sabato 27 Aprile 2024
Home / Corsi / Corso Python / Usare Raspberry Pi Pico con MicroPython
Pico coding

Usare Raspberry Pi Pico con MicroPython

Come detto nella guida precedente di primo approccio al Raspberry Pi Pico, questo micocontrollore può essere programmato in due modi diversi: Con C (o C++), oppure con MicroPython.

Usando un linguaggio versatile e potente come MicroPython è possibile cominciare subito a esplorare la programmazione sul Pico, senza bisogno di nient’ altro, mentre usando C o C++ si può sfruttare fino all’ultima goccia la potenza dell’hardware, ma occorre preparare il sistema per compilare i programmi prima di mandarli in esecuzione. Questa guida è incentrata all’approccio con l’utilizzo del linguaggio MicroPython. Vuoi invece esplorare la programmazione del Pico in C C++? Leggi la guida parallela a questa!

Iniziamo, in MicroPython !

MicroPython non è una versione ridotta di Python, ma una versione di Python per i microcontrollori. Quindi le conoscenze e la pratica sviluppata su Raspberry Pi si possono riportare pari pari sul Pico. Questa è una cosa grandiosa e lo rende subito utilizzabile. Per usare MicroPython, Pico deve avere caricato il firmware cin l’interprete MicroPython. Installarlo è davvero semplice: basta collegare il Pico a un computer tenendo premuto il tasto BOOTSEL a bordo della scheda, per farlo vedere al sistema come una memoria di massa USB.

Ora, al suo interno, vedremo un file index.htm che, se aperto, rimanderà alla pagina web del Pico, dove seguendo le istruzioni per MicroPython, ci farà scaricare un file con estensione .uf2, da copiare poi nella “chiavetta” RPI-RP2 che è poi il nostro Pico. Ma non fatelo ora: c’è un sistema ancora più semplice, lo vediamo!

Thonny

Uno script Python o MicroPython altro non è che un file di testo. potete scriverlo con gli strumenti che volete (anche il blocco note di Windows), salvare il testo con estensione .py e poi trascinare il file dentro la memoria di massa RPI-RP2. Se si chiama main.py, verrà eseguito automaticamente non appena viene alimentato il Pico.

Tuttavia, un IDE (ambiente di sviluppo integrato), cioè un programma pensato appositamente per farvi scrivere gli script, risulta comodo in molte cose. La Fondazione Raspberry Pi, ha da qualche anno adottato Thonny come IDE Python da inserire nel sistema operativo ufficiale Raspberry Pi OS. Esiste anche in versione Windows e Mac, ed è gratuito.

Indirizzato ai principianti, era molto semplice nelle prime versioni, anche se con una interessante opzione di debug passo-passo. Nel tempo è cresciuto, arricchendosi di funzioni. Con l’uscita del Pico è stato aggiornato alla vers. 3.3.xx dalla quale supporta direttamente il Pico collegato alla macchina su cui gira Thonny.

Il Firmware .uf2

Come scritto poco più su, le indicazioni ufficiali dicono di scaricare il firmware .uf2 per MicroPython e copiarlo nel dispositivo. Se si usa Thonny, il tutto è ancora più semplice: una volta collegato il Pico via USB al computer (sia esso un Raspberry Pi, un PC Windows o Linux, o un Mac), quando lanciamo Thonny, possiamo scegliere, in basso a destra, l’interpreter dedicato al Raspberry pi Pico. Cercherà quindi il Pico connesso, e se il firmware MicroPython non è già presente, ce lo notificherà e ci chiederà se vogliamo installarlo sul Pico. Tutto in automatico, e in pochi secondi. Molto bene!

Ora possiamo, grazie a Thonny, scrivere i nostri programmi MicroPython, leggerli e/o salvarli, sul computer o direttamente sul Pico, oppure mandarli in esecuzione. E’ possibile salvare più programmi sul Pico, fino a che c’è spazio in memoria. Il programma denominato main.py sarà quello in “esecuzione automatica” all’alimentazione del Raspberry Pi Pico, gli altri con altro nome possono essere lanciati da Thonny o richiamati dal programma main.py a seconda del bisogno, ad esempio. Non è obbligatorio usare Thonny come IDE per Raspberry Pi Pico, potete usarne uno molto più professionale o magari un editor di testo a linea di comando: i programmi funzioneranno lo stesso, se scritti correttamente. Ma Thonny è il compagno ideale per cominciare con il Pico.

Ricordate sempre di smontare correttamente il Pico dal sistema del computer, prima di scollegarlo, come fosse una chiavetta USB!

Programmi di esempio

Cercavo di ideare un esempio più utile del classico “facciamo lampeggiare il LED a bordo della scheda” che è praticamente l’unico argomento di tutti i tutorial sul Raspberry Pi Pico con MicroPython che si possono trovare in rete. E che non è nient’altro che il programma fornito come esempio dalla Fondazione Raspberry Pi. Possiamo cercare di pensare a qualcosa di un poco più intrigante. Rimestando nelle mie scatole di “sensori e ammenicoli elettronici” ho trovato un piccolo display OLED.. Perché non usarlo con il Pico, visualizzare la temperatura misurata dal sensore di temperatura che ha incorporato sulla scheda? Ecco ci allora al..

