esp32-micropython-memory

Nenasytný Micropython v ESP32

V OctopusLabu ani poslední tři měsíce nezahálíme. Jak jistě víte, dost času jsme věnovali modulu ESP32 ve spojení s Micropythonem.
Vytvořili jsme si k tomu i takový „sranda“ nástroj, kterému říkáme uPyShell. Je to soubor programů, napsaných v Micropythonu, které nám ulehčí jednoduchý vývoj, ladění a testování našich projektů. Tváří se jako Linuxový shell a dává k dispozici pár základních příkazů, které potřebujete pro prohlížení souborů na disku, kopírování, mazání a jednoduchou editaci. Navíc jsme přidali i práci s WiFi, kde najdete klasický ifconfig, ping, wget a několik dalších neocenitelných příkazů – a to vše běžící v ESP32.

Paměti není nikdy dost

ESP32 v základu disponuje pamětí programu flash (4MB) a operační pamětí RAM (3 bloky v celkové velikosti 520kB), ze které nám ale po spuštění Micropythonu zbývá jen něco kolem 100kB. V případě, že si inicializujete pár svých knihoven, dostaneme se na 50kB, což už je pro trochu větší projekty hraniční. Například při použití obyčejného barevného displeje (128×160 px), na který Micropython alokuje dvojnásobný framebuffer, nám zbývala kapacita nedostačující pro další práci.

Proto pro některé robustnější a ambicióznější projekty potřebujeme paměť posílit. Pro větší soubory dat (případné zvuky a obrázky) nám docházela i Flash paměť. Tam jsme to už před časem vyřešili připojením klasické SD karty – „adafruit“ modul čtečky připojené na SPI. V Céčku otestováno už minulý rok, v Micropythonu nám to doladili až před několika dny.

Pro paměť RAM existuje elegantní řešení osminohým „švábem“ ESP-SPIRAM64H. Tento maličký SMD obvod disponuje 8MB (použitelných je zatím 4MB). Jelikož s ním na desce ESP32board už počítáme, tak ho hned můžeme vyzkoušet. Je také SPI, ale navíc nám vyblokoval nějaké PINy (PWM1, PWM2), ale co bychom pro více paměti neobětovali.

Na obrázku vidíte RAM (osminohý brouk uprostřed nad ESP) a zároveň i připojení externí čtečky SD karet. Pro inicializaci v Micropythonu stačí dva řádky kódu:

import machine
uos.mount(machine.SDCard(slot=2, freq=16000000), "/sd")

Pozor, takto to funguje až od verze Micropythonu v1.12-495+. Pro externí RAM je nutno mít navíc speciálně zkompilovanou binárku), proto je ideální použít poslední naší verzi Micropythonu, kterou máme vždy otestovanou a snažíme se držet podle možností co nejvíce aktuální. V době psaní článku byla ke stažení už v1.12-512.

Pokud vyzkoušíte verzi Micropythnonu spustit na ESP32 bez přidané SPIRAM, paměť se nepřipojí, ale vše bude fungovat bez dalších zádrhelů. Červeně Vás systém při bootování pouze upozorní:
E(606) spiram: SPI RAM enabled but initialization failed. Bailing out.

E (10) spiram: SPI RAM not initialized
.

Co bylo příjemným překvapením, vše funguje korektně i s uPyShellem. Takže máme „na hraní“ úplně jiný stroj, než jsme byli před necelým rokem zvyklí.
Na obrázku vidíte informaci z příkazu top (modifikovaný htop z některých Linuxových distribucí). Zvýrazněné číslo 4067.904 kB značí stále více než 4 MB volné paměti.
Následující cd sd přepneme na SD kartu a příkazem ls vylistujeme soubory a podadresáře na připojené externí kartě. Všechny příkazy pro práci se soubory fungovaly korektně a tak na kartu můžeme soubory přesouvat a z karty je zase nahrávat.
Ta přidaná paměť našim experimentům dodala další dimenzi, jelikož u některých projektů nás to dost omezovalo.