Micro Python: arriva la Python board per sistemi embedded

Pyboard e Micro Python, due termini che viaggiano insieme; infatti, non si può parlare della Pyboard se non introduciamo Micro Python. La Pyboard è una nuova scheda, tipo Raspberry Pi, dove il software residente è la versione embedded di Python: si controlla la scheda in modo diretto senza passare da nessun’altra interfaccia, in questo modo si gestiscono direttamente le risorse hardware della medesima con estrema semplicità e facilità.

Introduzione

Micro Python è un’implementazione del linguaggio di programmazione, vedi [1], realizzata in modo specifico per il mondo dei microcontrollori; infatti, la scheda Pyboard può rappresentare un piccolo esempio su come può essere possibile utilizzare Python in un ambiente embedded. Ricordiamo che Python è un linguaggio di scripting molto facile da imparare, altamente espressivo e potente, oltre, cosa da non sottovalutare, a vantare una grande comunità di supporto. Grazie alla presenza della Pyboard, possiamo, senza dubbio, vedere in che modo utilizzare questo linguaggio per fare, ad esempio, lampeggiare un LED, leggere le tensioni, azionare motori, riprodurre suoni, scrivere dati su schede SD e comunicare in modalità wireless con altri dispositivi.

Rispetto alla versione ufficiale di riferimento, così come anche ad altre distribuzioni dello stesso tipo, Micro Python si basa su una riscrittura completa del linguaggio. Infatti, stando alle indicazioni del realizzatore del progetto, questa versione embedded è scritta in ANSI C e comprende una completa libreria parser, un compilatore, una macchina virtuale, un sistema runtime con garbage collector, oltre al supporto per l’esecuzione su un microcontrollore. Non solo, sempre secondo le specifiche presenti sul sito di riferimento, il compilatore può compilare in codice byte o codice macchina nativo, selezionabile per funzione. Non solo, questa implementazione supporta anche l’assembler inline e tutta la procedura di compilazione è realizzata sul chip senza la necessità di utilizzare software addizionali. L’attuale stato dell’arte del progetto prevede il pieno supporto dei processori ARM a 32 bit con il set d’istruzioni Thumb v2, quali la famiglia Cortex-M. Micro Python è stato su un chip STM32F405. Possiamo così brevemente riassumere le caratteristiche di Micro Python:

  • Pieno rispetto della grammatica Python 3, anche se non sono presenti tutte le librerie standard
  • L’attuale implementazione offre un lexer, parser, un compilatore, una macchina virtuale e runtime
  • Micro Python esegue codice all’interno di file, oltre ad un’interfaccia a riga di comando (una lettura-valutazione-stampa-loop, o REPL)
  • Il codice Python è compilato in un bytecode compresso che risulta successivamente eseguito sul built-in di una macchina virtuale
  • Micro Python è stato realizzato con l’obiettivo di utilizzare solo una piccola quantità di ram riducendo al minimo l’uso della memoria heap
  • Questa implementazione consente di ottenere prestazioni paragonabili a un linguaggio embedded; infatti, le funzioni possono essere opzionalmente compilate in codice macchina nativo, con un incremento delle sue prestazioni rispetto a un codice interpretato
  • L’implementazione dell’assembler inline consente l’accesso completo alla macchina sottostante; infatti, le routine assembler possono essere chiamate da Python come se fossero delle normali funzioni.

UTILIZZARE MICRO PYTHON

La Pyboard contiene una versione preinstallata di Micro Python e, grazie alle caratteristiche del linguaggio, può essere utilizzata da chiunque perché non richiede conoscenze tecniche particolari. Infatti, per utilizzare Micro Python non è necessario fare un set-up dell’ambiente, ma semmai, utilizzandolo con un PC, c’è solo la necessità di procurarsi un cavo micro-USB e collegare la scheda a una porta libera per ottenere un flash driver USB. Una volta che abbiamo alimentato la scheda possiamo scrivere tutto il codice di cui abbiamo bisogno. È possibile, ad esempio, scrivere funzioni e classi, fare liste e dizionari, occuparci dell’elaborazione di stringhe o leggere e scrivere file (sulla scheda SD o nella memoria flash): le possibilità di programmazione sono infinite! Non solo, la scheda ha molti pin di I/O che possono essere collegati ad altre schedine al fine di rendere il nostro progetto più complesso.

