Continua la serie di Tutorial sui servomotori (articoli precedenti su questo argomento Tutoria Arduino e i servo e Tutorial Arduino e i servo II ) prova a pilotare 6 servomotori:
Nella costruzione di un robot, ad esempio, è necessario che tu sappia pilotare più di un servo contemporaneamente, immagina il sistema di locomozione utilizzato dalla nasa per i rover Sojourner, Pathfinder e Opportunity, tale sistema è denominato Rocker-bogie in cui ciascuna delle 6 ruote necessarie alla locomozione si muove in modo indipendente.
Non ho la pretesa di realizzare un prodotto tanto complesso, come una sonda per marte ma un piccolo rover che sorrazzi per il giardino, magari con una telecamera di sorveglianza a bordo potresti aver voglia di provare a realizzarlo, in questo caso la rotazione delle singole ruote sarebbe affidata ad esempio a dei motori in corrente continua, ma la capacità di sterzare potresti gestirla con i 6 servomotori di cui parlo in questo articolo.
Finita la premessa passiamo allo sketch, premetto solo che questo è uno sketch di esempio a banco, ossia nulla che montato su un rover possa consentirgli di muoversi; è troppo embrionale come esempio.
Lo scopo dello sketch è pilotare i 6 servo impartendo dei comandi provenienti dalla porta seriale, ecco perchè ho parlato di test a banco, o scrivania se preferisci.
#include <Servo.h> Servo servoMotor2; Servo servoMotor3; Servo servoMotor4; Servo servoMotor5; Servo servoMotor6; Servo servoMotor7; int grad = 0; int gradMin=0; int gradMax=180; int servoPin2 = 2; int servoPin3 = 3; int servoPin4 = 4; int servoPin5 = 5; int servoPin6 = 6; int servoPin7 = 7; void setup() { servoMotor2.attach(servoPin2); servoMotor3.attach(servoPin3); servoMotor4.attach(servoPin4); servoMotor5.attach(servoPin5); servoMotor6.attach(servoPin6); servoMotor7.attach(servoPin7); Serial.begin(9600); } void loop() { grad = Serial.read(); Serial.println("Gradi: " + grad); if (grad < gradMin) { grad = gradMin; } if (grad > gradMax) { grad = gradMax; } int _grad = (gradMax - grad); servoMotor2.write( grad ); servoMotor3.write( grad ); servoMotor4.write( grad ); servoMotor5.write( _grad ); servoMotor6.write( _grad ); servoMotor7.write( _grad ); delay(15); }
linea 01: includi la classe Servo, è la classe che ti permetterà di pilotare in modo semplice i servomotori;
linee 03-08: inizializza 6 variabili come istanze della classe Servo, per non creare confusione tra i pin a cui hai collegato i servo e il nome dell’istanza puoi seguire il mio metodo: ciascuna variabile di istanza termina con il numero di pin a cui è connessa, nulla ti vieta di chiamare queste istanze diversamente secondo lo schema che hai deciso di utilizzare;
linea 10: imposta una variabile di tipo integer (intero) in cui memorizzerai il valore prelevato sulla seriale;
linea 11: imposta una variabile di finecorsa inferiore, il conetto di finecorsa in questo caso è più informatico che elettronico, in quanto non si tratta di un classico finecorsa elettromeccanico ma della sua traduzione informatica, ti serve per definire qule sarà il limite minimo (in gradi) che il servo potrà raggiungere, se nel tuo rover i servomotori non devono mai scendere sotto i 15° puoi impostare questo valore a 15;
linea 12: imposta una variabile di finecorsa superiore, definisci con questa variabile il grado massimo a cui i tuoi servo possono arrivare, vedreai in seguito meglio l’utilizzo di questa variabile nello sketch;
linee 14-19: imposta 6 variabili di tipo integer ciascuna con il pin a cui è collegato un servomotore, in questo modo sarà più semplice spostare un servo da un pin ad un altro se necessario senza cambiare tutto li sketch;
linea 21: imposta la funzione di setup();
linee 22-27: associa a ciascuna istanza dell’oggetto Servo che abbiamo definito nellelinee da 03 a 08 il pin a cui è collegato il servo, per farlo non utilizzare il numero di pin direttamente, sebbene sia possibile farlo, ma segui il mio esempio, utilizza una delle variabili (int) che hai definito alle linee dalla 14 alla 19, il vantaggio lo ritroverai qualora per esigenze di programmazione del tuo rover non potrai utilizzare gli stessi pin impostati inizialmente ma dovrai collegare i server a pin differenti;
linea 29: inizializza la comunicazione con la porta seriale a 9600 baud;
linea 32: definisci la funzione di loop(), eseguita ciclicamente da Arduino;
linea 34: leggi dalla comunicazione seriale il valore in gradi che impartirai ai servomotori;
linea 35: per sicurezza fatti printare sul monitor seriale il valore appena inviato;
linee 37-38: controlla che siano rispettati i finecorsa inferiore e superiore, in questo modo se il valore che immetti o che in uo sketch futuro ricaverai da altri movimenti e sensori, dovesse superare in basso o in alto i limiti impostati per i finecorsa, sarà lo sketch stesso ad effettuare la correzione impedendo il movimento dei servo oltre tali limiti, il problema in realtà non è di tipo meccanico, il servo oltre i 180° di rotazione massima e 0° di minima non si muoverebbe comunque, ma se nel tuo rover l’escursione minima fosse impostata a 15° oltre cui causeresti la rottura di un componente meccanico esterno al servo il finecorsa inferiore salverebbe il tuo rover, impedendo al servo di scendere sotto i 15° (se hai impostato a 15 la variabile gradMin) in pratica: il servo può muoversi da 0° a 180°, il tuo rover può supportare una rotazione da 15° a 165°, oltre si rompe, se imposti i finecorsa in modo corretto (min 15°, max 165°) anche se impartisci un grado di rotazione inferiore o superiore a quello possibile ( es.: 8° ) ottieni che il servo si ferma a 15°; se non ti è chiara questa parte, prima di rompere tutto, scrivimi 🙂
linea 39: questo è un piccolo trucco matematico che in fase dimostrativa ti permette di impartire un ordine in gradi ai tuoi servo e vedere la loro rotazione uguale solo a 3 a 3 e non per tutti e 6, ossia al comando 20° otterai che i primi 3 servo si posizioneranno a 20° mentre i 3 restanti si posizioneranno a 160°, giusto per rompere la monotonia del movimento, per farlo ho utilizzato la formula matematica banale: gradMax – grad: quando impartisci 0 il risultato è 3 servo a 0 e 3 servo a 180 (180 – 0 = 180), impartendo 90 tutti si posizionano al medesimo angolo di rotazione 90 (180-90 = 90) e impartendo 180 otterrai l’opposto dello 0;
linee 41-46: non resta che applicare a ciascun servo il suo grado di rotazione, ai primi 3 applico grad: il valore letto dalla porta seriale, ai secondi 3 applico _grad: lopposto del valore letto, calcolato con la formula della linea 39;
linea 47: imposto un delay di 15 millisecondi per consentire a ciascun servo di mettersi in posizione.
Questo è solo un semplice esempio di come puoi pilotare più servo, come avrai letto, sia nei miei articoli precedenti che sul sito ufficiale della classe Servo questa è in grado di pilotare 12 motori contemporaneamente con Arduino duemilanove o Arduino uno e 23 con Arduino Mega.
Buon lavoro
87 commenti
Vai al modulo dei commenti
ciao!ho in mente di fare un braccio robot,però invece di pilotarlo solo con potenziometri mi piacerebbe impartigli dei comandi in modo che si muova da solo,come un robot industriale. è questo il tutorial giusto? in tal caso non ho capito come impostare i gradi che desidero impartire ai servi. grazie Mauro per il tutorial.
Autore
Ciao Danilo,
si il tutorial è giusto, guarda anche gli altri due articoli citati, sono una buona introduzione per quello che vuoi fare.
i gradi che desideri impartire li puoi ottenere con il metodo write( grad ) applicato all’oggetto servo che vuoi ad esempio servoMotor2.write( 20 ); applica 20 gradi al servo connesso al pin 2.
Mauro
grazie Mauro,sempre chiarissimo e rapido.
ciao Mauro. finalmente ho finito di costruire il mio primo braccio robotico.Adesso non mi resta altro che programmarlo per farlo muovere automaticamente. però ho delle perplessità per quanto riguarda lo sketch, potresti darmi un aiuto? Intanto potrei inviarti anche delle foto del “braccio” per gli amici del sito. come posso inviartele?
Autore
Ciao Danilo,
mi fa molto piacere e se posso darti qualche dritta lo faccio volentieri, come pubblicare il tuo progetto.
Inviami le foto all’indirizzo email che trovi nei contatti del blog.
Mauro
ciao,
non ho trovato un contatto email,solo facebook.Caricherò li le foto. Comunque il mio progetto consiste semplicemente di usare il braccio per fargli fare delle manovre,come prendere un oggetto spostarlo o agitare la pinza per salutare..cose cosi.Ho trovato questo tuo tutorial, ma non so come sfruttarlo. come posso impostare una serie di gradi ad ogni servo,in modo da eseguire i comandi in serie ,cioè uno dopo l’ altro. mi servirebbe uno sketch concreto con i gradi già inseriti per farmi un idea. poi per calibrare i gradi con i movimenti è solo questione di tempo.Grazie,danilog
Autore
Nella pagina in cui hai trovato il contatto FB c’è anche il mio indirizzo email.
sto facendo delle prove con myservo.write(pos)
delay(ms)
sembra gestibile cosi, dando ordini e ritardi.
Autore
Ottimo Danilo,
sapevo che leggendo i tutoria e sperimentando saresti riuscito.
Come vedi la classe Servo è molto semplice e il metodo write( gradi ) fa proprio quello che occore a te.
Sul blog trovi tanti altri modi di dare input ad Arduino come i potenziometri molto utili in progetto come il tuo per guidare il braccio.
Mauro
si infatti già ho fatto un telecomando primitivo con dei potenziomentri. molto divertente comandare il braccio tramite i pot. però alcune volte si accendeva e sopegneva la scheda arduino in continuazione facendo impazzire il dbot. forsè può essere a qualche contatto tra i fili dei potenziometri oppure un carico troppo pesante per il bot? non so ancora spiegarmelo questo.
Autore
Ciao Danilo,
penso sia più probabile un falso contatto tra i collegamenti.
Prova a togliere il 50% dei servo e osservare se si verifica ancora, oppure attiva il monitor seriale e nello sketch fatti inviare qualche messaggio sui dati letti e inviati.
Mauro
ciao Mauro,
ho notato che durante il funzionamento del mio robotic arm molto spesso la scheda arduino si resetta, ho pensato e sono sicuro che è un problema di alimentazione. per alimentare 5 servi e un led, non basta l uscita 5 v di arduino a bassa corrente. credo che un pacco batteria 6V e 1200mah sia la mia soluzione al problema , oppure un bel alimentatore variabile. Cosa ne pensi? d’altronde ogni servo necessita di 180-220mah circa.
Autore
Ciao Danilo,
ho aggiunto il tuo commento all’articolo in cui mi hai scritto la prima volta per condividere quello che ci raccontiamo con tutti gli appassionati.
In merito al tuo problema, ricorda che Arduino gestisce 40/50mA sulle sue uscite, se hai utilizzato dei servo che richiedono maggiore potenza dovrai costruirti una shiled di interfaccia adatta.
Mauro
Ciao Mauro, sto usando 3 servi con Leonardo alimentati separatamente e comandati via cavo lungo 10m. I servi sono Hitec, la massa l’ho messa in comune, lo sketch è banalissimo:
pos2 = analogRead(potpin2);
pos2 = map(pos2, 0, 1023, 0, 179);
myservo2.write(pos2);
ripetuto per i tre servi con settaggi di rotazione specifici per ognuno. Non ho messo il delay: con o senza non mi pare che ci siano differenze.
Il tutto funziona benissimo, tuttavia riscontro dei leggerissimi “scatti anomali”, cioè a potenziometri fermi i servi è come se ricevessero comunque degli impulsi, muovendosi di uno/due scatti (gradi?).
Interferenze? con l’alimentazione separata non dovrebbe essere questo il problema…
Modificare il software?
grazie per l’aiuto
Autore
Ciao Daniel,
così come lo hai descritto sembra un problema imputabile o alle interferenze, 10m di cavo ne raccolgono parecchie o alla qualità dei servo.
Puoi escludere la seconda provando con cavi molto più corti.
Mauro
qualità dei servo buona (Hitec, altrimenti quali?) cavo corto = stesso problema……
Autore
Io uso i Futaba e non ho mai avuto problemi simili a quelli che mi hai segnalato, non dico che la Hitec non sia buona ma solo che potrebbero essere un modello di server meno qualitativo.
Hai visto i miei video, non ci sono sfarfallii dei servo.
Per essere certo di quello che accade dovresti disporre di un oscilloscopio e controllare l’onda di uscita da Arduino verificando se ci sono segnali sporchi sulle uscite.
Mauro
Ciao Mauro,
complimenti per il tutorial, spiegato molto chiaro.
Ho in mente, progetto finale di studi, di fare una cnc fresa controllata con arduino.
Per fare il disegno di taglio, con scketh up. Per tradurre le coordinate, mach3….
Come posso adattare i codici da mach3 a arduino e controllare i motori?
grazie
Autore
Ciao Alberto,
sul blog ci sono degli articoli dedicati ai motori passo-passo ed un articolo dedicato ad una Cnc realizzata da Paolo, utente e appassionato, proprio per un progetto d’esame.
So che esistono delle librerie che leggono GCODE e pilotano i motori passo-passo.
Ovviamente se vorrai pubblicare il tuo lavoro dopo l’esame a me farebbe piacere darti visibilità attraverso il blog.
Mauro
Ciao devo realizzare per la maturità un progetto del genere http://www.youtube.com/watch?feature=endscreen&NR=1&v=B68lK_W1WCo mi potresti aiutare nella programmazione e nel realizzare questa mano?
se volessi pilotarla con la mia mano dove sono installati dei sensori flessibili cambia la programmazione?
Autore
Ciao Davide,
il progetto che vuoi realizzare è interessante.
Ti consiglio di leggere gli ultimi articoli pubblicati troverai parte del progetto già realizzato da un appassionato.
Siccome è un progetto per la tua maturità ti aiuterò ma non scriverò il codice, quello vorrei che lo facessi tu, io ti darò le linee guida e ti consiglierò gli articoli che puoi leggere.
Mauro
Se ti servono delle info eccomi visto che sò più elettronico che informatico
stavo improntando anche io una cosa del genere la parte sensori e software è già fatta… manca lo scheletro XD
comunque quei sensori sul guanto non sono altro che sensori di flessione (lo trovi nello store di futura ellettronica 7300-FLEXSENSOR) si comportano più o meno come un normale potenziometro che aumenta o diminuisce i lvalore della resistenza interna in base al grado di flessione.
come codice da utilizzare in arduino non è altro uguale a qualunque altro che controlla i servomotori con potenziometri bisogna solo calibrarli a dovere in quanto quelli di futura elettronica hanno questi valori sensore non curvato: 9 kohm, curvato di 90°: 14 kohm, curvato di 180°: 22 khom. da realizzare non ci vuole molto è più la parte meccanica che un casino
Autore
Ciao Raffaele,
grazie per il tuo contributo.
La parte meccanica puoi leggerla in uno degli ultimi articoli del blog.
Mauro
ciao Raffaele, i sensori di flessione sono attaccati insieme a un oggetto che non so cosa è, sai dirmi che è? e come fare??
ciao , per prima cosa grazie per l’esempio dei 6 servo , ma non ho capito come spedire i comandi via seriale .
grazie.
Si può avere un esempio di cosa scrivere , che strumento usare ….
Autore
Ciao Adrian,
la comunicazione Seriale la apri alla linea 29, prova a leggere la spiegazione dello sketch riportata nell’articolo.
Come interfaccia puoi usare il monitor seriale dellIDE arduino, se non sai dove si trova prova a seguire tutti i tutorial della pagina corso arduino: https://www.mauroalfieri.it/corso-arduino
Mauro
ciao senti ho cambiato idea e adesso non uso più i pulsanti ma lo faccio automatico però come solito ho trovato problemi ho copiato lo steck di questa tua descrizione tale e uguale ma mi dice (servo does not name a type) quando faccio la verifica e si evidenzia (Servo servoMotor2;) nn riesco a capire perchè sia sbagliato a te risulta giusto ???
Autore
Ciao Danilo,
l’errore mi dice che non hai la classe Servo installata o non la legge correttamente.
La classe Servo esce con l’IDE Arduino, verifica che sotto le libreria vi sia, prova uno degli esempi forniti con Arduino in merito ai servo.
Mauro
aspetto non ho capito cosa mi manca a me io ho scaricato normalmente il programma dal sito di arduino, vuoi dire che devo scaricare qualcosa e se si cosa scusa non ho capito bene ????
Autore
Ciao Danilo,
ti manca la classe Servo.h che è inclusa in alto nello sketch.
Hai provato ad eseguire il codice di esempio, fornito con l’IDE arduino, per i servomotori?
Mauro
ho provato a carica un esempio ma di dice che c’è un problema nel caricare il programma cosa devo fare ????
scusa ancora ma ho letto un po in giro che dovrei avere la libreria servo nella cartella di arduino ma non so perchè nella cartella di arduino io ho solo una cartella con scritto libraries e dentro non c’è nulla come faccio a scaricare la libreria servo ???
Autore
Ciao Danilo,
è quello che continuavo a dirti io.
Probabilmente hai scaricato una versione incompleta dell’IDE Arduino, riscaricalo dal sito arduino.cc
Mauro
Ciao mauro,
Sono un principiante e non ho capito una cosa. Utilizzando la breadboard, visto che tutti i servo hanno in comune i 5v come faccio a collegarli su essa?
Scusa x la domanda stupida!
Ciao
Autore
Ciao Davide,
le breadboard ci sono di tanti tipi, alcune hanno solo connessioni in un verso, altre hanno alcune file connesse tra loro perpendicolarmente al lato lungo, ed altre ( di solito 2 file ) connesse parallelamente ai due lati lunghi.
Se hai una breadboard di questo tipo sono proprio le file orizzontali che devi utilizzare per l’alimentazione.
Considera di fornire ai servo un’alimentazione esterna, la trovi descritta in molti tutorial sul blog, in quanto arduino potrebbe non riuscire ad alimentare più servo insieme.
Mauro
Buongiorno Mauro
Ho realizzato senza difficoltà il” TUTORIAL ARDUINO E I SERVO III” usando però soltanto tre motori (tale è il numero che avevo a disposizione oggi) modificando opportunamente lo sketch (vedi in fondo). Tutto bene fino a un certo punto.
Aprendo il monitor seriale, appare soltanto la scritta “Gradi:”che scorre in velocissima sequenza senza nessun’altra indicazione numerica. Se provo ad impatire qualche istruzione dalla riga dei comandi (un numero di gradi), l’operazione viene eseguita dai motorini ma contemporaneamente si blocca la porta seriale.
Dove ho sbagliato?
Ti ringrazio per quanto vorrai rispondermi e anche per tutto quello che ho imparato finora dalle tue pagine.
#include
Servo servoMotor2;
Servo servoMotor3;
Servo servoMotor4;
int grad = 0;
int gradMin=0;
int gradMax=180;
int servoPin2 = 2;
int servoPin3 = 3;
int servoPin4 = 4;
void setup() {
servoMotor2.attach(servoPin2);
servoMotor3.attach(servoPin3);
servoMotor4.attach(servoPin4);
Serial.begin(9600);
}
void loop()
{
grad = Serial.read();
Serial.println(“Gradi: ” + grad);
if (grad gradMax) { grad = gradMax; }
int _grad = (gradMax – grad);
servoMotor2.write( grad );
servoMotor3.write( grad );
servoMotor4.write( _grad );
delay(15);
}
Autore
Ciao Walter,
Nel tuo sketch c’é forse un errore nell’If non ne sono certo xchè potrebbe essere dovuto al codice incollato nel commento che non riesce a visualizzarsi correttamente.
Mauro
Salve: sono nuovo.in questo settore anzi ho appena comprato una scheda arduino uno.. volevo chiederti se era possibile o quando meno come fare a far funzionare una elettroguida di una fiat seicento ,sono possessore di una elettroguida sprovvisto di centralina ,se era possibile farla funzionare con il sensore della elettroguida stessa.sto costruendo un prototipo fiat 126 motorizzato motociclo …te ne sarei grato se mi potessi cosigliare in proposito e se puoi rispondermi direttamente sulla mia e-mail.
distinti saluti…ciao
Autore
Ciao Felice,
purtroppo non so come sia fatta una elettroguida e che tipo di sensore abbia.
In generale ho elimintao il tuo indirizzo email dal commento per evitare che tu sia vittima di migliaia si spam, è buona regola che tu non metta il tuo indirizzo email nei commenti di un blog.
Il tuo indirizzo lo vedo comunque in quanto compilato nel campo corretto e non lo rendo pubblico in questo modo.
In merito alla risposta via email preferisco che tutte le conversazioni siano pubbliche perchè il tuo dubbio e le mie risposte possono essere utili ad altri accrescendo le conoscenze di tutti.
salve, avrei bisogno di comandare due microservi, che alzano e abbasano una sbarra, attraverso arduino. Tutti e due hanno le stesse seguenti funzioni:
ai piedini devo collegare due impulsi, uno per farla alzare e una per farla abbassare.
Di conseguenza arduino dovrebbe far fare una rotazione di 90 gradi in positivo all’impulso di apertura, mentre dvrebbe poi tornare in posizione 0 quando gli arriva l’impulso di chiusura.
Le chiedo quindi cortesemente consigli sulla programmazione.
Tutto ciò mi serve per realizzare un parcheggio automatico per l’esame di maturità di elettrotecnica quindi di elettronica ci acchiappo veramente poco.
Grazie Mille
Autore
Ciao Marco,
se cerchi nel blog troverai tanti articoli sui servo, cerca “servo e pulsanti”
Mauro
Salve,
vorrei chiedere un informazione, ho creato un circuito con arduino che mi attiva due servomotori con un led che si accende quando è in chiusura (serve per un elmo) mentre i led si spengono quando i servomotori sono “aperti”. Il problema nasce dal fatto che capita sia in apertura che in chiusura che uno dei servomotori (si alternano) anche se a riposo continuano a lavorare come sotto sforzo (e non dovrebbero farlo) andando anche a surriscaldare chiaramente il servomotore e la piastra arduino…
Ora non capisco se è un problema di codice (è quello più probabile) oppure di collegamenti.
Ho fatto delle prove con altri due servo motori e questi qua non vibrano…quindi veramente non mi capacito della cosa.
Il codice sarebbe questo
#include
Servo myservo; // create servo object to control a servo
Servo myservo1;
const int buttonPin = 2; // the pin that the pushbutton is attached to
const int ledPin = 5; // the pin that the LED is attached to
int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button
int ledState = 0; // remember current led state
int pos = 0; // variable to store the servo positions
int pos1 = 180;
void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
myservo1.attach(10); // attaches the servo on pin 10 to the servo object
pinMode(buttonPin, INPUT); // initialize the button pin as a input
pinMode(ledPin, OUTPUT); // initialize the button pin as a output
}
void loop()
{
buttonState = digitalRead(buttonPin); // read the pushbutton input pin
if (buttonState != lastButtonState) // compare buttonState to previous state
{
if (buttonState == 1)
{
if(ledState == 1)
{
delay(30); ledState = 0;
for(pos = 0; pos = 0; pos1 -= 10) // goes from 180 degrees to 0 degrees
{ // in steps of 10 degrees
myservo1.write(pos1); // tell servo to go to position 'pos1'
}
delay(15); // waits 15ms for the servo to reach the position
}
else
{
delay(30); ledState = 1;
for(pos = 180; pos >= 0; pos -= 10) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position 'pos'
}
for(pos1 = 0; pos1 <= 180; pos1 += 10) // goes from 0 degrees to 180 degrees
{
myservo1.write(pos1); // tell servo to go to position 'pos1'
}
delay(1000);
}
}
lastButtonState = buttonState; // remember the current state of the button
}
// turns LED on if the ledState =1 or off if ledState = 0
digitalWrite(ledPin, ledState);
myservo.write(pos); // goes from 0 degrees to 180 degrees
myservo1.write(pos1); // goes from 180 degrees to 0 degrees
delay(20);
}
Potreste darmi un consiglio? Grazie
Autore
Ciao Matteo,
prova a non arrivare agli estremi dei servo ossia a 0 ed a 180 gradi, imposta magari 10 di angolo minimo e 170 di massimo.
La vibrazione potrebbe essere dovuta anche al peso dell’elmo da sostenere, se il servo solleva una parte dell’elmo questa tenta di ritornar giù per gravità ed il servo deve opporsi alla gravità causando lo sforzo.
Mauro
Salve Sig.Mauro, cerco un tutorial che spiega come controllare un servomotore con arduino ma dal PC. Non sono sicuro se è possibile utilizzare il serial monitor(con la funzione “serial.read”) o è opportuno utilizzare un software che mandi le info sulla porta seriale(quella su cui c’è arduino)tipo python o processing.
Autore
Ciao Giorgio,
Grazie per il Sig. Lo apprezzo, ma il blog é informale e tra appassionati ci diamo del tu 🙂 puoi fare altrettanto.
In merito alla tua domanda io penserei all’uso del Serial.read() per leggere dalla seriale i valori che gli invii con il Pc.
Dal Pc puoi scegliere se utilizzare il monitor seriale o un linguaggio di programmazione per inviare i comandi, dipende da che comandi vuoi inviare e sopratutto a quale velocità.
Mauro
Ok, ti darò del tu…era solo perché io sono un neofita e tu sei un maestro nel settore.
I comandi che vorrei mandare dal monitor seriale sono quelli che servono per pilotare un servo standard Hitec.
Non esistono spiegazioni in merito? Finora ho trovato solo esempi dove Arduino manda segnali al monitor seriale, ma non viceversa.Un solo esempio ho trovato dove con i tasti F!,F2,F3,ecc. posso variare la velocità di un motore Dc, ma col monitor seriale niente…Ti saluto e attendo tua risposta
Autore
Ciao Giorgio,
siamo tutti appassionati arduino e questo ci pone sullo stesso piano.
Per il tuo progetto ti consiglio di leggere i miei articoli sulla comunicazione seriale e poi scriverti il tuo codice ad-hoc, dubito che esista qualcosa di già scritto che risponde esattamente al tuo progetto arduino, del resto é proprio la parte divertente di questa passione poter scrivere sketch nuovi che nessuno ha ancora scritto 🙂
Mauro
Ciao Mauro complimenti per le guide! Volevo chiederti se sapevi spiegarmi come mai i servi funzionano anche sulle porte non pwm…
Ti ringrazio e continua così!!!
Dome
Autore
Ciao Domenico,
mi cogli impreparato dovrei provare, per definizione i servo sono controllati in PWM tuttavia è possibile simulare il PWM via Software come ho fatto io nel tutorial in cui descrivo l’uso della libreria SoftPWM.
Mauro
Ciao Mauro!
Prima di tutto ti ringrazio per il blog che porti avanti perchè grazie ai tuoi tutorial sono riuscito a fare i primi progetti con Arduino, sei uno dei pochi (o forse l’unico) che dedica una cosa del genere ad Arduino e in ITALIANO.
Volevo chiederti: lavorando con due servo ho sempre utilizzato l’alimentazione di Arduino per uno e un portabatterie da 4 AA (quindi 6 volt) ed è sempre funzionato bene. Ora che sto lavorando ad una sorta di “braccio robotico” (mi son fissato, spero di farcela), e devo alimentare almeno 3 servo, cosa mi consigli?
Compro un altro porta-batterie da 4 AA e lo aggiungo in seriale? O in parallelo? E se dovessi alimentarne 4?
Mentre per quando riguarda Arduino basta l’USB, giusto?
Scusa per la serie di domande, spero mi potrai aiutare!
Grazie mille 🙂
Alessandro
Autore
Ciao Alessandro,
ti consiglio di leggere il mio articolo su come alimentare più servocomandi ed arduino.
Nel tuo caso specifico puoi usare anche la medesima fonte di alimentazione a 4 pile per tutti i servo, certo si esaurirà prima.
Se vuoi collegare più pacchi da 4 pile devi farlo in parallelo e non in serie per non bruciare arduino ed i servo.
Se alimenti tutto esternamente puoi alimentare anche arduino con una pila da 7-12v
Ciao Mauro,
ho un problema e da un pezzo giro nel tuo forum.Da poco ho preso l’arduino rev3 sono poco esperto nel campo sono riuscito a farmi un circuito e funziona tutto solo che mi infastidisce una cosa…vorrei scriverti in privato nella mail per spiegarmi meglio ed anche perchè capisco di non incollare sketch nei commenti.
Umberto
Autore
Ciao Umberto,
comprendo la tua voglia, tuttavia ho deciso di riservare l’email ai progetti su commissione in quanto non riesco a leggere, provare e correggere tutti gli sketch che ciascun appassionato e visitatore del blog vorrebbe inviarmi.
Comprenderai che essendo io uno e voi più di 1500 al giorno non ce la posso fare.
Se hai dei dubbi specifici relativi ad un articolo ti prego di usare i commenti e chiedere informazioni relative a dubbi sull’articolo.
Ciao Mauro
per prima cosa ti vorrei ringraziare per avere fatto questo corso di arduino che mi sta aiutando veramente tanto. Ho avuto dei problemi in questo progetto e in particolare sul invio di input dal pc ad arduino, quindi non riesco a comunicargli la posizione del motore . Ho inoltre provato ad usare la funzione Serial.read() anche in altri esempi per pilotare il valore di un led, ma non sono riuscito comunque a risolvere il problema. POtresti darmi una mano per risolvere tale probleme.
un saluto
Autore
Ciao Giuseppe,
da quanto mi scrivi comprendo che le tue difficoltà nascono principalmente dalle conoscenze sulla comunicazione seriale tra Pc ed arduino.
Ti consiglio di leggere i miei articoli in cui parlo di comunicazione seriale e XBee per approfondire l’argomento e se qualcosa dei miei articoli non ti è chiara commentali pure chiedendo.
Mauro
Ma se volessi mettere il servo in una posizione e dopo un numero di secondi cambiare posizione come faccio, visto che il delay è indispensabile nel loop per poter rientrare ciclicamente e farlo muovere ogni 15 millisecondi….
Autore
Ciao Paolo,
di delay puoi metterne più di uno se vuoi.
Io ne metterei uno dopo ogni spostamento che desidero venga mantenuto per un determinato numero di secondi.
Salve Mauro vorrei chiedere un informazione sulla libreria servo.h, ho letto questo articolo e alla fine hai citato che la libreria in uso puo pilotare 12 servomotori , ho intenzione di costruire un braccio robotico e possiedo arduino uno avendo 6 pwm a disposizione ma manca l’ ultimo servomotore, con la libreria servo.h posso inserire il mio settimo servomotore inserendo il segnale del servo nel pin digitale di arduino? , vorrei usare lo stesso funzionamento dei pwm per dare una maggiore stabilita al servo, e non avere il segnale in digitale cioè 0 e 1;
Grazie per l’aiuto.
Pasquale.
Autore
Ciao Pasquale,
nella documentazione ufficiale della libreria Servo.h puoi leggere:
“The Servo library supports up to 12 motors on most Arduino boards and 48 on the Arduino Mega. On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins. On the Mega, up to 12 servos can be used without interfering with PWM functionality; use of 12 to 23 motors will disable PWM on pins 11 and 12.”
Per cui puoi usare con arduino uno 12 servo rinunciando al controllo via PWM dei servo.
Grazie mille per l’informazione .
ciao, sono neofita, però mi piacerebbe imparare e purtroppo ho acquistato ArduinoDUE e mi sono resa conto dopo che sarebbe stato meglio acquistare ArduinoUNO.
Vorrei comprare un servo e ne ho adocchiato uno, che ha range voltaggio 4,5 – 6V, ma avendo arduinoDUE, che va a 3,3V, non posso collegare direttamente il servo ad Arduino, come nell’immagine che hai messo tu. Devo alimentarlo separatamente immagino con una batteria dedicata?
grazie 1000
Autore
Ciao Luis,
il problema non è solo l’alimentazione che potresti dare al servo in modo separato senza grandi difficoltà, è piuttosto il pin di controllo che lavora a 3,3v ed i servo si aspettano un controllo a 5v.
Penso che la cosa migliore sa cercare una scheda di controllo per servo che possa essere compatibile con Arduino Due
Ciao volevo chiederti una cosa… Ma nel caso io costruisca un piccolo robot quadrupede con 8 servomotori e a questo robottino volessi collegare dei sensori di prossimità, come si fa? Grazie in anticipo 😉
Autore
Ciao Emanuele, puoi collegare i sensori come descritto dal produttore del sensore stesso, ad esempio nel blog trovi spesso usati i sensori sharp (IR) o il sensore ad ultrasuoni. Tu che sensore vuoi utilizzare?
Ciao.
Quando noi colleghiamo un servomotore e usiamo un comando del tipo:
int mot = Servo.read() dovrebbe registrare nella variabile mot un valore che rappresenta l’angolo del servomotore. Se non sbaglio viene effettuata una lettura dal potenziometro associato al servomotore.
Nel caso in cui noi colleghiamo più di un servomotore, lo stesso comando cosa registra nella variabile mot? Un angolo? una serie di angoli associati a ciascun servomotore?
Grazie.
Autore
Ciao Davide,
ti consiglio di leggere bene i miei tutorial del corso base e cercare di capire come funziona la comunicazione seriale, la lettura dei segnali analogici ecc..
Grazie per la risposta. I due link che ho trovato in questa pagina, portano al medesimo tutorial sui segnali analogici e digitali. Mi potresti lasciare un link del tutorial sulla comunicazione seriale?
Grazie.
Autore
Ciao Davide,
sono tutti nel corso base gratuito che trovi nel blog.
ciao e complimenti per la competenza.
è un po che ti seguo mi sono avvicinato da poco a questo mondo, per hobby ho il modellismo dinamico.
questo inverno ho realizzato una barca da pesca radiocomandata con 3 canali (timone motore e sgancio lenza)
vorrei realizzare una sorta di pilota automatico con gps (sarà lunga sono solo agli inizi)
ho capito come comandare un servo con arduino fin qui tutto bene ma se volessi leggere un segnale da una ricevente radio e processarlo con arduino come posso fare?
es ricevo il segnale su un pin dalla ricevente,
comando un servo pari pari su un altro pin.
ti ringrazio anticipatamente maurizio
Autore
Ciao Maurizio,
puoi leggere come ho fatto io negli articoli dedicati al “Rover Leo Wirc” in cui uso una ricevente speciale “WiRc” che si connette ad un Ipad inn WiFi ma il concetto ed i comandi sono identici.
Ti consiglio, come leggerai nell’articolo, una Genuino Leonardo, come scheda.
Ciao Mauro,
Volevo chiederti una cosa, una cortesia.
Io vorrei fare un programma del genere, pilotando due servo contemporaneamente pero ad ognuno vorrei collegare un sensore ad ultrasuoni (hc-sr04) e vorrei farli muovere solo quando ogni rispettivo sensore rileva un movimento, un po’ come a simulare il casello stradale, che si alza solo quando c’è una macchina davanti, potresti aiutarmi gentilmente con il codice che sono giorni che sto impazzendo ma non riesco a trovare una soluzione. Se puoi aiutarmi ti ringrazio davvero tanto.
Autore
Ciao Riccardo,
posso aiutarti certamente consigliandoti di leggere sia gli articoli del corso base arduino gratuito on-line sia quelli specifici sui sensori di distanza sia dei servomotori.
Non ricordo di aver mai provato un HC-SR04 ma dovresti trovare degli articoli sul suo fratello maggiore HC-SR05
Ciao Mauro,
innanzitutto complimenti per i tutorial.
Però ho un problema… come anche a “bufalo” che scrisse il “19 maggio 2013”, ho provato questo sketch, ma avendo un solo motore, l’ho modificato per far funzionare il tutto con un solo motore.
Il problema è che mi scrive sul monitor solo “Gradi: “, ma nient’altro. Quando vado ad inserire un valore numerico… es 90, i servi accennano un movimento, ma poi tornano alla posizione iniziale immediatamente.
Ti incollo qui sotto lo sketch:
[[ codice rimosso in automatico ]]
Potrebbe essere che non funziona perché il servo è connesso al pin 9?
Autore
Ciao Diego,
innanzitutto ti chiedo la cortesia di rispettare le due semplici regole riportate in fondo ad ogni articolo e non incollare codice nei commenti, viene rimosso in automatico.
In realtà rileggendo lo sketch un errore c’è: il Serial.read() legge solo un carattere in arrivo dalla seriale e ti basta scriver ” 90″ perchè legga solo ” ”
Prova a modificare lo sketch leggendo un buffer da 3 caratteri, eliminare gli spazi vuoti e trasformare il tutto in int.
Un consiglio: sul blog trovi molti articoli dedicati ai buffer letti sulla seriale.
Ciao!
Scusami per aver messo il codice! Sono sincero non l’ho letta proprio questa regola… Mi è sfuggita!
Grazie per il consiglio! Ora provo a sistemare! Grazie!!!
Buonasera Mauro, sono un novizio con Arduino e la robotica ma nonostante questo ho promosso una iniziativa in una mia classe, dove insegno fisica, per costruire e poi far gareggiare dei line-follower.
Ho tante domande su come controllare i servo che abbiamo comprato ( SERVOSM S4303R ), ma prendo spunto dai tuoi tutorial per iniziare a chiederti, approfittando prima di tutto della tua disponibilità, poi della tua gentilezza ed infine della tua autorevolezza,
quale sia la differenza fra” motori in corrente continua” e “servomotori”;
e se è possibile controllare la velocità di rotazione dei nostri S4303R, che dovranno equipaggiare i nostri line-follower per dar loro modo di seguire la linea tracciata sul pavimento nella maniera più veloce possibile.
intanto grazie molte
nicola nigro
Autore
Ciao Nicola,
bellissima iniziativa.
Spiegare in un commento la differenza mi è complesso e rischio di creare più confusione, terrò un corso di due serate domani ( martedì 28/02 e giovedì 2/03 ) proprio sui motori a Milano, se sei in zona ti consiglierei di partecipare per parlarne in presenza.
Nel tuo caso ciò che è importante i servomotori sono dotati solitamente di circuiteria interna che gli consente di essere controllati da arduino o genuino in modo diretto.
Solitamente i servomotori a rotazione continua, come quelli che mi hai indicato, consentono il controllo della velocità di rotazione.
Purtroppo non ho mai utilizzato il modello specificato per poterti fornire ulteriori informazioni e non ne possiedo un modello per eseguire dei test.
Ciao Mauro, da poco mi sono avvicinato al mondo Arduino e relativa programmazione. Ho già visto ed utilizzato diversi codice sorgente relativi ai comandi di servi, purtroppo non riesco a trovare uno sketch adatto alle mie esigenze. Vado a spiegarmi meglio, devo utilizzare un servo per movimentare una piattaforma, per la precisione un orologio a cucù, ma purtroppo trovo solo delle sequenze non adatte. Quello che serve a me è un movimento da 0° a 180°, una pausa di circa 15 sec e relativo movimento da 180° a 0° il tutto azionato da un pulsante e senza loop, la sequenza si riattiva al premere nuovamente il pulsante. Riesci a darmi qualche delucidazione o dritta in merito? Grazie anticipatamente.
Autore
Ciao Gaetano,
è molto semplice quello che ti occorre, puoi iniziare studiando dal mio corso arduino gratuito on-line le lezioni sui servo e sui pulsanti e poi combinarle in modo da far funzionare il tutto.
Prova a leggere anche gli articoli sui passaggi a livello per trenini elettrici sono dal funzionamento molto simile a quello che ti occorre.
Ciao Mauro, sono Davide volevo comandare un motore stepper per azionare una pompa e dosare su richiesta la quantita di prodotto. Come posso controllare la posizione del motore su piu giri di rotazione?
La quantita dosata è funzione della portata della pompa. Mi fai sapere dove posso trovare articoli su questo argomento.
Grazie mille
Autore
Ciao Davide,
articoli dedicati all’argomento sono troppo specifici per essere trattati.
Quello che puoi trovare è come controllare un motore stepper, non in questo articolo.
Aggiungi il commento in un articolo più adatto e proverò a darti dei suggerimenti in funzione dell’articolo che commenterai.
Bungiorno
vorrei chidere un parere , vorrei cotrure un bracco meccanico a 4 servo motori comandandoli con 4 potenziometri da 10k , secndo voi e megli usare una alientazine dedicata ai servo o poso usare la solita
dei potenziometri?
grazie
Autore
Ciao Marco,
per alimentare i servomotori io preferisco sempre utilizzare una alimentazione separata nei progetti.
Discorso differente per un test o per i tutorial in cui trovi che l’alimentazione dei servo la prelevo, a volte, da Arduino.
Scusa Mauro….sono interessato allo sketch riportato sopra per un mio progetto di diversa natura.
L’ ardware in mio possesso e’ cosi’ composto : Atx 5v 15-20A che alimenta una PCA9685 a cui sono collegati 6 servomotori
MG996r pin 0….5. Fa seguito una scheda arduino 1 collegata alla PCA9685 e cavo usb da collegare al pc.
Indico il mio problema!
#include oppure #include ?
#include e’ d’obbligo , e dovrebbe richiamare in automatico l’indirizzo 0x40 !
C’e’ altro a cui bisogna pensare ?
Ho notato che non riporti alcuno sketch d’esempio con scheda pca . E’ giusto ? o non ho guardato bene nei tuoi
tutorial?
Ti ringrazio fin da ora se vorrai rispondermi e sappi che sono un tuo assiduo lettore perche’ quello che contraddistingue i tuoi tutorial e’ la spiegazione riga per riga degli sketch che pubblichi.
Un’ altra cosa importante e’ che i tuoi sketch funzionano davvero!!!!!!Non si puo’ dire lo stesso di altri !! Mi chiedo perche’ …. alcuni non li verifico neanche su Arduino perche’ ”intenzionalmente” errati , anche se provenienti da esperti che realmente hanno pubblicato guide sulla programmazione in C/C++ e nei loro video dimostrano di essere molto esperti in hardware e software.
Ti ringrazio di nuovo.
Continua la serie di Tutorial sui servomotori (articoli precedenti su questo argomento Tutoria Arduino e i servo e Tutorial Arduino e i servo II ) prova a pilotare 6 servomotori:
Autore
Ciao Francesco,, l’ho aggiunta nello sketch.
mi sono accorto che pre qualche motivo era stato omesso il valore della libreria da includere
In questo tutorial non ho parlato della scheda PCA, ne ho parlato in questo altro tutorial: https://www.mauroalfieri.it/elettronica/arduino-library-pca9685.html in cui è presente la libreria che ho utilizzato in fase di test.
Ciao Mauro,
ho copiato il codice di questo articolo ma purtroppo mi ritrovo con un problema.
Quando digito un valore per far muovere i servo mi sono accorto che il valore che legge è un valore in codice ascii. Quindi se per esempio digito 5 mi stampa 53, se digito 55 mi stampa 2 volte 53, z corrisponde a 122. Cosa sto sbagliando?
Grazie per la risposta e per la pazienza.
Autore
Ciao Giuseppe,
non stai sbagliando nulla, all’ecpoca in cui ho scritto questo codice ricordo funzionasse, tuttavia riprovandolo oggi si è rivelato errato.
Puoi sostituire la linea 34:
grad = Serial.read();
con le due linee seguenti:
while (Serial.available()==0){} // aspetta che l'utente inserisca un valore
grad = Serial.parseInt(); // imposta la variabile grad come l'intero del valore in Input via Serial Monitor