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.
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# Mostra la temperatura su display I2C su Pico from machine import Pin, I2C from ssd1306 import SSD1306_I2C import framebuf,utime sensor_temp = machine.ADC(4) #al ADC4 è collegato il sensore di temperatura integrato conversion_factor = 3.3 / (65535) WIDTH = 128 # larghezza display oled HEIGHT = 32 # altezza display oled i2c = I2C(0) # Inizializza I2C usando I2C0 di default SCL=Pin(GP9), SDA=Pin(GP8), freq=400000 print("I2C Address : "+hex(i2c.scan()[0]).upper()) # Mostra indirizzo display print("I2C Configuration: "+str(i2c)) # Mostra configurazione I2c oled = SSD1306_I2C(WIDTH, HEIGHT, i2c) # Inizializza il display oled # Raspberry Pi logo in bytearray 32x32 buffer = bytearray(b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|?\x00\x01\x86@\x80\x01\x01\x80\x80\x01\x11\x88\x80\x01\x05\xa0\x80\x00\x83\xc1\x00\x00C\xe3\x00\x00~\xfc\x00\x00L'\x00\x00\x9c\x11\x00\x00\xbf\xfd\x00\x00\xe1\x87\x00\x01\xc1\x83\x80\x02A\x82@\x02A\x82@\x02\xc1\xc2@\x02\xf6>\xc0\x01\xfc=\x80\x01\x18\x18\x80\x01\x88\x10\x80\x00\x8c!\x00\x00\x87\xf1\x00\x00\x7f\xf6\x00\x008\x1c\x00\x00\x0c \x00\x00\x03\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00") # Carica il logo nel framebuffer (immagine 32x32) fb = framebuf.FrameBuffer(buffer, 32, 32, framebuf.MONO_HLSB) #ciclo infinito while True: reading = sensor_temp.read_u16() * conversion_factor temperature = 27 - (reading - 0.706)/0.001721 #legge la temperatura in gradi C # Pulisce il display oled.fill(0) # Mette l'immagine dal framebuffer al display oled oled.blit(fb, 0, 1) # Aggiungiamo il testo oled.text("Raspberry Pi",30,1) oled.text("Pico",55,14) oled.text("Temp: ",30,25) oled.text(str(round(temperature,2)),75,25) utime.sleep(2) #attende 2 secondi # Infine aggiorna il display per mostrare immagine e testo oled.show() |
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.
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:
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).
Lo script
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# Porcometro per Pico #importa le librerie from machine import Pin, PWM, ADC import utime def ev_handler(pin): global POS, MAX, SUX POS -= SUX print ("sale", POS) if POS <= MAX: POS = MAX print ("fondo scala") #impostazioni MIN = 2500000 # posizione 0 MAX = 500000 # posizione fondo scala SUX = 6000 # coefficiente di salita GIUX = 6000 # coefficiente di discesa POS = MIN mic = Pin(0, Pin.IN) mic.irq(trigger=Pin.IRQ_RISING, handler=ev_handler) pwm = PWM(Pin(15)) pwm.freq(50) #inizializzazione, fondo scala e zero pwm.duty_ns(MAX) utime.sleep(1) pwm.duty_ns(MIN) utime.sleep(3) #ciclo infinito while True: POS += GIUX if POS >= MIN: POS = MIN print("zero") pwm.duty_ns(POS) print ("scende", POS) utime.sleep(.2) |
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: Facebook, Twitter, Youtube
Se vuoi anche trovare prodotti e accessori Raspberry Pi in offerta, seguici anche su Telegram!!