Come utilizzare un servomotore con il Raspberry Pi

Raspberry Pi Servo Motor Feature Image
⏱️ 13 min read

I motori a corrente continua sono fantastici, ma è difficile fargli controllare le mani e le dita robotiche. Non riesci a ottenere l’angolazione giusta. Ma con i servomotori, puoi sempre essere sicuro che si fermeranno sempre alla giusta angolazione.

Quindi prendi i cavi dei ponticelli e faremo girare un servomotore con il Raspberry Pi e lo faremo fermare da qualsiasi angolazione!

Cos’è un servomotore?

Un servomotore è un motore a corrente continua che consente di controllarne l’angolo. Puoi impostarlo per ruotare di 90 gradi, fermarsi, quindi tornare indietro di 90 gradi. Sono utili quando è necessaria la precisione su una parte che si muove automaticamente.

Servo e Raspberry Pi

All’interno di un servomotore ci sono tre parti: motore CC, potenziometro e un circuito che controlla il motore.

I potenziometri nei servomotori sono resistori, proprio come i resistori che usi per accendere i LED. L’eccezione è che possono cambiare i valori di resistenza quando li giri.

Nei servomotori, il potenziometro è orientato al motore CC in modo che ruoti quando il motore CC gira. Questo ti consente di conoscere l’angolo dell’albero motore. Il circuito del controller gli dice di fermarsi quando raggiunge una certa angolazione.

Con questo in mente, l’utilizzo di servomotori con Raspberry Pi significa che stai dicendo al circuito del controller di far girare il motore CC fino a raggiungere un certo angolo.

Che cos’è la modulazione dell’ampiezza di impulso?

Pulse Width Modulation (PWM) è il cuore di tutta questa cosa servo-movimento. È un metodo per controllare la temporizzazione tra le onde di impulso in un segnale PWM.

Come spiegazione più semplice, immagina il Raspberry Pi che emette 3,3 V dal pin 7. Su un oscillatore che crea un grafico della tensione nel tempo, ciò creerebbe un grafico sul lato 3,3 V, che diventa una lunga linea col passare del tempo . Quando improvvisamente scende a 0 V, l’oscillatore traccia una linea verticale sul lato 0 V, quindi traccia una linea orizzontale da lì nel tempo.

Onde di impulso a modulazione di ampiezza di impulso
Un’onda di impulso appare così su un oscillatore.

Questa è chiamata un’onda di impulso. PWM è quando controlli la distanza tra due onde di impulso (lunghezza di 0 s) o la lunghezza dell’impulso stesso (lunghezza di 1 s). Questo è anche noto come a ciclo di lavoro ed è ciò che cambi durante l’utilizzo di ChangeDutyCycle() funzione.

Il controllo PWM è una funzione importante in molti microcontrollori, non solo nel Raspberry Pi. Ti consente di controllare e produrre così tante altre cose, per tutto il tempo usando solo un minuscolo morso di elettricità per lavorare.

Cose che ti servono per far girare un servomotore

  • Servomotore
  • 3 cavi di collegamento
  • Raspberry Pi (qualsiasi modello tranne il Pico)

Passaggi per l’utilizzo di un servomotore

  1. Con il tuo editor di codice preferito, incolla il codice seguente:
import RPi.GPIO as GPIO
from time import sleep
 
servoPin = 7
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(servoPin, GPIO.OUT)
pin7 = GPIO.PWM(servoPin, 50)
pin7.start(0)
 
def angleToDutyConvert(angle):
  dutyCycle = angle / 18 + 2
  GPIO.output(servoPin, GPIO.HIGH)
  pin7.ChangeDutyCycle(dutyCycle)
  sleep(0.15)
  GPIO.output(servoPin, GPIO.LOW)
  sleep(0.15)
 
def sweep(degrees):
  for pos in range(0, degrees, +5):
    print(pos)
    angleToDutyConvert(pos)
  for pos in range(degrees, 0, -5):
    print(pos)
    angleToDutyConvert(pos)
 
while True:
  sweep(45)
  sweep(90)
  1. Salva come “rpi-servo.py” o qualsiasi nome file a tua scelta, purché termini con l’estensione del file “.py”. Spegni il tuo Raspberry Pi in seguito.
  1. È ora di costruire il circuito! I servi sono dotati di tre fili che di solito sono incollati insieme come un unico cavo piatto.

