Differenze tra le versioni di "Installare MicroPython su NUCLEO-F401RE"

Da raspibo.
Jump to navigation Jump to search
Riga 36: Riga 36:
 
=== Usare MicroPython dall'interprete ===
 
=== 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:
+
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 (REPL, ovvero Read, Eval, Print and Loop) di MicroPython. Provate a dare il comando:
 
  >>> pyb.LED(1).on()
 
  >>> pyb.LED(1).on()
 
per vedere se si accende il LED onboard.
 
per vedere se si accende il LED onboard.
Riga 74: Riga 74:
 
Per usarlo:
 
Per usarlo:
 
  ampy -p <porta seriale> put <nome file>
 
  ampy -p <porta seriale> put <nome file>
 +
 +
= Display OLED I²C =
 +
 +
Per testare il funzionamento di MicroPython, proviamo a usare un piccolo display OLED I²C.
 +
 +
== Caricare la libreria ==
 +
 +
Con ampy carichiamo la [https://github.com/micropython/micropython/blob/master/drivers/display/ssd1306.py libreria ssd1306].
 +
 +
ampy -p /dev/ttyACM0 put ssd1306.py
 +
 +
== Manovrare il display da REPL ==
 +
 +
Se la libreria è stata caricata si può importare scrivendo:
 +
 +
>>> import ssd1306
 +
 +
Occorre poi creare un oggetto I2C specificando quali pin usare per SCL e SDA (in teoria dovrebbe essere automatico, ma secondo [https://forum.micropython.org/viewtopic.php?t=4663 questo post sul forum di micropython] l'automatismo non funziona), la libreria machine dovrebbe essere già importata di default:
 +
 +
>>> pscl = machine.Pin('D15',machine.Pin.OUT_PP)
 +
>>> psda = machine.Pin('D14',machine.Pin.OUT_PP)
 +
>>> i2c = machine.I2C(scl=pscl,sda=psda)
 +
 +
e poi creare un oggetto che gestisca il display:
 +
 +
>>> oled = ssd1306.SSD1306_I2C(128,64,i2c)
 +
 +
dove 128 e 64 sono le dimensioni.
 +
 +
== Test! ==
 +
 +
Per prima cosa occorre cancellare un'eventuale scritta precedente:
 +
 +
>>> oled.fill(0)
 +
 +
Poi scriviamo qualcosa:
 +
 +
>>> oled.text('qualcosa',0,0)
 +
 +
e infine lo mostriamo:
 +
 +
>>> oled.show()
 +
 +
et voilà!
 +
[[File:Micropython_test_oled.jpg]]
 +
 +
Più informazioni su come funziona la libreria, corredata da esempi, le potete trovare sul [https://learn.adafruit.com/micropython-hardware-ssd1306-oled-display/circuitpython sito di Adafruit].

Versione delle 19:02, 9 mar 2019

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.

Installazione MicroPython

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 (REPL, ovvero Read, Eval, Print and Loop) 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.

Caricare uno script

Un modo piuttosto comodo di inviare e ricevere file sulla flash della Nucleo è usare uPyLoader: https://github.com/BetaRavener/uPyLoader/ ma quasi sempre dà un errore di timeout.

Il programma fornito da Adafruit sembra funzionare decisamente meglio https://learn.adafruit.com/micropython-basics-load-files-and-run-code/install-ampy

Per installarlo usare pip (o pip3):

pip install adafruit-ampy

Per usarlo:

ampy -p <porta seriale> put <nome file>

Display OLED I²C

Per testare il funzionamento di MicroPython, proviamo a usare un piccolo display OLED I²C.

Caricare la libreria

Con ampy carichiamo la libreria ssd1306.

ampy -p /dev/ttyACM0 put ssd1306.py 

Manovrare il display da REPL

Se la libreria è stata caricata si può importare scrivendo:

>>> import ssd1306

Occorre poi creare un oggetto I2C specificando quali pin usare per SCL e SDA (in teoria dovrebbe essere automatico, ma secondo questo post sul forum di micropython l'automatismo non funziona), la libreria machine dovrebbe essere già importata di default:

>>> pscl = machine.Pin('D15',machine.Pin.OUT_PP)
>>> psda = machine.Pin('D14',machine.Pin.OUT_PP)
>>> i2c = machine.I2C(scl=pscl,sda=psda)

e poi creare un oggetto che gestisca il display:

>>> oled = ssd1306.SSD1306_I2C(128,64,i2c)

dove 128 e 64 sono le dimensioni.

Test!

Per prima cosa occorre cancellare un'eventuale scritta precedente:

>>> oled.fill(0)

Poi scriviamo qualcosa:

>>> oled.text('qualcosa',0,0)

e infine lo mostriamo:

>>> oled.show()

et voilà! Micropython test oled.jpg

Più informazioni su come funziona la libreria, corredata da esempi, le potete trovare sul sito di Adafruit.