Tutorial Arduino e i servo II

Nel precedente articolo hai preso confidenza con la classe Servo per pilotare i servo motori ad uso modellistico in tutte le tue applicazioni con Arduino.
In questo articolo vedrai come impartire i comandi di rotazione utilizzando un potenziometro.

Arduino Servo e potenziometroNello schema in alto puoi osservare come eseguire i collegamenti, il servo è di tipo modellistico funzionante a 4-6v per cui puoi alimentarlo con i +5v di Arduino, se i servo dovessero essere più di uno devi calcolare il loro assorbimento sapendo che Arduino NON è illimitato.

Come potenziometro puoi utilizzarne uno da 10KΩ collegando i pin esterni, quelli ai cui capi misuri una resistenza di 10KΩ indipendentemente dalla rotazione dell’alberino, al positivo (+5v) e al negativo (Gnd) di Arduino.
Non preoccuparti di quale dei terminali colleghi al positivo e quale al negativo, l’importante è che la resistenza misurata tra i due non vari ruotando l’albero del potenziometro.

Il collegamento centrale del potenziometro, quello che varia in funzione della rotazione dell’albero rispetto ad entrambi i contatti esterni, aumentando la resistenza dall’uno e diminuendola dall’altro, devi collegarlo ad uno dei pin analogici di Arduino, nello schema il pin scelto è A0.

Fatto ciò passiamo all’esempio, preso dal sito Arduino:

// Controlling a servo position
// using a potentiometer (variable resistor)
// by Michal Rinott
// 

#include <Servo.h>

Servo myservo;

int potpin = 0;
int val;

void setup()
{
  myservo.attach(9);
}

void loop()
{
  val = analogRead(potpin);
  val = map(val, 0, 1023, 0, 179);
  myservo.write(val);
  delay(15);
}

Analizziamo linea per linea ciò che Michal Rinott ha scrito come esempio:

linea 6: include la libreria esterna Servo che contiene una classe Servo() il cui utilizzo è descritto in questo articolo;
linea 8: crea l’oggetto myservo di tipo Servo, ossia inizializza la classe.
linea 10: imposta una nuova variabile di tipo integer potpin che indica a quale pin è collegato il potenziometro, in questo caso è il pin 0 ossia il primo pin analogico, il segnale letto da questo pin avrà valori che variano da 0 a 1023 dove 0 indica la minima resistenza e 1023 la massima;
linea 11: imposta la variabile val senza darle alcun valore, questa variabile sarà poi utilizzata per memorizzare il valore letto sul pin 0 analogico;
linee 13-16: definiscono la funzione setup(), fondamentale per inizializzare lo sketch, al suo interno utilizzando il metodo attach() già visto impostiamo che il pin per comunicare con il servo è il pin 9;
linea 18: definisce la funzione loop(), quella eseguita ciclicamente da Arduino durante il suo funzionamento.
linea 20: con la funzione di Arduino analogRead() leggi il valore proveniente dal potenziometro e lo memorizzi nella variabile int, i valori come detto saranno la variazione da 0 a 1023 in funzione della rotazione dell’albero;
linea 21: introduce una funzione molto interessante map() capace di eseguire una mappatura tra valori minimi e massimi, nell’esempio gli dici che la variabile val contiene il valore da mappare e che l’intervallo 0-1023 (secondo e terzo parametro) deve essere mappato sull’intervallo 0-179 (quarto e quinto parametro), per essere più chiari riporto questo esempio: immagina di leggere dal potenziometro il valore 512, non puoi passarlo direttamente al server in quanto il range di funzionamento è 0-179 gradi, per cui un valore 512 posizionerebbe il servo al 180 grado, ma farebbero altrettanto tutti i valori da 180 a 1023 non riuscendo ad ottenere il risultato sperato, per questo dovrestii convertire proporzionalmente il valore diciamo con la seguente equazione: 1023:179 = 512:x da cui x = (512 x 179 ) / 1023 = 89,58 arrotondando 90°, per eseguire ad ogni ciclo di eseguzione questo calcolo viene in contro la funzione map(9 che si occupa di tutto, arrotondamenti incusi. Al termine della nostra elaborazione di riga val varrà il valore corrispettivo tra 0 e 179 proporzionalmente a quello impostato sul potenziomentro.
linea 22: non resta che posizionare il servo con il metodo write() della classe Servo;
linea 23: imposta un tempo di attesa i 15 millesimi di secondo prima di ripartire con il ciclo della funzione loop(), questo tempo serve mediamente al servo per raggiungere la posizione desiderata.

Aggiungo una considerazione proprio sull’ultima linea di codice vista (23), il tempo impostato è generico ed è stato impostato su un valore abbastanza grande da consentire il corretto funzionamento con la maggior parte dei servo modellistici in commercio, tuttavia se il servo che stai utilizzando fosse di quelli molto rapidi a raggiungere un determinato angolo il mio consigio è di ridurre questo tempo per avere delle variazioni più immediate. Per calcolare il tempo di ritardo puoi fare riferimento alle caratteristiche del server, solitamente è indicata la velocità angolare, per capire meglio cosa intendo apri la pagina del servo futaba S3016 mini e guarda le caratteristiche tecniche riportate dal costruttore, troverai:

Speed: 0.25 sec/60° @ 4.8V

che a 4,8 v ( ˜5v a cui lo hai alimentato ) indica una velocità di rotazione di 0,25 sec per 60° che corrisponde a 1/4 di secondo per 60° e nel caso di rotazione a 180° 0,75 sec ( 180 / 60 = 3 -> 0,25 x 3 = 0,75) e quindi 0,0041666667 sec per ciacun grado che corrisponde a circa 4 millesimi di secondo per grado, considerando le dovute approssimazioni sia in alimentazione che per arrotondamenti possiamo dire che il nostro servo, alimentato a 5v, si muove di un grado ogni 5 millesimi di secondo.
Buon lavoro

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/tutorial-arduino-servo-2.html

125 pings

Skip to comment form

  1. […] servomotori in modo parallelo ( articoli precedenti su questo argomento Tutoria Arduino e i servo e Tutorial Arduino e i servo II ) prova a pilotare 6 servomotori […]

  2. […] leggere la nostra conversazione come commento all’articolo Tutotorial Arduino e i servo II in cui Danilo ha postato il suo […]

  3. […] il potenziometro col segnale che pilota l'innalzamento o l'abbassamento del suono del motore. Tutotorial Arduino e i servo II – Mauro Alfieri Elettronica Sugo __________________ Un ottimista invento' l'aeroplano, un pessimista invento' il […]

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.