SERVOCOMANDI

ES08AII (EMAX)

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

Lascia un commento