ESP8266 – Frankenstein firmware a další…

FrankenSituace na poli různých verzí firmware pro WiFi modul s čipem ESP8266 je den ode dne lepší a lepší – jak se objevují nové informace o čipsetu a otevírají se možnosti vlastních modifikací, nebo tvorby firmware, tak se stejnou rychlostí “nabalují” další vývojáři, kteří chtějí přijít se svojí troškou do mlýna. Za včerejší večer a dnešek jsem vyzkoušel několik firmwarů – u každého z nich jsem přišel na výhody, ale i na nevýhody (alespoň z mého pohledu) a o svá zjištění bych se chtěl zde podělit…

Velmi důležitou informací na poli bezdrátových technologií bývá praktický dosah. Ten velmi záleží na okolních podmínkách, ale stejně je dobré mít alespoň rámcovou představu o schopnostech modulu. Naštěstí se našlo pár experimentátorů, kteří dosah ověřili a podělili se o výsledky v následujícím videu

Výsledky jsou na tak malý modul velmi dobré, takže se domnívám, že pokud se podaří zajistit FCC certifikaci (nebo aspoň jeden výrobek s tímto modulem projde zkušebnou), bude jeho nasazení v profesionální sféře zcela bez potíží.

Během posledních dní jsem postupně vyzkoušel originální firmware ve verzi 0.9.2.2 AT, nodemcu Lua firmware a firmware, pojmenovaný Frankenstein. Verze Lua a Frankensteina záměrně neuvádím – na obou probíhá velmi aktivní vývoj, takže se dá vyjít pouze z časových údajů sestavení (například LUA byl modifikován před hodinou – to jsem začal psát tento příspěvek, takže “poslední” verzi jsem ještě nezkoušel).

Originální FW 0.9.2.2 AT

Nahrání FW proběhlo bez problémů. Pouze se objevil problém po nastavení na nižší přenosovou rychlost (9600Bd), který je na internetu rovněž zmiňován.

Výhodou tohoto firmware je oficiální podpora (ať už to znamená cokoliv), snadno modifikovatelné a přenostitelné příklady do Arduina a velká komunita experimentátorů.

Nevýhodou je zatím nedotaženost firmware – například na povel AT+CWLAP by modul měl odpovědět seznamem okolních AP, jenomže po nahrání FW odpoví ERROR. Důvodem je to, že seznam AP je dostupný pouze v režimech STA, nebo BOTH (AT+CWMODE=xx) a defaultní nastavení je na režim AP. Další velkou nevýhodou (zejména pro IoT použití) je nemožnost nějak programově ovládat spotřebu modulu. Možná to jde ovládáním pinu CH_PD, protože některé internetové zdroje tento pin označují jako Power Down, ale reálný pokus jsem zatím neobjevil.

Nodemcu LUA

Jde o nejkomplikovanější firmware, který jsem zkoušel. Nahrání opět proběhlo bez potíží, interpreter se spustil a vše vypadalo výborně. Potíže však nastaly při podrobnějším testování, kdy bylo zřejmé, že někde “teče” paměť – dostupná paměť na hromadě stále ubývala a v situaci, kdy jí zbývalo něco kolem 3000 bytů se celý modul restartoval. Je možné, že tato chyba je již odstraněna, protože fórum na téma LUA je poměrně aktivní, ale ve verzi z 26.11. jsem na ni narazil při pokusech i já.

Výhodou tohoto firmware je jeho všestrannost, možnost ovládání spotřeby přes node.deepsleep(), možnost uložit informace do souborů v souborovém systému, časování pomocí tmr.alarm(), dns klient, pwm výstup, A/D převodník, I2C rozhraní, apod…

Nevýhodou pak je zatím nedotažená správa heapu, nemožnost ovládat uart…. POZOR!!! Oprava – ve verzi, která byla uvolněna před cca hodinou je nově přidáno API pro ovládání uartu, ale bohužel se stále nedá nastavit přenosová rychlost). Za velkou nevýhodu považuji (zatím) uzavřené zdrojové kódy.

Frankenstein

