I principi base di CircuitPython per una prototipazione e uno sviluppo rapidi basati su microcontroller

Di Steve Leibson

Contributo di Editori nordamericani di DigiKey

Anche se il linguaggio Python ha reso più accessibile la programmazione, è stato concepito per l'esecuzione su PC e altre macchine con moltissime risorse di elaborazione, memoria e periferiche. Per sistemi embedded con rigidi vincoli di risorse e interfaccia, si è diffusa una versione ottimizzata per microcontroller chiamata MicroPython. L'accoglienza è stata talmente buona che la community open-source ha iniziato ad adattare MicroPython a specifici microcontroller e schede per supportare lo sviluppo di microcontroller sofisticati.

Questo articolo illustrerà uno di questi adattamenti, CircuitPython di Adafruit. Dopo una breve presentazione di Python, e un confronto con il classico linguaggio di sviluppo embedded C++, descriverà come si è evoluto prima in MicroPython e ora in CircuitPython. Infine spiegherà come scrivere il software con CircuitPython e introdurrà diverse schede di sviluppo di Adafruit e di altri fornitori che supportano l'ambiente CircuitPython.

Perché è nato Python

La scheda di sviluppo a microcontroller originale Arduino, e le molte che sono seguite, hanno riscosso l'approvazione di maker, hobbisti e studenti che le hanno usate sia per i propri progetti che per prototipi embedded. Tuttavia, l'IDE e il linguaggio di programmazione di Arduino sono basati su C++, un linguaggio compilato potente ma complesso con una sintassi dall'aspetto strano e regole di punteggiatura rigide che spesso scoraggiano i programmatori alle prime armi.

Python è un linguaggio di programmazione più moderno, interpretato, interattivo e orientato agli oggetti, che combina una notevole potenza di programmazione con una sintassi estremamente chiara. È noto per la sua facilità di scrittura e di lettura e anche per una sintassi più semplice. L'insieme di queste caratteristiche riduce il numero di errori di programmazione, facilita il riutilizzo del codice e accelera lo sviluppo del software.

La natura interpretativa del linguaggio offre al programmatore un riscontro immediato che incoraggia la sperimentazione e l'apprendimento rapido. Questo fa di Python il primo linguaggio di programmazione studiato da molti studenti e maker.

Python ha però anche uno svantaggio. Infatti è stato progettato per essere eseguito su PC e macchine più grandi con tantissima RAM e archiviazione di massa e con un'interfaccia utente completa di tastiera, grande display e mouse. Non è stato concepito come linguaggio di programmazione embedded. Finché non è comparsa un'implementazione agile ed efficiente del linguaggio di programmazione Python 3, chiamata MicroPython, creata e ottimizzata appositamente per l'esecuzione con le risorse limitate di un microcontroller.

Appurato che MicroPython è un linguaggio di programmazione embedded, la community open source ha iniziato ad adattarlo a certi microcontroller e schede per supportare lo sviluppo di microcontroller sofisticati. Adafruit, ad esempio, ha sviluppato una propria versione di MicroPython, chiamata CircuitPython. Progettato per semplificare la sperimentazione e imparare più rapidamente a programmare schede a microcontroller a basso costo, CircuitPython è costruito su misura per i microcontroller e le risorse hardware disponibili sulle schede di sviluppo di Adafruit. Su diverse schede di sviluppo di Adafruit è preinstallato, mentre in altre è installabile.

Differenze tra C++ e Python

Data la popolarità e la presenza dell'IDE Arduino e delle numerose schede di sviluppo Arduino oggi disponibili, chiedersi perché potrebbe servire una versione di Python per lo sviluppo embedded non è una domanda fuori luogo. La risposta la dà un confronto fra i linguaggi.

C++ è un'estensione del vecchio linguaggio C con estensioni orientate agli oggetti. Con queste estensioni, il codice C++ finisce per essere un po' criptico perché mantiene la sintassi C creata originariamente da Kernigan e Ritchie di Bell Labs tra la fine degli anni '60 e i primi anni '70. Nelle intenzioni, C doveva poter essere mappato facilmente nelle istruzioni di una macchina per un determinato processore. La preferenza accordata alle esigenze della macchina rispetto a quelle del programmatore è evidente nella sintassi del linguaggio. Dato che i microprocessori commerciali sono apparsi solo nel 1971, C è stato in origine sviluppato per i minicomputer. I compilatori C per i microprocessori si sono gradualmente evoluti in strumenti utili nel corso degli anni '80. C è sempre stato un linguaggio compilato, come C++.

L'informatico danese Bjarne Stroustrup ha iniziato a sviluppare C++ nel 1979. Il suo primo manuale sul linguaggio è apparso nel 1985 ma si è dovuto attendere il 1998 perché C++ diventasse un linguaggio di programmazione standard. Come C, C++ di Stroustrup inizialmente era destinato a computer più grandi. L'IDE (ambiente di sviluppo integrato) Arduino, sviluppato nel 2003, ha fatto di C++ un linguaggio utile per i microcontroller.

Anche Python è un linguaggio orientato agli oggetti. Sviluppato dal programmatore olandese Guido van Rossumin, venne rilasciato per la prima volta nel 1991. La costruzione sintattica di Python evidenzia la leggibilità "umana" del codice, cosa che lo differenzia in modo basilare da C++. La facilità di scrittura, strettamente associata a quella di lettura, è un'altra caratteristica che gioca a favore di Python. Per la sua facilità di scrittura, molti ritengono che Python permetta ai programmatori di scrivere le applicazioni più rapidamente, incoraggiando la sperimentazione e accorciando i cicli di prototipazione e sviluppo.

Una seconda differenza importante è il fatto che Python è un linguaggio interpretato, molto simile al linguaggio di programmazione Basic apparso per la prima volta per i minicomputer negli anni '60 e "sbocciato" in pieno negli anni '70 con l'introduzione dei microcomputer. Come Basic, la natura interpretativa di Python incoraggia la sperimentazione, e quindi l'apprendimento, facendo a meno del ciclo di sviluppo edita/compila/scarica/esegui usato per i linguaggi di programmazione compilati. Tuttavia, diversamente da Basic, Python è un linguaggio orientato agli oggetti moderno e di livello superiore che incorpora i progressi fatti in campo informatico nel mezzo secolo trascorso dalla nascita di Basic.

Non è ad esempio necessario dichiarare o digitare le variabili di Python prima dell'uso. I programmatori non devono preoccuparsi se una variabile deve essere un intero o un numero a virgola mobile. L'interprete di Python è in grado di capirlo e di fare le scelte appropriate al momento dell'esecuzione.

Altre due differenze tra C++ e Python sono la gestione delle stringhe e la punteggiatura. Molti programmatori ritengono che la gestione delle stringhe in C++ sia lenta e confusa. La gestione delle stringhe di Python è molto più semplice e ricorda da vicino le capacità di gestione delle stringhe di Basic, lineare e molto apprezzata, che è stata a lungo considerata un punto forte di Basic.

Anche la punteggiatura di C e C++ - specie le parentesi graffe ({}) - si rivela spesso un ostacolo contro cui vanno a sbattere anche i programmatori esperti. Sembra che in un programma ci sia sempre un numero dispari di parentesi graffe, il che significa che il programmatore deve esaminare a fondo il codice per trovare dove dovrebbe andare la parentesi graffa mancante. Python non ha una punteggiatura così pignola ma usa i rientri, che lo rendono estremamente facile da leggere.

Le origini di MicroPython

Come C e C++, Python in origine era destinato a essere eseguito su computer più grandi. Di conseguenza, richiedeva troppe risorse per poter essere utilizzato per la programmazione di microcontroller. Questo ha spinto il programmatore e fisico australiano Damien George a sviluppare una versione di Python chiamata MicroPython che fosse eseguibile sulle risorse più limitate di un microcontroller, come le schede di sviluppo Arduino.

La natura interattiva di MicroPython poggia sulla sua interfaccia di comando, chiamata formalmente finestra REPL (read-eval-print-loop), che in genere opera su una connessione seriale tra un PC host e una scheda di sviluppo a microcontroller. L'interfaccia REPL assomiglia molto alle interfacce a riga di comando Basic degli anni '70 e '80. Accetta le immissioni dell'utente (espressioni o istruzioni singole), le valuta, quindi invia i risultati all'utente tramite la finestra REPL oppure esegue il comando embedded nell'istruzione.

Utilizzando l'interfaccia REPL è possibile inviare una query a una variabile, commutare una linea di I/O o inviare una stringa di caratteri a una periferica collegata. La riga viene interpretata ed eseguita non appena si preme il tasto di invio. Questa è la natura di un linguaggio interpretato.

Questa caratteristica di MicroPython facilita il debug e la programmazione esplorativa ed è uno degli aspetti che rende il linguaggio facile da usare sia per i principianti che per i programmatori esperti. L'interfaccia utente REPL supporta cicli di sviluppo più rapidi rispetto al classico ciclo modifica-compila-esegui-correggi dell'IDE Arduino. La possibilità di sperimentare nuovi tipi di periferiche in modo interattivo utilizzando l'interfaccia utente REPL di MicroPython torna utile anche ai programmatori esperti.

Il supporto di CircuitPython per le schede di sviluppo

Ogni microcontroller ha una serie esclusiva di periferiche e ogni scheda di sviluppo va ad aggiungersi all'elenco. Queste periferiche richiedono librerie di supporto. Questo vale sia per l'IDE Arduino che per MicroPython. Inoltre, anche molti dispositivi periferici aggiuntivi, come il LED RGB indirizzabile NeoPixel 1655 di Adafruit richiedono il supporto di librerie.

Per fornire un supporto superiore, Adafruit ha sviluppato la sua versione di MicroPython, chiamata CircuitPython, con l'obiettivo di soddisfare i requisiti specifici di molte delle sue economiche schede di sviluppo a microcontroller. La società ha anche convertito molte librerie di periferiche della sua immensa collezione Arduino in librerie CircuitPython, fornendo così un numero cospicuo e crescente di librerie di supporto delle periferiche per CircuitPython.

Adafruit ha progettato una linea di schede di sviluppo a microcontroller espressamente per supportare CircuitPython, tra cui:

  • Circuit Playground Express 3333 con dieci LED RGB controllabili e indirizzabili (Figura 1)

Immagine di Circuit Playground Express 3333 di Adafruit

Figura 1: Circuit Playground Express 3333 ha dieci LED RGB controllabili e indirizzabili. (Immagine per gentile concessione di Adafruit)

  • Scheda di sviluppo Trinket M0 3500 di soli 27x15,3x2,75 mm (Figura 2)

Immagine della scheda di sviluppo Trinket M0 3500 di Adafruit

Figura 2: Scheda di sviluppo Trinket M0 3500 di soli 27x15,3x2 mm. (Immagine per gentile concessione di Adafruit)

  • Gemma M0 3501 è grande circa quanto una moneta da 50 centesimi e può essere alimentata dalla sua porta USB o da una porta per batteria separata (Figura 3)

Immagine di Gemma M0 3501 di Adafruit

Figura 3: Gemma M0 3501 di Adafruit è grande circa quanto una moneta da 50 centesimi e può essere alimentata dalla sua porta USB o da una porta per batteria separata. (Immagine per gentile concessione di Adafruit)

  • Feather M0 Express 3403 è una scheda di sviluppo con una piccola area della basetta sperimentale per una circuiteria personalizzata (Figura 4)

Immagine della scheda di sviluppo Feather M0 Express 3403 di Adafruit

Figura 4: Feather M0 Express 3403 è una scheda di sviluppo con una piccola area della basetta sperimentale per una circuiteria personalizzata. (Immagine per gentile concessione di Adafruit)

Queste quattro schede di sviluppo a microcontroller di Adafruit sono tutte basate sui microcontroller SAMD21 di Microchip Technology (ex Atmel) con supporto USB nativo. Tuttavia, CircuitPython non supporta solo le schede di sviluppo di Adafruit e il microcontroller SAMD21. Stanno già iniziando ad apparire versioni di CircuitPython per altre schede di sviluppo con altri microcontroller. Fra queste, la Feather NRF52 3406 di Adafruit e la nRF52-DK di Nordic Semiconductor, basate entrambe sul microcontroller nRF52832 di Nordic Semiconductor. CircuitPython supporta anche la scheda di sviluppo nRF52840-DK di Nordic Semiconductor (Figura 5), basata sul suo microcontroller nRF52840. Sul chip di entrambi i microcontroller di queste tre schede è integrato Bluetooth Low Energy (BLE) con il relativo supporto software.

