programming
Il MicroPython è un'implementazione snella ed efficiente del linguaggio di programmazione Python 3, ottimizzato per l'esecuzione sui microcontrollori. Questi minuscoli componenti elettronici rappresentano il cuore pulsante di molti dispositivi moderni, tra cui sensori, motori e schermi, ma anche di cose più complesse come i robot e i dispositivi intelligenti.
A differenza del Python, che è un linguaggio di programmazione di alto livello utilizzato per lo sviluppo di software, il MicroPython è stato adattato specificatamente per i microcontrollori. Ciò rende possibile trarre vantaggio dall'avere un linguaggio potente come il Python in ambienti in cui le risorse sono limitate e l'efficienza e il controllo della stessa risultano fondamentali.
Le radici del MicroPython sono da ricercarsi nel tentativo di consentire la programmazione di unità a microcontrollore (in gergo "MCU") con facilità e flessibilità, reinterpretando in chiave ottimizzata un linguaggio tipico della programmazione di alto livello.
In genere, la programmazione dei microcontrollori richiede l'utilizzo di linguaggi di basso livello come il C o il C++, ma il MicroPython apporta delle novità interessanti.
In primo luogo, porta con sé un sottoinsieme della libreria standard del Python, il che significa che possiamo utilizzare molte delle funzioni e dei moduli Python familiari, anche se entro i vincoli imposti dall'hardware.
Adottando il MicroPython in modo strategico, è possibile ridurre significativamente i tempi di sviluppo facendo leva su alcuni suoi punti di forza.
Ad esempio, il supporto di prompt interattivi, il che consente di eseguire comandi e vedere immediatamente i risultati, proprio come avviene lavorando in Python su un PC o un server.
Questa funzionalità è eccezionalmente utile per la prototipazione rapida, per il debug e per l'apprendimento del modo in cui l'hardware interagisce con il software.
Inoltre, la sintassi e le librerie di MicroPython sono progettate per interagire perfettamente con l'hardware, dandoci un controllo quasi diretto sulla funzionalità delle periferiche MCU.
Esplorando la genesi di MicroPython, è necessario partire dalla sua campagna Kickstarter. Il nostro viaggio illustra lo sviluppo di questo interprete snello attraverso tappe fondamentali, definendo man mano la sua posizione unica nel panorama della programmazione di basso livello.
Nel 2013, Damien George ha lanciato una campagna Kickstarter per finanziare lo sviluppo di MicroPython, una nuova versione di Python progettata per funzionare su microcontrollori. La campagna è stata un successo, ha raccolto oltre £ 97.000 superando notevolmente quello che era il suo obiettivo iniziale.
George, con un background in fisica teorica e in ingegneria del software, mirava a portare la facilità della programmazione Python nel mondo dell'hardware. Il suo obiettivo era dunque ambizioso, ma non fuori portata. Per agevolarne la realizzazione, George ha puntato da subito ad uno sviluppo di tipo collaborativo.
Il codice sorgente di MicroPython è stato reso pubblicamente disponibile su GitHub, sotto la licenza MIT, consentendo così una vera e propria collaborazione aperta. Il progetto si è evoluto rapidamente, proprio grazie ai contributi da sviluppatori a livello globale.
In particolare sono le due repository centrali, micropython-lib
e micropython
, che costituiscono il nucleo del progetto, ospitando rispettivamente le librerie aggiuntive e il codice dell'interprete principale.
CPython è l'implementazione predefinita e più diffusa del linguaggio di programmazione Python. È scritta in C e in Python e rappresenta il riferimento con cui tutte le altre implementazioni di Python vogliono essere compatibili.
MicroPython, sebbene ispirato a CPython, si differenzia in quanto è progettato su misura per ambienti limitati come i microcontrollori. Mentre CPython è l'implementazione di riferimento di Python nella sua interezza, il MicroPython incorpora solo gli elementi essenziali, puntando a un ingombro di memoria minimo e ad una migliore gestione dei vincoli hardware.
È importante notare che MicroPython potrebbe non includere tutte le librerie o funzionalità standard presenti in CPython. Tuttavia, mantiene una somiglianza sintattica di alto livello, garantendo caratteristiche di leggibilità e manutenibilità importanti.
L'esplorazione di MicroPython richiede la comprensione di concetti fondamentali, quali il firmware, il processo di boot utilizzato e le famiglie di microcontrollori supportate.
Come già accennato, il MicroPython è un'implementazione efficiente di Python 3, progettata per funzionare su microcontrollori e in ambienti limitati. Fondamentalmente, l'obiettivo del progetto è rendere la programmazione dei dispositivi digitali quanto più semplice e accessibile possibile.
Il progetto prevede l'ottimizzazione del linguaggio Python per l'esecuzione su hardware con potenza di elaborazione e memoria limitate. Ciò comporta una combinazione di riscrittura delle librerie Python principali per renderle più compatte e ideazione di un compilatore incrociato in grado di convertire gli script Python in bytecode ottimizzato per vari microcontrollori.
MicroPython include una libreria standard completa che rende possibile scrivere codice in Python su dispositivi più piccoli, in precedenza erano limitati all'utilizzo di linguaggi tradizionali come il C o l'assembler.
Il firmware in MicroPython funge da intermediario tra il software e l'hardware. Tale firmware è progettato per essere leggero e altamente portatile, supportando un'ampia gamma di dispositivi.
Quando esegui il flashing di questo firmware su un microcontrollore, incapsuli automaticamente l'interprete MicroPython e una parte della libreria Python standard.
All'accensione del dispositivo, il bootloader, un piccolo programma memorizzato nella memoria non volatile del chip, avvia il processo.
Questo bootloader è responsabile della configurazione dell'hardware di base e dell'esecuzione del firmware principale, che include l'interprete MicroPython.
Il processo di avvio deve essere veloce e affidabile e dovrebbe consentirti di iniziare a eseguire gli script Python quasi immediatamente dopo aver acceso il dispositivo.
MicroPython supporta una varietà di architetture di microcontrollori, comprese le famiglie PIC, STM32 ed ESP.
Il firmware MicroPython per questi dispositivi non include solo funzionalità standard ma anche moduli per la comunicazione di rete, consentendo la creazione di dispositivi connessi.
In questa sezione ti guideremo attraverso l'installazione di MicroPython su vari sistemi operativi, la configurazione dell'ambiente per la distribuzione del codice e la comprensione delle porte e dei driver necessari. Il nostro obiettivo è fornirti i passaggi pratici necessari per una configurazione fluida del MicroPython.
Per installare MicroPython, dobbiamo garantire la compatibilità con il nostro sistema operativo. Possiamo installarlo su Linux, macOS e Windows con procedure specifiche per ciascuno:
python3
e pip3
. Quindi, installa MicroPython utilizzando pip3 install micropython
brew install micropython
Dopo la procedura di installazione, dobbiamo procedere con la configurazione dell'ambiente attraverso i seguenti passi:
Identifica la porta seriale della scheda.
ls /dev/tty.*
.Utilizza uno strumento come mpfshell
o rshell
per la distribuzione:
pip3 install mpfshell
(Linux/macOS) o pip install mpfshell
(Windows).mpfshell
seguito da put your_script.py
.Le porte e i driver corretti sono fondamentali per la comunicazione tra il nostro computer e la scheda MicroPython:
Assicurati di aver installato i driver necessari:
Esploreremo ora i componenti hardware essenziali di MicroPython, concentrandoci sulle schede primarie disponibili, sui microcontrollori che utilizzano e su come si confrontano con altre piattaforme popolari come Arduino e Raspberry Pi Pico.
PyBoard è la scheda di sviluppo ufficiale di MicroPython, progettata per fornire un'interfaccia hardware di basso livello per l'esecuzione degli script MicroPython. È disponibile in diverse varianti, ad esempio:
MicroPython supporta una varietà di microcontrollori, ciascuno diverso per capacità e funzionalità:
Asse | Microcontrollore | RAM |
---|---|---|
PyBoard v1.1 | STM32F405RG | 192KB |
Schede basate su ESP8266 | Tensilica L106 | 96KB |
Schede basate su ESP32 | Tensilica Xtensa LX6 | 520KB |
La RAM è fondamentale perché determina la complessità degli script e dei programmi. Maggiore è la quantità di RAM disponibile, più sofisticate possono essere le applicazioni.
Mentre MicroPython può essere eseguito su una varietà di schede:
In questa sezione esploreremo le basi per lavorare con questo linguaggio di programmazione, evidenziando le caratteristiche chiave come la sua sintassi, l'ambiente REPL interattivo e il modo in cui si integra con moduli, librerie e sistemi di controllo della versione come Git.
MicroPython è fondamentalmente simile a Python 3, con cui condivide la stessa sintassi di base e gli stessi paradigmi di programmazione.
Variabili, strutture di controllo, funzioni e classi funzionano tutte come previsto in Python. Ad esempio, creare una variabile è semplice come una regolazione assegnazione in Python, counter = 10
, e scrivere un ciclo avviene attraverso la familiare sintassi for item in range(counter)
.
La leggibilità e la concisione intrinseche di Python vengono mantenute, consentendo a chiunque abbia esperienza con Python 3 di passare a MicroPython con relativa facilità.
REPL sta per Read-Eval-Print-Loop ed è un ambiente di programmazione dinamico incluso in MicroPython.
Ci consente di eseguire i comandi Python uno alla volta e vedere risultati immediati. Possiamo interagire con REPL direttamente sul microcontrollore collegandoci ad esso tramite un'interfaccia seriale o tramite la rete.
>>> print("Hello, MicroPython!")
Hello, MicroPython!
L'interazione di cui sopra nel REPL è essenziale nel dimostrare come il feedback immediato nelle attività di programmazione possa accelerare i processi di apprendimento e debug.
MicroPython supporta moduli e librerie che possono essere importati per estendere le sue funzionalità.
Questo è fondamentale in quanto ci consente di riutilizzare e includere funzionalità complesse senza scriverle da zero. Ad esempio, l'utilizzo di un modulo di rete import network
ci consente di connettere un dispositivo a Internet.
Per gestire e condividere il codice in modo efficace, MicroPython si integra comodamente con Git, il famoso sistema di versioning.
Ciò significa che possiamo collaborare ai progetti pushando e pullando codice dalle repository, monitorando le modifiche e gestendo le versioni, tutte pratiche cruciali per lo sviluppo di software sostenibile.
MicroPython funge da catalizzatore per un'ampia gamma di iniziative di sviluppo di progetti, in particolare nei settori in cui convergono l'Internet delle cose (IoT), la domotica e i progetti educativi.
Essendo un'implementazione efficiente e semplificata di Python 3, MicroPython è realizzato su misura per microcontrollori e sistemi compatti su chip (SoC), consentendoci non solo di scrivere codice pulito e semplice ma anche di integrare varie funzionalità con facilità e precisione.
Spesso sfruttiamo il MicroPython per lo sviluppo di prodotti Internet of Things (IoT) poiché offre un'esperienza fluida per la codifica dei dispositivi connessi. I nostri progetti tipicamente riguardano:
Per la domotica e la robotica, MicroPython si distingue come scelta ideale per la sua versatilità:
In queste applicazioni, lo sviluppo del nostro progetto si concentra sulla risposta e sull’affidabilità in tempo reale.
MicroPython è adatto per progetti educativi STEM grazie alla sua sintassi semplice e alla curva di apprendimento rapida. E' possibile infatti progettare sia kit didattici sia vari esperimenti, come:
MicroPython consente agli sviluppatori esperti di spingersi oltre i limiti del semplice scripting.
E' infatti possibile personalizzare il comportamento, ottimizzare le prestazioni e mantenere le versioni di MicroPython utilizzando funzionalità avanzate come la compilazione di firmware personalizzato e la manipolazione del bytecode.
In MicroPython, l'inline assembler fornisce la capacità di scrivere in linguaggio assembly direttamente all'interno del nostro codice Python.
# Esempio di inline assembler per l'aggiunta di due interi
@micropython.asm_thumb
def add(r0, r1):
add(r0, r0, r1)
Ciò sfrutta tutta la velocità e il controllo del processore, una caratteristica fondamentale quando sono necessari tempi esatti o istruzioni specifiche.
La gestione del bytecode invece consente di ottimizzare la macchina virtuale Python. Ad esempio, è possibile ispezionare, modificare o estendere le operazioni del bytecode per miglioramenti delle prestazioni o funzionalità personalizzate.
# Esempio di manipolazione del bytecode in MicroPython
import micropython
micropython.bytecode()
E' possibile compilare il MicroPython per creare firmware personalizzato.
Questo processo consente l'inclusione o la rimozione di moduli, l'ottimizzazione per hardware specifico o persino l'integrazione di nuove funzionalità.
I passaggi per creare un firmware personalizzato in genere comportano:
# Cloning the MicroPython repository
git clone https://github.com/micropython/micropython.git
# Compiling the source on a Unix-based system
make -C mpy-cross && make -C unix
Per mantenere una versione personalizzata di MicroPython, è possibile eseguire il fork della repository ufficiale su GitHub.
Ciò ci consente di sperimentare le modifiche, monitorarle e successivamente contribuire alla comunità MicroPython.
Il nostro flusso di lavoro per la gestione di un fork MicroPython include:
# Syncing our fork with the original repository
git fetch upstream
git checkout master
git merge upstream/master
git push
Il MicroPython facilita la connettività e l'interfacciamento di un'ampia gamma di periferiche, candidandosi così come ottima scelta per lo sviluppo di applicazioni in ambito Internet of Things (IoT).
Viene fornito un solido supporto per la connettività Wi-Fi e Bluetooth in MicroPython, liberando il potenziale per una miriade di applicazioni IoT.
Lo stack WiFi consente una connessione continua alle reti wireless, consentendo ai dispositivi programmati in MicroPython di comunicare su Internet.
Utilizzando il modulo network
, è possibile cercare reti disponibili, stabilire connessioni e persino impostare MicroPython come punto di accesso.
Per Bluetooth, il modulo bluetooth
disponibile in MicroPython fornisce un'interfaccia per configurare le connessioni Bluetooth Low Energy (BLE), consentendo ai dispositivi di interagire con sensori e periferiche abilitati BLE.
Wifi
Bluetooth
Per quanto riguarda i protocolli IoT, MicroPython supporta intrinsecamente l'MQTT (Message Queuing Telemetry Transport), un protocollo di messaggistica leggero ideale per piccoli sensori e dispositivi mobili.
L'interfaccia con sensori, attuatori e display è resa semplice grazie all'ampio supporto della libreria MicroPython.
I moduli machine
e pyb
consentono di comunicare con vari componenti elettronici tramite pin GPIO (ingresso/uscita per uso generale), PWM (modulazione di larghezza di impulso), ADC (convertitore analogico-digitale) e altro ancora.
Sensori
Attuatori
Visualizza
Ciò garantisce che i progetti che implicano monitoraggio e controllo in tempo reale, come termostati intelligenti o bracci robotici, possano essere eseguiti in modo efficiente con un codice pulito e conciso.
MicroPython eccelle nel facilitare la comunicazione seriale e il networking.
Attraverso il modulo uos
viene fornita funzionalità per accedere all'UART (Universal Asynchronous Receiver/Transmitter) per le comunicazioni seriali, una capacità fondamentale per progetti che richiedono la trasmissione di dati tra dispositivi.
Connessioni seriali
Oltre a UART, MicroPython supporta protocolli di rete di livello superiore, offrendo TCP/IP e UDP attraverso il modulo usocket
, consentendo una comunicazione di rete robusta per i dispositivi MicroPython.
Rete
Ciò diventa fondamentale nei sistemi IoT complessi in cui più dispositivi devono scambiare dati in modo efficiente ed affidabile.
E' possibile migliorare in modo significativo le funzionalità dei sistemi MicroPython incorporando storage aggiuntivo, soluzioni di gestione dell'alimentazione e una varietà di ulteriori accessori.
Schede SD: è possibile espandere la capacità di archiviazione dei dispositivi MicroPython inserendo schede SD. Ciò è particolarmente utile per le applicazioni di registrazione dati in cui è necessario archiviare grandi quantità di dati.
Memoria flash: molte schede MicroPython sono dotate di memoria flash integrata. Se è necessaria ulteriore memoria, si può considerare l'aggiunta di chip flash aggiuntivi sugli ingombri disponibili.
Gestione della batteria: una gestione efficiente dell'energia è fondamentale per i progetti MicroPython portatili. Controller di carica e circuiti integrati di gestione dell'alimentazione sono facilmente integrabili per garantire una fornitura di energia costante, nonché la longevità della batteria.
Connettività della batteria: molte schede supportano le connessioni alle batterie LiPo, consentendo operazioni senza vincoli. È necessaria un'attenta considerazione delle specifiche della batteria e della connettività per soddisfare i requisiti di alimentazione del dispositivo.
Puoi trovare supporto nella comunità MicroPython quando ti trovi a dover superare ostacoli incontrati durante la programmazione con MicroPython.
Sia che tu sia alle prese con problemi comuni o che ricerchi una conoscenza approfondita, i forum e la wiki sono risorse inestimabili per il supporto. Qui di seguito invece ti forniamo una panoramica degli errori che si riscontrano più comunemente e le loro soluzioni suggerite.
Spesso si incontrano una serie di problemi comuni durante il lavoro con MicroPython.
Ecco di seguito alcuni problemi frequenti e le relative soluzioni che possiamo consigliarti:
Vuoi ricevere approfondimenti speciali sull'elettronica industriale?