Come controllare i servomotori con Arduino

Uno dei primi usi dei servomotori era quello di controllare i meccanismi di sterzo di aerei RC, automobili e barche. Oggi, si possono trovare in robot, attrezzature industriali, e molti diversi progetti Arduino.

I servomotori sono in grado di controllare con precisione la rotazione di un albero motore. Essi consentono di impostare un angolo esatto di rotazione con il codice, o con ingressi come joystick, pulsanti, o potenziometri.,

In questo tutorial, daremo un’occhiata a come funzionano i servomotori e come utilizzare un Arduino per controllarli. Vedremo anche due programmi di esempio è possibile eseguire su Arduino. Il primo programma ti mostrerà come controllare la direzione e la posizione di un servo usando due pulsanti. Il secondo programma ti mostrerà come usare un potenziometro per controllare la posizione del servo.

Va bene, cominciamo!

BONUS: Ho fatto una guida rapida per questo tutorial che è possibile scaricare e tornare più tardi se non è possibile impostare questo in questo momento., Copre tutti i passaggi, i diagrammi e il codice necessari per iniziare.

Come funzionano i servomotori

I servomotori sono motori a corrente continua che sono stati orientati verso il basso per ridurre la velocità e aumentare la coppia del motore. Hanno anche costruito in circuiti che controllano l’angolo di rotazione di un grado alla volta, e mantenere tale posizione fino a quando un altro ingresso viene ricevuto., Servi a rotazione un certo numero di gradi a seconda della larghezza degli impulsi elettrici consegnato da Arduino:

Il servo si aspetta un impulso ogni 20 ms. Per la maggior parte dei servi, 1 ms impulso risultati zero gradi di rotazione, a 1,5 ms impulso risultati di una rotazione di 90 gradi, e un 2 ms impulso traduce in una rotazione di 180 gradi.

Collegamento del servomotore all’Arduino

Ora vediamo come utilizzare un Arduino per controllare un servomotore., Questi sono i componenti che si dovrà installare l’esempio progetti discussi di seguito:

  • Arduino Uno
  • SG90 Micro Servo
  • Potenziometro 10K
  • Resistenze
  • Condensatori
  • 4X AA Batteria Titolare
  • Tattile Pulsanti

a Seconda del servo si utilizza (quelli più grandi, in particolare), si dovrebbe usare un altro alimentatore DC al potere. In caso contrario, la corrente assorbita dal servo potrebbe danneggiare il vostro Arduino.,

una Volta che tutti i componenti, collegare l’Arduino seguendo questo schema di cablaggio:

la Programmazione del Servo

stiamo andando a utilizzare Arduino built-in libreria Servo di programma del servo. Questa libreria è inclusa con l’IDE Arduino, quindi non c’è bisogno di installarlo.,

una Volta che hai collegato le parti secondo lo schema di cui sopra, aprire l’IDE di Arduino e caricare il codice per il consiglio:

Il servo motore si deve spostare a 0 gradi, mettere in pausa per un secondo, poi si sposta a 90 gradi, mettere in pausa per un secondo, poi si sposta a 180 gradi, pausa per un secondo, per poi ricominciare da capo.

Sulla prima riga includiamo la libreria Servo con#include <Servo.h>., Nella riga successiva, creiamo un oggetto chiamato servo1 per fare riferimento al servomotore specifico in tutto il codice. Nella riga successiva, dichiariamo una variabile pin chiamata serverPin e la impostiamo uguale al pin Arduino 9.

Nella sezione setup, inizializziamo il servo con la funzione attach(). La funzioneattach() accetta un parametro: il pin a cui è collegato il servo. Quindi abbiamo servo1.attach(servoPin).,

Per spostare il servo, utilizzare la funzione write() con l’angolo di rotazione come argomento. L’angolo è in gradi, da 0 gradi a 180 gradi. L’angolo cambia la larghezza dell’impulso inviata al servomotore, che quindi determina la quantità di rotazione. Stiamo chiamando la funzione attraverso l’oggettoservo1, quindi usiamoservo1.write(angle), con 0 gradi, 90 gradi e 180 gradi.

La funzione writeMicroseconds ()

La funzionewrite() funzionerà per la maggior parte dei servi, ma non per tutti., Alcuni servomotori hanno una gamma di 180 gradi, alcuni hanno una gamma di 90 gradi, e alcuni hanno ovunque nel mezzo. L’utilizzo della funzionewrite() consente solo un massimo di 180 passaggi. Tuttavia, esiste una funzione che consente fino a 1000 passaggi, chiamata writeMicroseconds(). Se si desidera un controllo più preciso del servo, è possibile utilizzare la funzionewriteMicroseconds() invece diwrite().,

