Gestiamo i servomotori con Arduino

In quest’articolo parleremo un pò dei servomotori (o più comunemente servi). Si tratta di dispositivi meccanici di precisione che servono (passatemi il termine) per gestire la posizione angolare di un disco rotante o di un braccio meccanico. Sostanzialmente un servo è composto da un motore elettrico, un motoriduttore ed un circuito di feedback per la gestione della posizione. In commercio, esiste una vasta scelta di servi, ciascuno caratterizzabile per valore di coppia e precisione.

Il servo trattato in questo articolo è il B2232, un piccolo servo economico, ideale per i primi esperimenti didattici.

Questo tipo di servo ha un angolo di rotazione di circa 180° (la rotazione effettiva è un pò inferiore), inoltre esistono altri tipi di servi che hanno una rotazione continua e, anzichè pilotarne la posizione, ne possiamo gestire la velocità.

dynam-b2232

Qualunque sia il servo scelto, ci troveremo davanti sempre 3 contatti di cui due sono di alimentazione (V+ e GND) mentre il terzo è il pin di controllo. Per il servo in questione (i colori sono differenti dalla foto) il filo rosso corrisponde a V+, il filo viola è il GND mentre il filo giallo è quello del segnale.

Per gestire i servi con l’Arduino abbiamo a disposizione la libreria Servo. L’uso di questa libreria è molto semplice, vediamo quest’esempio preso direttamente dal sito ufficiale dell’Arduino.

xxxxxx [arduino]
#include <Servo.h>

Servo myservo;

int pos = 0;

void setup()
{
  myservo.attach(9); //pin a cui è collegato il controllo del servo
}

void loop()
{
  for(pos = 0; pos < 180; pos += 1)
{
myservo.write(pos);
 delay(15);
 }
for(pos = 180; pos>=1; pos-=1)
  {
    myservo.write(pos);
    delay(15);
  }
}
[/arduino]

Con l’istruzione

Servo myservo;

dichiariamo un oggetto di tipo Servo, e lo chiamiamo myservo. Invece per indicare a quale pin è collegato l’oggetto myservo usiamo la funzione attach(), di cui possiamo vedere la sintassi all’interno del void setup(). Per pilotare il servo usiamo la funzione myservo.write(pos) dove con pos si indica la posizione in gradi.

Dopo aver visto la sintassi vediamo un esempio pratico.

4 commenti su “Gestiamo i servomotori con Arduino”

  1. Salve Antonio,
    è molto interessante il suo sito e ritendola la persona giusta le chiedo una cortesia.

    Avrei bisogno di far girare un servo in una direzione e non per gradi, mi spiego meglio: vorrei che andasse AVANTI e poi INDIETRO per parecchi giri sia in un senso che nell’altro.
    Sarebbe gradita una sua risposta, la ringrazio ed ad ogni modo continuero a visitare il suo sito.

    Pini Ettore

    1. Salve Ettore, la ringrazio per i complimenti.
      Per risolvere il suo problema è necessario modificare fisicamente il servo.
      Questo funziona con un semplice motore DC con un serie di ingranaggi che ne rallentano la rotazione (dando più coppia) ed un potenziometro collegato ad essi. Ruotando il braccio del servo ruota anche il potenziometro interno, vi è quindi un’associazione angolo-resistenza. La logica interna si occuperà di fermare il motore DC non appena si raggiunge l’angolo desiderato (leggendo appunto il valore sul potenziometro).
      La modifica consiste in:
      -Eliminare fisicamente i blocchi presenti all’interno del servo;
      -“Scollegare” il potenziometro dagli ingranaggi;
      -“Tarare” il potenziometro sulla posizione fissa di 90°.
      In questo modo se richiedo un angolo maggiore di 90° il servo comincerà a ruotare in un senso cercando di raggiungere la posizione richiesta. Ma dato che il potenziometro rimane fermo (pèerchè scollegato dagli ingranaggi) ruoterà senza fermarsi mai. Viceversa per angoli inferiori a 90°.
      Io non ho mai effettuato questa modifica perchè non ne ho avuto necessità, a questo link c’è una guida più dettagliata con tanto di foto.
      Prima di chiudere alcune precisazioni:
      -non sarà possibile regolare la velocità di rotazione del servo, che sarà quella massima.
      -Una volta fatta la modifica non si può tornare indietro.

      Credo di averle detto tutto il necessario. Ci faccia sapere se va tutto per il “verso” giusto!

      1. Salve Antonio,
        grazie per la risposta, io possiedo un servomore

        GS-3630BB che é a rotazione continua,

        io le chiedevo uno sketch per far girare il SERVO in modo continuo sia in un verso che nell’altro, anni fa lo avevo trovato uno sketch che faceva questo poi ho smesso di usare Arduino e probabilmente ho cancellato qualcosa che ora reiniziando ad usare Arduino non trovo piu.

        Non voglio la pappa fatta, ma mi creda dopo aver guardato un in ogni posto non hotrovato niente.

        La ringrazio Ettore.

        1. Allora non avevo capito!
          Non ho mai usato un servo a rotazione continua, però ho trovato questo dove si specifica sche si può usare la stessa libreria, ed il verso di rotazione si scaglie pilotandolo con angoli >90° o <90°.
          Stessa cosa ribadita in questa discussione.

          Purtroppo altro non so dirti. Se non dovesse funzionare ricontrolla i collegamenti e che tu stia usando i pin giusti! Sembra una raccomandazione per neofiti, ma ti assicuro che così non è! Ho passato gli ultimi 3 giorni a debuggare un programma su FPGA, e alla fine era semplicemeente un segnale di clock collegato male!
          Fai qualche prova e fammi sapere.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *