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 }