Progetto 5: Controllo del Servo

(1)Descrizione:

Un servomotore è un attuatore rotativo per il controllo della posizione. È composto principalmente da un alloggiamento, una scheda elettronica, un motore senza nucleo, un ingranaggio e un sensore di posizione. Il suo principio di funzionamento è che il servo riceve il segnale inviato dal MCU o dal ricevitore e produce un segnale di riferimento con un periodo di 20ms e una larghezza di 1.5ms. Confronta quindi la tensione di polarizzazione DC acquisita con la tensione del potenziometro e ottiene l’uscita della differenza di tensione.

Quando la velocità del motore è costante, il potenziometro viene azionato in rotazione 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 angolo di rotazione del servo è 0° – 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-2ms, ma in pratica è tra 0.5ms-2.5ms. La larghezza corrisponde all’angolo di rotazione da 0° a 180°. Nota 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 è la massa, quello rosso è il polo positivo e quello arancione è il filo del segnale.

L’angolo del servo:

(2)Parametri:

  • Tensione di lavoro: DC 4.8V ~ 6V

  • Intervallo angolo operativo: circa 180° (a 500 → 2500 μsec)

  • Intervallo larghezza 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)

(3)Schema di Collegamento:

Nota: I fili marrone, rosso e arancione del servo sono collegati rispettivamente a Gnd(G), 5v(V) e 10 dello shield. Ricordarsi di collegare un’alimentazione esterna a causa dell’alta corrente del servo. In caso contrario, la scheda di sviluppo potrebbe danneggiarsi.

(4)Codice di Test 1:

(Nota: Non collegare il modulo Bluetooth prima di caricare il codice, poiché il caricamento del codice utilizza anche la comunicazione seriale e potrebbero verificarsi conflitti con la comunicazione seriale Bluetooth, che possono causare il fallimento del caricamento.)

/*
Keyestudio Mini Tank Robot V3 (Popular Edition)
lesson 5.1
Servo
http://www.keyestudio.com
*/

#define servoPin 10 //Il pin del servo

int pos; //La variabile dell'angolo del servo
int pulsewidth; //La variabile della larghezza di impulso del servo

void setup() 
{
    pinMode(servoPin, OUTPUT); //Imposta il pin del servo come uscita
    procedure(0); //Imposta l'angolo del servo a 0°
}

void loop() 
{
    for (pos = 0; pos <= 180; pos += 1)  // Da 1° a 180°
    {
    	// con incrementi di 1 grado	
        procedure(pos); // Ruota all'angolo 'pos'
        delay(15); //Controlla la velocità di rotazione
    }
    for (pos = 180; pos >= 0; pos -= 1) // Da 180° a 1°
    { 
        procedure(pos); // Ruota all'angolo 'pos'
        delay(15);
    }
}
//La funzione controlla il servo
void procedure(int myangle) 
{
    pulsewidth = myangle * 11 + 500; //Calcola il valore della larghezza di impulso
    digitalWrite(servoPin, HIGH);
    delayMicroseconds(pulsewidth); //Il tempo al livello alto rappresenta la larghezza di impulso
    digitalWrite(servoPin, LOW);
    delay((20 - pulsewidth / 1000)); //Poiché il ciclo è 20ms, il tempo rimanente è al livello basso
}

Caricando il codice, vedremo il servo muoversi da 0° a 180°. Nei capitoli successivi, introdurremo come pilotare un servo. Inoltre, possiamo controllare un servo con una libreria servo di Arduino.

Nota: Questo file di libreria servo utilizza il timer 1, e l’uscita PWM delle porte IO 9 e 10 utilizza anch’essa il timer 1, quindi non possiamo utilizzare questa libreria servo quando utilizziamo l’uscita PWM di D9 e D10 in seguito.

(5)Codice di Test 2:

(Nota: Non collegare il modulo Bluetooth prima di caricare il codice, poiché il caricamento del codice utilizza anche la comunicazione seriale e potrebbero verificarsi conflitti con la comunicazione seriale Bluetooth, che possono causare il fallimento del caricamento del codice.)

/*
Keyestudio Mini Tank Robot V3 (Popular Edition)
lesson 5.2
Servo
<http://www.keyestudio.com>
*/

#include <Servo.h>

Servo myservo; // crea i servo
int pos = 0; // Salva le variabili dell'angolo

void setup() 
{
	myservo.attach(10); //Collega il servo alla porta digitale 10
}

void loop() 
{
    for (pos = 0; pos <= 180; pos += 1)  //Da 0° a 180°
    {
    	//la lunghezza del passo è 1
        myservo.write(pos); // Ruota all'angolo 'pos'
        delay(15); // Attendi 15ms per controllare la velocità
    }

    for (pos = 180; pos >= 0; pos -= 1)  //Da 180° a 0°
    {
        myservo.write(pos); // Ruota all'angolo 'pos'
        delay(15); // Attendi 15ms per controllare la velocità
    }
}

(6)Risultati del Test:

Caricare il codice, collegare l’alimentazione e il servo si muove nell’intervallo tra 0° e 180°.

(7)Spiegazione del Codice:

Arduino è dotato di #include <Servo.h> (funzione e istruzioni del servo)

Di seguito sono riportate alcune istruzioni comuni della funzione servo:

1. attach(interfaccia)——Imposta l’interfaccia del servo, le porte 9 e 10 sono disponibili

2. write(angolo)——L’istruzione per impostare l’angolo di rotazione del servo, l’intervallo di angolo va da 0° a 180°

3. read()——L’istruzione per leggere l’angolo del servo, legge il valore del comando di “write()”

4. attached()——Verifica se il parametro del servo è stato inviato alla sua interfaccia

Nota: Il formato di scrittura sopra indicato è “nome variabile servo, istruzione specifica()”, ad esempio: myservo.attach(10)