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
}