Breve tutorial per Illustrare la Libreria Servo di Arduino, illustrando le diverse Funzioni e presentando un Semplice Esempio di Applicazione…
INTRO
Come illustrato nella guida sui servomotori (https://www.ne555.it/i-servomotori/) i servomotori hanno bisogno di un impulso di durata determinata per mettersi nella posizione desiderata. Arduino dispone di una libreria per il controllo dei servomotori e un singolo Arduino può controllare fino a 12 servi e fino a 48 sull’Arduino mega.
La libreria ha le seguenti funzioni:
- #include <Servo.h> //Stringa da inserire all’inizio del codice per richiamare le funzioni della libreria
- servo servo1; //Assegno il nome servo1 al mio servomotore.
- servo1.attach(pin, min, max); //Serve ad indicare a quale pin è collegato il servomotore, min indica il minimo impulso (500 per 0°) mentre max indica il massimo impulso (2000 per 180°).
- write(angolo); //sposto il servomotore all’angolo desiderato.
- writeMicroseconds(numero_microsecondi); //Simile al precedente ma invece di scrivere l’angolo si scrive la durata dell’impulso in microsecondi.
- servo1.read(); //Ritorna il valore precedentemente scritto.
- servo1.attached(); //Ritorna vero se il servo è connesso falso altrimenti.
- servo1.detach(); //Stacca il servo e viene quindi permesso di utilizzare i pin di PWM normalmente.
A meno di applicazioni particolari si usano solo le prime 4 funzioni. La funzione di lettura ritorna semplicemente il valore scritto in precedenza, ma se il servo ha subito variazioni esterne non riesce a leggerle.
CODICE E SCHEMA DI ESEMPIO
Andiamo a realizzare un esempio semplice, un pulsante che controlla lo stato del servocomando. Se premuto il servo va in posizione 0° altrimenti sta in posizione 90°. Il tutto si aggiorna ogni secondo.
Prima di tutto con la funzione servo.attach(pin, min, max) vado a trovare i valori di minimo e massimo controllando il motore e il suo angolo. 500ms di impulso corrispondono a 0 gradi mentre per raggiungere i 180° l’impulso deve durare 2600ms.
Il codice è il seguente:
#include <Servo.h> //richiama la libreria servo Servo servo1; //ogetto servo1 const int pulsante = 2; //variabile pulsante uguale 2 int statopulsante = 0; void setup() { servo1.attach(9, 500, 2600); //Servo connesso al pin9 pinMode(pulsante, INPUT); //Pin 2 assegnato come ingresso } void loop() { statopulsante = digitalRead(pulsante); //Leggi stato pulsante if (statopulsante == HIGH) { //Se il pulsante è premuto servo1.write(0);} //Servo impostato a 0° else{servo1.write(90);} //Altrimenti 180° delay(1000); //Aggiorna ogni secondo }
Includo la libreria del servo, creo l’oggetto servo1, il pulsante e lo stato del pulsante. Nel setup inizializzo il servo sul pin9 e con minima e massima durata dell’impulso. Inizializzo il pin 2 come ingresso del pulsante.
Nel ciclo infinito controllo se il pulsante è premuto o no e in base allo stato del pulsante metto in posizione 0° se è allo stato alto, ovvero premuto, altrimenti 90°. Questo ciclo si ripete ogni secondo.
Lo schema è il seguente:
Il servo è connesso con il filo rosso alla tensione 5V, il marrone a GND e il giallo è connesso al pin 9 di Arduino. R1 è un resistore di pull-down che mantiene il pin 2 a GND quando il pulsante non è premuto. Premendolo avrò 5V sul pin 2 di Arduino.
DOWNLOAD
Potete scaricare la simulazione del circuito con PROTEUS e lo Sketch Arduino al seguente LINK!!!