Progetto 4 Controllo del Servo

Descrizione
Il servomotore è un attuatore rotativo per il controllo della posizione. È composto principalmente da un alloggiamento, una scheda circuito, un motore senza nucleo, un ingranaggio e un sensore di posizione. Il suo principio di funzionamento prevede che il servo riceva il segnale inviato dai microcontrollori o dai ricevitori e produca un segnale di riferimento con un periodo di 20ms e una larghezza di 1,5ms, quindi confronti la tensione di polarizzazione DC acquisita con la tensione del potenziometro per ottenere un’uscita della differenza di tensione.
Quando la velocità del motore è costante, il potenziometro viene fatto ruotare attraverso l’ingranaggio riduttore a cascata, il che porta la differenza di tensione a 0 e il motore si ferma. In generale, l’intervallo di rotazione del servo è compreso tra 0° e 180°.
L’angolo di rotazione del servomotore è controllato regolando il ciclo di lavoro del segnale PWM (Pulse-Width Modulation). Il ciclo standard del segnale PWM è 20ms (50Hz). Teoricamente, la larghezza è distribuita tra 1ms e 2ms, ma in pratica è compresa tra 0,5ms e 2,5ms. La larghezza corrisponde all’angolo di rotazione da 0° a 180°. Si noti tuttavia che per motori di marche diverse, lo stesso segnale può produrre angoli di rotazione differenti.

In generale, il servo ha tre fili: marrone, rosso e arancione. Il filo marrone è collegato a massa, quello rosso è il polo positivo e quello arancione è il filo del segnale.

Gli angoli corrispondenti del servo sono mostrati di seguito:

Specifiche tecniche
Tensione di lavoro: DC 4,8V ~ 6V
Intervallo di angolo operativo: circa 180° (a 500 → 2500 μsec)
Intervallo di larghezza di impulso: 500 → 2500 μsec
Velocità a vuoto: 0,12 ± 0,01 sec / 60 (DC 4,8V) 0,1 ± 0,01 sec / 60 (DC 6V)
Corrente a vuoto: 200 ± 20mA (DC 4,8V) 220 ± 20mA (DC 6V)
Coppia di stallo: 1,3 ± 0,01kg · cm (DC 4,8V) 1,5 ± 0,1kg · cm (DC 6V)
Corrente di stallo: ≦ 850mA (DC 4,8V) ≦ 1000mA (DC 6V)
Corrente in standby: 3 ± 1mA (DC 4,8V) 4 ± 1mA (DC 6V)
Componenti

Schema di collegamento:
Note sul collegamento: il filo marrone del servo è collegato a Gnd(G), il filo rosso è collegato a 5v(V) e il filo arancione è collegato al pin digitale 9.
Il servo deve essere collegato a un’alimentazione esterna a causa dell’elevata richiesta di corrente per il suo azionamento. In generale, la corrente della scheda di sviluppo non è sufficiente. Se non viene collegata l’alimentazione esterna, la scheda di sviluppo potrebbe danneggiarsi.
Codice di Test 1
/*
keyestudio Mini Tank Robot V2.1
lesson 4.1
Servo
http://www.keyestudio.com
*/
#define servoPin 9 //pin del servo
int pos; //variabile dell'angolo del servo
int pulsewidth; // variabile della larghezza di impulso del servo
void setup()
{
pinMode(servoPin, OUTPUT); //imposta il pin del servo come OUTPUT
procedure(0); //imposta l'angolo del servo a 0°
}
void loop()
{
for (pos = 0; pos <= 180; pos += 1) // va da 0 gradi a 180 gradi
{
// con incrementi di 1 grado
procedure(pos); // dice al servo di andare alla posizione nella variabile 'pos'
delay(15); //controlla la velocità di rotazione del servo
}
for (pos = 180; pos >= 0; pos -= 1) // va da 180 gradi a 0 gradi
{
procedure(pos); // dice al servo di andare alla posizione nella variabile 'pos'
delay(15);
}
}
// funzione per controllare il servo
void procedure(int myangle)
{
pulsewidth = myangle * 11 + 500; //calcola il valore della larghezza di impulso
digitalWrite(servoPin,HIGH);
delayMicroseconds(pulsewidth); //la durata del livello alto è la larghezza di impulso
digitalWrite(servoPin,LOW);
delay((20 - pulsewidth / 1000)); // il ciclo è 20ms, il livello basso dura per il tempo rimanente
}
Dopo aver caricato il codice con successo, il servo oscilla nell’intervallo da 0° a 180°.
/*
keyestudio Mini Tank Robot V2.1
lesson 4.2
servo
http://www.keyestudio.com
*/
#include <Servo.h>
Servo myservo; // crea un oggetto servo per controllare un servo
// sulla maggior parte delle schede possono essere creati dodici oggetti servo
int pos = 0; // variabile per memorizzare la posizione del servo
void setup()
{
myservo.attach(9); // collega il servo sul pin 9 all'oggetto servo
}
void loop()
{
for (pos = 0; pos <= 180; pos += 1) // va da 0 gradi a 180 gradi
{
// con incrementi di 1 grado
myservo.write(pos); // dice al servo di andare alla posizione nella variabile 'pos'
delay(15); // attende 15ms affinché il servo raggiunga la posizione
}
for (pos = 180; pos >= 0; pos -= 1) { // va da 180 gradi a 0 gradi
myservo.write(pos); // dice al servo di andare alla posizione nella variabile 'pos'
delay(15); // attende 15ms affinché il servo raggiunga la posizione
}
}
Risultato del Test
Dopo aver caricato il codice con successo e acceso l’alimentazione, il servo oscilla nell’intervallo da 0° a 180°.
Il risultato è lo stesso. Di solito lo controlliamo tramite il file di libreria.
Spiegazione del Codice
Arduino include #include <Servo.h> (funzioni e istruzioni per il servo)
Di seguito sono riportate alcune istruzioni comuni della funzione servo:
attach(interfaccia)——Imposta l’interfaccia del servo; sono disponibili le porte 9 e 10.
write(angolo)——L’istruzione per impostare l’angolo di rotazione del servo.
read()——L’istruzione per leggere l’angolo del servo; legge il valore del comando di “write()”.
Nota: Il formato di scrittura sopra indicato è “nome variabile servo, istruzione specifica()”, ad esempio: myservo.attach(9).