I cavi del servo possono essere di diversi colori, a seconda del produttore. Collegali al Raspberry Pi come segue:

  • Bianco, rosso, nero: bianco = pin 7, rosso = 5V, nero = GND
  • Giallo, rosso, marrone: giallo = pin 7, rosso = 5V, nero = GND
  • Blu, rosso, nero: blu = pin 7, rosso = 5V, nero = GND

Il filo che stai collegando al pin 7 è il filo di “segnale” del servo. Questo è collegato direttamente al circuito del controller.

Collegamenti servo pin
A destra: cavo servo. A sinistra: lato maschio dei cavi di collegamento maschio-femmina.

Se non hai abbastanza cavi di collegamento maschio-femmina, puoi crearne uno tuo con un cavo di collegamento maschio-maschio e uno femmina-femmina collegati insieme.

Cavi jumper maschio a maschio e femmina a femmina
In alto: ponticello maschio-maschio. In basso: cavo di collegamento femmina-femmina. Combinandoli insieme si forma un cavo di collegamento più lungo con un’estremità maschio e un’estremità femmina.

Mancia: Se hai problemi a cercare il pin 7, tieni il tuo Raspberry Pi in modo che i pin GPIO siano posizionati sulla destra. A partire dal pin in alto a sinistra, quello sarebbe il pin 1. Alla sua destra c’è il pin 2. Sotto il pin 1 c’è il pin 3 e così via.

Piedinatura Raspberry Pi
La piedinatura è universale in tutti i modelli Raspberry Pi a 40 pin.
  1. accendi il tuo Raspberry Pi e apri il terminale. Uso cd per aprire la cartella in cui hai salvato il file. Un esempio è cd Routech.ro/experiments. Puoi anche farlo in modalità wireless tramite SSH.
  2. È ora di eseguire lo script Python. accedere python3 rpi-servo.py e guarda il tuo servo muoversi!

Mancia: è più facile vedere il Raspberry Pi muoversi quando ci metti sopra un pezzo di nastro adesivo, ma idealmente dovresti usare il “corno” che viene fornito con il servo direttamente dalla scatola.

Servo Con Trombe Assortiti
I servomotori sono dotati di un assortimento di “trombe” e una vite per fissarli in posizione.

Come funziona

Come per la maggior parte delle altre istruzioni che eseguiamo, stiamo dividendo questo codice in quattro parti:

  1. Comandi di importazione
  2. Comandi di configurazione
  3. Dichiarazioni di funzione
  4. Comandi in loop

Come sempre, queste non sono divisioni “standard”. È solo una buona pratica dividere il codice in bit più piccoli durante la programmazione delle cose per semplificare notevolmente la modifica e il debug!

Comandi di importazione

La sezione dei comandi di importazione è dove dovresti caricare i tuoi moduli. Qui stiamo usando due moduli: RPi.GPIO e time.

import RPi.GPIO as GPIO
from time import sleep

import RPi.GPIO as GPIO importa il modulo RPi.GPIO e ti consente di controllare i pin neri (GPIO) in cui inserisci i cavi del codice. L’ultima parte di questa linea, as GPIOdichiara una nuova variabile denominata GPIO. Qui, GPIO significherà sempre RPi.GPIO, a meno che non venga modificato nella parte successiva del codice. Puoi sostituire GPIO con qualsiasi altro nome di variabile tu voglia!

from time import sleep è un altro modo per importare un modulo, ma invece di importare l’intero modulo, ne stai solo importando una parte. Qui, abbiamo appena preso il sleep parte del modulo tempo, che consente di utilizzare il sleep() funzione, sospendendo il codice per un determinato numero di secondi.

Comandi di configurazione

I comandi di configurazione consentono di impostare e definire le cose prima di passare alla parte in loop.

servoPin = 7
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(servoPin, GPIO.OUT)
pin7 = GPIO.PWM(servoPin, 50)
pin7.start(0)

servoPin = 7 definisce la variabile servoPin e gli dà il valore 7. Stiamo usando questo per dire che il pin per il controllo del servomotore sarà il pin 7.

Perché definire un numero pin? A volte, quando cambi idea e pensi, vuoi spostarlo sul pin 40, ad esempio, è più facile cambiare solo un numero pin piuttosto che cercare il numero 7 su tutto il codice.