La scheda può funzionare senza PC, perché l’alimentazione è fornita da un dispositivo esterno in grado di assicurare una tensione tra 3.6 V e 10 V. In pratica è possibile utilizzare Micro Python allo stesso modo di una qualsiasi scheda targata Arduino o Raspberry Pi, ma, al contrario di queste ultime, senza la necessità di utilizzare un compilatore. Vediamo le operazioni da fare per eseguire un semplice script Python sulla scheda. Una volta connessa a un PC (Windows, Mac o Linux) con un cavo micro USB vedremo che la Pyboard inizia il processo di boot: il led verde si accende per mezzo secondo fino a quando non termina il processo di avvio. Alla presenza, ad esempio, di Windows, la Pyboard si presenta con un’unità flash drive rimovibile e gestibile attraverso Explorer. Non solo, in ambiente Windows, la schedina potrebbe anche essere vista come dispositivo seriale: in questo caso, il sistema operativo in uso cercherà di configurare in modo automatico la periferica. Una volta terminata l’operazione di riconoscimento della periferica, la Pyboard risulta connessa e in 0:/ noteremo la presenza di quattro file:

  1. boot.py – Questo è uno script eseguito quando la scheda è in fase di boot: lo script ha la funzione di configurare la scheda stessa;
  2. main.py – È lo script principale che contiene il vero programma Python ed è posto in esecuzione dopo boot.py;
  3. README.txt Contiene alcune informazioni utili per gestire la scheda;
  4. pybcdc.inf – È il classico driver di Windows utilizzato per configurare il dispositivo seriale.

Una volta connessi alla scheda è possibile modificare i diversi file. Per scrivere il nostro primo e semplice programma dobbiamo modificare main.py per mezzo di un text editor (notepad, ad esempio, in ambito Windows). Una volta aperto il file, noteremo la presenza di una linea di testo:

# main.py -- put your code here!

La linea inizia con il carattere #, in Python si identifica un commento. Per inserire il nostro script dovremo solo aggiungere nuove linee in questo modo:

# main.py -- put your code here!
import pyb
pyb.LED(4).on()

Che cosa significa questo codice? In primo luogo abbiamo bisogno di un pò di terminologia. Python è un linguaggio orientato agli oggetti, quasi tutto in Python è una classe e quando si crea un’istanza di una classe si ottiene un oggetto. Alle classi sono associati dei metodi: un metodo (una funzione membro) è utilizzato per interagire con o controllare l’oggetto stesso. Con “import.pyb” chiediamo a Python di utilizzare il modulo pyb: questo modulo contiene tutte le funzioni e classi che permettono di controllare e gestire la scheda. Con la linea successiva, “pyb. LED(4).on()”, decidiamo di accendere il quarto LED. Questo è solo un piccolo programma di nessuna pretesa, ma mostra come interagire con la scheda. Terminata la modifica del file non ci rimane altro che eseguirlo. Per eseguire questo script dobbiamo chiudere il file salvando le modifiche apportate e scollegare in seguito Pyboard dal PC. Una volta eseguita l’operazione, premiamo il tasto RST per resettare la schedina. Conclusa la nuova fase di boot noteremo l’accensione del LED. Non solo, le possibilità sono diverse. Possiamo, ad esempio, modificare il file come:

myled = pyb.LED(1)
myled.on()
myled.off()

In questo caso accendiamo e spegniamo il LED 1. Possiamo introdurre anche uno script leggermente più complicato come:

led = pyb.LED(2)
while True:
led.toggle()
pyb.delay(1000)

Con questo esempio otterremo il lampeggio del LED verde. Ecco come funziona: la prima riga di codice crea un oggetto LED, che abbiamo poi chiamato led. Una volta creato l’oggetto, ci vuole un parametro che deve essere compreso tra 1 e 4, corrispondenti ai led della scheda. La classe pyb.LED ha tre funzioni: on(), off() e toggle(). L’altra funzione utilizzata è pyb.delay(): questa è una routine particolare utilizzata per introdurre un ritardo nell’esecuzione, espresso in millisecondi. Fino ad ora abbiamo utilizzato un solo LED, anche se la scheda ne offre quattro. Possiamo gestirli tutti direttamente creando un oggetto per ogni LED. Per farlo abbiamo la necessità di creare una lista di led, come:

leds = [pyb.LED(i) for i in range(1,5)]

A questo punto non ci rimane che definire un loop infinito allo scopo di accendere/spegnere ogni led in modo sequenziale:

n = 0
while True:
n = (n + 1) % 4
leds[n].toggle()
pyb.delay(50)

E' possibile, poi, intervenire sul processo di esecuzione di uno script utilizzando CTRL-C, in questo caso Micro Python dovrà generare una eccezione con il conseguente arresto del programma. Non solo, è anche possibile catturare una particolare eccezione al fine di instaurare una nostra particolare gestione ricorrendo all’opzione try. Infatti, con try possiamo uscire dal ciclo infinito ed eseguire la porzione “finally”. Un possibile codice finale potrebbe essere questo:

leds = [pyb.LED(i) for i in range(1,5)]
for l in leds:
l.off()
n = 0
try:
while True:
n = (n + 1) % 4
leds[n].toggle()
pyb.delay(50)
finally:
for l in leds:
l.off()

Un discorso a parte merita il LED 4. Infatti, oltre a poterlo spegnere o accendere come qualsiasi altro led, è possibile controllare la sua intensità grazie al metodo intensity(). In questo caso è necessario inviare al metodo un valore compreso tra 0 e 255 che determina il grado della sua intensità, in questo modo:

led = pyb.LED(4)
intensity = 0
while True:
intensity = (intensity + 1) % 255
led.intensity(intensity)
pyb.delay(20)

 

