ambiente di sviluppo per micropython con wsl, vscode e PyMakr

Dato che nessuno vorrebbe sviluppare i propri progetti IoT con Micropython su Windows, mi sono configurato un ambiente di sviluppo abbastanza funzionale basato su vscode, wsl e l'estensione pymakr.

esp32 dev board

Cominciamo coi pre-requisiti: - installare wsl2 con ubuntu (default) - installare e configurare vscode con remote wsl extension

A questo punto potete già sviluppare quello che volete in ambiente linux con vscode da una macchina windows con innumerrevoli vantaggi tra qui una gestione umana delle versioni e paths di python, git out of the box ed altro ancora..

ambiente di sviluppo linux

I prossimi passaggi saranno:

setup WSL

Per configurare il WSL per un ambiente di sviluppo micropython servono 2 step:

nel container wsl, se stai usando la release 20.04 (default quando ho installato la distro), la versione di python è davvero vecchia; io uso sempre pyenv per gestire le versioni di python nei miei device e ambienti:

sudo apt-get update
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl git zlib1g zlib1g-dev libssl-dev libbz2-dev libsqlite3-dev
curl https://pyenv.run | bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
pyenv  install 3.11
pyenv global 3.11

Per configurare la gestione delle porte USB, per il WSL ubuntu, servono un paio di passaggi; prima di tutto, vogliamo gestire le console con systemd in modo da avere i permessi corretti "out of the box". Per fare ciò serve modificare il file di configurazione del wsl all'interno del container:

echo -e "[boot]\nsystemd=true\n" | sudo tee  /etc/wsl.conf

e riavviare il WSL con

wsl.exe --shutdown

successivamente serve abilitare il forwarding dei dispositivi USB al WSL:

winget install --interactive --exact dorssel.usbipd-win

Mentre nel container:

sudo apt update && sudo apt install linux-tools-generic hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20

installare i tools necessari

Ora installiamo alcuni tools per gestione e sviluppo con micropython:

esptool serve per flashare micropython sul microcontroller mentre micropy-cli è un utilissimo tool per aggiungere ai progetti l'auto-completion e poter fare linting con micropython oltre che per fare scaffolding di nuovi progetti micropython. Per entrambi i tool basta utilizzare pip:

pip install esptool micropy-cli

micropy-cli per funzionare con vscode ha bisogno di un po di setup; serve installare intellisense nel wsl ed in oltre servono gli "stubs" per l'autocompletion:

micropy stubs install micropython-esp32-stubs

se volete vedere che versione di micropython viene usata nello stub potete usare la funzione search per avere più info:

micropy stubs search esp32

per pymakr, basta installare (nell'stanza remota di vscode) l'estensione.Ad oggi serve installare le verisone preview perchè c'è qualche problema di compatibilità con vscode. L'estensione è stata fatta per la pyboard ma può essere usata con qualsiasi board su cui giri micropython

per concludere ecco una lista di estensioni che utilizzo sepre per sviluppare (anche in Cpython):

setup progetto

siamo ormai pronti per il nostro prossimo progetto embedded ma prima di tutto, serve avere due cose: una devboard e micropython!

Io, ho parecchie devboard esp32 comprate negli anni su aliexpress come questa:

lolin lite 32

per micropython, scaricate la versione direttamente dal sito, specifica per la vostra board nel container:

wget https://micropython.org/resources/firmware/esp32-20230426-v1.20.0.bin

a questo punto, con la board collegate la board al computer; usate un cavo con il canale dati altrimenti perderete 1 ora come me a cercare di capire cosa non vada... In generale, se sentite il "dling-dlong" di windows quando attaccate la board siete a cavallo.

Ora, date il controllo del bus USB al container (serve farlo ogni volta che connettete il cavo al pc) con una shell da amministratore:

usbipd wsl list
usbipd wsl attach --busid <busid>

a titolo di esempio, potete vedere quando la board non è connessa e quando lo è, e nella seconda schermata quando la porta USB è gestita dal container WSL.

usb list

usb attached

mentre nel container dovreste poter listare il nuovo device:

lsusb

lsusb

ora siamo pronti a flashare l'immagine nel microcontroller (path, parametri e porte dipendono dal vostro controller etc):

esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 460800 write_flash -z 0x1000 esp32-20230426-v1.20.0.bin

esptool erase

esptool flash

Se tutto è andato a buon fine, abbiamo una board pronta per essere programmata in micropython, collegata al nostro WSL!

Ora non resta che create un progetto e conminciare a scrivere codice.

Prima di tutto, creiamo un progetto con micropy-cli e configuriamo la connessione con pymakr:

mkdir newproject && cd newproject
micropy init -n newproject -t vscode -t pymakr -t pylint -t gitignore -t bootstrap -s  micropython-stdlib-stubs -s micropython-esp32-stubs
code .

Io ho direttamente specificato gli stubs che ho installato ma lanciando la cli in maniera interattiva potete selezionare config e stubs in base alla vostra installazione

micropy init

quando vscode si aprirà, avrete un workspace già configurato e pronto per configurare la connessione al microcontroller.

vscode pymakr

nel tab in basso avrete la vostra board nei devices associati al progetto; ora potete connettervi e verificare che tutto funzioni aprendo una shell interattiva nel device

vscode pymakr connect

ed ora, proviamo a scrivere del "upython" code con l'aiuto del linter e code hints

vscode pymakr code hints

That's it! possiamo divertirci con micropython e i nostri piccoli device in un ambiente davvero comodo per lo sviluppo e il test delle nostre applicazioni IoT!