Robotica educativa/Servomotore

Indice del libro


Il servomotore SG90

modifica
 
Servomotore SG90

Il servomotore SG90 viene utilizzato nei microcontrollori per la gestione di robot di vario genere. È in grado di compiere una rotazione di  , semplicemente specificando il grado in formato numerico e intero.

Come visibile in figura l'uscita è composta da tre terminali: giallo, rosso e marrone.

Colore Significato Valori consentiti
giallo Driver  
rosso Alimentazione positiva  
marrone Messa a terra  

Il controllo del motore avviene mediante tecnica PWM (Pulse Width Modulation), pertanto un Arduino Uno ne può controllare fino a sei, attraverso i pedini 3, 5, 6, 9, 10 e 11, quelli con il simbolo della tilde (~) vicino al loro numero.

La Pulse Width Modulation (modulazione a larghezza di impulsi) comunica attraverso la dimensione della parte alta del segnale, nota come ciclo utile, spesso espressa in percentuale, rende possibile inviare dati - anche complessi - con una singola linea.

Di seguito come viene controllato l'angolo del servomotore tramite un singolo impulso.

 

Da quanto precede, segue che sono necessari 20 millisecondi per comunicare al motore in quale angolo posizionarsi. Questo è uno dei valori minimi consigliati come tempo d'attesa tra una posizione e la successiva del motore.

Schema circuitale

modifica

Di seguito lo schema circuitale. Lo schema è molto semplice perché, oltre all'alimentazione, è necessaria solo una connessione per la trasmissione dati relativi all'angolo che l'albero del servomotore deve assumere.

Naturalmente, se si vogliono controllare più servomotori (come detto si può arrivare fino a sei, con Arduino Uno) è opportuno prendere in considerazione l'utilizzo di un'alimentazione esterna, per non sovraccaricare il microcontrollore.

Nel codice che segue il servomotore viene identificato come ciaociao, perché come si può notare dai parametri, viene utilizzato per collegarci una mano di cartone stilizzata ed effettuare un saluto.

 

Nel caso di controllo di un robot antropomorfo i nomi potrebbero essere spalla, avambraccio, braccio e mano (ovvero la pinza o - più comunemente - end effector).

#include <Servo.h>
#define pin_servo 6                   // Pin a cui è collegato il servomotore
Servo ciaociao;                       // Nome del servomotore

int attesa          = 0;              // Tempo di attesa al termine di un'operazione
int velocitaservo   = 20;             // Tempo di attesa tra un comando e il successivo

int angoloiniziale  = 15;             // Posizione iniziale del servomotore
int angolofinale    = 75;             // Posizione finale del servomotore

void setup() {
  ciaociao.attach(pin_servo);         // Identificazione pin servo motore
  ciaociao.write(angoloiniziale);     // Si porta il motore all'angolo iniziale
}

void loop() {
  // Le azioni vengono divise in due parti
  // apertura e chiusura (es. di una finestra)
  apri();
  chiudi();  
}

// Movimenta il motore in senso antiorario
void apri() {
  // Conta da angoloiniziale fino a angolofinale - 1
  for( int i = angoloiniziale; i < angolofinale; i++ ) {
    // Assegna l'angolo al motore
    ciaociao.write(i);
    // Attende quanto specificato
    delay (velocitaservo);
  }
  // Fa una pausa
  delay (attesa);
}

// Movimenta il motore in senso orario
void chiudi() {
  // Conta da angolofinale fino a angoloiniziale + 1
  for( int i = angolofinale; i > angoloiniziale; i-- ) {
    // Assegna l'angolo al motore
    ciaociao.write(i);
    // Attende quanto specificato
    delay (velocitaservo);
  }
  // Fa una pausa
  delay (attesa); 
}

Espansioni suggerite

modifica
  • Come accennato, controllare più servomotori. Naturalmente l'utilizzo di un'alimentazione esterna è fortemente consigliato. In questo cosa, al microcontrollore va connessa la messa a terra;
  • un semplice esempio potrebbe essere la simulazione dei tergicristalli, o simili.