GPIO.setwarnings(False) interrompe un messaggio di avviso che vedrai quando esegui uno script Python che utilizza i pin GPIO. È impostato su “True” per impostazione predefinita.

GPIO.setmode(GPIO.BOARD) definisce quale piedinatura stai usando. Ne esistono di due tipi: BOARD e BCM. In BOARD, stai definendo i pin in base a dove si trovano. Il pin 1 è in alto a sinistra, il pin 2 alla sua destra e così via.

BCM sta per “Broadcom” e seleziona i pin in base al loro canale SOC Broadcom. Questo è un numero specifico per il pin. A differenza di BOARD, è più facile commettere errori con BCM, poiché il numero pin che utilizzerai cambia in base al modello Raspberry Pi che stai utilizzando.

GPIO.setup(servoPin, GPIO.OUT) definisce il pin 7, quel pin che abbiamo definito in precedenza come servoPine lo assegna come pin di uscita.

pin7 = GPIO.PWM(servoPin, 50) è un’altra variabile che stiamo definendo. GPIO.PWM(servoPin, 50) significa che stai facendo il servoPinpin di uscita rilascia un segnale PWM. Parleremo di PWM (Pulse Width Modulation) più avanti. Ma per soddisfare una certa curiosità, PWM significa che stai attivando e disattivando il pin a intervalli regolari. La seconda parte, 50indica al pin di essere attivato al 50% dell’intervallo, quindi si spegne.

Infine, pin7.start(0) fa in modo che il pin 7 inizi a fare la cosa PWM, rendendolo pronto per l’uso!

Dichiarazioni di funzione

La programmazione di codice complesso può essere eseguita in due modi: digitare e ridigitare la stessa cosa più e più volte o digitarla una volta in una variabile e ridurre dieci righe di codice in una riga. “Funzione” lo rende più semplice e nessun programmatore sano di mente preferirebbe il primo a una bella funzione.

def angleToDutyConvert(angle):
  dutyCycle = angle / 18 + 2
  GPIO.output(servoPin, GPIO.HIGH)
  pin7.ChangeDutyCycle(dutyCycle)
  sleep(0.15)
  GPIO.output(servoPin, GPIO.LOW)
  sleep(0.15)
 
def sweep(degrees):
  for pos in range(0, degrees, +5):
    print(pos)
    angleToDutyConvert(pos)
  for pos in range(degrees, 0, -5):
    print(pos)
    angleToDutyConvert(pos)

Le funzioni nelle dichiarazioni sono solo una gigantesca “funzione in una funzione”. Iniziamo dalla funzione in basso, sweep()in primo luogo, che utilizza l’altra funzione, angleToDutyConvert()dentro.

Funzione n. 1: spazzare (gradi)

def sweep(degrees): definisce un nome di funzione, sweepe gli dà un parametro: degrees. Vogliamo che questa funzione prenda un angolo in gradi e scorra lentamente fino a raggiungere quell’angolo. In quel momento stampa l’angolo corrente mentre si muove, quindi saprai già fino a che punto è andato.

def sweep(degrees):
  for pos in range(0, degrees, +5):
    print(pos)
    angleToDutyConvert(pos)
  for pos in range(degrees, 0, -5):
    print(pos)
    angleToDutyConvert(pos)

Normalmente, i servomotori si sposteranno a un angolo target il più velocemente possibile. Per far “spazzare” lentamente un servomotore, dovremo farlo muovere e fermarsi con una piccola angolazione finché non raggiunge l’angolo target.

Per farlo, abbiamo bisogno di un ciclo “for”. La linea for pos in range(0, degrees, +5): è un ciclo for che salva la posizione corrente in gradi in una variabile, pose scorre tra la parte iniziale di range() funzione, 0 e il valore massimo in gradi incrementando di 5.

Puoi visualizzarlo in questo modo: Il valore per pos inizia da 0, quindi si sposta di +5. Il ciclo for controlla se è ancora al di sotto del valore massimo (il degrees parte). In caso contrario, inizia a fare ciò che è all’interno del ciclo, quindi torna ad aggiungere +5 a pos. Poiché prima era 0, il valore successivo dovrebbe essere 0 + 5 = 5. Ricontrolla e si ripete finché pos diventa più grande o allo stesso livello di degrees.

La parte successiva fa le cose al contrario. A partire dal valore di degreesil servo si sposterà di -5 fino al valore di posscende a 0.