Lo schizzo seguente mostra come utilizzare la funzione writeMicroseconds():

In questo schizzo, abbiamo sostituito ogni funzione write() con una funzione writeMicroseconds(). Modificare i valori angolari da (0, 90, 180) gradi a (1000, 1500, 2000) microsecondi. Caricare ed eseguire il programma utilizzando la stessa configurazione hardware. Per un servomotore capace di un intervallo fino a 180, i valori saranno 1000 microsecondi = 0 gradi, 1500 microsecondi = 90 gradi e 2000 microsecondi = 180 gradi.,

A seconda del servomotore che si sta utilizzando, si può notare una differenza. È interessante notare che sul mio setup, mentre monitoravo gli impulsi su un oscilloscopio, ho notato che quando usavo servo1.write(0);, la larghezza dell’impulso era solo di circa 700 microsecondi, non 1000 che è il modo in cui la funzione dovrebbe funzionare se impostata a zero gradi. Ma quando si utilizzaservo1.writeMicroseconds(1000); l’output era esattamente 1000 microsecondi.,

Controlla un servo con i pulsanti

Costruisci il tuo circuito come mostrato nello schema sopra, quindi carica il codice mostrato di seguito.

Dopo aver caricato il codice compilato, aprire il monitor seriale sul vostro Arduino. Quando si preme su entrambi i pulsanti, il servo dovrebbe aumentare o diminuire come mostrato sul monitor seriale. Inizialmente, il codice imposterà il servo a 90 gradi. Utilizzare il pulsante collegato al pin 3 per aumentare l’angolo., Quando si raggiunge 180 gradi, la fascia alta della rotazione, il LED collegato al pin 5 si accende. Quando si raggiunge la fascia bassa della gamma che è 0 gradi, il LED collegato al pin 6 si accende.

Per determinare il risultato della pressione del pulsante, un’istruzione while verifica il pulsante e l’angolo dell’albero. while (digitalRead(pin3) == HIGH && pos < 180) determina che il pulsante è stato premuto (ALTO) e l’angolo è inferiore a 180, quindi il programma aggiunge un grado e si attiva. Il secondo pulsante while (digitalRead(pin4) == HIGH && pos > 0) determina che il pulsante è stato premuto (ALTO) e l’angolo è maggiore di 0., Ciò fa sì che l’angolo diminuisca di uno e si attivi. Il livello LedHi e LedLow per i LED sono controllati da un’istruzione if che controlla l’angolo per vedere se è 0 o 180. I LED vengono spenti non appena l’angolo cambia in ciascuna delle due istruzioni while.

Controllare un servo con un potenziometro

Costruire il circuito come mostrato nello schema utilizzando un potenziometro 10 K per controllare il servomotore. Quindi carica il codice qui sotto.,

Dopo aver caricato il codice, aprire il monitor seriale sul vostro Arduino. Come si regola il potenziometro, la rotazione del servo cambierà di conseguenza. Quando si raggiunge il limite inferiore della gamma, il basso LED si accende, e come si raggiunge il limite superiore, il LED ad alta si accende.

Il codice è semplice. La prima riga di codice nella funzione loop() dovrebbe essere:

val = analogRead(pot); val = map(val, 0, 1023, 0, 180); servo1.write(val); 

analogRead() prende la tensione dal potenziometro come segnale analogico., Accetta i valori dell’intera gamma di input accettati in un Arduino (0-5V). Lo cattura come un numero intero nell’intervallo di (0-1023). Quindi, ad esempio, un valore DC di 0V verrebbe catturato come numero intero 0; un valore di intervallo completo di 5V verrebbe catturato come numero intero 1023 e metà dell’intervallo di input di 2,5 V verrebbe catturato come numero intero 512, metà di 1023.

La riga successiva di codiceval = map(val, 0, 1023, 0, 180); associa il valore di val all’interno dell’intervallo 0, 1023, a un valore di 0, 180.,

La riga successiva di codice servo1.write(val); è il comando write() che prende come argomento il numero intero memorizzato in val e lo applica al servo. Il servo riceve un impulso dal servo1.write(val); e la larghezza dell’impulso è determinata dal valore di val. Il servo utilizza la larghezza di questo impulso per determinare la sua rotazione.

Lascia un commento

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