Visualizzare la temperatura su display OLED

Per comodità, per collegare qualcosa al Raspberry Pi Pico è decisamente più semplice saldargli i piedini e inserirlo in una breadboard. Se si ha già saldato su schede elettroniche, si tratta solo di piedini standard in passo 2.54mm . Se comunque non avete mai saldato prima, fatevelo fare da qualcuno di più esperto o fate prima allenamento su schede millefori o su schede guaste.

La breadboard permette di collegare componenti e fili senza effettuare altre saldature. Il Pico va inserito a cavallo della scanalatura, in modo che i piedini di un lato e quelli dell’altro non vadano a finire in contatto tra loro tramite la breadboard stessa.

Pico e strip pin

Collegamenti

Collegare un display OLED è così banale che non metto nemmeno lo schema, solo una tabella:

Display Oled Raspberry Pi Pico
GND un qualsiasi pin di massa (GND)
VCC pin 40 (+5V)
SCL pin 12 (GP9)
SDA pin 11 (GP8)

Lo script

Installare le librerie

Qui non abbiamo un sistema operativo alle spalle, e un comando come  PIP. Allora, come installiamo le librerie esterne, come ad esempio quella per far funzionare il display OLED?

La libreria andrebbe cercata (compatibile con Micropyton), scaricata e copiata nella memoria di massa del Pico, dentro una directory di nome lib.

Per fortuna, anche in questo caso, Thonny ci viene in aiuto. E’ sufficiente usare il menù Strumenti – Gestisci Plug-in per aprire un pannello per cercare e installare in automatico le librerie che ci servono. nel mio caso, ho un display ssd1306, basta quindi scrivere semplicemente “ssd1306” e premere invio per avere una lista di risultati. Facciamo scorrere fino a trovare quello che si chiama “micropython-ssd1306” e premiamo “installa”. Thonny si occuperà di scaricarla e installarla nel posto giusto sul Pico, pronta per essere importata nei nostri programmi. 

Si noti che cercando le librerie, i risultati sono vari, infatti compaiono anche le librerie per Python, per circuitpython ecc.. perché Thonny può essere usato per tutte queste varianti del linguaggio. Starà a noi scegliere quella adatta (in questo caso, quella per Micropython)

Descrizione

A differenza di Python su Raspberry Pi, qui (su MicroPython) per comandare i PIN e altre caratteristiche hardware si usa la libreria (preinstallata) machine. Si usa utime invece di time. Importiamo quindi le librerie necessarie, compresa la funzione SSD1306_I2C dalla llibreria ssd1306 installata prima, che ci servirà per comunicare con il display.

Poi fissiamo alcune variabili per impostare il sensore integrati nel Pico, il display e una costante che serve per la conversione della temperatura in gradi Celsius. impostiamo anche un bitarray: quella serie di numeri vanno a descrivere l’immagine di un lampone, poi da mostrare sul display.

Nel ciclo infinito while True, leggiamo la temperatura, puliamo lo schermo da eventuali residui di grafica di altri programmi, mettiamo l’immagine e il testo (compresa la temperatura) sul display. Attendiamo 2 secondi prima di riprendere il ciclo e fare nuova misura.

Pico alzato in cielo

Qualcosa di più sfizioso: il Porcometro!

Perché non provare il Pico anche con i motori, servomotori, o qualche sensore che non ho mai usato? Dalla scatola magica esce un servomotore e un sensore microfonico. Aziono il mio raffinato cervello e partorisco, complice la confusione agostiana in ufficio, un progetto indispensabile per l’umanità: il PORCOMETRO

Un indicatore di parolacce a lancetta, che abbia una certa inerzia in discesa, in modo che salga velocemente non appena i toni si scaldano e poi scenda piano piano a indicare il massimo raggiunto, in modo che a colpo d’occhio di percepisca la il “mood” dell’ambiente. Il progetto potrebbe chiamarsi “Casinometro” o “Urlometro” a seconda del contesto in cui viene usato.

L’hardware

Un pezzo di cartone, e una grafica fatta al volo per il tabellone, Servomotore e microfono collegati al Pico tramite la Breadboard.

Servomotore
Servomotore  Raspberry Pi Pico
VCC pin 36 (3V3OUT)
GND un qualsiasi pin di massa (GND)
SIGNAL pin 20 (GP15)
Sensore microfonico

Ho alcuni sensori microfonici, tutti molto simili: una basetta standard per sensori, con uscita digitale e analogica, con a bordo un trimmer che regola la soglia di intervento se usato in digitale, e la sensibilità se usato in analogico. Per intenderci tipo questo:

Sensore microfonico

