Tutorial Arduino e i servo

In questo weekend mi sono giunte alcune richieste di informazioni in merito a come pilotare dei servo motori ad uso modellistico con Arduino.

schema Arduino e servomotoreSono contento delle richieste e spero che arivino sempre più numerose perchè sono di aiuto non solo per chi formula le richeste ma per tutti gli appassionati di questo fantastico sistema.
Un altro motivo per cui nasce questo tutorial è legato al motivo per cui anche io mi sono avvicinato a questa piattaforma: i servo, ne possedevo alcuni da una fervida attività aeromodellistica in età adolescenziale e avrei sempre voluto riutilizzarli in qualche progetto, ma la difficoltà maggiore è sempre stata realizzare circuiti che potessero essere abbastanza versatili da non concludere la loro utilità in un singolo progetto.
Oggi posso dire che qello che cercavo era Arduino e per fortuna Massimo Banzi l’ha creato per tutti noi.

Passiamo al tutorial

Se vuoi pilotare dei servo prima di tutto devi sapere che la complessità dell’opera nasce dalla necessità di utilizzare un duty-cycle per impartire comandi a questi meravigliosi oggetti in grado di trasformare la volontà elettronica in movimento. Arduino dispone, secondo i modelli, di uscite PWM ossia pin digitali in grado di generare un duty-cycle utilizzabile per far muovere un servo, puoi trovare una panoramica sull’argomento in questo mio articolo.

Il modo più semplice per pilotare i servo è utilizzare una classe, che traduca angoli in segnali e ti eviti di dover impazzire con i duty-cycle e i calcoli dei tempi; la classe è la Servo descritta in modo egregio nella pagina uficiale presente sul sito.
Questa classe ti mette a disposizione alcuni metodi che semplificano di molto l’obiettivo:

attach(): permette di specificare su quale pin è connesso il nostro servo e legarlo all’oggetto Servo;
attached(): controlla che un oggetto di tipo Servo sia collegata ad un pin;
detach(): rimuove il collegamento tra l’oggetto Servo e il pin a cui era legata;
read(): legge la posizione angolare del nostro servo, restituisce l’ultimo valore passato con write();
write(): impartisce al servo l’angolo a cui posizionarsi, su servo a rotazione continua imposta la velocità di rotazione 0=velocità massima in un senso, 90=fermo, 180=velocià massima nella direzione inversa;
writeMicroseconds(): imposta la velocità di rotazione del servo, in un servo standard il valore va da 1000 a 2000, in un servo a rotazione continua si comporta allo stesso modo della write().

Ora dovresti avere le idee più chiare su cosa poter fare con questa classe, passiamo a realizzare uno sketch di esempio, immaginiamo di aver collegato il nostro servo come nella seguente figura:

schema Arduino e servomotore

il servo ha il positivo e il negativo collegati rispettivamente al +5v e Gnd di Arduino e il segnale al pin 9.

E’ importante che tu tenga conto che la classe Servo può utilizzare 12 pin digitali di Arduino e non solo le uscite di tipo PWM, questo disabilita la funzione analogWrite() normalmente utilizzabile con le uscite PWM di Arduino, l’uso di questo comando l’ho descritto in questo articolo.

Il primo esempio è quello scritto da BARRAGAN e riportato sul sito arduino.cc:

// Sweep
// by BARRAGAN 
// This example code is in the public domain.

#include <Servo.h>

Servo myservo;

int pos = 0;

void setup()
{
  myservo.attach(9);
}

void loop()
{
  for(pos = 0; pos < 180; pos += 1)
  {
    myservo.write(pos);
    delay(15);
  }
  for(pos = 180; pos>=1; pos-=1)
  {
    myservo.write(pos);
    delay(15);
  }
}

Osservando riga per riga lo sketch Sweep, questo il nome dell’esempio, trovi:

linea 5: include la Libreria Servo.h quella contenete la classe di cui ho parlato sopra;
linea 7: crea l’oggetto di tipo Servo, myservo sarà l’oggetto su cui opererai;
linea 10: inizializza una variabile di tipo intero pos il cui valore sarà la posizione da impartire al servo;
linea 12: crea la funzione setup() in cui esegue i comandi di inizializzazione;
linea 14: ecco il primo metodo che hai visto in questo articolo: attach(), questo metodo lega l’oggetto myservo al pin a cui abbiamo collegato il nostro servo, in questo caso il pin 9;
linea 17: crea la funzione loop() utilizzata ciclicamente da Arduino;
linea 19: imposta un ciclo con valori che vanno da 0 a 180, sarano i gradi di spostamento del nostro servo;
linea 21: con il metodo write() passi all’oggetto myservo la posizione che deve raggiungere, essendo il ciclo impostato per crescere con valori compresi tra 0 e 180 il servo si sposterà gradualmente dalla sua posizione 0° alla posizione 180°;
linea 22: imposta un ritardo di 15 millesimi di secondo per ogni ciclo del for, rallenta la rotazione inviando al servo uno spostamento di un grado ogni 15 millesimi di secondo, impiegherai 2,7 secondi per compiere il movimento completo da 0° a 180° (180 x 15 = 2700/1000 = 2,7 sec);
linee 24-28: eseguono lo stesso pricipio appena esposto per il ciclo for da 0 a 180, ma in senso opposto ossia partendo da 180 e scalando fino a 0.

Questo primo esempio dovrebbe aveti chiarito un po di dubbi sul funzionamento della classe Servo e dei servo motori in generale, almeno per quello che riguarda Arduino.

Nei prossimi articoli ti mostrerò alcuni esempi più complessi o di uso differente della classe stessa.

Buon lavoro.

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

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

354 pings

Skip to comment form

  1. […] non lo hai già fatto ti consiglio di leggere i due precedenti articoli scritti su questo argomento Tutoria Arduino e i servo e Tutorial Arduino e i servo II ) prova a pilotare 6 servomotori […]

  2. […] infatti possibile pilotare di base fino a 6 servomotori con un arduino uno, duemilanove, mini e similari, ossia quelli basati su Atmega 168 e 328; il numero di porte PWM […]

  3. […] Servo.h usata in questo sketch, al suo interno è contenuta una classe servo che dispone di alcuni metodi ciascuno dei quali ha una funzione […]

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.