Anni 90: Robot Wars è uno dei programmi più in voga sulle televisioni di tutto il mondo. I bambini rimangono incollati allo schermo del televisore per vedere quelle meraviglie di latta con un paio di ruote cercare di distruggersi in tutti i modi possibili. Probabilmente in molti saranno rimasti affascinati dai robot (che oltre a farsi la guerra su palcoscenici simili a quelli della WWE, fanno anche cose molto utili per semplificarci la vita) e in molti avranno anche provato a costruirne uno, affacciandosi per la prima volta al mondo dell'elettronica e della programmazione.
2021: la tecnologia si è evoluta, abbiamo robot che ci puliscono la casa anche quando noi non ci siamo, ci lavano i piatti e ci consigliano anche come vestirci in base al meteo giornaliero. Chi è alle prime armi però vorrà iniziare con qualcosa di più semplice di un robot aspirapolvere: qui entra in gioco il Raspberry Pi Pico, un'ottima scelta per iniziare a mettere le mani in pasta e dare vita al nostro primo robot, considerando i costi molto contenuti sia in termini di acquisto che di alimentazione necessaria rispetto ai suoi fratelli maggiori. Seguendo questa guida, completa di tutti i componenti necessari, dovreste riuscire a costruire un robottino molto semplice basato appunto su Raspberry Pi Pico.
Componenti necessari
- Raspberry Pi Pico
- Kitronik Motor Driver Board
- Robot chassis
- 1x pacco batteria (4 batterie)
- 4x batterie AA
- 1x switch / pulsante
- Saldatore a stagno
Assemblaggio dei componenti
Il primo step sarà la connessione dei motori ai pin corrispondenti della scheda driver, l'alimentazione tramite batteria e la connessione dei sensori antiurto. In questa build inoltre è stato utilizzato un microswitch, che è sostanzialmente lo stesso che si trova sui joystick arcade, per una semplice questione di gusto personale. Un qualsiasi pulsante svolgerà lo stesso identico lavoro.
Connessione al Raspberry Pi Pico
- Inserite il Pico nei pin femmina della scheda Kitronik.
-
Spelate quattro cavi, lasciando più o meno 10 mm di filo a ogni capo. Uniteli insieme come nell'immagine e saldateli con dello stagno in modo da evitare corto circuiti. Se i motori che avete acquistato hanno già i cavi per il collegamento, saltate direttamente al punto 4.
-
Saldate i cavi creati al punto 2 sulle placchette metalliche dei motori.
-
Inserite i capi opposti dei cavi nei pin Motor 1 e Motor 2 della scheda Kitronik.
-
Saldate due cavi sul microswitch / pulsante utilizzato. Un cavo andrà saldato sul COM (Common), mentre l'altro su NO (Normally Open), in modo tale che il circuito venga chiuso (quindi la corrente inizi a fluire) alla pressione del pulsante.
-
Inserite il cavo COM nel pin 3V della scheda Kitronix e l'altro cavo nel pin GP0.
-
Collegate il pacco batteria ai pin di alimentazione. Assicuratevi di rispettare la polarità (cavo rosso = +, cavo nero = -) ma non inserite ancora le batterie.
- Fissate la scheda Kitronix e il pacco batteria allo chassis.
Programmazione del robot
La scheda Kitronik ha una sua libreria MicroPython tramite la quale controllare i motori, quindi il primo passo sarà proprio installare questa libreria. Assicuratevi che lo switch di alimentazione del motor driver sia su OFF mentre è collegata al PC, per evitare di danneggiare il Raspberry o il vostro computer.
- Connettete il Raspberry Pi Pico al PC e aprite il software Thonny. Cliccate STOP per assicurarvi che il Pico sia connesso.
- Copiate il testo di questo file.
- Create un nuovo file in Thonny e incollate il testo copiato in precedenza. Salvate il file come PicoMotorDriver.py nel vostro Raspberry Pi Pico.
- Create un nuovo file per il codice del progetto.
-
Importate due librerie: PicoMotorDriver e utime. PicoMotorDriver è quella che abbiamo appena creato con il file precedente, mentre utime serve a gestire i timing necessari a controllare il robot.
import PicoMotorDriverimport utime
-
Create due oggetti. Il primo, "board", verrà utilizzato per controllare la scheda Kitronik. Il secondo, "forward_bumper", crea una connessione tra la scheda Kitronik e lo switch. Questo pin verrà configurato come input e settato a 0V.
board = PicoMotorDriver.KitronikPicoMotor()forward_bumper = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_DOWN)
-
Create una funzione chiamata "forward". L'unico argomento di questa funzione sarà la velocità alla quale vogliamo far muovere il robot. Le due linee di codice servono a controllare rispettivamente il motore 1 e il motore 2 (che dovrà ruotare in direzione opposta rispetto al motore 1). A tal proposito, identificheremo la direzione di rotazione del motore 1 con la "f" (forward) e quella del motore 2 con "r" (reverse). Nel caso in cui "f" ed "r" non dovessero funzionare potete provare a invertirle, ricordandovi sempre di testare il funzionamento prima di procedere con la stesura del codice.
def forward(speed):board.motorOn(1, "f", speed)board.motorOn(2, "r", speed)
-
Create un'altra funzione per la retromarcia.
def reverse(speed):board.motorOn(1, "r", speed)board.motorOn(2, "f", speed)
-
Create altre due funzioni per far sterzare il robot a destra e a sinistra. In questo caso i due motori dovranno ruotare in direzioni opposte per effettuare il movimento.
def left(speed):board.motorOn(1, "f", speed)board.motorOn(2, "f", speed)
def right(speed):board.motorOn(1, "r", speed)board.motorOn(2, "r", speed)
-
Create l'ultima funzione per far fermare il robot.
def stop():board.motorOff(1)board.motorOff(2)
-
Aggiungete un delay di 5 secondi. Questo ci darà il tempo di posizionarlo sul pavimento e levarci di torno.
utime.sleep(5)
-
Create un loop while True per far girare continuamente il codice.
while True:
-
Aggiungete un test condizionale all'interno del loop. In questo modo verrà eseguito un test sul pin GPIO utilizzato per lo switch. Se il robot urta un ostacolo, lo switch chiude il circuito e attiva la connessione tra il pin 3V e il GP0, modificando il suo valore da 0 a 1.
if forward_bumper.value() == 1:
-
Scrivete un codice per definire ciò che succede nel momento in cui il robot urta un ostacolo: verrà inizialmente stampato un messaggio sulla shell di Python. Successivamente verrà invocata la funzione "reverse" per un secondo, al 75% della potenza. Il robot poi si ferma, viene stampato un altro messaggio sulla shell e viene invocata la funzione "left" per un secondo al 75% della potenza, per poi infine far fermare il robot.
print("Reverse")reverse(75)utime.sleep(1)stop()print("Left")left(75)utime.sleep(1)stop()
-
Aggiungete una condizione di else per il caso in cui il robot si muove in avanti. Verrà stampato un messaggio sulla shell di Python e successivamente, tramite la funzione "forward", la velocità verrà impostata al 75%. Il robot verrà fatto muovere in avanti per 5 secondi, passati i quali verrà effettuato nuovamente il controllo sul pin GP0.
else:print("Forward")forward(75)utime.sleep(5)
- Salvate il codice sul Raspberry Pi Pico come main.py, in modo tale che esso venga avviato automaticamente quando il Raspberry viene acceso.
Codice completo
import PicoMotorDriverimport utimeboard = PicoMotorDriver.KitronikPicoMotor()forward_bumper = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_DOWN)
def forward(speed):board.motorOn(1, "f", speed)board.motorOn(2, "r", speed)
def reverse(speed):board.motorOn(1, "r", speed)board.motorOn(2, "f", speed)
def left(speed):board.motorOn(1, "f", speed)board.motorOn(2, "f", speed)
def right(speed):board.motorOn(1, "r", speed)board.motorOn(2, "r", speed)
def stop():board.motorOff(1)board.motorOff(2)
utime.sleep(5)while True:if forward_bumper.value() == 1:print("Reverse")reverse(75)utime.sleep(1)stop()print("Left")left(75)utime.sleep(1)stop()else:print("Forward")forward(75)utime.sleep(5)