Cos'è il MicroPython? Un'introduzione al Python-3 semplificato per microcontrollori

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.

Il MicroPython è un linguaggio di programmazione piccolo e leggero. Funziona su microcontrollori e viene utilizzato per sistemi embedded e dispositivi Internet of Things (IoT).

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.

Le origini del MicroPython

Lo schermo di un computer mostra il codice di MicroPython, circondato da componenti e circuiti elettronici, che simboleggiano le origini del linguaggio di programmazione

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.

Damien George e la campagna KickStarter

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.

L'evoluzione del codice sorgente MicroPython

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-libmicropython, che costituiscono il nucleo del progetto, ospitando rispettivamente le librerie aggiuntive e il codice dell'interprete principale.

MicroPython vs CPython: comprendere le differenze

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.

Concetti fondamentali di MicroPython

Un circuito stampato con il logo MicroPython, circondato da componenti elettronici e frammenti di codice

L'esplorazione di MicroPython richiede la comprensione di concetti fondamentali, quali il firmware, il processo di boot utilizzato e le famiglie di microcontrollori supportate.

Fondamenti del progetto MicroPython

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.

Firmware e processo di avvio

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.

Nozioni di base sul microcontrollore: PIC, STM32 ed ESP

MicroPython supporta una varietà di architetture di microcontrollori, comprese le famiglie PIC, STM32 ed ESP.

  • PIC : i microcontrollori PIC di Microchip sono popolari grazie alla loro semplicità e convenienza.
  • STM32 : la famiglia STM32 di STMicroelectronics offre prestazioni elevate con una gamma di opzioni che forniscono un equilibrio tra consumo energetico e capacità di elaborazione.
  • ESP8266 ed ESP32 : ESP8266 ed ESP32 di Espressif hanno guadagnato una notevole popolarità grazie alle loro funzionalità Wi-Fi integrate.

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.

Configurazione di MicroPython

Una scrivania con un computer, un cavo USB e una scheda microcontrollore. Sullo schermo viene visualizzato il codice per la configurazione di MicroPython

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.

Installazione su più sistemi operativi

Per installare MicroPython, dobbiamo garantire la compatibilità con il nostro sistema operativo. Possiamo installarlo su Linux, macOS e Windows con procedure specifiche per ciascuno:

  • Linux: utilizza il gestore pacchetti per installare python3pip3. Quindi, installa MicroPython utilizzando pip3 install micropython
  • macOS: installa Homebrew se non è già sul tuo sistema, quindi usa brew install micropython
  • Windows: scarica il programma di installazione di Windows dal sito Web MicroPython e segui la procedura guidata di configurazione

Configurazione dell'ambiente e distribuzione del codice

Dopo la procedura di installazione, dobbiamo procedere con la configurazione dell'ambiente attraverso i seguenti passi:

  1. Collega la scheda MicroPython al computer.
  2. Identifica la porta seriale della scheda.

    • Linux e macOS : controlla le porte disponibili utilizzando ls /dev/tty.*.
    • Windows : cerca in Gestione dispositivi sotto "Porte (COM e LPT)".
  3. Utilizza uno strumento come mpfshellrshellper la distribuzione:

    • Installa : pip3 install mpfshell(Linux/macOS) o pip install mpfshell(Windows).
    • Distribuisci codice : vai alla directory del tuo progetto ed esegui mpfshellseguito da put your_script.py.

Comprensione di porte e driver

Le porte e i driver corretti sono fondamentali per la comunicazione tra il nostro computer e la scheda MicroPython:

  • Identifica la porta della scheda del microcontrollore come menzionato sopra
  • Assicurati di aver installato i driver necessari:

    • I driver CP210x o FTDI sono comuni per le schede MicroPython.
    • È possibile scaricare i driver dai siti Web dei produttori.

Schede e hardware MicroPython

Una scheda MicroPython e l'hardware sono disposti su un banco da lavoro, con uno schermo di computer che mostra il codice e un saldatore nelle vicinanze

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 ufficiale e le sue varianti

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:

  • PyBoard v1.1 : include un microcontrollore STM32F405RG con 192 KB di RAM.
  • PyBoard serie D : versioni migliorate con opzioni di connettività come Wi-Fi e Bluetooth.

Microcontrollori supportati e considerazioni sulla RAM

MicroPython supporta una varietà di microcontrollori, ciascuno diverso per capacità e funzionalità:

AsseMicrocontrolloreRAM
PyBoard v1.1STM32F405RG192KB
Schede basate su ESP8266Tensilica L10696KB
Schede basate su ESP32Tensilica Xtensa LX6520KB

La RAM è fondamentale perché determina la complessità degli script e dei programmi. Maggiore è la quantità di RAM disponibile, più sofisticate possono essere le applicazioni.

Compatibilità con altre schede come Arduino e Raspberry Pi Pico

Mentre MicroPython può essere eseguito su una varietà di schede:

  • Arduino: il MicroPython non è supportato nativamente; tuttavia, esistono soluzioni alternative tramite firmware speciale come uPyCraft.
  • Raspberry Pi Pico: ha il supporto diretto per MicroPython, dotato di un microcontrollore RP2040 progettato dalla Raspberry Pi Foundation con 264 KB di SRAM.