Sono intesi più come sensori sonori che come microfoni per registrare la propria voce, quindi qui andremo a rilevare semplicemente quando il tono della voce si alza sopra il livello normale. Avevo intenzione di usarlo come sensore analogico: più è alto il livello sonoro e più alto sarà il valore che mi ritorna, ma non sono riuscito a farlo in pochi minuti (probabilmente occorreva regolarlo a progetto finito in modo da avere la lancetta al massimo con il massimo di livello sonoro). Sinceramente non ci ho perso molto tempo: stavo realizzando un progetto goliardico in pausa mensa, non un sistema di IA che riconosce il linguaggio naturale: mi bastava che rilevasse se c’è suono o no, e il suono va a alzare la lancetta di uno step, se poi il suono prosegue, di un altro step, e così via, fino all’eventuale fondo-scala. Se invece cessa, la lancetta prende a scendere, ma molto lentamente, fino a arrivare allo zero, se non interviene nel frattempo un altro suono. sinceramente raggiunge lo scopo anche così. Quindi per collegarlo come sensore digitale (c’è suono/non c’è suono) ho usato:

Sensore Raspberry Pi Pico
VCC pin 40 (+5V)
GND un qualsiasi pin di massa (GND)
DO (Digital Output) pin 1 (GP0)
AO (Analog Output) non collegato
Regolazione del sensore

Il trimmer multi giro a bordo di questo sensore (il parallelepipedo blu con la vitina di regolazione in cima) serve a regolare la “soglia” di intervento quando si utilizza l’uscita digitale: il sensore passerà da livello logico 0 a livello logico 1 al superamento di quella soglia, e col il trimmer potete variare quella soglia. Il tutto è semplificato dai due led a bordo del piccolo PCB: uno indica l’alimentazione (quando il sensore è acceso e operativo), mentre l’altro indica l’intervento, cioè quando il sensore passa a livello logico 1. Parlando e regolando il trimmer osservando il LED, si vedrà quando questo reagisce al suono. Si noti chela basetta è standard e comune a una infinità di sensori economici, e nella stessa maniera si regolano tutti i sensori realizzati con questo tipo di PCB: sensori di luce, di inclinazione, di vibrazione, di campo magnetico ecc ecc.

Quando viene usata l’uscita analogica, invece, il trimmer dovrebbe regolare la sensibilità del sensore (ma in effetti è molto più complicato regolarlo “a occhio”, se non con un sistema di feedback anch’esso analogico, come ad esempio la lancetta su un quadrante, altrimenti vedreste numerini cambiare di continuo su uno schermo, ma è difficile apprezzarne la grandezza).

sfondo porcometro
Lo sfondo, creato al volo per il mio indicatore di “porchi”

 

Lo script

Descrizione dello script in Micropython

importiamo le librerie necessarie, come prima cosa.

Poi, vado a definire una funzione  “ev_handler” che si occuperà di far salire la lancetta collegata al servomotore di un certo step SUX, quando viene richiamata. Controlla anche di non aver raggiunto il fondo scala, in quel caso, la lancetta non verrà mandata oltre. Si noti che, per come ho posizionato il servomotore, per “salire” con la lancetta, devo decrementare il valore passato al servomotore. Funziona, cioè, al contrario.

 poi imposto le mie variabili, che comprendono i limiti zero e fondo scala, e i coefficenti per salite e discese più o meno rapide della lancetta.

Definisco che il microfono è sul pin 0, che deve reagire in modalità interrupt a un fronte di salita (Pin.IRQ_RISING) in seguito al quale deve richiamare la funzione handler.

Istruisco il programma che il pin 15, a cui è collegato il servomotore, è da gestire in PWM (Pulse With Modulation) e poi lancio una sequenza lancetta a fondo scala, attendi un secondo, lancetta a zero, per l’inizializzazione dello strumento al boot, che ricorda gli strumenti del cruscotto della mia auto, e secondo me fa molto figo.

Nel ciclo infinito, la posizione della lancetta viene portata verso il basso, a meno che non sia già al punto zero (ricordate che per abbassarlo devo aumentare il numero), attendo 0,2 secondi, e riprendo il ciclo di (lenta) discesa.

naturalmente questa azione di lenta discesa può venire alterata solo dal sensore, che lavorando in logica interrupt, in qualsiasi momento può aumentare il valore di POS (la posizione della lancetta). L’effetto lo vedete nel video.

I vari print presenti nello script, sono lì a scopo di debug, non sono indispensabili al funzionamento.

 

Vuoi capire come invece come programmare il Pico in C o C++? Leggi la guida parallela a questa!

Raspberry Pi Pico si può acquistare presso i rivenditori ufficiali come Melopero, a circa 4,50€

Se vuoi restare aggiornato, seguici anche sui nostri social: FacebookTwitterYoutube

Se vuoi anche trovare prodotti e accessori Raspberry Pi in offerta, seguici anche su Telegram!!

A proposito di Zzed

Appassionato di informatica alternativa, ma perenne novellino di Linux..

Vedi Anche

Raspberry Pi AI Camera

Nuovi Hardware Ufficiali Raspberry Pi

Anticipazioni sui futuri prodotti ufficiali Raspberry Pi!

Powered by themekiller.com