# boot.py -- run on boot-up
# can run arbitrary Python, but best to keep it minimal
import pyb
#pyb.main(‘main.py’) # main script to run after this one
#pyb.usb_mode(‘CDC+MSC’) # act as a serial and a storage device
#pyb.usb_mode(‘CDC+HID’) # act as a serial device and a mouse
Listato 1 – Boot.py
Figura 1: Primo piano della Pyboard

Figura 1: Primo piano della scheda Pyboard

LA SCHEDA MICRO PYTHON (PYBOARD)

La scheda Pyboard utilizza un microcontrollore STM32F405 con un clock a 168 MHz e con una memoria Flash da 1Mb e 192 kb RAM: valori sicuramente soddisfacenti per sfruttare Python in versione embedded. Non solo, allo scopo di facilitarne l’uso con un qualsiasi PC, la scheda offre anche un’interfaccia USB che si presenta come una periferica seriale, insieme con un dispositivo di memorizzazione rimovibile (MSC). Grazie a queste dotazioni, quando è collegato a un PC, qualsiasi utente può aprire un programma di comunicazione seriale e interagire con la scheda attraverso la riga di comando Python. La scheda, poi, funziona anche come un dispositivo di archiviazione, ovvero come un banale flash drive USB, dove è possibile copiare gli script Python che saranno poi eseguiti indipendentemente dal PC in uso. Micro Python, allo scopo di sfruttare in pieno il linguaggio di programmazione, ha un ridotto file system: in questo modo si possono scrivere in memoria diversi script da utilizzare nel nostro progetto.

Non solo, altro aspetto da non sottovalutare, la scheda può eseguire script residenti in memoria senza la necessità di utilizzare fonti di alimentazioni esterne, perché si utilizza una batteria dedicata. Ricordiamo, poi, che esiste un pin speciale, BOOT0, utilizzato per riprogrammare il microcontrollore; infatti, collegando il pin BOOT0 al pin 3,3 V e resettando successivamente la scheda con il pulsante di reset, si entra in modalità “aggiornamento del firmware del dispositivo”: questa è una particolare modalità di funzionamento prevista dallo standard USB che permette di scaricare una particolare versione di Micro Python. Per utilizzare la scheda non è indispensabile conoscere in modo specialistico un linguaggio di alto livello come il C insieme alla sua cross-factory, ma, grazie alla presenza di Micro Python, è possibile controllare la scheda con un semplice script.

Il file system locale, visto come driver, è indirizzato su 0:/ e indentifica una particolare zona della memoria flash presente sulla scheda. In presenza di una card SD, la schedina di memoria esterna è visibile come 1:/. All’accensione della Pyboard, il software residente deve scegliere il file system: con una scheda SD si utilizza 1:/, altrimenti si viene indirizzati a 0:/. Come abbiamo messo in evidenza in precedenza, la prima cosa che deve fare il software residente, o Micro Python, è di cercare due file: boot.py e main.py. Questi due file possono essere inseriti/modificati in memoria del target attraverso la connessione USB: in effetti, Micro Python esegue gli script contenuti in questi file in modo perfettamente trasparente rispetto all’operatore. Se si accende normalmente, o si preme il pulsante di reset, la Pyboard si avvierà in modalità standard: il file boot.py sarà eseguito per primo, poi, una volta configurata l’interfaccia USB, sarà posto in esecuzione il contenuto di main.py. È anche opportuno ricordare che è possibile modificare la sequenza di avvio agendo sugli switch della scheda al fine di ottenere diverse modalità di boot. Possiamo mettere in evidenza che con:

  • “Green LED only”, è la configurazione standard, ovvero al boot si fanno partire boot.py e main.py
  • “Orange LED only”, è la modalità di safe boot: in questo caso non si esegue nessuno script - “Green and Orange LED”, in caso di accensione dei LED verde e arancio in contemporanea, il file system sarà resettato alla modalità di fabbrica e, solo successivamente, Micro Python si prenderà cura di eseguire un boot di tipo safe mode. In caso di corruzione del file system è consigliabile utilizzare questa modalità di boot.

Il dispositivo dispone poi di un servizio di autodiagnosi utile per ricavare informazioni di debug degli script: questo lavoro è garantito dai led presenti sulla scheda. Per segnalare un errore all’interno di uno script, (ad esempio relativo al main.py), saranno accesi il led di colore rosso e verde, altrimenti, alla presenza di una sequenza di accensione e spegnimento di tutti i quattro LED, siamo in presenza di un problema hardware risolvibile solo con un reset.

# main.py -- put your code here!
Listato 2 – main.py

CONCLUSIONI

Micro Python, insieme alla sua scheda, può rappresentare una valida alternativa alle diverse soluzioni già proposte e presenti sul mercato quali Arduino o Raspberry Pi perché, oltre ad avere un costo irrisorio, permette di realizzare dispositivi più o meno complessi con un minimo sforzo e con conoscenze anche limitate in ambito hardware. La presenza, poi, di un Python embedded permette di interagire con la scheda senza utilizzare particolari cross-factory.

Tabella 1 – Pyboard

Tabella 1: Pyboard

Riferimenti

Scarica subito una copia gratis

Scrivi un commento

Send this to a friend