Programmazione con MicroPython

Un circuito stampato con il codice MicroPython visualizzato sullo schermo di un computer, circondato da vari componenti elettronici e da un saldatore

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.

Sintassi di base e funzionalità di Python 3

MicroPython è fondamentalmente simile a Python 3, con cui condivide la stessa sintassi di base e gli stessi paradigmi di programmazione.

Variabilistrutture di controllofunzioni 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à.

Programmazione interattiva con REPL

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.

Moduli, librerie e integrazione Git

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.

Sviluppo del progetto

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.

Internet od things e dispositivi connessi

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:

  • Integrazione dei sensori : utilizzo di sensori digitali e analogici per acquisire dati ambientali.
  • Elaborazione dati : interfaccia MicroPython con il core del dispositivo per elaborare e interpretare i dati del sensore.
  • Comunicazione : implementazione di protocolli di rete come MQTT o HTTP per la trasmissione dei dati.

Progetti di domotica e robotica

Per la domotica e la robotica, MicroPython si distingue come scelta ideale per la sua versatilità:

  • Logica del controller: scrittura di script per gestire dispositivi come termostati intelligenti o sistemi di illuminazione.
  • Robotica: programmazione del movimento e delle attività per i robot utilizzando attuatori e controller del motore.

In queste applicazioni, lo sviluppo del nostro progetto si concentra sulla risposta e sull’affidabilità in tempo reale.

Come costruire progetti educativi STEM

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:

  • Strumenti interattivi: creazione di dispositivi che dimostrino principi scientifici
  • Piattaforme di apprendimento: piattaforme che aiutano gli studenti a scrivere ed eseguire il proprio codice MicroPython

Funzionalità avanzate e personalizzazione

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.

Inline assembler e 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()

Compilazione e creazione di firmware personalizzato

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:

  1. Clonazione della repository MicroPython da GitHub
  2. Configurazione delle opzioni di creazione
  3. Compilazione del codice sorgente
  4. Flashing del firmware compilato sul nostro hardware
# 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

Creazione e gestione di un fork MicroPython su GitHub

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:

  • Mantenere aggiornato il fork con il repository upstream
  • Prevedere ramificazione per nuove funzionalità o correzioni di bug
  • Invio di richieste pull per i contributi che si desidera versare
# Syncing our fork with the original repository
git fetch upstream
git checkout master
git merge upstream/master
git push

Connettività e periferiche

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).

Lavorare con protocolli Wi-Fi, Bluetooth e 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

    • Scansione in rete
    • Gestione della connessione
    • Configurazione del punto di accesso
  • Bluetooth

    • BLE Advertising
    • Servizi e caratteristiche BLE
    • Accoppiamento sicuro

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.

Interfacciamento di sensori, attuatori e display

L'interfaccia con sensori, attuatori e display è resa semplice grazie all'ampio supporto della libreria MicroPython.

I moduli machinepyb 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

    • Lettura dei dati (ad esempio, temperatura, umidità)
    • Interfacciamento ADC, I2C, SPI
  • Attuatori

    • Controllo dei motori
    • Pilotaggio di LED e relè
  • Visualizza

    • Integrazione OLED e LCD
    • Output grafico e basato su testo

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.

Comunicazione seriale e rete

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

    • Configurazione UART
    • Invio e ricezione dati

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

    • Creazione di socket
    • Protocolli TCP/IP e UDP
    • Comunicazione client-server

Ciò diventa fondamentale nei sistemi IoT complessi in cui più dispositivi devono scambiare dati in modo efficiente ed affidabile.

Espansione e risorse esterne

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.

Aggiunta di spazio di archiviazione con scheda SD e memoria flash

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 energetica e connettività della batteria

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.

Risoluzione dei problemi e supporto della comunità

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.

Problemi comuni e come risolverli

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:

  1. Errori di importazione dei moduli: a volte, l'importazione dei moduli può restituire errori. Per risolvere questo problema, controlla che il nome del modulo sia specificato correttamente e verifica che sia incluso nel firmware MicroPython.
  2. Problemi di connessione seriale: i problemi con la comunicazione seriale sono piuttosto comuni. Puoi risolvere questo tipo di problemi assicurandoti che siano selezionate la porta e la velocità di trasmissione corrette e che i cavi siano ben connessi.
  3. Errori di allocazione della memoria: quando si esaurisce la memoria, può essere utile semplificare il codice e gestire le risorse in modo efficiente utilizzando l'iterazione anziché la ricorsione e liberando memoria over possibile.

Impostazione Cookie

Questo sito utilizza i cookies. Puoi scegliere di consentirne o rifiutarne determinati tipi. Ulteriori informazioni sul loro utilizzo sono disponibili nella nostrainformativa sulla privacy.

Consentono la funzionalità di base del sito web. Il sito non funzionerebbe senza di essi.

Servono a raccogliere statistiche di utilizzo, con IP anonimo, che ci aiutano a migliorare il sito web.

Vuoi ricevere approfondimenti speciali sull'elettronica industriale?

Proteggiamo la tua privacy e trattiamo i tuoi dati nel rispetto della normativa GDPR. Inviando i tuoi dati attraverso questo form, ne consenti il trattamento come da nostra Privacy Policy
Contatti