Potresti notare che ogni ciclo for ha due righe: print(pos) e angleToDutyConvert(pos). Il primo, print(pos)stampa il valore di pos nella console, il che rende le cose più facili da vedere. angleToDutyConvert(pos)d’altra parte, lo è Quello funzione personalizzata nella nostra funzione.

Funzione n. 2: angleToDutyConvert(pos)

Anche se questo è stato menzionato in precedenza, è più facile da spiegare dopo aver spiegato in cosa verrà utilizzato. angleToDutyConvert(angle) è una funzione personalizzata, come sweep(degrees). Allora a cosa serve?

def angleToDutyConvert(angle):
  dutyCycle = angle / 18 + 2
  GPIO.output(servoPin, GPIO.HIGH)
  pin7.ChangeDutyCycle(dutyCycle)
  sleep(0.15)
  GPIO.output(servoPin, GPIO.LOW)
  sleep(0.15)

Ricordati che sweep(degrees) prende un numero in gradi. È fantastico, ma i computer (e il circuito del controller del servo) non sanno cosa sia un “grado”, eppure conoscono i cicli di lavoro.

Per la maggior parte dei servomotori, calcolano l ‘”angolo” ascoltando i cicli di lavoro. Per convertire un numero da gradi a duty cycle, devi dividere l’angolo per 18 e aggiungere 2 al quoziente. Questa è esattamente la linea dutyCycle = angle / 18 + 2 è per.

La parte successiva della funzione fa la maggior parte del legwork. GPIO.output(servoPin, GPIO.HIGH) accende il pin 7, inviando un segnale al servomotore. pin7.ChangeDutyCycle(dutyCycle) cambia il ciclo di lavoro con il valore dalla conversione dei gradi in cicli di lavoro, quindi sleep(0.15) sospende il codice per 0,15 secondi.

Le ultime due parti, GPIO.output(servoPin, GPIO.LOW) e un secondo sleep(0.15), disattivare temporaneamente il pin 7. Non sono un codice “vitale” ma aiutano con il jitter, specialmente quando vuoi che il servo mantenga la sua posizione.

Comandi in loop

È tempo di far funzionare le cose. Usando un ciclo while, ruota il servomotore con il Raspberry Pi per tutto il tempo che desideri.

while True:
  sweep(45)
  sweep(90)

while True: è un ciclo while che non finisce mai. Qualunque cosa tu metta al suo interno verrà ripetuta per sempre, fintanto che gli dai elettricità.

Ma il vero MVP qui è il sweep() funzione, che è quella funzione che abbiamo creato in precedenza. Puoi aggiungerne altri per far oscillare il servomotore con diverse angolazioni. Ricorda solo che qualunque numero metti tra parentesi, quello sarà l’angolo in cui si muoverà il servo.

Domande frequenti

Perché il LED rosso dell’indicatore del mio Raspberry Pi si spegne durante l’utilizzo di un servomotore?

Il LED indicatore rosso ti consente di sapere se il tuo Raspberry Pi ha abbastanza elettricità che lo attraversa. Se inizia a morire mentre è in funzione un servomotore, probabilmente sta funzionando a bassa potenza. I servomotori hanno bisogno di molta elettricità per funzionare, quindi potresti voler utilizzare un alimentatore adeguato e più di un semplice caricabatterie per telefono.

Perché il mio servomotore non può ruotare di 360°?

La maggior parte dei servomotori per hobby non può ruotare di più di 180°. Chiedergli di ruotare di 360° sarebbe un allungamento. Ma ci sono altri servi che girano continuamente: “servi a rotazione continua”.

Perché il mio servomotore tremola?

Il jittering nei servomotori può essere dovuto a molte ragioni. Bassa potenza, problemi di codice o anche solo perché ne stai utilizzando uno economico realizzato con parti economiche. Gli ingranaggi potrebbero essere stati disallineati. Tuttavia, può essere utile disattivare il segnale PWM quando si desidera che rimanga in posizione.

Join our Newsletter and receive offers and updates! ✅

0 0 votes
Article Rating
Avatar di Routech

Routech

Routech is a website that provides technology news, reviews and tips. It covers a wide range of topics including smartphones, laptops, tablets, gaming, gadgets, software, internet and more. The website is updated daily with new articles and videos, and also has a forum where users can discuss technology-related topics.

Potrebbero interessarti anche...

Subscribe
Notificami
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x