Immagine della scheda di sviluppo nRF52840-DK di Nordic Semiconductor

Figura 5: Nella scheda di sviluppo nRF52840-DK di Nordic Semiconductor il supporto BLE è integrato. (Immagine per gentile concessione di Nordic Semiconductor)

Sviluppo con CircuitPython

Adafruit ha adottato un approccio particolare inserendo CircuitPython su schede di sviluppo progettate appositamente per supportarlo. Basta inserire una di queste schede in una porta USB del PC host perché il PC la veda come un'unità disco. La directory radice dell'unità disco mostra i file critici di CircuitPython, compreso l'interprete, il programma utente e una cartella contenente i file della libreria. Grazie a questa configurazione, il PC host riesce ad accedere facilmente alla scheda di sviluppo utilizzando il suo file system e i driver esistenti.

L'interfaccia utente di CircuitPython sul PC host richiede un editor open source gratuito e scaricabile e l'interfaccia REPL. Adafruit consiglia un'applicazione open source chiamata Mu, indicata nella Figura 6. La schermata della Mu è suddivisa in una finestra col codice in cui avviene l'editing e nella finestra di controllo e monitoraggio REPL in cui il programmatore controlla l'interprete di CircuitPython della scheda di sviluppo.

Immagine dell'interfaccia di programmazione open source Mu di Adafruit

Figura 6: Adafruit consiglia di utilizzare l'interfaccia di programmazione open source Mu La schermata della Mu è suddivisa in una finestra col codice in cui avviene l'editing e nella finestra di controllo e monitoraggio REPL in cui il programmatore controlla l'interprete di CircuitPython della scheda di sviluppo. (Immagine per gentile concessione di codewith.mu/en/tutorials/1.0/adafruit)

Digitando un programma nella finestra del codice e facendo clic sul pulsante "Save" della Mu, il codice viene salvato nella grande memoria flash su chip del microcontroller SAMD21 delle schede di sviluppo CircuitPython di Adafruit. Tutto il codice di CircuitPython si trova nella memoria flash del microcontroller della scheda di sviluppo. Tenere presente che al PC la scheda CircuitPython sembra un'unità disco, per cui ciò non appare come un'anomalia dal punto di vista del sistema operativo.

Conclusione

Il linguaggio Python offre ai programmatori molti vantaggi, compresi la programmazione, la sperimentazione e il debugging interattivi. Ha una sintassi semplificata e più simile a quella del linguaggio umano, non richiedendo dichiarazioni o l'immissione delle variabili, né una punteggiatura pignola. MicroPython è una variante di Python 3 che permette di programmare microcontroller in Python.

Come illustrato, Adafruit ha adattato MicroPython per ottenere CircuitPython per il supporto hardware diretto e poter così ulteriormente semplificare la sperimentazione e l'apprendimento e accelerare lo sviluppo software. CircuitPython supporta già numerose schede a basso costo basate sui microcontroller SAMD21 di Microchip, oltre ad altre basate sui microcontroller nRF abilitati BLE di Nordic Semiconductor.

DigiKey logo

Esonero della responsabilità: le opinioni, le convinzioni e i punti di vista espressi dai vari autori e/o dai partecipanti al forum su questo sito Web non riflettono necessariamente le opinioni, le convinzioni e i punti di vista di DigiKey o le sue politiche.

Informazioni su questo autore

Image of Steve Leibson

Steve Leibson

Steve Leibson è stato System Engineer per HP e Cadnetix, Editor in Chief per EDN e Microprocessor Report, blogger tecnologico per Xilinx e Cadence (solo per citarne alcuni), e ha collaborato come esperto di tecnologia in due episodi di "The Next Wave with Leonard Nimoy". Da 33 anni collabora con molti progettisti allo sviluppo di sistemi migliori, più veloci e più affidabili.

Informazioni su questo editore

Editori nordamericani di DigiKey