GUIDA 17, Arduino e Servo Motore




servoUn componente molto utilizzato in campo meccanico che è presente nel kit di Arduino è il Servomotore. Un Servomotore è un tipo di motore elettrico che possiede tre terminali:

  • Alimentazione, nel mio caso +5V;
  • GND, massa;
  • Segnale, da collegare ad un PIN abilitato al PWM, nel mio caso il 3.

Grazie al pin “Data”, Arduino può comunicare al servo l’angolo su cui si deve posizionare. Io utilizzo un servo che può ruotare di 180°, ma esistono in commercio altri modelli che permettono rotazioni più ampie. Iniziamo creando un semplice circuito in cui colleghiamo semplicemente il servo ad Arduino. Per il collegamento dei tre pin puoi consultare il datasheet del tuo motore. Solitamentei colori dei cavi sono:

  • Rosso per l’alimentazione
  •  Nero per GND
  • giallo/bianco per i dati.

Il modo più semplice per pilotare un servo è quello di utilizzare la libreria “Servo”, che mette a disposizione delle funzioni per pilotare in modo semplice il motore. Eccone alcune:

  • attach(): permette di dichiarare su quale pin è connesso il nostro servo
  • attached(): controlla che un oggetto di tipo Servo sia collegato ad un pin;
  • detach(): “scollega” l’oggetto Servo dal il pin a cui era legato;
  • read(): legge l’angolo su cui si trova il servo;
  • write(): dice al servo su quale angolo deve spostarsi;

schema_bb

Esempio 1

#include<Servo.h>
int val;
Servo mioservo;

void setup() {
  Serial.begin(9600);
  mioservo.attach(3);
}

void loop() {
  
  for (val=0; val<180; val++) {    
    mioservo.write(val);
    Serial.println(val);
    delay(7);
    }
  for (val = 179; val>=0; val--) {
    mioservo.write(val);
    Serial.println(val);
    delay(7);
    }
}

Scrivendo questo programma il motore compirà una rotazione di 1° ogni 7 ms e ne verrà stampata la posizione angolare sulla porta seriale. Nella prima riga ho incluso la libreria “Servo”. Ho poi definito una variabile intera vale creato un oggetto di tipo Servo chiamato mioservo. La stringa mioservo permette di fare riferimento al Servomotore,; è come una variabile: possiamo darle il nome che preferiamo. Nel setup() inizializziamo la comunicazione seriale e comunichiamo ad Arduino il pin digitale a cui è collegato il pin “data” del servo, con la funzione attach() Nel loop(), creiamo un ciclo for, che incrementa la variabile val di 1 unità ad ogni iterazione, fino a quando quest’ultima diventa uguale a 180. Con la funzione mioservo.write() Arduino comunica al servo l’angolo su cui posizionarsi. Scrivendo quindi mioservo.write(val), il valore di val corrisponderà all’angolo su cui il servo si posiziona. Essendo questo valore incrementato ad ogni iterazione del ciclo, il risultato è il movimento del servo. Scriviamo sulla porta seriale il valore di val (quindi l’angolo su cui è il servo) e aggiungiamo un ritardo di 7 ms, per dare la giusta velocità al servo. Con un altro ciclo, eseguiamo l’operazione inversa: dall’angolo 179 il servo si sposta verso l’angolo 0.

 Esempio 2

Usiamo lo schema precedente e scriviamo un codice che associa la posizione angolare del servo a un valore generato a random:

#include;

int val;
Servo mioservo;
int angolo;

void setup() {
  Serial.begin(9600);
  mioservo.attach(3);
}

void loop() {
  angolo=random(0, 179);
  mioservo.write(angolo);
  delay(200);
}

Con la funzione random() si può generare un numero casuale avente un valore massimo o uno minimo e uno massimo. Ecco la sua sintassi:

random(max);

random(min, max);

E’ chiaro che se si imposta solo il valore massimo, quello minimo viene settato a 0.

Associando poi questo valore alla posizione angolare del servo e aggiungendo un piccolo ritardo si ottiene il risultato che vedi nel video:


I servomotori possono essere utilizzati nel campo della robotica, ad esempio, per controllare le ruote anteriori di un piccolo robot.