Raspberry Pi ha appena rilasciato Raspberry Pi Pico, la prima scheda microcontrollore basata sul nuovo chip RP2040, progettato per essere un microcontrollore economico (4 dollari USA) e flessibile, e una piattaforma di sviluppo in grado di lavorare con i linguaggi C/C++ e Python. Il chip RP2040 incorpora un nuovo processore dual core Cortex M0+ in tecnologia ARM, in grado di funzionare a ben 133MHz, che può far conto su 2 MB di flash memory precaricata e 264 KB di SRAM. Per maggiori informazioni sul rilascio vi riporto il link della notizia scritta venerdì scorso (clicca qui).
Ci sono tanti motivi per cui potresti utilizzare un joystick analogico con la board Raspberry Pi Pico, per esempio come la creazione di un gioco o di un dispositivo input per la navigazione.
Il collegamento di un joystick è davvero semplice e anche la codifica in MicroPython è un gioco da ragazzi.
MicroPython è un’implementazione software del linguaggio di programmazione Python 3, scritto in C, ottimizzato per l’esecuzione su un microcontrollore.
Componenti da utilizzare:
- Raspberry Pi Pico con pin
- Joystick analogico con interfaccia a 5 pin (ci sono molti modelli).
- Breadboard (opzionale). Puoi anche collegare il tuo joystick direttamente ai pin.
- Cinque cavi jumper : femmina-maschio. Se non stai usando una breadboard, avrai bisogno di jumper femmina-femmina.
Ecco il diagramma di collegamento:
Il joystick analogico “incorpora” tre dispositivi in uno in quanto è costituito da un potenziometro per l’asse X, un altro potenziometro per l’asse Y e un pulsante/bottone digitale nel momento in cui si pigia sulla levetta del joystick.
Il primo passo consiste nell’apertura di un IDE per MicroPython come Thonny,
Ecco il codice completo per utilizzo del joystick:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
xAxis = ADC(Pin(27)) yAxis = ADC(Pin(26)) button = Pin(16,Pin.IN, Pin.PULL_UP) while True: xValue = xAxis.read_u16() yValue = yAxis.read_u16() buttonValue = button.value() xStatus = "middle" yStatus = "middle" buttonStatus = "not pressed" if xValue <= 600: xStatus = "left" elif xValue >= 60000: xStatus = "right" if yValue <= 600: yStatus = "up" elif yValue >= 60000: yStatus = "down" if buttonValue == 0: buttonStatus = "pressed" print("X: " + xStatus + ", Y: " + yStatus + " -- button " + buttonStatus) utime.sleep(0.1) |
Vediamo passo passo il codice come funziona.
Per prima cosa vi è l’importazione di vari moduli come:
- Pin
- ADC for machine
- utime
1 2 |
from machine import Pin, ADC import utime |
In seguito vi è l’utilizzo della funzione utime.sleep per inserire un ritardo necessario in un ciclo che legge lo stato del pulsante.
Poi vi è la creazione delle variabili le variabili xAxis e yAxis, ciascuna assegnato al pin GP corrispondente.
1 2 |
xAxis = ADC(Pin(27)) yAxis = ADC(Pin(26)) |
Poi vi è la creazione di una variabile pulsante, assegnata al Pin corrispondente.
1 |
button = Pin(16,Pin.IN, Pin.PULL_UP) |
Poi vi è la creazione di un ciclo continuo che controlla e stampa i valori per x, y e pulsante.
1 2 3 4 5 6 |
while True: xValue = xAxis.read_u16() yValue = yAxis.read_u16() buttonValue= button.value() print(str(xValue) +", " + str(yValue) + " -- " + str(buttonValue)) utime.sleep(0.1) |
Proviamo ad eseguire il codice e osservare i risultati nella shell MicroPython mentre spostiamo la levetta del joystick e si preme il pulsante. Quello che probabilmente vedremo è che se il joystick non viene spostato o premuto, i valori X e Y saranno compresi tra 32.000 e 33.000 e il valore del pulsante sarà 1. Spostandoti a sinistra vedremo che il valore X è compreso tra 300 e 500 e spostandola verso destra sarà di circa 65.000. Nel momento in cui si sposta la levetta verso l’alto il valore della variabile Y oscilla tra 300 a 500 e spostata verso il basso il valore della varabile sarà di circa 65.000. Premendo il pulsante si assegna un valore 0 nel momento in cui è premuto.
Ora interrompiamo l’esecuzione e cancelliamo l’istruzione print per risparmiare spazio.
Creiamo delle variabili per identificare lo stato della levetta.
1 2 3 |
xStatus = "middle" yStatus = "middle" buttonStatus = "not pressed" |
Utilizziamo l’interazione if per etichettare correttamente lo stato del joystick e dei pulsanti all’interno del ciclo.
1 2 3 4 5 6 7 8 9 10 |
if xValue <= 600: xStatus = "left" elif xValue >= 60000: xStatus = "right" if yValue <= 600: yStatus = "up" elif yValue >= 60000: yStatus = "down" if buttonValue == 0: buttonStatus = "pressed" |
Utilizziamo un’istruzione print per stampare le variabili e posizioniamola sopra il comando sleep.
1 |
print("X: " + xStatus + ", Y: " + yStatus + " -- button " + buttonStatus) |
Ed ecco che hai implementato con successo il tuo joystick ed è pronto per essere utilizzato nei progetti con Raspberry Pi Pico.
Link utili
Ciao, ho fatto tutto e funziona tutto, ma ora vorrei che funzionasse come joystick non solo tramite IDE.
Non riesco a capire come fare. Grazie
Per farlo funzionare come joystick occorre inserire codice.
Ad esempio, le variabili xAxis e yAxis contengono un valore continuo analogico a 10 bit (tra 0 e 1023), mentre la variabile button è uno switch digitale (premuto/non premuto): il ciclo while True legge in continuazione i valori provenienti dal joystick (che è, ricordiamolo, nient’altro che l’unione di due potenziometri). In base al vlore risontrato occorre fare in modo che (ad esempio) Arduino piloti un attuatore esterno attraqverso i PIN di output, o invii codici opportuni via serial per colloquiare con un PC…
Grazie dei suggerimenti, sono molto inesperto, e non ho idea di come aggiungere il codice necessario.
Ciao Christian, all’inizio siamo tutti stati inseperti. Se ti va puoi provare ad unirti al nostro canale Telegram, dove centinaia di utenti (esperti e meno esperti) pongono domande ed offrono risposte per i propri progetti.
Oppure decidere di seguire un (breve) corso tra quelli che offriamo, per aumentare le tue competenze seguito passo passo da un istruttore.