Firmware od programátora s nickem Nekromant je pojmenovaný Frankenstein a dost se odlišuje od obou výše zmíněných. V režimu AP obsahuje vestavěný DHCP server, takže je možné vytvořit mikroskopickou lokální síť, která je naprosto soběstačná co se týče konfigurace a komunikace mezi jednotlivými prvky. Na sériovém portu běží shell, který je svými příkazy a správou proměnných velmi podobný Linuxovému uBootu. Přímo z konzoly je možné sestavit TCP spojení a odeslat jednoduchou zprávu, nebo sestavit čekající spojení. To je ale zatím také bohužel všechno (pominu-li ovladač pro měření teploty s DS18B20, který je ale bohužel k ničemu, protože sled povelů musím stejně odněkud zadat).

Výhodou tohoto firmware je jednoznačně jeho DHCP server, možnost ovládání příkonu (i když tahle funkce mi moc dobře nepracovala – modul bylo nutné restartovat, což možná souvisí s nutností propojení pinů, které vyžaduje LUA FW), další obrovskou výhodou jsou otevřené zdrojové kódy, dostupné na Githubu a vidím v něm velký potenciál do budoucna.

Nevýhodou pak je prozatímní jednoduchost a nutnost použití dalšího procesoru pro jednotlivé funkce (absence skriptování).

Závěr

Zatím jsem se nerozhodl, který firmware budu používat – každý z výše uvedených má své výhody, ale každému z nich rovněž něco chybí. Kdyby se tak podařilo vytvořit firmware, který by spojoval všechny výhody a eliminoval nevýhody…

8 komentářů u „ESP8266 – Frankenstein firmware a další…“

  1. Zdravím,
    Zkusil jsem připojit k ESP8266 LCD displej s I2C. A narazil jsem hned na začátku. Použil jsem I2C scanner a výsledek :
    Unknow error at address 0x01 atd…..
    Zkoušel jsem různé piny, přidal pul up odpory 3k3, 100n na napájení a stále nic. Zkusil jsem i jiné I2C zařízení. Zrovna nemám k dispozici jiné ESP, kdyby to bylo ESPečkem.
    Prošel jsem kde jakou diskusi, ale nic nepomohlo. Nenapadá Vás prosím ještě co vyzkoušet?
    Děkuji

    1. Dobrý den,
      pull-up odpory určitě připojte – používám 2k2-4k7 dle délky sběrnice.Nicméně to ale vypadá na něco jiného – když kouknete do zdrojového kódu scanneru, tak uvidíte, že hláška Unknown error at address… se objeví v případě, že se vrátí 4 z Wire.endTransmission(), pokud se podíváte do zdrojových kódů knihovny wire, tak uvidíte, že se chybový kód vrací z knihovny twi z jádra a v hlavičce twi.h je napsáno:
      #define I2C_SDA_HELD_LOW_AFTER_INIT 4
      předpokládám tedy, že Vám něco drží SDA na L úrovni (zkrat na GND, zkrat s jiným výstupem, …). Tady by opět hodně pomohl osciloskop – pokud zmenšíte rychlost na sběrnici pomocí Wire.setClock(), tak by snad mohl stačit i ten primitivní osciloskop z Arduina…

  2. Děkuji, měl jste opět pravdu. Hlavní problém byl fakt v napájení. Zajímavé je, že
    Wire.begin(4,5); //SDA,SCK
    musím prohodit a pak to adresu najde (na Arduino ale funguje dle popisku).
    Bohužel je to na 5V, takže další pokusy, až mi dorazí 3V verze

    1. No můžete zkusit takové ty obousměrné převodníky na 3V3<->5V I2C jestli ho máte doma… Ten problém s přehozením 4 a 5 možná souvisí s tím, že na starších ESP modulech byly chybně ty GPIO označeny (byly přehozené). Jo a omlouvám se za to meteo – ještě jsem se k tomu nedostal 🙁

  3. Jejda. Omlouvat se nemusíte. Je mi jasné, že máte k řešení svoje věci. Jsem moc vděčný, že mi věnujete váš čas.

  4. Pokračuji s LCD – funguje to. Ale když to začlením do programu, tak po:
    wifi.begin(offsetof(eepromdata, wc), fc,60, wcb); // startujeme pripojeni
    už nemůžu nic zobrazit. (před tim to zobrazuje) Čtení eeprom přece používá I2, aby něco změnilo. Zkoušel jsem to objevit v knihovnách, ale nebyl jsem úspěšný.
    Co by to mohlo být?

  5. Znovu jsem prostudoval Vaši diskuzi (dělám si výpisky) a to se vyplatilo. Pro wemos platí to samé co pro ESP. Použil jsem piny, dle vašich rad a jede to.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *