Dokončil jsem projekt, který je postaven na ESP8266 s MicroPythonem a tak bych se rád podělil o své zkušenosti, které s použití této dvojce plynou.
Nejprve by se hodilo zodpovědět několik otázek ohledně výběru. Pomůže to udělat si obrázek, co od této kombinace očekávám.
Proč právě ESP8266
Je to velmi malý WiFi čip. S omezeným, ale přesto dostatečným počtem IO pinů, aby mohl být použitý v některých projektech. Sám mám, nebo se chystám mít rozmístěno několik zařízení po domě a zahradě, a ne všude jsou nataženy datové dráty, nebo by kroucená dvoulinka byla zbytečný luxus. ESP8266 lze připojit na WiFi, samotné umí i režim AP, vlastně oba režimy najednou. Nejen Wemos k desce s ESP8266 vyrábí mnoho kitů, které tak lze použít stejně snadno, jako kity pro Arduino. Rozhodně má své omezení, nicméně žádný čip není nejlepší na světě, je to jen o vhodnosti nasazení.
Proč právě Python
Ten jazyk mám opravdu moc rád. Napsal jsem poměrně hodně různých komponent a knihoven v Pythonu, takže znám mnohé jeho slabiny ale především přednosti. Je to můj oblíbený jazyk a tak jeho použití v MCU je příjemná možnost.
Proč jejich kombinaci
Důvod je o něco praktičtější, připravuji učební pomůcky pro výuku robotiky. Interpretovaný jazyk v MCU splňuje požadavky na snadné nahrání kódu do robota bez složitějších kouzel, jako je kompilace. MicroPython má k dispozici REPL konzoli, což umožní zadávat příkazy MCU, potažmo Robotovi přímo přes sériovou linku, nebo i přes webové rozhraní. Stejně tak nahrání kódu do MCU je otázka jen jednoho, relativně snadného příkazu v konzoli, nebo ještě snazšího poslání souboru přes webovou aplikaci. Žádná kompilace, složité laborování s parametry čipu nebo něco takového. To vidím jako obrovský benefit oproti C++.
WebREPL je další možností jak vzdáleně aktualizovat firmware zařízení. Díky konzoli je možné firmware snadno ladit vzdáleně, nebo měnit jeho konfiguraci bez nutnosti vytvářet nějaké složité konfigurační prostředí. Může tak stačit něco jako:
>>> import json >>> with open('config.json', 'r+') as conf: >>> obj = json.load(conf) >>> obj['key'] = 'new_value' >>> conf.seek(0) >>> json.dump(obj, conf)
A nebo jednodušeji, stáhnout soubor, upravit a nahrát zpět.
První důležitým faktorem, na který jsem narazil je vlastní implementace některých funkcí v Pythonu, místo použití těch dodávaného v SDK. Neznám plně důvody, možná je to ve výsledku jednodušší, je to ale škoda.
Jedním takovým je NTP. SDK od Espressif nabízí vlastní funkce. Místo toho ntptime
je napsaný přímo v Pythonu. Podobně na tom je i SSL. MircoPython používá separátní knihovnu. Vlastnosti, resp. funkcionalitu obou implementací jsem nijak neporovnával a tak bych nerad tvůrcům MicroPythonu křivdil.
Paměť dochází s počtem použitých knihoven velmi rychle. První byla umqtt.robust. Počítal jsem se SSL spojením na broker kdesi v internetu. S vlastní funkcionalitou, a dalšími knihovnami ale paměť došla, tak při použití urllib.request jsem musel ze SSL slevit a použít broker na lokální síti. Ještě že tu možnost mám.
Nakonec jsem funkce umazával a ořezával, protože mě postupně nechtěl naběhnout ani main.py
. Velkým žroutem je bezesporu webrepl
modul, resp aktivní daemon, kterého jsem vyžadoval.
Pro mě důležitá informace je, že dokumentace paměť nebere, alespoň to tak vypadá, že dokumentované funkce zabírají, i díky nedostupnosti __doc__
atributu stejně, jako ty bez dokumentace.
Problém času a časovače je věc přímo ESP8266. Pouze implementace na straně MicroPythonu práci s časem sjednocuje, což je spíše výhoda. RTC je na ESP hodně orientační a je deklarováno, že se rozchází o sekundy už po pár minutách. Naproti tomu jsem změřil, že časovač je poměrně přesný a nerozešel se ani po několika hodinách.
V kombinaci se SSL sockety, které jsou pouze blokové je WebREPL občas nedostupné. Nicméně nevím ani proč, ale ani sériový REPL mi občas pořádně nefunguje, o nahrávání souborů přes ampy
ani nemluvě. Podle všeho je to způsobené blokujícími sockety a nedostatkem paměti. Chování je ale dost prapodivné, takže na to člověk přijde spíš intuitivně, a jen si svou teorii ověří znovu navozením stavu.
Kdybych nepotřeboval WebREPL, asi bych po Pythonu už nesáhl. Ještě mám jeden projekt, který má i SPI display, možná zkusím implementovat jeho firmware právě v MicroPythonu. WebREPL už ale potřebovat nebudu, stejně jako HTTP komunikaci, tak budu mít k dispozici mnohem více paměti.
Pro kroužek robotiky se chystám postavit s ESP i malý plotter ze starých CD/DVD zařízení. Uvidím jestli bude ESP8266 stačit nebo ne, pinů tolik netřeba, takže to bude jen o paměti ;-)
Rozhodně mě zajímá, jak je na tom paměťová náročnost jazyku Lua, který je i na intel platformě velmi malý, uvidíme jestli se někdy rozhoupu v něm něco napsat, pak bych tento článek určitě doplnil.
© 2023 Ondřej Tůma McBig. Ondřej Tůma | Based on: Morias | Twitter: mcbig_cz | RSS: články, twitter