
Un servocomando è un dispositiovo che amplifica la potenza di una funzione di comando mettendo in movimento un dispositivo meccanico. In sostanza sono dei trasduttori di posizione: si portano alla posizione richiesta.
Il servocomandi AC ricevono in ingresso un treno di impulsi (generalmente alla frequenza di 50Hz) con duty-cycle variabile all’interno di una determinata finestra.


Sono dispositivi molto versatili e piuttosto robusti. Nelle applicazioni più comuni non si ha un controllo ad anello chiuso, ovvero si da l’input ed il servocomando cercherà di raggiungere l’obiettivo. Per tale motivo, se rimanesse incastrato, continuerebbe a fornire coppia ma un motore che fornisce coppia a rotore fermo (coppia di spunto) equivale ad un cortocircuito (a transitorio estinto).

Per tale motivo è indispensabile consultare i dati forniti dalla casa produttrice. Nel caso in esame, se si volesse far muovere un peso di 1.6kg e si alimentasse con una tensione di 4.8v, il servo si danneggerà: in quelle condizioni infatti, la coppia di stallo verrebbe vinta dal carico che trascinerà l’albero.
La velocità nominale (operating speed) viene definita infatti a vuoto (senza carico): a 4.8v si riuscirà ad avere rotazioni di 60° in 0.12 secondi.
La velocità di uscita del servo non è la medesima dell’albero del motore interno ma modificata tramite “motoriduttori”: Riducendo il numero di giri a parità di potenza si ha coppia maggiore. Quello che si vuole ottenere da tali dispositivi è infatti una coppia elevata.
Calettato all’albero d’uscita vi sarà un potenziometro rotativo: l’uscita del partitore resistivo sarà pertanto proporzionale alla posizione fisica.
La differenza tra la posizione richiesta e quella fisica, chiamata “errore” di posizione, viene amplificata tramite un regolatore che ne aumenta la stabilità.
Pilotaggio di un servocomando con Arduino
Un semplice sketch in Processing può fungere da pannello di controllo per un servocomando:
import processing.serial.*; //libreria per la comunicazione seriale
Serial porta_arduino; //variabile inizializzata
float x_sx,x_dx,y = 100,r = 50; //pulsanti
float angle = 90,L = 105,Y0 = 200;
float lim_inf = 20,lim_sup = 160;//limiti
float arr = 10;
int delay = 10 ; //ritardo in ms
void setup(){
size(400,250);
x_sx = width/4;
x_dx = width/4+width/2;
porta_arduino = new Serial(this, "COM5", 9600);//settaggio parametri
}
void draw(){
background(100);
strokeWeight(3); // Default
text("UP",x_sx,150);
text("DOWN",x_dx,150);
text("POSIZIONE SERVOCOMANDO",width/2,30);
circle(x_sx,y,r);
circle(x_dx,y,r);
text(angle,width/2,Y0+3*arr);
textAlign(CENTER);
translate(width/2,Y0);
rotate(-radians(angle));
line(0,0,L,0);
triangle(L, 0, 0, arr, 0, -arr);
circle(0,0,2*arr);
rotate(radians(angle));
rotate(-radians(lim_sup));
line(0,0,L,0);
rotate(radians(lim_sup-lim_inf));
line(0,0,L,0);
if(mousePressed){
//se il pulsante del mouse viene premuto:
//controlla se è all'interno del pulsante
//up o down
if(sqrt(pow(mouseX-x_sx,2)+pow(mouseY-y,2))<r){
if(angle < lim_sup){angle = angle +1;}//controllo limiti
}
if(sqrt(pow(mouseX-x_dx,2)+pow(mouseY-y,2))<r){
if(angle > lim_inf){angle = angle -1;}//controllo limiti
}
porta_arduino.write(int(angle));//invia dato ad Arduino
delay(delay); //ritardo
}
}

è opportuno impostare dei limiti (in termini di posizione angolare) oltre i quali l’attuatore arriverebbe a battuta.
Per quanto riguarda la scheda Arduino invece, è possibile utilizzare la libreria Servo.h.
Una volta definito l’oggetto della classe “servo” si determina, nel setup, il pin a cui è collegato:
servo_1.attach(pin_servo); //pin a cui è collegato il servo
Per impostare la posizione, è sufficiente chiamare la seguente funzione:
servo_1.write(angle);//scrivi posizione angolare
Ove l’argomento (angle) rappresenta l’angolo desiderato, da 0 a 180°.
Notare che una scheda Arduino non può gestire un numero qualsiasi di servocomandi tramite tale libreria, pertanto è necessario consultare la documentazione relativa alla scheda in esame.
A seguire uno sketch che consente ad Arduino di portare il servocomando nella posizione inviatagli tramite porta seriale.
#include <Servo.h>
#define pin_servo 7
int angle;//angolo in gradi
Servo servo_1;//oggetto della classe "Servo"
void setup() {
servo_1.attach(pin_servo); //pin a cui è collegato il servo
Serial.begin(9600);
servo_1.write(90); // set servo to mid-point
}
void loop() {
if (Serial.available() >0) {
angle = Serial.read();
servo_1.write(angle);//scrivi posizione angolare
//N.B. L'argomento (angolo) è in gradi
}
}
Matteo Gentileschi