Robotica educativa/Servomotore
Il servomotore SG90
modificaIl 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
modificaDi 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).
Codice
modifica#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.