Tag

, , , ,

Ho trovato su Ebay, per circa 5-6 euro, un piccolo servo motore modello Tower Pro SG90 che può vantare, nonostante le sue dimensioni ridotte, delle specifiche di tutto rispetto e perciò ho cercato di capire meglio come poteva essere utilizzato. Il funzionamento di un servo motore è abbastanza elementare: un pin la 5V, un pin per la terra, e un pin PWM per comunicare con Arduino.

Software

Quando si lavora con un servo motore, è importante ricordarsi di aggiungere al nostro progetto la libreria Servo.h, grazie alla quale diventa molto semplice controllare il servo, trattandolo come un oggetto. Per poter utilizzare il servo, basta dichiararlo e indicare a quale pin è attaccato:

#include <Servo.h>
Servo myservo; // Crea l'oggetto servo
void setup() 
{ 
  myservo.attach(9); // Attacca l'oggetto servo al pin 9
}

Et voilà. In programmazione, quando si parla di oggetto, si intende un elemento logico e coerente, ben definito, in genere auto-sufficiente (in grado cioé, di eseguire quanto viene richiesto). Questo significa che – mentre per accendere un LED dobbiamo dire a Arduino: accendi il pin, aspetta, spegni – per gestire un servo basta dire: parti! e lui andrà.

Schema

Qui sotto ho riportato lo schema per il collegamento. È davvero semplice, non vi servirà nemmeno una breadboard, per il momento.

Arduino Servo Motor Schema

Arduino Servo Motor Schema

Codice

Proviamo adesso a far muovere il servo, in senso orario e anti-orario. Per farlo ci basterà trasmettere al pin 9 la rotazione desiderata, espressa in gradi.

void loop() 
{ 
  myservo.write(0);
  delay(1000);

  myservo.write(90);
  delay(1000);

  myservo.write(180);
  delay(1000);
}

Velocità

La libreria Servo.h fornisce delle funzionalità davvero molto elementari. Ad esempio, non c’è un comando per impostare la velocità con la quale si deve muovere il nostro servo!…

Ma senza volere criticare questa libreria, che ci permette comunque di utilizzare il servo con solo una riga di codice, vediamo come aggirare il problema.

Per prima cosa, sposto il servo in posizione centrale, con la funzione servo.writeMicroseconds(1500) – il valore 1500 è arbitrario, su alcuni servo potrebbe essere diverso.

Successivamente, creo un ciclo for che aumenta la posizione in maniera incrementale e imposto una piccola pausa tra un movimento e il successivo. L’effetto finale? Il servo si muoverà più o meno velocemente!

Servo myservo;
int velocita = 50; // Un valore da 0 a 100 (da lento a veloce)
void setup() 
{ 
  myservo.attach(9);
  myservo.writeMicroseconds(1500); // Imposto il servo al centro
}

void loop() 
{ 
  for (int n=0; n<90; n++) // Rotazione 90 gradi, un grado per volta
  {
    myservo.write(n); // Faccio muovere il servo di un grado
    delay(calcolaVelocita()); // Imposto il ritardo prima del movimento
  }
  delay(1000); // Attendo prima di ricominciare da capo
}

int calcolaVelocita()
{
  // Calcolo un ritardo da 120 a 20 ms al variare di velocita
  return (map(velocita,0,100,120,20));
}

La funzione calcolaVelocita() non fa altro che calcolare il ritardo, espresso in millisecondi, da applicare alla rotazione. L’unica particolarità della funzione è che converte il valore di velocita per così dire al contrario, impostando un ritardo minimo (20ms) se è impostata a 100, e un ritardo massimo (120ms) quando la variabile è 0. È un piccolo trucco 🙂

Potenziometro

Aggiungere un potenziometro per controllare la rotazione del servo è uno dei primi e più comuni esperimenti. Potremmo decidere di spingere un pulsante per far ruotare il servo di un numero di gradi prestabilito, oppure abbinarlo allo sketch Toc toc! Chi è? per fargli alzare il chiavistello della porta ed entrare in casa (è stato fatto, credetemi!), ma usare un potenziometro è il modo più immediato, e semplice, di interagire con il nostro servo.

Per farlo, dobbiamo prima di tutto prendere una breadboard ed aggiungere allo schema il potenziometro. Anche in questo caso, lo schema risultante è davvero semplice.

Per poter funzionare, il potenziometro ha bisogno solo di un collegamento alla 5V, di uno alla terra, e di uno al pin analogico di controllo.

Schema Arduino Servo Potenziometro

Schema Arduino Servo Potenziometro

Grazie al nostro potenziometro, adesso possiamo far ruotare il servo verso destra o verso sinistra a piacere. Ecco il codice:

Servo myservo; // Crea l'oggetto servo
int triggerPin = A0; // Pin analogico per il potenziometro

void setup() 
{ 
  myservo.attach(9); // Attacca l'oggetto servo al pin 9
  pinMode(triggerPin,INPUT); // Imposto il potenziometro come input
}

void loop() 
{ 
  int posizione = analogRead(triggerPin); // Leggo il potenziometro
  int gradi = calcolaRotazione(posizione); // Converto in gradi
  myservo.write(gradi); // Faccio muovere il servo
}

int calcolaRotazione(int posToDeg)
{
  // Converte la lettura del potenziometro (da 0 a 1023) in gradi
  return (map(posToDeg,0,1023,0,180));
}

PS: purtroppo il mio potenziometro è troppo piccolo per cui va soggetto a oscillazioni che fanno muovere il servo un po’ a casaccio 🙂 Ho aggiunto delay(250); alla fine del loop e qualcosa è migliorato, ma servirebbe un potenziometro serio!

Considerazioni

Un servo, normalmente, ruota soltanto di 180 gradi. Se pensate di avere bisogno di una rotazione completa, di 360 gradi, esistono dei servo speciali a rotazione continua; oppure potete aprire il servo e sostituire l’ingranaggio dell’albero con un ingranaggio diverso, che abbia un passo doppio di quello originale. Ma questo è un hack per uomini veri! Se invece vi serve un servo che ruota senza fermarsi mai, allora state cercando un motore… 😉

NB: a differenza di un motore, il servo può essere molto utile in certe circostanze perché conosce la propria posizione. Per conoscere di quanti gradi è ruotato un servo in qualsiasi momento, potete usare la funzione read(); nel nostro esempio myservo.read();

Processing

Per rendere il tutto più interessante (far ruotare una leva non lo è molto), proveremo ad interagire con il servo grazie a Processing. Nel caso specifico, cercheremo di controllare il funzionamento del servo grazie al mouse del nostro computer.

Ma per farlo, dovrete aspettare il prossimo studio. A presto!

Codice: Arduino_Servo_Suite.zip

PS: un saluto dalla mia piccola aiutante Mimi, special guest del video! 🙂

PPS: Come promesso, è ora disponibile lo studio su Arduino servo e Processing.