Alcuni appassionati di arduino mi hanno segnalato la volontà di usare arduino per comandare due servo con i pulsanti, in pratica utilizzando 3 pulsanti per ciascuno dei servo motori è possibile spostare questi ultimi nella posizione desiderata.
il progetto in se non è molto complesso, devi procurarti il materiale seguente:
- n.1 arduino uno, leonardo, mini ….
- n.1 breadboard per le connessioni
- n. 14 cavetti per breadboard
- n. 6 ponticelli rigidi da breadboard, in alternativa usa 6 cavetti
- n. 6 pulsanti NA
- n.6 resistenze da 330ohm
- n.2 servomotori modellistici
a questo punto assembla il tutto.
Montaggio arduino per comandare due servomotori con i pulsanti
per aiutarti nel collegamento dei cavi ho scelto di utilizzare delle foto:
posiziona i 6 pulsanti sulla breadboard collegando uno dei terminali di ogni pulsante al polo positivo di arduino ( +5v ) e l’altro terminale al polo negativo attraverso la resistenza da 330ohm:
ciascun cavetto che collega il pulsante ad arduino lo devi collegare sul pin del pulsante a cui hai collegato la resistenza da 330ohm, se non ti è chiaro questo passaggio puoi leggere l’articolo Tutorial: Arduino, i servo e i pulsanti
collega i pin provenienti dai pulsanti ad arduino:
ho deciso di collegarli agli ingressi analogici per mostrati come si rileva un pulsante collegato all’ingresso analogico invece che al solito ingresso digitale. Avrai notato che i cavetti colorati li hai collegati ai pin A0,A1 ed A2 mentre quelli verdi ai pin A3,A4 ed A5 questa distinzione ti serve anche a capire quali pulsanti sono connessi al servomotore denominato X ( i colorati ) e quali al servo denominato Y ( i verdi ) la seguente figura può aiutarti:
Lo sketch del progetto
#include <Servo.h> #define servoPinX 10 #define servoPinY 11 Servo myservoX; Servo myservoY; int buttX[] = { A0,A1,A2 }; int gradX[] = { 0,90,180 }; int lengthX = 3; int buttY[] = { A3,A4,A5 }; int gradY[] = { 0,90,180 }; int lengthY = 3; int servoPosX = 0; int servoPosY = 0; void setup() { myservoX.attach( servoPinX ); myservoX.write( servoPosX ); myservoY.attach( servoPinY ); myservoY.write( servoPosY ); for (int pin=0; pin<lengthX; pin++) { pinMode( buttX[pin],INPUT ); } for (int pin=0; pin<lengthY; pin++) { pinMode( buttY[pin],INPUT ); } } void loop() { for (int pin=0; pin<lengthX; pin++) { if ( analogRead(buttX[pin]) > 1000 ) { servoPosX = gradX[pin]; } } for (int pin=0; pin<lengthY; pin++) { if ( analogRead(buttY[pin]) > 1000 ) { servoPosY = gradY[pin]; } } myservoX.write( servoPosX ); myservoY.write( servoPosY ); delay( 15 ); }
partiamo dalle righe fondamentali:
linea 01: includi la classe Servo.h;
linee 03-04: definisci le due costanti servoPinX e servoPinY a cui sono connessi rispettivamente il pin di controllo;
linee 06-07: definisci due istanze dell’oggetto Servo;
linea 09: definisci un array di tipo integer i cui valori indicano i pin a cui sono collegati i pulsanti relativi al controllo del servo X;
linea 10: definisci un array di tipo integer i cui valori indicano i gradi che vuoi impostare alla pressione del pulsante corrispondente;
linea 11: imposta una variabile con la lunghezza dei due array definiti alle linee 09 e 10;
avrai notato che i due array corrispondono in numero di elementi, questo perchè userai un unico indice per entrambi in pratica alla pressione del pulsante corrispondente al pin A1 di arduino il servo si posizionerà a 90°, per A2 a 180°
linee 13-15: imposti le stesse variabili viste alle linee 09-11 per l’asse Y;
linee 17-18: imposta a 0 il valore dei gradi iniziali a cui il servo deve andare prima della pressione di un pulsante;
linee 22-23: imposta il pin a cui è connesso il servomotore X per l’istanza corrispondente e posizionlo al valore in gradi definito nella variabile servoPosX;
linee 25-26: esegui la stessa impostazione per l’istanza Y;
linee 28-31: imposta un ciclo for da 0 al valore massimo definito nella variabile lengthX e per ciascun valore di pin imposta a INPUT la modalità di funzionamento del pin corrispondente;
linee 33-35: esegui la stessa operazione vista alle linee 28-31 per i valori di Y;
linee 41-44: imposta un ciclo del tutto simile a quello impostato alla linea 28 con la differenza che per ciascun valore della variabile pin testi che il convertitore analogico-digitale di arduino ti restituisca un valore superiore a 1000. Come saprai il convertitore analogico digitale di arduino uno è a 10bit che vuol dire una risoluzione di 1024 bit da 0 a 5v, quando il pulsante è aperto il valore di tensione sul pin analogico è dato dalla corrente che transita attraverso la resistenza da 330ohm, alla pressione del pulsante al pin arriva +5v diretti ed il valore dell’ADC è di 1023 circa, per questo motivo puoi definire la condizione alla linea 43 testando che il valore analogico letto sul pin Ax ( 0 <= x < 3 ) sia superiore a 1000;
linee 46-49: imposta il ciclo visto alle linee 41-44 per la componente Y del progetto;
linee 51-52: sposta il servo alla posizione di angolo desiderata;
linea 53: attendi 15 millisecondi prima di ricominciare il loop per consentire l’eseguzione dei comandi precedenti;
Il video su come usare arduino per comandare due servo con i pulsanti
ecco il video mente testo il progetto ultimato:
Buon divertimento
132 commenti
Vai al modulo dei commenti
passione elettronica tanto ,
ciao mauro, come posso risolvere il problema che i miei servi hanno bisogno dell’impostazione della velocità sennò non girano?
Mi spiego meglio, ho un piccolo servo (forza 3kg) che con questo programma funziona bene, mentre con quello più grande (forza 15kg) non gira? Ho notato che se nel programma c’è l’impostazione della velocita il servo grande gira bene, mentre se non c’è non gira…
cosa sbaglio ?
cordiali saluti..
a presto
Paolo
Autore
Ciao Paolo,
che modello di servo da 15Kg stai utilizzando?
Mauro
df15mg della dfrobot…
Autore
Ciao Paolo,
il servo utilizzato è il DF15 Metal Gear Servo (15kg) un normale servo analogico.
Cosa intendi per velocità?
Mauro
nel senso che, se nel programma gli viene dato il tempo in cui eseguire il movimento ( nel senso di girare più o meno veloce) gira bene, ma se gli viene fornito soltanto il grado da eseguire il servo non parte..
Autore
Ciao Paolo,
questo è normale sui servo senza grandi performance, probabilmente è il tuo caso.
Quando impartisci un comando devi attendere che il servo possa eseguirlo prima di impartirgliene un’altro.
Eliminando il delay alla fine dello sketch, trasferisci i comandi alla velocità di clock di arduino ed il servo non riesce ad interpretarli.
Mauro
ma non l’ho eliminato il delay.. cosa può essere?
Paolo
Autore
Ciao Paolo,
non mi è chiaro dove gli hai dato il tempo, nel mio sketch solo il delay alla fine imposta la velocità di rotazione.
Mauro
Ho provato a mettere il tuo sketch, ma non funziona =( , e non riesco a capire il perchè..
Autore
Ciao Paolo,
quale sketch stavi utilizzando?
Se mi scrivi su un articolo io immagino che stia utilizzando lo sketch che ho descritto, altrimenti non ci si capisce più nulla.
Mauro
si, sto utilizzando lo sketch qui sopra descritto.. però i servi non si muovono…
Autore
Nello sketch a quale velocità ti riferisci?
Mauro
penso sia quello il problema, perchè i servi, si muovono solo una volta portandosi a 90°, poi anche se clicchi gli altri pulsanti non succede nulla…
Autore
Mi indichi la linea di codice a cui ti riferisci per impostare la velocità?
Mauro
la 53…
Paolo
Autore
Ciao Paolo,
c’è qualcosa di non chiaro.
Se utilizzi il mio sketch alla linea 53 c’è il delay di cui ti ho scritto e che ti ho espressamente detto di non togliere spiegandotene il motivo, vedi sopra.
Se togli la linea 53 e non funziona è chiaro il motivo, leggi sopra.
Mauro
lo so, ma infatti non l’ho tolto..
Paolo
finalmente ho risolto il problema, ho dovuto modificare il programma cosi:
#include
#define servoPinX 10
#define servoPinY 11
Servo myservoX;
Servo myservoY;
int buttX[] = { A0,A1,A2 };
int gradX[] = { 20,90,150 };
int lengthX = 3;
int buttY[] = { A3,A4,A5 };
int gradY[] = { 20,90,150 };
int lengthY = 3;
int servoPosX = 0;
int servoPosY = 0;
void setup()
{
myservoX.attach( servoPinX );
myservoX.write( servoPosX );
myservoY.attach( servoPinY );
myservoY.write( servoPosY );
for (int pin=0; pin<lengthX; pin++)
{
pinMode( buttX[pin],INPUT );
}
for (int pin=0; pin<lengthY; pin++)
{
pinMode( buttY[pin],INPUT );
}
}
void loop()
{
for (int pin=0; pin 1000 ) { servoPosX = gradX[pin]; }
}
for (int pin=0; pin 1000 ) { servoPosY = gradY[pin]; }
}
myservoX.write( servoPosX );
myservoY.write( servoPosY );
delay( 15 );
}
grazie mille per il tuo aiuto
Paolo
Autore
Ciao Paolo,
sono contento tu abbia risolto.
A cosa servono i due cicli for nella loop()?
In che punto leggi i pulsanti per impartire i comandi ai servo?
Mauro
servono a verificare se è stato premuto il pulsante, ma io non ho modificato quello, ma i gradi, che evidentemente scritti troppo precisi per il servo che ho non andavano bene…
Paolo
Autore
OK, ho riguardato lo sketch, nel copia e incolla sul commento si sono persi dei pezzi che rendevano il codice apparentemente errato.
Lo sketch dell’articolo è giusto.
Mauro
ciao,
Volevo chiederti se potresti fare un tutorial o spiegarmi come comandare arduino con un telecomando modellistico, in pratica io vorrei poter dire ad arduino con un interruttore del telecomando quando far partire il programma che farà poi muovere due servi .
Grazie Oliver
Autore
Ciao Oliver,
interessante spunto.
Mi sai dire la frequenza di uscita del segnale sulla ricevente quando muovi l’interruttore?
Mauro
trovato , ha una frequenza fissa di 50hz e un duty cicle che varia tra 1000 e 2000 us
Autore
Ciao Oliver,
questo é il dato giusto.
Purtroppo tutte le riceventi per modellismo lavorano su questo duty cicle, ti consiglio di leggere il mio articolo sul rover5 che si guida con iPad e comprende come puoi misurare il livello di segnale a interruttore off ed on, a quel punto sará per te un gioco da ragazzi impostare il programma.
Mauro
ho guardato vari tutorial sul rover5, ma non trovo quello dove parli della misura del segnale
Autore
Ciao Oliver,
hai già leggo questo articolo ?
https://www.mauroalfieri.it/elettronica/wirc-collegalo-ad-arduino.html
Contiene tutte le informazioni di cui hai bisogno.
Mauro
Grazie , mi sono chiarito molte cose, non ho capito dove dovrei collegare il pin del segnale del ricevitore ad Arduino .
Ho visto in altri tuttorial che chiedevi quale fosse il programma per simulare i crcuiti con Arduino, si chiama fritzing
Autore
Ciao Oliver,
grazie per la info, da un po di tepo l’ho scoperto ed ho iniziato ad usarlo.
Trovo Fritzing molto comodo 🙂
Il tuo ricevitore dovrebbe avere una contattiera in cui inserire i servo, devi collegare il pin segnale corrispondente al servo al pin arduino su cui leggi, scegli tu quale.
Ricorda che il pin del segnale lato ricevitore deve essere quello del canale che riceve informazioni dall’interruttore.
Mauro
io ho provato ad usare il programma che hai messo nel tutorial che mi hai linkato, da quel che ho capito dovrebbe far funzionare il servo nello stesso modo di come muovo lo stick della radio ???
Penso che a me serva qualcosa di molto più semplice , io ho questo programma :
#include
Servo sportelli;
Servo pinna;
int pos = 0;
void setup()
{
sportelli.attach(9);
pinna.attach(10);
}
void loop()
{
for(pos = 0; pos < 180; pos += 5) //apre gli sportelli
{
sportelli.write(pos);
delay(15);
}
delay(1000); //aspetta 1 secondi
for(pos = 0; pos =1; pos-=5) //chiude gli sportelli
{
sportelli.write(pos);
delay(15);
}
delay(10000); //aspetta 10 secondi
seconda parte :
for(pos = 0; pos =1; pos-=1) //chiude la pinna
{
pinna.write(pos);
delay(15);
}
delay(1000); //aspetta 1 secondi che la pinna rientri
for(pos = 180; pos>=1; pos-=5) //chiude gli sportelli
{
sportelli.write(pos);
delay(15);
}
delay(10000);
}
e ho bisogno che quando l’ interruttore è in una posizione fa partire la prima parte del programma e quando è nel altra fa partire la seconda parte .
Forse con la domanda di comandare un servo con un interruttore sono partito sbagliato…
Grazie Oliver
Autore
Ciao Oliver,
ti ho consigliato questo sketch perché tu possa utilizzarlo per capire che tipo di segnale esce dalla tua ricevente quando sposti l’interruttore.
Poi potrai applicare quei valori al tuo sketch.
Leggi attentamente il mio articolo e scoprirai cosa puoi dare con quello sketch.
Mauro
sono nuovissimo con arduino e ti sto seguendo su tutto adesso stavo facendo un progetto (modificando uno tuo ) pero non so come risolverlo allora io sto cercando di fare con un arduino uno comandare due servo motori GS-9018 con un unico pulsante e che vadano da grado 38 a grado 180 io utilizzo il tuo sketch
controllin a servo position using two buotton e lo modificato con i gradi che mi servono:
#include
Servo myservo;
int grado = 38;
int minGrad = 38;
int maxGrad = 180;
int pinServo = 3;
int prev = A1;
int next = A0;
void setup()
{
myservo.attach( pinServo );
myservo.write( grado );
pinMode( prev, INPUT );
pinMode( next, INPUT );
}
void loop()
{
if ( analogRead( prev ) > 1000 ) { grado–; }
if ( analogRead( next ) > 1000 ) { grado++; }
if ( grado > maxGrad ) { grado = maxGrad; }
if ( grado < minGrad ) { grado = minGrad; }
myservo.write( grado );
delay(1);
}
xo cosi vengono comandati da due pulsanti uno che apre e uno che chiude volevo chiederti come posso fare per usare un solo pulsante in apertura e chiusura?
poi domanda banale per alimentare l'arduino uno dove mi posso collegare?quanti volto servono?
grazie mille in anticipo
Autore
Ciao Mirco,
lo sketch che stai utilizzando ti permette di incrementare e decrementare i gradi del servo da 38-180-30 in base al pulsante che premi.
Se lo sostituissi con uno solo non comprendo come vorresti che si muovesse, da 38 a 180 e poi al contrario fino a quando il pulsante resta premuto?
O vuoi che premendo una volta il servo vada a 180° e ripremendolo torni a 38° ?
Per alimentare Arduino puoi usare un alimentatore stabilizzato da 9/12v, o una pila da 9v, il problema possono essere i due servo che potrebbero richiedere un’alimentazione esterna a 6v.
Mauro
potresti dirmi se questo sketch per 6 servo e 12 pulsanti (2 per uno) è giusto? se no potresti scrivermene uno tu ??? sono disperato!! 🙁
#include
#define servoPinX 10
#define servoPinY 11
#define servoPinX 10
#define servoPinY 11
#define servoPinX 10
#define servoPinY 11
Servo myservoX;
Servo myservoY;
Servo myservoX;
Servo myservoY;
Servo myservoX;
Servo myservoY;
int buttX[] = { A0,A1,A2 };
int gradX[] = { 0,90,180 };
int lengthX = 3;
int buttY[] = { A3,A4,A5 };
int gradY[] = { 0,90,180 };
int lengthY = 3;
int buttX[] = { A0,A1,A2 };
int gradX[] = { 0,90,180 };
int lengthX = 3;
int buttY[] = { A3,A4,A5 };
int gradY[] = { 0,90,180 };
int lengthY = 3;
int buttX[] = { A0,A1,A2 };
int gradX[] = { 0,90,180 };
int lengthX = 3;
int buttY[] = { A3,A4,A5 };
int gradY[] = { 0,90,180 };
int lengthY = 3;
int servoPosX = 0;
int servoPosY = 0;
int servoPosX = 0;
int servoPosY = 0;
int servoPosX = 0;
int servoPosY = 0;
void setup()
{
myservoX.attach( servoPinX );
myservoX.write( servoPosX )
myservoY.attach( servoPinY );
myservoY.write( servoPosY );
myservoX.attach( servoPinX );
myservoX.write( servoPosX )
myservoY.attach( servoPinY );
myservoY.write( servoPosY );
myservoX.attach( servoPinX );
myservoX.write( servoPosX )
myservoY.attach( servoPinY );
myservoY.write( servoPosY );
for (int pin=0; pin<lengthX; pin++)
{
pinMode( buttX[pin],INPUT );
}
for (int pin=0; pin<lengthY; pin++)
{
pinMode( buttY[pin],INPUT );
}
for (int pin=0; pin<lengthX; pin++)
{
pinMode( buttX[pin],INPUT );
}
for (int pin=0; pin<lengthY; pin++)
{
pinMode( buttY[pin],INPUT );
}
for (int pin=0; pin<lengthX; pin++)
{
pinMode( buttX[pin],INPUT );
}
for (int pin=0; pin<lengthY; pin++)
{
pinMode( buttY[pin],INPUT );
}
}
void loop()
{
for (int pin=0; pin 1000 ) { servoPosX = gradX[pin]; }
}
for (int pin=0; pin 1000 ) { servoPosY = gradY[pin]; }
for (int pin=0; pin 1000 ) { servoPosX = gradX[pin]; }
}
for (int pin=0; pin 1000 ) { servoPosY = gradY[pin]; }
for (int pin=0; pin 1000 ) { servoPosX = gradX[pin]; }
}
for (int pin=0; pin 1000 ) { servoPosY = gradY[pin]; }
}
myservoX.write( servoPosX );
myservoY.write( servoPosY );
myservoX.write( servoPosX );
myservoY.write( servoPosY );
myservoX.write( servoPosX );
myservoY.write( servoPosY );
delay( 15 );
}
Autore
Ciao Dario,
spesso mi sopravvalutate, non sono in grado di leggere uni sketch e verificare come si comporta.
Il bello di Arduino è che sperimenti, sperimenti e sperimenti e ottieni quello che vuoi.
Se mi dici cosa vuoi ottenere io posso darti qualche dritta, più preciso sarai nella descrizione più preciso potrò essere sulla soluzione.
Se desideri che scriva io uno sketch su commissione ci posso pensare, tuttavia ho necessità di conoscere i particolari del progetto.
Mauro
L’idea era di realizzare un braccio robotico muovendo le sezioni con dei servi collegati a dei pulsanti ( volevo usare 6 servi e 2 pulsanti ciascuno)
nei tuoi video, che ho trovato altamente istruttivi ,spieghi come muovere un servo con dei pulsanti
(https://www.mauroalfieri.it/elettronica/tutorial-arduino-i-servo-e-i-pulsanti.html)
vorrei fare la stessa cosa ma utilizzando sei servomotori al posto di uno solo (come nel link)
il mio problema non è il montaggio hardware poichè ho imparato dal tuo video , oggetto di questa discussione , ma bensì la programmazione dello sketch tramite arduino
detto questo mi scuso per il disturbo e ti chiedo se potresti mandarmi in risposta uno sketch che soddisfi le condizioni prima citate
grazie in anticipo.
Autore
Ciao Dario,
dalla tua spiegazione comprendo che si tratta di un tuo esperimento, correggimi se sbaglio, non di un lavoro.
In tal caso ti invito a studiare i miei tutorial gratuiti per capire come scrivere il tuo sketch.
Siccome avrai molti pulsanti, considerando 6 servo, saranno almeno 12 ed i pin di arduino potrebbero non bastarti ti propongo di valutare una scheda joystick tipo questa: https://www.mauroalfieri.it/elettronica/joystick-per-arduino-input-shield.html
che renderebbe più interessante anche il tipo di controllo.
Mauro
mi sono dimenticato di precisare che il movimento che i servo devono compiere è di 5 o massimo 10 gradi per ogni volta che si schiaccia il pulsante
inoltre tenendo premuto un pulsante dovrebbe continuare a girare in senso orario o antiorario
Autore
Ciao Dario,
vedi risposta sopra.
Mauro
grazie dell’informazione , è stata utile
guarderò i tutorial per capire come scrivere lo sketch
grazie ancora
spero di non disturbarti ulteriormente ma vorrei che tu rispondessi alla seguente domanda :
nella parte di sketch ove sono rappresentati i caratteri A1 A2 A3 eccetera potresti spiegarmi come vanno collegati ad arduino?
poichè usando 6 servo a1 a2 a3 fino ad a5 si ripetono 2 volte
è un problema o è indifferente e non influisce sul progetto ?
es:
int buttA[] = { A0,A1,A2 };
int gradA[] = { 0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180 };
int lengthA = 3;
int buttB[] = { A3,A4,A5 };
int gradB[] = { 0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180 };
int lengthB = 3;
int buttC[] = { A0,A1,A2 };
int gradC[] = { 0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180 };
int lengthC = 3;
int buttD[] = { A3,A4,A5 };
int gradD[] = { 0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180 };
int lengthD = 3;
int buttE[] = { A0,A1,A2 };
int gradE[] = { 0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180 };
int lengthE = 3;
int buttF[] = { A3,A4,A5 };
int gradF[] = { 0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180 };
int lengthF = 3;
Autore
Ciao Dario,
non ho capito cosa mi hai chiesto, perdonami devi essere più chiaro.
Ti chiedo di non inserire parti di sketch nei commenti xchè si leggono male e non posso capire cosa fanno solo leggendoli.
Quello che leggo é confusione, probabilmente sei partito dall’esempio sbagliato o troppo complesso per quello che vuoi realizzare.
Parti dai primi articoli del corso arduino on-line e man mano troverai come scrivere lo sketch.
Mauro
non vorrei essere insistente ne sembrare ossessivo ma ti chiedo se per favore potresti scrivermi uno sketch che faccia eseguire a sei servomotori le stesse operazioni che svolge il tuo in questo video
https://www.mauroalfieri.it/elettronica/tutorial-arduino-i-servo-e-i-pulsanti.html
p.s. volevo chiarire che sono nuovo in questo campo poichè ho solo 14 anni
ma visto che frequento l’itis di crema ho una piccola preparazione in materia
ti ringrazio sia tu voglia mettere a mia disposizione lo sketch sia il contrario
grazie
Dario
Autore
Ciao Dario,
sei un ragazzo certamente in gamba, e la tua giovane età ti da l’entusiasmo e la carica che dimostri quando i scrivi.
Non voglio scriverti io lo sketch perché mio padre mi ha insegnato, quando avevo soli 10anni, che se un esperimento lo realizzi con le tue forze sarai super soddisfatto se te lo realizza qualcun’altro é solo un gioco passeggero e deludente.
Io ti voglio aiutare nel tuo progetto, solo lo farò non scrivendo ti il codice me dando ti gli spunti per imparare a fare non solo questo progetto ma tutti quelli ha vorrai.
Ti va?
Mauro
sono rimasto colpito dalle tue parole e mi sono stupito per la veridicità di esse
hai ragione , sto sperimentando vari sketch e sto raggiungendo il mio scopo , l’unico problema sono i pin analogici poichè me ne servirebbero 12 ma sono solamente 6
ho dato un ‘ occhiata all’espansione che mi hai consigliato ma credo che non sia la soluzione migliore
anche perchè applicando il joystick lo sketch diventerebbe piu complicato
se sei a conoscenza di qualche altro metodo potresti informarmi?
grazie in anticipo
Autore
Ciao Dario,
ci sono molte tecniche che puoi utilizzare, ti suggerisco i primi due c’è mi vengono in mente:
1. la Keypad LCD, se leggi l’articolo, troverai che con un solo pin controlla 5 pulsanti e lo fa con delle resistenze in serie ai pulsanti, lato sketch ogni pulsante ti da un valore differente;
2. puoi usare anche i pin digitali per collegare i pulsanti, in tal caso li leggi come digitalRead ed il valore potrà essere LOW o HIGH dipende da come li colleghi al positivo e negativo.
Mauro
io ho trovato questo tipo di sdoppiatore
http://www.ebay.it/itm/CAVO-SDOPPIATORE-ALIMENTAZIONE-AD-Y-DA-MOLEX-4-PIN-A-2-PER-MOLEX-4-PIN-/151021764749?pt=Cavi_Prolunghe_Convertitori&hash=item232999408d&_uhb=1#ht_1644wt_1139
potrebbe andare bene?
Autore
Ciao Dario,
non vedo l’immagine, per quale parte del progetto intendevi utilizzarlo?
Mauro
volevo utilizzare uno sdoppiatore di pin per aumentare quelli di arduino da 6 a 12
così potrò procedere con il progetto senza molti intoppi
Autore
Ciao Dario,
non vedo l’immagine del prodotto, ma considerata la descrizione é solo un cavo per sdoppiare l’alimentazione nulla che possa essere usato come vuoi tu.
Mauro
avrdude: stk500_getsync(): not in sync: resp=0x30
mi esce questo errore quando carico lo sketch su arduino
cosa posso fare
Autore
Ciao Dario,
è un errore di comunicazione, prova a verificare che l’esempio blink funzioni 🙂
Mauro
collego tutto come nell’esempio ma non funziona niente
Autore
Ciao Dario,
se hai lo stesso errore che mi hai detto sopra è normale che non funzioni nulla, non hai trasferito lo sketch ad Arduino.
Mauro
stesso errore e adesso arduino non segnala la luce tipica verde di quando è acceso
Autore
Ciao Dario,
potrebbe essere un errore di installazione dell’IDE, un collegamento errato dell’arduino o il computer che non riconosce Arduino.
Mauro
ho risolto il problema delle lucine ma l’errore che non mi fa caricare lo sketch sul componente hardware persiste
come lo risolvo?
Autore
Ciao Dario,
lo risolvi analizzando il problema passo-passo:
– controlla la connessione pc-arduino;
– controlla che il driver sia installato;
– controlla che il pc veda arduino;
– ecc..
Mauro
risolti tutti gli errori ma i servo non si muovono di un millimetro
ho collegato come nello schema
potresti fare un video tutorial, mi servirebbe di questa tua recensione .
https://www.mauroalfieri.it/elettronica/tutorial-arduino-i-servo-e-i-pulsanti.html
Autore
Ciao Dario,
bene per gli errori.
Siccome sei alle prime armi ti consigli di iniziare a leggere il mio corso on-line e man mano provare gli esperimenti.
Vedrai che sarai in grado di comprendere i tuoi errori ed i collegamenti e di farne di nuovi.
Mauro
ho ascoltato il tuo consiglio risultato :
ho imparato molte cose nuove e dopo tanti tentativi sono riuscito a assemblare la parte elettronica del progetto quindi prevedo che entro due giorni riuscirò a completare il braccio meccanico e vedrò di migliorarlo in futuro.
Dario
Autore
Grande Dario,
mi fa estremamente piacere e sono pronto a ricevere foto,testi,schemi e video del progetto se vorrai condividerli sul blog con altri appassionati.
Mauro
anche seguendo il corso on line ho avuto un problema con i pin digitali
lo sketch è giusto :
#include
Servo myservo; // create servo object
int grado = 0;
int minGrad = 0;
int maxGrad = 180;
int pinServo = 3;
int low = 4 ;
int high = 2;
void setup()
{
myservo.attach( pinServo );
myservo.write( grado );
pinMode( low, INPUT );
pinMode( high, INPUT );
}
void loop()
{
if ( digitalRead( LOW ) > 1000 ) { grado–; }
if ( digitalRead( HIGH ) > 1000 ) { grado++; }
if ( grado > maxGrad ) { grado = maxGrad; }
if ( grado < minGrad ) { grado = minGrad; }
myservo.write( grado );
delay(15);
}
ma nonostante questo non funziona il servo
i cavetti dei relativi pin digitali sono collegati ad un'estremità del pulsante come fossero analogici
sbaglio forse quello?
Autore
Ciao Dario,
sei certo di aver seguito il corso?
Probabilmente hai prestato poca attenzione, penso di non aver mai scritto una linea del tipo:
if ( digitalRead( LOW ) > 1000 ) { grado–; }
in quanto profondamente errata.
Credimi sarebbe per me più facile scriverti lo sketch ma preferisco che tu provi a impegnarti, se vuoi imparare qualcosa, e correggere da solo l’enorme errore, ti consiglio di guardare il manuale arduino, che sempre dovrebbe essere di riferimento per tutti, anche io lo consulto prima di scrivere u comando: http://arduino.cc/en/Reference/DigitalRead
Per il collegamento elettrico, da quello che scrivi è corretto.
Mauro
non riesco a trovare l’errore
ti chiedo se gentilmente potresti indicarmelo ed io provvederò a sistemare lo sketch
Dario
Autore
Ciao Dario,
non so come aiutarti, ti ho indicato la linea di errore nel precedente commento e anche dove leggere la correzione.
Mauro
ho corretto cosi ma nessun risultato
#include
Servo myservo;
int grado = 0;
int minGrad = 0;
int maxGrad = 180;
int servoPin = 13;
int inPin = 7;
int newPin = 2;
int val = 0;
void setup()
{
myservo.attach( servoPin );
myservo.write( grado );
pinMode(inPin, INPUT);
pinMode(newPin, INPUT);
}
void loop()
{
if ( digitalRead( inPin ) > 1000 ) { grado–; }
if ( digitalRead( newPin ) > 1000 ) { grado++; }
if ( grado > maxGrad ) { grado = maxGrad; }
if ( grado < minGrad ) { grado = minGrad; }
myservo.write( grado );
delay(15);
val = digitalRead(inPin);
digitalWrite(servoPin, val);
val = digitalRead(newPin);
digitalWrite(servoPin, val);
}
Autore
Ciao Dario,
non stai seguendo nessuna delle mie guide e neppure il manuale arduino.
Stai tentando a caso di farcela.
L’impegno e la lettura dei documenti è la prima regola in questa passione per riuscire.
Mauro
spero di non averti dato troppa noia con le mie assillanti richieste, ma , ancora una volta , grazie a te , ho raggiunto il mio obbiettivo!!!
ora posso collegare fino a 6 servo con 2 pulsanti ciascuno !
non ti ringrazierò mai abbastanza per le tue dritte ed i tuoi consigli ma…
grazie mille!!! 🙂 🙂
Autore
Ciao Dario,
i tuoi ringraziamenti sono sufficienti e sono certo che la soddisfazione che provi nell’avercela fatta sia incredibile.
Se ti va di pubblicare i tuoi successi sono disponibile a farlo e lo ritengo impareggiabile ringraziamento perché l’ultimo passo è condividere le proprie idee e progetti.
Mauro
ciao Mauro
questa volta volevo chiederti se puoi spiegarmi o postarmi un link su come controllare tramite pc un servomotore
Dario
Autore
Ciao Dario,
non comprendo cosa tu voglia fare, dovresti essere più chiaro esistono mille modi di fare quello che vuoi ed ognuno ha delle caratteristiche e delle difficoltà differenti.
Mauro
una volta constatato che il braccio meccanico può essere mosso da dei servomotori i quali si muovono tramite dei pulsanti (decrementando e incrementando il grado) mi piacerebbe muovere ogni singolo servomotore ,indipendentemente, dal mio computer senza utilizzare cavi (non pretendo un raggio d’azione di chilometri anche se sarebbe bello , ma mi accontento tra virgolette di 60 / 100 metri oppure il massimo che mi sai consigliare, poichè non voglio sparare numeri astronomici a caso 🙂 )
in poche parole fare le stesse cose che faceva prima utilizzando i pulsanti solo che ora , per esempio , schiacciando la lettera “A” incrementi il grado di un servo e schiacciando la lettera “B” decrementi il grado.
Spero di essermi chiarito bene
grazie in anticipo 🙂
Autore
Ciao Dario,
bel progetto io lo affronterei con gli Xbee che funzionano come seriali e sono semplici da configurare, purtroppo non ho un tutorial sugli Xbee da suggerirti.
Mauro
Ciao Mauro,
ora ti scrivo lo sketch che sto cercando di completare per far funzionare due servo contemporaneamente con l’utilizzo di un pulsante…i problemi che mi sorgono sono: -si muove un solo serve e non tutti e due;
– dopo un pò che non schiaccio il pulsante l’unico servo che si muove parte da solo…
Non riesco a trovare l’inghippo…
Spero potrai essermi di aiuto =)
#include
#define Led 13
#define Occhi 2// Il Pin del Led
#define Polsiera 7
#define Testa 9
#define STesta 10
int Valore = 0; // Valore servirà per conservare lo stato del Pin di Input
int Vecchio_Valore = 0; // Questa variabile conserva il valore precedente di “Valore”
int Stato = 0; // 0 = Led spento e 1 = Led acceso
int statoPrecedente=0;
int vel=20;
int angleUP=100;
int angleDOWN=5;
Servo servo;
void fadeup();
void fadedown();
void openElmo ();;
void closeElmo ();
void setup()
{
pinMode(Occhi, OUTPUT);
pinMode(Led, OUTPUT); // Indica ad Arduino che Led è un Output
pinMode(Polsiera, INPUT);
pinMode(Testa, OUTPUT); // e che Pulsante è un Input
pinMode(STesta, OUTPUT); // e che Pulsante è un Input
servo.attach(STesta);
servo.attach(Testa);
}
void loop()
{
Valore = digitalRead(Polsiera); // Legge il valore dell’Input e lo conserva
delay(20);
if ((Valore == HIGH) && (Vecchio_Valore == LOW)) {Stato = 1 – Stato;}
Vecchio_Valore = Valore;
if (Stato == 1 && statoPrecedente!=1) {openElmo();
fadedown();}
if (Stato == 0 && statoPrecedente!=0) {closeElmo();
fadeup();}
}
void fadeup(){
int brightness=0;
int fadeamount=3;
for(brightness=0;brightness=0;brightness=brightness-fadeamount){
analogWrite(Occhi, brightness);
delay(vel);
}
if(brightness!=255){statoPrecedente=1;}
}
void openElmo(){
int i=0;
for(i=angleDOWN;iangleDOWN;i-=1){
digitalWrite(Led, LOW);
servo.write(i);
delay(vel);
}
if(i==angleDOWN){statoPrecedente=0;}
}
Autore
Ciao Emanuele,
ci sono diversi errori nello sketch:
1. se usi 2 servo non puoi chiamarli tutti e due servo ma servo A e servoB, leggi gli articoli in cui lavoro con più servo;
2. nella funzione openElmo mancao delle info nel for, forse dovuti al copia e incolla, come avrai letto chiedo di non postare codici xchè tanto arrivano illegibili.
3. il problema del servo che parte a caso potrebbe essere dovuto ad uno di questi errori od ad un collegaento elettrico non fermo, il calssico falsocontatto.
Prova nella setup() a inserire un digitalWrite(Testa,LOW) e lo stesso per sTesta.
Mauro
Ciao Mauro
Oggi sono ripartito da zero e ho provato a scrivere un’altro sketch ma ho ancora toppato….
non riesco ad arrivare ad una fine…sicuramente per te srivere una sketch del genere sarà una passeggiata…non è che puoi darmi delle dritte? sto cercando di non arrendermi ma è ormai parecchio tempo che non riesco =(.
Grazie
Autore
Ciao Emanuele,
ti ho dato tutte le dritte necessarie a sistemare il tuo precedente sketch, ti ho evidenziato gli errori e detto come correggerli.
Come ti ho scritto realizzò sketch su commissione quando sono progetti complessi ma in questo caso ci vuole solo un po’ di buona volontà.
Mauro
Ciao Mauro,
le correzioni che mi avevi dato nell sketch ho provato a farle ma niente…sono rimasto con lo stesso problema…
A questo punto anche se per te è una baggianata mi chiedo se magari quando hai qualche minuto libero riuscissi a compilarmi una sketch…te lo chiedo semplicemente perchè sono bloccato e non posso andare avanti nel mio progetto..
Se vorrai aiutarmi poi ti darò tutte le informazioni necessarie, altrimenti ti ringrazio lostesso per la pazienza che hai avuto fino ad adesso .
Emanuele
Autore
Ciao Emanuele,
Io voglio aiutarti, ma non é scrivendo lo sketch al tuo posto c’è ci riuscirò e sopratutto ne imparerai a continuare con questa passione.
Hai seguito alla lettera i miei consigli? Hai creato due istanze servo?
Già solo questo doveva far migliorare il funzionamento del tuo progetto.
Hai definito le due istanze nel ciclo for in modo corretto?
Inoltre, una banalità, hai pensato di collegare tutti e due i servo allo stesso pin?
Mauro
ciao Mauro ,
avrei una domanda davvero banale da farti :
i motori passo passo hanno un numero limitato di giri da compiere?
per esempio: tenendo premuto un pulsante per farlo girare in senso antiorario si fermerà dopo una rotazione di 360°?
oppure può compiere “infiniti giri”?
grazie Dario
Autore
Ciao Dario,
possono compiere infiniti giri.
Mauro
Ciao Mauro,
ho fatto delle correzioni creando due instanze per i due servo ed adesso si muovovo in contemporanea…poi però adesso sorge un’altro problema…il fatto che i servo partono e fin li tutto ok…poi arrivati a metà del lorotragitto di andata si bloccano e sembra come se si staccasse l’alimentazione per un’instante e poi tornasse e i servo se ne tornano al punto di partenza senza motivo… non riesco a capire quale sia il problema…penso che il problema si ancora nello sketch…
Non ho inserito, come consigliavi tu, le due instanze dei servo nel ciclo del for perchè non sapevo come inserirle…
Vorrei sottoporti a controllo lo sketch ma considerando, come dici tu, gli errori del copia e incolla non so come mandartelo…mi farebbe piacere se riuscissi a provarlo e vedere tu stesso quale problema esce fuori…
Grazie
Emanuele
Ciao Mauro,
visto che non hai risposto subito io sto continuando a fare delle prove…
Ho notato che se collego un solo servo tutto funziona correttamente mentre poi quando metto anche il secondo poi non va più come prima…a questo punto mi sono posto una domanda… ma se il problema sorge dall’alimentazione?? potrebbe non bastare l’alimentazione da usb di arduino per i due servo?? potrebbe essere questo il mio problema??
Emanuele
Autore
Ciao Emanuele,
sono contento che tu stia provando e riprovando.
Da quello che scrivi il problema sembra esattamente quello che hai individuato 🙂
Alimenta i servo in modo indipendente da Arduino, trovi degli articoli sui servo in cui ti mostro come fare.
Attenzione: collegare carichi eccessivi su arduino può rovinarti la porta Usb del Pc.
Mauro
Autore
Ciao Emanuele,
sicuramente l’errore è nello sketch.
Ti invito a leggere gli articoli sui servo e provare, se te lo risolvo io perdi tutto il divertimento.
Mauro
Ciao Mauro,
quest’oggi volevo che tu mi dessi un consiglio oppure mi indirizzassi su qualche sito ove viene spiegato come connettere dei sensori di flessione a dei servomotori .
il tutto fatto a distanza tramite moduli xbee .
pensavo a qualcosa del genere:
http://buzzlough.com/2012/12/costruire-una-mano-robotica/
quindi tramite un guanto e dei sensori di flessione comunicare ai servo (tramite xbee) di quanti gradi debbano spostarsi per riprodurre più o meno il movimento della mia mano .
grazie
Dario.
Autore
Ciao Dario,
il link mi sembra che ti dia già tutto quello che ti occorre.
Il tuo progetto è interessante, tuttavia non è tra i progetti che ho in programma di seguire, magari tra qualche mese lo farò.
Mauro
si lo so , ma quel che mi serve , non è la costruzione hardware , ma lo sketch , oppure come fare a leggere il segnale del sensore di flessione e indirizzarlo nel giusto modo al servomotore
grazie , Dario
Autore
Ciao Dario,
io ho letto velocemente l’articolo ed in fondo ho trovato un link al firmware, è un’altro modo di chiamare lo sketch.
Se preferisci che te lo scriva io posso farlo su commissione, mi serve che tu mi spedisca i componenti: sensori,resistenze,shied e servo che vuoi utilizzare ed io ti posso preventivare il costo di realizzazione dello sketch.
Mauro
no grazie comunque
il problema è che quando clicco su firmware mi dice:
external link not trusted
e mi reindirizza su questa pagina
potresti mostrarmi lo sketch da lui utilizzato se riesci ba vederlo ?
grazie
Dario
Autore
Ciao Dario,
se il link non funziona prova a scrivere all’autore per segnalarglielo, magari non lo sa e gli offri il tuo aiuto.
Mauro
Ciao Mauro,
sono finalmente riuscito a far funzionare tutto!!.. il problema era proprio quello che avevi individuato nell’alimentazione =) =)
Ora resta soltanto un piccolissimo difettuccio che con il tuo consenso sarei felice di farti vedere con un video che potrei inviarti su facebbok xkè non so come spiegarlo a parole…
Grazie
Emanuele
Ciao Mauro,
dopo averti finalmente detto di essere riuscito a fare quello che volevo mi è sorto un problema di movimento che non avevo tenuto in considerazione…mi ero completamente dimenticato che i due servo devo posizionarli in direzioni opposte e quindi di conseguenza si dovranno muovere in sensi opposti….
c’è per caso un’articolo in cui parli di questa cosa? ho dato un’occhiata ma non l’ho visto…
Su questo argomento sono completamente impreparato….puoi darmi un’aiuto?
Grazie
Emanuele
Autore
Ciao Emanuele,
non ricordo se ho scritto un articolo in merito.
Se mi trovassi nella tua situazione lo risolverei matematicamente ossia se il ciclo for va da 0 a 180 gradi il primo servo esegue esattamente i gradi, il secondo esegue il contrario:
grado = ( 180 – valore )
Avrai che quando il primo è a 180 il secondo é a 0 e viceversa.
Mauro
Ciao Mauro,
non so come inserire i due servo con funzioni inverse nel for…sarei felice se potessi dare un’occhiata al mio sketch x darmi un consiglio per riuscire a completare lo sketch.
Grazie
Emanuele
Poi forse non mi sono spiegato bene…ho bisogno che un serva faccia da 0 a 100 ° e un’altro invece che faccia da 0 a -100°….mi sono completamente bloccato…non so come muovermi per questo ti chiedo un’aiuto per completare lo sketch visto che ormai manca soltanto quest’ultima cosa che mi ero dimenticato di tenere in considerazione…
Emanuele
Autore
Ciao Emanuele,
innanzitutto c’é un errore nel tuo ragionamento i servo possono compiere da 0 a 100 ( 180 ) non possono muoversi da 0 a -100 é la posizione di montaggio e lo sketch che derminano il verso di rotazione.
Per cui avrai e il primo servo va da 0 a 100 ed il secondo da 100 a 0 se osservi il ragionamento capisci subito c’è la formula matematica che ti ho indicato va benissimo a meno di scriverlo come:
grado_secondo_servo = ( 100 – grado_primo_servo )
Per cui al valore 0 avrai (100-0)=100 al valore 100 avrai (100-100)=0 ed il gioco é fatto.
Ti ho praticamente scritto lo sketch.
Mauro
Autore
Ciao Emanuele,
ti ho spiegato nella mia precedente risposta come fare.
Devi usare la matematica, (180 – grado ) = grado_inverso
Non é complesso, sono sicuro che se ti impegni c’è la fai.
Mauro
Autore
Ciao Emanuele,
sono contento !!!
Per il video, postali su youtube e inviami il link alla casella info del blog.
Mauro
mi spiace ma adesso non trova la pagina completa e non posso inserire commenti ..
potresti postarmi lo sketch da lui utilizzato?
grazie
Dario
Autore
Ciao Dario,
purtroppo anche io come fai tu, se non risponde la pagina dovrai attendere che ritorni disponibile.
Non è un mio sito e non posso ricavarmi lo sketch se non funziona il sito.
Mauro
ciao Mauro , oggi volevo presentarti queste domande sorte da piccoli problemi
1- lo shield per xbee : devo prenderne uno specifico o non cambia (qualsiasi shield prendo )?
2- potresti chiarirmi a che pin di arduino sono collegati le due uscite del sensore di flessione (con relativa resistenza )?
3-una volta montato su arduino lo shield e il relativo modulo xbee (parte trasmittente credo)m la parte con i servomotori (ricevente) come devo montarla ?
ti ringrazio molto se deciderai di rispondere alle mie domande…
grazie , Dario
Autore
Ciao Dario,
provo a rispondere un quesito alla volta:
1. non tutti gli adattatori sono identici ma sono molto simili, scegline uno che abbia anche l’adattatore di tensione a 3,3v xchè Xbee funziona a 3,3v
2. Il sensore di flessione va collegato con un pin al negativo e l’altro ad un pin analogico da cui parte una resistenza di pari valore del sensore che va al pin positivo, come un partitore di tensione ( leggi articolo sul partitore di tensione)
3. se usi un modulo xBee collegato ad arduino per il trasmettitore dovrai averne uno anche per il ricevitore a cui colleghi i servo.
Mauro
caro mauro è da un po di tempo che non scrivo sul tuo forum e volevo dirti che presto vorrei pubblicare ( con il tuo consenso ) un video tutorial di un semplice braccio robotico semovente …
oggi volevo sapere se conosci un modo per risolvere un piccolissimo errore in cui mi sono imbattuto :
grazie ai tuoi tutorial ed i tuoi consigli sono riuscito a completare un piccolo braccio robotico utilizzando 6 piccoli servomotori da 9 grammi , senza trovare alcun tipo di problema di natura tecnica eccetto uno :
ho notato che se ad arduino collego un servomotore controllandolo tramite pulsanti ( con breadboard , collegamenti e sketch giusti ) il servomotore si muove , ipotizzando che metta come delay 6 , ad una certa velocità , ma , man mano che il numero di servomotori collegati ad arduino ed alla breadboard aumenta ( io sono appunto arrivato a collegarne sei senza problemi di sketch o tecnici ) la velocità di rotazione a cui mi riferivo prima quando ho citato il delay diminuisce nonostante il delay [ scusa la ripetizione 🙂 ] rimanga fisso , in questo caso sei .
fammi sapere se ho esposto chiaramente il problema e se c’è un qualsiasi tipo di ” soluzione “.
P.S.
ho già visto il tuo tutorial sui servo con movimento armonico ma mi chiedevo se ci fosse un modo per controllarli medesimamente ma impostando il grado . esempio se tengo tenuto premuto un pulsante si sposta in senso antiorario e viceversa .
grazie mille in anticipo .
Dario
Autore
Ciao Dario,
il rallentamento potrebbe essere dovuto alla mancanza di alimentazione adeguata, i servo li hai alimentati con una batteria esterna?
Il movimento armonico è possibile impostando anche un grado, tuttavia dovrai sviluppare lo sketch per farlo partendo da quelli pubblicati.
Mauro
come alimentazione uso o il mio pc portatile o il cavo di arduino collegato a una presa elettrica tramite uno spinotto usb.
Mauro salve come posso fare per far girare un servo di 360° invece di faro girare solo di esempio 45°?
Autore
Ciao Pasquale,
innanzitutto devi possedere un servo in grado di compiere i 360 gradi, se il tuo é di questo tipo dovrai leggere dal sito del produttore quali comandi inviare e quindi scrivere lo sketch.
Mauro
ciao mauro, sto utilizzando il tuo sketch per un progetto casalingo, ho modificato il tuo sketch perchè a me serve solo che i servo vadano da 0 a 90 e da 90 a 0. ora, il problema e che, a me serve che i servo, quando gli impartisco il comando, si muovano piu lentamente, potresti dirmi come posso risolvere questo problema? non so che parte di sketch devo modificare.. grazie in anticipo 😉
Autore
Ciao Matteo,
puoi aumentare il delay tra un ciclo ed il successivo, questo incrementa il tempo tra un grado ed il successivo.
Mauro
Ciao Mauro,
Io di arduino sono poco pratico ma grazie hai tuoi tutorial sono riuscito a muovere i servo solo che io vorrei muovere con un pulsante prima un servo a 90 gradi e pio dopo l’apertura del servo partisse anche l’altro dp di 90 gradi ripremendo il pulsante si chiude e si richiude e dp due secondi anche l’altro… Spero che hai capito xD
Autore
Ciao Umberto, se ho compreso ciò che vuoi realizzare é un movimento temporizzato. Ti consiglio di leggere i tutorial sui giochi di luce in cui troverai moti modi di temporizzare più uscite arduino. Nel tuo caso dovrai scatenare il primo evento alla pressione del pulsante e impostare i gradi dei servo invece di accendere luci.
Gentile Mauro
Sono un progettista meccanico e per 35 anni ho fatto appunto il progetista. Lavorando presso la Soc. Elettronica di Roma, operante nel campo della Difesa,mi sono anche occupato un pò di elettronica per hobby,qualche infarinatura cel’ho, ma non troppa ho fatto molti circuiti con master funzionanti, ma solo parterndo da schemi.Oggi avrei la necessità di muovere in X eY di pochi gradi, un videoproiettore montato a 4 metri di altezza e da vecchio aeromodellista ho subito pensato a dei servi comandabili via cavo.
Ho visto il tuo interessante articolo su questo argomento, ma purtroppo per realizzarlo avrei bisogno di uno schema elettrico a simboli,completo di tutto,collegamenti su Arduino e alimentazioni varie.
Puoi mandarmi qualcosa via mail, a lavoro ultimato ne farò partecipi gli amici del forum dandoti chiaramente il merito.
Cari saluti, e buon lavoro Claudio
Autore
Ciao Claudio,
con X ed Y intendi Pan e Tilt immagino per questa ragione parli di servo.
Su schemi per collegarli ne trovi a decine sul blog, ti consiglio l’articolo dedicato ai servo con alimentazione esterna che ha un semplice schema e garantisce più stabilità al progetto
Ciao mauro
ho provato a fare questo progetto, ma mi serviva che facesse muovere un solo servo sempre con tre pulsanti, quindi ho rimosso la parte del servo y. Una volta caricato però non succede niente… ho anche provato a usare lo sketch senza modificarlo ma stesso risultato. il montaggio sulla breadboard e lo stesso… come potrei risolverlo
Autore
Ciao Simone,
controlla che l’IDE non ti dia degli errori in fase di caricamento.
Ciao Mauro.
Ma anzichè un servo usassi un normale motorino dc va bene comunque?
Se si devo caricare comunque la classe ?
Grazie mille!
Ps: la casetta di Barbie è fatta! Mancano alcuni particolari ma mia figlia insiste: dov’è l’ascensore?!????
Autore
Ciao Claudio,
servo e motori Dc hanno caratteristiche differenti sia per meccanica che per controllo.
Ad esempio per un motore DC devi trovare un altro modo di controllare la posizione, magari con un encoder, e devi usare una motor shield o altro driver di corrente per motori DC.
Mi è tutto chiaro. Solo non capisco quel > 1000, Perché è versa se maggiore di 1000, perché quel mille? cosa è?
Autore
Ciao Paolo,
quando leggi da un pin analogico su arduino ottieni un valore da 0 a 1023 ( 10bit di conversione ) corrispondente a 0-5v a cui arriva ogni pin arduino.
Nella configurazione dei pulsanti come mostrato in questo esempio il pulsante premuto restituisce un valore prossimo ai 1023 ( +5v ) per cui > 1000 vuol dire premuto.
Maggiori dettagli li trovi negli articoli dedicati ad arduino ed i pulsanti nel corso arduino base on-line gratuito
Grazie ora mi è molto chiaro! Grazie mille!
Ciao Mauro,
mi chiamo Paolo, avrei da chiederti un piacere.. sto cercando di far comandare un servo motore con un pulsante, ma non riesco a capire come importare lo sketch del progetto
Avresti un paio di minuti per aiutarmi?
Grazie mille in anticipo
Ciao
Paolo
Autore
Ciao Paolo,
usa il copia e incolla dal blog al tuo IDE.
Se non sai usare l’IDE per programmare arduino puoi seguire il mio corso arduino gratuito on-line.
ciao mauro,
vorrei una dritta da lei…devo comandare un servo motore con due pulsanti, uno che gli fa fare un movimento verso destra e l’altro verso sinistra.. è fino a qua ci siamo..la dritta che voglio e… si può fare che quando io gli do l’impulso per esempio con il pulsante che lo comanda verso destra con un solo tocco di pulsante lui può andare per esempio( 120°) e ritornare al posto di partenza? e certamente lo deve fare anche con l’altro verso…se puoi darmi questo consiglio…aspetto tuo notizie..
Autore
Ciao Fabrizio,
se ho compreso bene vuoi poter premere un pulsante e raggiungere i 120°, si si può fare sostituendo i gradi attuali con quello a cui vuoi andare.
Buonasera Mauro, ho compilato uni sketch in cui tramite 2 pulsanti muovo a step un servo in senso orario o antiorario… vorrei mettere un terzo bottone in cui se premuto mi porti il servo a 90°, mi potresti aiutare che non ne vengo a capo? grazie
Autore
Ciao Gabriele,
con la medesima tecnica di controllo dei due pulsanti precedenti aggiungine uno che esegua solo il comando di posizionamento a 90°
Grazie mille Mauro per la risposta, sinceramente ci ho provato, manon riesco a dargli l’istruzione giusta probabilmente perché non si muove nulla..
prendo una riga del tuo sketch.. if ( analogRead( nextDX ) > 1000 ) { gradoDX++; } al posto del ++ per portarlo a 90° cosa è corretto scrivere?grazie
Autore
Ciao Gabriele,
devi impostare il gradoDX = 90; ti consiglio la lettura di un manuale c base per comprendere la sintassi del linguaggio, altrimenti qualsiasi modifica ti sembrerà impossibile da effettuare.
Ok grazie mille Mauro, inizio subito, comunque avevo provato ad inserire gradodx=90 ma non andava.. probabilmente ometto qualche passaggio..