Arduino ed i Servomotori
Il Servomotore è formato da un Motore in CC racchiuso in un contenitore, all’interno del quale troviamo anche una serie di ingranaggi che ne riducono il numero di giri e che vincolano l’albero del Motore CC all’albero di un potenziometro. Inoltre all’interno del contenitore troviamo anche un circuito di controllo.
Il circuito di controllo, all’interno del Servomotore, riceve uno speciale impulso PWM ed ordina al Motore CC di ruotare. Il circuito di controllo si occuperà anche della lettura del valore del potenziometro che, poiché vincolato al motore tramite gli ingranaggi, ruoterà di conseguenza. Così facendo il circuito di controllo saprà esattamente la posizione dell’albero del Motore CC e farà in modo di tenerlo nella posizione indicata dall’impulso di PWM ricevuto.
Solitamente i Servomotori sono in grado di ruotare di 180° (ma esistono anche modelli che ruotano di 90°, 270° o 360°), hanno 3 fili, due per l’alimentazione e uno per il segnale di controllo. I colori dei fili variano a seconda dei modelli:
– Il polo negativo solitamente è nero, o marrone
– Il polo positivo solitamente è rosso
– Il filo del segnale di controllo può essere bianco, giallo, arancio o blu.
Sono molto utilizzati nel modellismo radiocomandato, infatti vengono usati per i timoni degli aerei o delle barche, ma anche negli sterzi delle macchinine, o più in generale in tutte quelle applicazioni dove c’è bisogno di muovere oggetti in determinate posizioni, come ad esempio saracinesche.
Ne esistono di varie dimensioni, dai piccoli SG90 con ingranaggi in plastica che possono sopportare piccoli carichi, fino a quelli più grandi con ingranaggi in metallo che possono muovere carichi di vari Kg.
Solitamente i Servomotori vengono venduti con una serie di leve e viti accessorie che servono a creare leveraggi per collegarli agli oggetti da muovere.
Il sistema di controllo sarà lo stesso, varierà naturalmente la tensione di alimentazione e la corrente di cui hanno bisogno per muoversi.
Necessitano di uno “speciale” impulso PWM.
Solitamente per i Servomotori occorre inviare ogni 20 ms un impulso positivo di ampiezza variabile che va da un minimo di 1 ms ad un massimo di 2 ms.
Variando l’ampiezza dell’impulso si possono ottenere tutti i valori di posizione che variano da 0° fino al massimo supportato dal servo. (nell’esempio 180°).
La frequenza e l’ampiezza del segnale possono variare in base ai vari modelli di Servomotori.
La teoria è più complicata della pratica, ed ora vedremo come utilizzare i Servomotori con Arduino.
Usare i Servomotori con Arduino
Con l’IDE di Arduino viene fornita una libreria dedicata all’uso dei Servomotori, la libreria Servo.h.
Per l’uso con Arduino Uno si può utilizzare il seguente schema:Lo sketch da utilizzare per provarne il funzionamento è il seguente:
#include <Servo.h> // Carica la libreria Servo #define potenziometro A0 // Pin potenziometro #define pinservo 9 // Pin dove collegato al servo Servo myservo; // Crea l'oggetto myservo int pos; // Dichiara una variabile per salvare la posizione del servo void setup() { myservo.attach(pinservo); // Attacca il pinservo all'oggetto myservo } void loop() { pos = map(analogRead(potenziometro), 0, 1023, 0, 180); // Converte il valore del potenziometro in posizione del servo myservo.write(pos); // Scrive il valore convertito sul pin 9 delay(500); // Attende 500 ms }
Descrizione del programma:
Viene caricata la libreria Servo.h .
Con l’istruzione Servo myservo; dichiariamo un oggetto di tipo Servo e lo chiamiamo myservo.
Per indicare a quale pin è collegato l’oggetto myservo usiamo la funzione attach()
Viene letto il valore del potenziometro e convertito per trasferirlo al servo.
Per pilotare il servo usiamo la funzione myservo.write(pos);
Si attende mezzo secondo tra una lettura e l’altra.
Note sulla libreria Servo.h:
E’ importante tenere conto che con la classe Servo possiamo utilizzare tutti i pin digitali e analogici di Arduino e non solo le uscite di tipo PWM, la libreria Servo supporta fino a 12 motori sulla maggior parte delle schede Arduino e 48 su Arduino Mega. Su schede diverse dalla Mega, l’uso della libreria disabilita la funzionalità analogWrite () (PWM) sui pin 9 e 10, indipendentemente dal fatto che ci sia o meno un Servo su quei pin. Sul Mega, è possibile utilizzare fino a 12 servi senza interferire con la funzionalità PWM; l’uso di motori dal 12° al 23° disabiliterà il PWM sui pin 11 e 12.
La libreria servo.h mette a disposizione alcuni metodi:
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;
writeMicroseconds(): imposta la velocità di rotazione del servo, in un servo standard il valore va da 1000 a 2000;
I Servomotori a Rotazione Continua
I Servomotori a Rotazione Continua sono dei Servomotori modificati ai quali è stato tolto il potenziometro e sostituito con un trimmer non vincolato all’asse del Motore CC.
Così facendo possono ruotare all’infinito in un verso o nell’altro. Si utilizzano come i comuni Servomotori.
Sono molto utilizzati nei robot rover come motori per le ruote, in quanto hanno molta forza per via degli ingranaggi interni che funzionano da riduttori e non necessitano di elettronica esterna per funzionare.
Inviando .write(0) ruoteranno al massimo della velocità in un senso;
Inviando .write(90) il motore resterà fermo;
Inviando .write(180) ruoteranno al massimo della velocità nell’altro senso;
Con valori intermedi si può regolare la velocità di rotazione nei vari sensi.
Solitamente su un lato hanno un foro per la taratura del trimmer, questo serve a regolarne lo stop quando si invia il .write(90), sono tarati di fabbrica, ma a volte dovrà essere eseguita una piccolissima taratura, andateci piano che basta poco!