Controllo di un servo con Raspberry Pi Pico W e PWM

Un servo è uno dei modi fondamentali per imparare a utilizzare la modulazione di larghezza di impulsi (PWM) con Raspberry Pi. In questo articolo, vi mostrerò come farlo con un Raspberry Pi Pico W.

Obiettivi dell'esercitazione PWM

Un servo con un Pico W e un PWM
  • Imparare a utilizzare il PWM per controllare l'angolo del servo.
  • Configurare un server con Pico W
  • Il server fornisce una pagina web con un cursore per il controllo del servo

Parti necessarie

  • Raspberry Pi Pico W con header
  • Cavo di collegamento
  • Servo (noi utilizziamo il micro-servo Tower Pro SG90)

Che cos'è la modulazione di larghezza di impulso?

I bambini trovano divertente accendere e spegnere ripetutamente le luci.

Per loro è così divertente vedere le luci accendersi e spegnersi quando azionano l'interruttore. I genitori potrebbero non trovarlo divertente, ma questo rappresenta un momento di apprendimento per tutti noi.

Se voi o i vostri figli l'avete fatto, avete sperimentato una forma primitiva di modulazione di larghezza di impulso.

Con un Raspberry Pi, è possibile farlo facilmente in modo automatizzato. In sostanza, dovrete dire al Raspberry Pi quante volte volete che le cose siano "accese" in un periodo specifico.

Questo permette di oscurare i LED:

telecomando picockpit gpio pwm
Regolazione della luminosità dei LED con la funzione PWM di PiCockpit

Inoltre, consente di controllare l'angolo del braccio del servo.

Un importante concetto di PWM: il ciclo di lavoro

Il ciclo di lavoro è sostanzialmente il tempo in cui il circuito rimane "alto", cioè acceso.

Quindi, supponiamo che il circuito sia acceso per metà del tempo. Possiamo quindi dire che il ciclo di lavoro è di 50%.

Se è sempre acceso, il suo ciclo di lavoro sarà pari a 100% e viceversa, se è sempre spento significa che il ciclo di lavoro è pari a 0.

Illustrazione del ciclo di lavoro da Sparkfun (CC BY-SA 4.0)

Tornando all'esempio di un bambino che accende e spegne le luci a un ritmo regolare, il motivo per cui le luci non si accendono completamente o si affievoliscono del tutto è che stiamo erogando una tensione in uscita solo per una porzione di tempo specifica.

Nel caso di un LED, ciò significa che il LED rimane acceso per un certo periodo di tempo, poi viene tolta l'alimentazione, quindi viene fornita nuovamente l'alimentazione, e così via.

In questo modo, il LED non diventa mai abbastanza luminoso da raggiungere la massima intensità, né ha il tempo di spegnersi completamente.

Servocomando SG90 con PWM

Dobbiamo essere cauti in quanto non tutti i servi funzionano allo stesso modo. Questo tutorial è specifico per il microservo Tower Pro SG90.

L'SG90 ha una rotazione di 180 gradi, ma alcuni servi sono a 120 gradi. I servi per radiocomando per hobby sono molto probabilmente a 120 gradi, quindi assicuratevi di controllare la scheda tecnica del servo che volete manipolare, poiché è possibile danneggiare i servi se gli date un segnale fuori portata.

Questa è la scheda tecnica dell'SG90, fornita da Luxor Parts:

La scheda tecnica indica due cose importanti: quale colore corrisponde al positivo, alla massa e al segnale e la frequenza degli impulsi/ciclo di lavoro.

  • Marrone = negativo
  • Rosso = positivo
  • Arancione = segnale

E per la frequenza degli impulsi/ciclo di lavoro

  • È necessario un ciclo di lavoro di 20 ms o 50 Hz.
  • Un segnale di 1 ms = zero gradi
  • Un segnale di 2ms = 180 gradi ruotati
Con un segnale di 1 ms, il servo viene ruotato di zero gradi.

Ciò significa che ogni ms il servo cercherà un aggiornamento. Se si continua a inviare un segnale di 2 ms, il servo rimarrà in rotazione completa (180 gradi). Se si passa a 1,5 ms, la rotazione sarà di 90 gradi, mentre a 1 ms la rotazione sarà di zero gradi.

Con un segnale di 2 ms, il servo viene ruotato di 180 gradi.

Collegamento del servo al Pico W

Per utilizzare il nostro codice, è necessario collegare il file filo di segnale al GPIO 0. Il filo di segnale è il filo arancione dell'SG90.

Quindi, collegare il filo rosso a VBUS (che fornisce 5 V). Come si può vedere dal datasheet, la tensione di funzionamento dell'SG50 è compresa tra 4,8 e 6 V, quindi il pin da 3,3 V del Pico W non funziona.

Codifica del servocomando Pico W

È possibile trovate il codice qui sul nostro GitHub.

Esaminiamo il codice.

In main.pyche è una convenzione di denominazione per il file che vogliamo eseguire all'avvio, creiamo una classe per il servo e la istanziamo:


class Servo:
    def __init__(self, MIN_DUTY=300000, MAX_DUTY=2300000, pin=0, freq=50):
        self.pwm = machine.PWM(machine.Pin(pin))
        self.pwm.freq(freq)
        self.MIN_DUTY = MIN_DUTY
        self.MAX_DUTY = MAX_DUTY
        
    def rotateDeg(self, deg):
        if deg < 0:
            deg = 0
        elif deg > 180:
            deg = 180
        duty_ns = int(self.MAX_DUTY - deg * (self.MAX_DUTY-self.MIN_DUTY)/180)
        self.pwm.duty_ns(duty_ns)

servo = Servo()

La classe Servo utilizza la classe machine.PWM disponibile in MicroPython. Vedere la documentazione qui.

In questo esempio, utilizziamo il Pico W come punto di accesso. Ecco il codice per realizzarlo:

ssid = 'Servo-Control'
password = 'PicoW-Servo'

ap = network.WLAN(network.AP_IF)
ap.config(essid=ssid, password=password)
ap.active(True)

while ap.active() == False:
  pass

print('Connection successful')
print(ap.ifconfig())

Come si può vedere dalle prime due righe, l'SSID che si sta cercando è Servocomando e la password è PicoW-Servo.

Una volta effettuato l'accesso alla rete WiFi, è possibile accedere all'indirizzo IP del Pico W, che per impostazione predefinita è 192.168.4.1. In alternativa, è possibile controllare il registro su Thonny per vedere qual è l'indirizzo IP del Pico. In alternativa, è possibile controllare il registro di Thonny per verificare l'indirizzo IP del Pico.

Come comunica la pagina web con il servo?

Controllo del servo cursore

Quando ci si collega all'indirizzo IP di Pico W, viene inviato il file index.html, che si trova sul repo Github.

Il file index.html contiene queste importanti righe:

 <form id="form">
            <input type="range" class="slider" min="0" max="180" value="slider_value" name="servo" id="servo">
            <output></output>
        </form>

Come si può vedere, c'è un oggetto che è il cursore.

Esiste anche un che visualizza il grado di rotazione.

La parte JavaScript aggiorna l' e l'URL in modo che Pico W possa acquisire i dati e ruotare il servo.

Gli elementi e hanno un genitore .

Ecco lo script sul lato anteriore,