Un servomotore è un motore elettrico da cui fuoriesce un perno in grado di ruotare di un angolo compreso tra 0 e 180° mantenendo stabilmente la posizione raggiunta. Per ottenere la rotazione del perno è utilizzato un motore a corrente continua e un meccanismo di demoltiplica che consente di aumentare la coppia in fase di rotazione.
La rotazione del motore è effettuata tramite un circuito di controllo interno in grado di rilevare l’angolo di rotazione raggiunto dal perno tramite un potenziometro resistivo e bloccare il motore sul punto desiderato.
I pin che consentono di pilotare il servomotore fornito nel kit di Arduino (SM-S2309S) sono tre:
  • (pin 1) massa
  • (pin 2) controllo direzione
  • (pin 3) alimentazione

Dal punto di vista del software per gestire i servomotori possiamo utilizzare la libreria <Servo.h> che mette a disposizione i seguenti metodi:

  • attach(): permette di specificare su quale pin è connesso il nostro servo e legarlo all’oggetto Servo;
  • attached(): verifica che l’oggetto servo sia effettivamente connesso a un pin;
  • detach(): toglie il collegamento creato in precedenza tra l’oggetto servo e il pin;
  • read(): restituisce la posizione angolare del motore;
  • write(): fornisce al motore l’angolo sul quale si deve posizionare. Sul motore a rotazione continua imposta la velocità di rotazione: 0 = velocità massima in un senso, 90 = fermo, 180 = velocità massima nella direzione inversa;
  • writeMicroseconds(): definisce la velocità di rotazione del motore (valore standard = 1000-2000). In un motore a rotazione continua si comporta in modo analogo alla write().

Esempio

Muovere il servomotore di 180°. In questo esempio si vuole far muovere il servo-motore collegato direttamente alla scheda Arduino per testarne il funzionamento e verificare l’uso della libreria Servo.h.
Colleghiamo i seguenti segnali del servomotore con i piedini della scheda Arduino:

  • pin 1 (filo rosso) con GND
  • pin 2 (filo bianco o giallo) con pin 8
  • pin 3 (filo nero) con +5 V
 
Il piedino digitale 8 della scheda Arduino, che verrà assegnato dallo sketch al servomotore con il metodo attach(), verrà usato per comandare il motorino. Vediamo il codice dello sketch che farà muovere il nostro motorino prima in senso orario di 180°, quindi in senso antiorario. Prima di tutto dobbiamo includere la libreria Servo.h con l’istruzione:#include <Servo.h> poi passiamo alla creazione dell’oggetto di classe Servo, in questo caso abbiamo deciso di chiamarlo motore, utile per poter gestire il servomotore: Servo motore Nella sezione di configurazione passiamo a definire il pin dell’Arduino delegato alla gestione del motore con l’istruzione attach(): motore.attach(8); Nella sezione loop() vengono richiamati i due cicli for utili a muovere il motorino. Il primo ciclo effettua un conteggio della variabile posiz da 0 a 179. All’interno del ciclo, mediante l’istruzione write(), viene spostato il motore alla posizione indicata: il ritardo (delay) è utile per rallentare il movimento del motore. Il ciclo successivo sposta il motore di nuovo alla posizione iniziale mediante un ciclo for che parte da 180 e arriva a 1.
 
#include <Servo.h>
Servo motore;
int posiz = 0;
void setup()
{
motore.attach(8);
}
void loop()
{
for (posiz=0;posiz<180;posiz+=1)
{
motore.write(posiz);
delay(15);
}
for (posiz=180;posiz>=1;posiz-=1)
{
motore.write(posiz);
delay(15);
}
}
 
 
 
Comandare il servomotore da pulsanti
In questo esempio vogliamo utilizzare due micro switch per comandare il servomotore. Il primo aziona il motore e lo fa andare in una direzione mentre il secondo lo azionerà per la direzione opposta. Premendo il pulsante mentre il motore gira si deve provocare il fermo del pulsante. Nel circuito, come possiamo notare, vi sono due micro switch collegati ai piedini digitali 12 e 13 della scheda Arduino, programmati in INPUT. Il servomotore è stato collegato mediante i suoi tre piedini nel modo seguente:
  • Pin 1 del servomotore (GND)
  • Pin 2 del servomotore (Pin 8 Arduino)
  • Pin 3 del servomotore (+5 V)

I micro switch sono stati collegati a cavallo tra la massa e l’alimentazione, con una resistenza di 10 kΩ inserita tra il pin del pulsante e il segnale di GND, come circuito anti rimbalzo. La scheda Arduino preleva il segnale dei due pulsanti (cavo verde) nei pin 12 e 13.
Il servomotore fornito con il kit Arduino è dotato di un connettore femmina, quindi per poterlo collegare alla nostra breadboard dobbiamo aggiungere tre connettori maschio. Per fare questo bisogna utilizzare i connettori a pettine forniti nel kit Arduino, quindi spezzarne tre. 
È stato aggiunto alla breadboard, a cavallo tra l’alimentazione e la massa, un condensatore elettrolitico da 100μF per compensare eventuali irregolarità nella tensione. Dobbiamo assicurarci di aver collegato correttamente la polarità del condensatore. Vediamo il codice dello sketch che farà muovere il nostro motorino prima in senso orario di 180°, quindi in senso antiorario. Prima di tutto dobbiamo includere la libreria Servo.h poi passiamo alla creazione dell’oggetto di classe Servo, in questo caso abbiamo deciso di chiamarlo motore, utile per gestire il servomotore. Le variabili avanti, indietro e posiz serviranno per determinare il verso di rotazione e la posizione del perno del motore. Nella sezione di configurazione prima definiamo il piedino 8 dell’Arduino delegato alla gestione del motore con l’istruzione motore.attach(). Andiamo poi a definire i due piedini (pin 12 e 13) dell’Arduino preposti alla lettura dei due pulsanti. Nella sezione loop() assegniamo il contenuto delle variabili avanti e indietro in base al valore letto dai due pulsanti suddetti. Quindi verifichiamo il contenuto delle due variabili e in base a ciò determiniamo la posizione successiva del motore aggiornando la variabile posiz. Quando posiz è uguale a 180 o uguale a 1 non viene aggiornata la posizione. Infine viene “mosso” il motore con motore.write() e generato un breve ritardo di 20 millisecondi per rallentare un po’ il movimento.

#include <Servo.h>
Servo motore;
int avanti=0;
int indietro=0;
int posiz=0;

void setup()
{
motore.attach(8);
pinMode(12,INPUT);
pinMode(13,INPUT);
}

void loop()
{
if (digitalRead(12)==HIGH)
{
avanti=1;
indietro=0;
}
if (digitalRead(13)==HIGH)
{
avanti=0;
indietro=1;
}
if (avanti==1)
if (posiz<180)
posiz+=1;
else
posiz=180;
if (indietro==1)
if (posiz>1)
posiz-=1;
else
posiz=0;
motore.write(posiz);
delay(20);
}