Installare MicroPython su NUCLEO-F401RE
Questa guida è basata quasi tutta su quella di Carmine Noviello https://www.carminenoviello.com/2015/06/03/running-micropyton-stm32nucleo-f4/ che peraltro trovate anche in italiano https://www.carminenoviello.com/it/2015/08/11/compilare-micropython-una-scheda-stm32nucleo-f4/ per cui scriverò solo le differenze.
La versione di Carmine di micropython, che si trova sul suo github, risolve il problema relativo alla mancanza di memoria SD della scheda Nucleo. Il file con il programma .py sarà caricato direttamente sulla flash.
La scheda
NUCLEO-F401RE della STMicroelectronics è una scheda basata su ARM Cortex M4 e fa parte della famiglia STM32 Nucleo Boards. Ha 512KB di Flash, 96 KB di SRAM, un clock di 84MHz, 50 GPIO, RTC, supporto I²C, SPI, USART e molto altro (maggiori info). La sua forma le permette di alloggiare sia gli shield per Arduino che le estensioni Morpho di STMicroelectronics. Il prezzo è abbastanza contenuto (attorno ai 12€ su Mouser) il che ne fa una scheda piuttosto interessante.
Normalmente si programmerebbe tramite l'editor online di Mbed. Il compilatore genererà dal nostro codice un file con estensione bin. Collegando la scheda verrà montato un volume, chiamato "NUCLEO" sul quale caricare il file bin. Quando la scheda verrà resettata, il codice verrà eseguito. È possibile anche usare editor offline con toolchain di compilazione come Eclipse. Non credo sia possibile usare la IDE di Arduino.
Primo tentativo
Toolchain e OpenOCD
Per compilare vi servirà la toolchain gcc-arm-embedded. Non è nei repo ufficiali quindi la dovete installare a mano oppure aggiungere un PPA. https://launchpad.net/gcc-arm-embedded Il programma per comunicare col debugger della scheda, openocd, invece è nei repo di Debian.
Come installare MicroPython
Potete seguire la guida di Carmine per la compilazione. Ovviamente se avete installato la toolchain con apt non è necessario aggiungere il path a tutti i comandi, perché sono già dentro a /usr/bin.
OpenOCD ci permette di caricare il firmware che abbiamo crosscompilato. Basterà lanciare il comando:
$ openocd -f board/st_nucleo_f4.cfg
Un LED della scheda dovrebbe lampeggiare rosso/verde. Il debugger è attivo. Per collegarcisi:
$ telnet localhost 4444
e poi scrivete:
> reset halt
e infine:
> flash write_image erase <file .elf da flashare>
Inizialmente non sembrava funzionare. Il tentativo finale che ha sbloccato la situazione è stato dare il comando shutdown. Non sono sicuro però che sia stato proprio quel comando e bisognerebbe indagare meglio.
Usare MicroPython dall'interprete
Aprendo la porta della nostra scheda (la trovate su dmesg non appena la attaccate, è /dev/ttyACMx dove x è un numero che parte da 0) con un emulatore di terminale (come console) alla velocità di 115200 baud, dovreste vedere l'interprete dei comandi di MicroPython. Provate a dare il comando:
>>> pyb.LED(1).on()
per vedere se si accende il LED onboard.
Usare MicroPython dal PC
Fra i tool di MicroPython, che trovate nella cartella di git micropython/tools, c'è pyboard.py, un programma che vi permette di eseguire uno script in MicroPython. Se la vostra porta non è accessibile dall'utente dovrete usare sudo.
# ./pyboard.py <nome file>.py
Caricare uno script
Carmine ha fatto una modifica a pyboard in modo che possa caricare un file sulla board.
# ./pyboard.py --device=/dev/ttyACMx --send <nome file>.py
MicroPython ha due file di default quando viene installato: boot.py e main.py. Il primo è un file di sistema che serve allo stesso MicroPython di partire. Non occorre di solito modificarlo. Il secondo, main.py, è uno script che viene eseguito all'avvio. Se carichiamo un file main.py questo verrà eseguito all'accensione.
Considerazioni finali
Molto bene, ma la versione di micropython non è aggiornata. Forse è per questo che non riesco a far funzionare la porta I²C?
Secondo tentativo
Boochow fornisce dei firmware già compilati su https://blog.boochow.com/micropython-firmware-for-mbed-boards basta scegliere la board giusta e caricare il file .bin nel volume "NUCLEO" che si monta quando si collega la USB. L'ultima versione però non è molto stabile, soprattutto quando si è trattato di inviare dei file alla flash della Nucleo, per cui ho dovuto ripiegare a una versione successiva.
Terzo tentativo
Sul forum di MicroPython, l'utente dhylands ha messo il link a una versione di MicroPython precedente. Caricata con OpenOCD funziona e sembra più stabile delle altre. https://forum.micropython.org/viewtopic.php?t=3709
Caricare uno script
Un modo piuttosto comodo di inviare e ricevere file sulla flash della Nucleo è usare uPyLoader. https://github.com/BetaRavener/uPyLoader/
È una versione alfa ma in qualche modo sono riuscito a caricare il file della libreria di un display OLED che vorrei usare come test per la porta I²C.