Tutorial Arduino e i servo III

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:

Schema 6 Servo

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 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

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/tutorial-arduino-e-i-servo-iii.html

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.