MicroPython sul NodeMCU

MicroPython sul NodeMCU

MicroPython è una versione leggera ed efficiente di Python progettata per girare su microcontrollori. Sul NodeMCU consente di programmare l’hardware in modo semplice e diretto, riducendo drasticamente la complessità tipica dello sviluppo embedded. Sensori, GPIO, comunicazione Wi-Fi e periferiche possono essere gestiti con poche righe di codice, rendendo il rapid prototyping accessibile anche a chi proviene dal software.

Open in Github

NodeMCU

Molti progetti IoT (Internet of Thing) sono basati sul kit di sviluppo NodeMCU che è composto da un modulo transceiver a basso costo Wi-Fi ESP e da un micro-controllore (MC Unit) prodotto da Espressif Systems.
I fabbricanti Amica, Lolin e DOIT hanno prodotto negli anni 3 versioni di NodeMCU: la seconda versione (V2) rappresenta un’evoluzione della precedente Ver 0.9 (V1) con l’aggiornamento del modulo da un ESP-12 a un ESP-12E. In realtà la V3 è un fork della V2 creata dal produttore LoLin che monta un convertitore CH340G, lo stesso utilizzato anche nella V1.

NodeMCU è dotato di 4 MB di memoria flash per l’archiviazione di programmi e dati,  quanto basta per parsare le response in formato json. Inoltre abbiamo abbiamo accesso a 11 pin GPIO e un pin convertitore analogico-digitale (ADC) con risoluzione a 10 bit.

La scheda ha un regolatore di tensione integrato ed è possibile alimentare il modulo utilizzando la presa mini USB o il pin Vin.
L’ESP8266 integra il ricetrasmettitore Wi-Fi 802.11b/g/n HT40, quindi può connettersi a una rete WiFi consentendoci di collegarci ad altri dispositivi.

Step 1- Installare Esptool

Esptool è un’utility scritta in Python che permette al nostro computer di comunicare con il bootloader dei SoC ESP8266 e EPS32. Inoltre ci permetterà di leggere, cancellare (erase) o scrivere (write) la memoria del device dandoci quindi la possibilità di riprogrammarlo con altri firmware.

Possiamo installare l’ultima versione stabile usando il gestore di pacchetti pip:

pip install esptool

Adesso controlliamo la versione che abbiamo installato:

> esptool version
esptool.py v5.1.0
5.1.0

Step 2 – Erase Flash Memory

NodeMCU include il bridge controller CP2102, che converte il segnale USB in seriale (USB-to-UART) consentendoci di programmare e comunicare con il SOC ESP8266.

Dobbiamo quindi installare su Windows 10 il driver CP210x USB to UART Bridge VCP scaricandolo dal sito web di Silicon Labs. Adesso su Windows 10 dobbiamo aprire la Gestione dispositivi (device manager) per trovare la porta COM su cui il device è stato riconociuto.

La porta seriale COM sarà quella che useremo durante l’emissione dei comandi da terminale, nel mio caso la porta seriale è la COM4. Utilizzando Esptool è necessario cancellare la flash memory dell’ESP32 con il comando:

esptool --port [porta seriale] erase-flash

Dovremmo avere un output simile al seguente:

esptool v5.1.0
Connected to ESP8266 on COM4:                                                                                                      
Chip type:          ESP8266EX                                                                                                      
Features:           Wi-Fi, 160MHz                                                                                                  
Crystal frequency:  26MHz
MAC:                c4:5b:be:61:13:74

Stub flasher running.

Flash memory erased successfully in 2.4 seconds.

Hard resetting via RTS pin...

Dovremmo vedere il messaggio di operazione conclusa con successo:

Chip erase completed successfully

Step 3 – Download del firmware

A questo punto, dobbiamo scaricare l’ultima versione stabile del firmware, stando attenti a selezionare la board giusta.

Nel nostro caso è una board esp32 generica e la versione da me scaricata è la V1.17 rilasciata il 2 settembre 2021.

Step 4 – Flash del firmware

Utilizzando Esptool è possibile caricare il firmware con MicroPython all’interno dell’ESP32 con il seguente comando:

esptool --port com4 --baud 115200 write-flash --flash-size=detect -fm dio 0 esp8266-20210902-v1.17.bin

L’output che comparirà sarà come il seguente:

esptool.py v3.1
Serial port com4
Connecting...
Device PID identification is only supported on COM and /dev/ serial ports.
.
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 84:f3:eb:05:90:c5
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Flash will be erased from 0x00000000 to 0x0009afff...
Flash params set to 0x0240
Compressed 633688 bytes to 416263...
Wrote 633688 bytes (416263 compressed) at 0x00000000 in 36.8 seconds 
(effective 137.6 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

Step 5 – Modules

In un articolo precedente “Getting started: MicroPython”  abbiamo visto che MicroPython mira ad essere il più compatibile possibile con Python, ma è progettato per funzionare su devices dalle risorse hardware limitate.

>>> help("modules")

Tutte le versioni di MicroPython sono dotate di moduli per interagire con l’hardware, i pin GPIO,  le periferiche e i componenti collegati tramite tali pin. Ad esempio i devices con funzionalità di rete, includeranno moduli per supportare queste funzionalità come WiFi, json, requests.

__main__          machine           ubinascii         ure
_boot             math              ucollections      urequests
_onewire          micropython       ucryptolib        urllib/urequest
_uasyncio         neopixel          uctypes           uselect
_webrepl          network           uerrno            usocket
apa102            ntptime           uhashlib          ussl
btree             onewire           uheapq            ustruct
builtins          port_diag         uio               usys
dht               ssd1306           ujson             utime
ds18x20           uarray            umqtt/robust      utimeq
esp               uasyncio/__init__ umqtt/simple      uwebsocket
flashbdev         uasyncio/core     uos               uzlib
framebuf          uasyncio/event    upip              webrepl
gc                uasyncio/funcs    upip_utarfile     webrepl_setup
inisetup          uasyncio/lock     upysh             websocket_helper
lwip              uasyncio/stream   urandom
Plus any modules on the filesystem