1° esempio SERVO MOTORE

Per sviluppare questo progetto occorre costruire il circuito (serve un servo motore) visualizzato nella seguente immagine:

I Servo motori hanno 3 pin: tensione, terra e segnale. Quindi colleghiamo
- il filo dell'alimentazione (tipicamente rosso) al pin 5V di arduino,
- la terra (tipicamente nero) al pin della terra.
- il filo del segnale (tipicamento giallo) al pin 9

Ecco l'immagine del circuito

Il modo più semplice per pilotare i servo è quello di utilizzare una opportuna classe fornita da un'apposita libreria presente di default all'interno dell'ambiente di sviluppo di Arduino. Compito principale di tale classe è tradurre gli angoli in segnali. La classe è la Servo descritta in modo egregio nella pagina ufficiale presente sul sito (http://playground.arduino.cc/ComponentLib/Servo).

Questa classe mette a disposizione alcuni metodi che semplificano di molto l’obiettivo. Ecco l'elenco conmpleto:

attach(): permette di specificare su quale pin è connesso il nostro servo e legarlo all’oggetto che gestisce il 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 ad un servo standard  l’angolo a cui posizionarsi. Su un servo a rotazione continua imposta la velocità di rotazione: 0=velocità massima in un senso, 90=fermo, 180=velocità massima nella direzione inversa;
writeMicroseconds(): imposta,  in un servo standard, la velocità di rotazione del servo. Il valore va da 1000 a 2000. In un servo a rotazione continua si comporta allo stesso modo della write().

Passiamo a realizzare uno sketch di esempio

Codice Sorgente

Prima di illustrare la soluzione si chiede agli astanti modello di analizzare il codice e cercare di capire cosa dovrebbe succedere.

#include <Servo.h> 
 
Servo myservo;  
int pos = 0;    
 
void setup() 
{ 
  myservo.attach(9);  
  myservo.write(0);   
  delay(15);         
 
 
void loop() 
{ 
  for(pos = 0; pos < 180; pos++)  
  { 
    myservo.write(pos);              
    delay(15);                      
  } 
  for (pos = 180; pos>=1; pos-=1)    
  {                                
    myservo.write(pos);            
    delay(15);                      
  } 
}

Obiettivo progetto: Scrivere un programma che muova da destra a sinistra il braccio del servo motore.

soluzione:

In questo esempio i metodi dell'oggetto Servo utilizzati sono: attach(), write(). Ecco ora la stessa soluzione opportunamente commentata

/* -----------------------------------------------------------------------------------
 Esempio creato partendo dal codice: Sweep di pubblico dominio.
 Muove a sinistra e destra di 180 gradi il servomotore
----------------------------------------------------------------------------------- */ 
#include <Servo.h> 
 
Servo myservo;  // creo un oggetto di tipo Servo - posso crearne al massimo 8  
int pos = 0;    // variabile utilizzata per registrare la posizione del servo
 
void setup() 
{ 
  myservo.attach(9);  // collego il servo al pin 9 
  myservo.write(pos);   // posiziono il servo alla posizione iniziale
  delay(15);          // aspetto 15ms per consentire al servo di raggiungere la posizione
} 
 
 
void loop() 
{ 
  for(pos = 0; pos < 180; pos++)  // si muove da 0 a 180 gradi di un grado alla volta
  { 
    myservo.write(pos);              // imposto l'angolo del servo tramite la variabile pos 
    delay(15);                       // aspetto 15ms per consentire al servo di raggiungere la posizione
  } 
  for (pos = 180; pos>=1; pos-=1)    // si muove da 180 gradi a 0 
  {                                
    myservo.write(pos);              // imposto l'angolo del servo tramite la variabile pos  
    delay(15);                       // aspetto 15ms per consentire al servo di raggiungere la posizione 
  } 
}

Esercitazione pratica:

Obiettivo progetto: Scrivere un programma completamente equivalente al precedente ma che non utilizzi alcuna istruzione iterativa (for, while, etc...)

soluzione:

Il seguente sketch rappresenta una delle possibili soluzioni della nostra esercitazione

/* -----------------------------------------------------------------------------------
 Esempio analogo al precedente ma che non utilizza alcuna strutture iterative.
 Muove a sinistra e destra di 180 gradi il servomotore
----------------------------------------------------------------------------------- */ 
#include <Servo.h> 
 
Servo myservo;  // creo un oggetto di tipo Servo - posso crearne al massimo 8  
int pos = 0;    // variabile utilizzata per registrare la posizione del servo
int delta = 1;  // variabile globale per indicare se devo aumentare o diminuire
                // l'angolo del braccio del servo motore
void setup() 
{ 
  myservo.attach(9);  // collego il servo al pin 9 
  myservo.write(pos);   // posiziono il servo alla posizione iniziale
  delay(15);          // aspetto 15ms per consentire al servo di raggiungere la posizione
} 
 
 
void loop() 
{ 
  pos=pos+delta;
  if (pos==179)
     delta=-1;        // inverto la direzione
  else if (pos==0)
     delta=1;         // inverto la direzione
  myservo.write(pos); // imposto l'angolo del servo tramite la variabile pos 
  delay(15);          // aspetto 15ms per consentire al servo di raggiungere la posizione
}