ESP8266 pro začátečníka – projekt OTA v režimu AP

APOTAAPSelČtenář Michal narazil na problém nefunkčního OTA programování modulu ESP8266 v případě, že je ESP nastaveno v režimu AP. V konferencích jsem na toto téma četl několik článků, kde si i další lidé stěžují na stejné chování. Já ale v jednom z projektů OTA v režimu AP používám a zatím (ťuk, ťuk) jsem na závažnější problém nenarazil. Slíbil jsem tedy, že vytvořím demonstrační projekt, kde ukážu, jak mám tento problém vyřešený.

Vyextrahoval jsem tedy jen surové jádro, které řeší nastavení modulu do AP režimu a OTA část a celé jsem to doplnil jen pár ladícími výpisy.

Při OTA v AP postupuji takto:

Přeložím projekt a (pokud je to poprvé s “čistým” modulem) nahraji jej po sériovém portu do zařízení.

Pak po restartu modulu připojím PC k novému AP (viz. obrázek v záhlaví článku). Důležité je si uvědomit, že IP adresa sítě, kterou poskytuje AP, vytvořený z ESP8266 je v rozsahu 192.168.4.X a v žádném případě nesmí kolidovat se stávající Ethernet sítí v počítači.

V Arduino IDE se pak v nástrojích v položce Port objeví nové zařízení (v mém případě na adrese 192.168.4.1 a se jménem APOTA), které vyberu (k tomuhle nemám screenshot, neboť můj Linux jaksi odmítá pořídit obrázek při rozbalených nabídkách 🙁 ).

No a pak už postupuji normálně – přeložím sketch a kliknutím na nahrávací šipku jej pomocí OTA nahraji do modulu

APOTAIDE

Pro jistotu jsem nahrání ověřil několikrát, přičemž jsem sériovým terminálem monitoroval výstup na ladícím portu.

OTATerm

Celý projekt je skutečně velmi jednoduchý a je zabalený pomocí Archivuj projekt v Arduino IDE.

A na závěr tradičně použité verze:

OS: Linux Ubuntu 16.04 LTS (nicméně můj originální projekt nahrávám i z Windows 7 x64 Professional)

IDE: 1.6.9

ESP8266Core: 2.3.0-rc1

No a projekt ke stažení:

 

APOTA-160611a
APOTA-160611a
APOTA-160611a.zip
782.0 B
2164 Downloads
Detaily

39 komentářů u „ESP8266 pro začátečníka – projekt OTA v režimu AP“

  1. Ahoj, děkuji moc za podporu, ale zatím jsem stále nepochodil. Chová se to stejně. Zatím nevím zda mám hledat chybu v tom kódu běžícím na ESP nebo v IDE na PC. Zkusil jsem i modul vyměnit, místo Wemosu D1 mini jsem vzal ESP01 a výsledek je stejný. Udělal jsem screenshoty. V IDE jsem zkoušel nastavit Generic ESP module, kde nejsou nastavené velikosti paměti i Wemos D1 R2 & mini a chová se to stejně.
    http://tc.esy.es/ESP8266/index.html

    1. Tak to je hodně zajímavé. Můžeš prosím vyzkoušet následující?:
      1. jestli funguje ping
      2. co vypíše ipconfig /all
      3. zkusit se podívat Wiresharkem – myslím, že by měly být vidět nějaké pakety na udp portu 8266
      4. pokud nemáš, tak zkus doinstalovat podporu mDNS (používám podporu z Apple balíku k iTunes pro Windows) a znovu zkus OTA – tady mě ale mate to, že se v seznamu portů vypíše jméno zařízení
      5. zkus nainstalovat IDE v režimu portable – tohle je konfigurace, kterou na Win používám
      Rád bych tenhle problém vyřešil, aby APOTA mohli používat i ostatní…

    2. Tak jsem na to možná přišel – podle obrázku z IDE na odkazu, který jsi poslal je problém ve velikosti paměti – OTA se prakticky nedá použít u modulu s 512kB paměti a dle výpisu máš právě takový modul nastavený (viz. řádek “Sketch uses 240,038 bytes (55%) of program…”) Zkus nastavit režim Generic ESP / 4M Flash / 3M SPIFFS – přesně tenhle režim používám já i pro Wemos D1 mini.

    3. Tak mi to nedalo a ponořil jsem se do OTA problému víc – zjistil jsem, že je NUTNÉ dodržet následující postup (je zmiňovaný i zde https://github.com/esp8266/Arduino/issues/1017 ) :
      1. nahrát skript, který obsahuje OTA do modulu přes sériový port
      2. VYPNOUT NAPÁJENÍ MODULU
      3. opět zapnout napájení
      4. OTA by mělo být funkční a mělo by přes něj jít nahrávat
      je možné, že se dnes objeví verze 2.3.0-rc2, která tento problém bude mít odstraněný, nebo aspoň lépe zdokumentovaný… (@igrr v tom smyslu něco psal na vývojářské diskuzi)

      1. Já dneska zkusím dneska ten Wiresharker a kdyžtak mohu poslat mejlem vypisy ipconfig /all co jsem zatim vyzkousel:
        – ping funguje, zde se zobrazi jen IP adresa, nazev zarizeni ne, ale to je tak asi OK, pokud v AP rezimu mDNS nefunguje (?).
        – IDE v režimu Portable je jiný instalátor? Ten zatím nemám.
        – o nastavené paměti 512K jsem věděl, to bylo default nastavení. Ale myslím, že k k vlastnímu nahrávání ještě nedošlo, že ten skript zkončil dřív než došlo ke kontrole paměti, ale zkusil jsem tam nastavit i ty 4M (3M SPIFFS) a nic
        – K destičce ESP01 ani reset tlačítko připojené nemám, takže jsem to dělal přesně tak jak jsem asi měl, tedy nastavil GPIO0 do 0, vypl a zapl napájení, nahrál jsem po sériovce, pak přenastavil GPIO0 do 1, vypl a zapl napájení a zkoušel.
        – zkoušel jsem to na NB s W10 x64, prakticky úplně čistá instalace, jen jsem doinstaloval Pyton 3.5.1. Zkoušel jsem pak ještě téměř čistý NB s W7 x86 a stejný Pyton

        1. Ok. Postup pro Portable instalaci Arduina se dá najít na internetu (třeba zde http://www.instructables.com/id/ESP8266-Arduino-IDE-164-Portable-Full-Quick-Instal/ ). V ESP01 OTA fungovat určitě nebude – je tam málo flash paměti. Pošli logy z Wiresharku (.pcap soubory). Ještě jedna věc – zkus do otaError metody ve skriptu dopsat výpis důvodu chyby – nejlépe třeba Serial.println((int)error); a napiš, co to vrátí za číslo. Zkusím kouknout do zdrojáku ArduinoOTA, kde by mohl být zádrhel. Další věc je, že dnes ráno vyšel 2.3.0-rc2, takže se dá zkusit i nová verze jádra…

          1. Updatl jsem na 2.3.0-rc2, rozdil na prvni pohled je v tom, ze se (nestihne?) nevypise text “Start.” na zacatku, otaError medota vraci 1, zapl jsem jeste debug v ArduinoOTA, okno terminalu:

            txWX6d´H<Ńěř4EÉŃĄąą..

            OTA server at: APOTA.local:8266
            Setup end.

            Update Begin Error

            Error: 1

            Wireshark vyskousim…

          2. Tak pokud to dobře hledám, tak chyba 1 je dle enum skutečně Update Begin Error. Vzniká to v metodě begin() třídy UpdaterClass a dle komentáře v Updater.h to znamená, že není dost místa ve flash paměti pro update… Skutečně máš vybraný čip se 4M flash a nastaveno rozložení paměti pro 1M program a 3M SPIFFS?

          3. Zkus ještě povolit v Updater.cpp ladění odkomentováním $define DEBUG_UPDATER / mělo by to vypsat podrobnější informace pro begin()… Ten Wireshark zatím asi nebude nutný.

  2. Zapl jsem ladeni, a zkusil obe desky, tedy ESP01 a WeMos D1 R2 @ mini. Dobou desek jsem nahral stejny FW, pri stejnem nastaveni, mel jsem vybranou desku WeMos, kde je nastavene 4M a (3M SPIFFS). Na NB kde se pokousim o uplaod pres OTA je stejne nastaveni. Vypisy na terminalu se lisi. Na ESP01 je skutecne problem s velikosti pameti.

    ESP01:
    OTA server at: APOTA.local:8266
    Setup end.

    ERROR[8]: Flash config wrong real: 1048576 IDE: 4194304
    Update Begin Error

    Error z otaError: 1

    WeMos D1:
    OTA server at: APOTA.local:8266
    Setup end.

    [begin] roundedSize: 0x0003C000 (245760)
    [begin] updateEndAddress: 0x00100000 (1048576)
    [begin] currentSketchSize: 0x0003D000 (249856)
    [begin] _startAddress: 0x000C4000 (802816)
    [begin] _currentAddress: 0x000C4000 (802816)
    [begin] _size: 0x0003B9E0 (244192)
    Start.

    Connect Failed
    Error z otaError: 2

    premature end: res:0, pos:0/244192
    Error z otaError: 4

    ERROR[0]: No Error

    1. 🙂 tak je to jasný – Updater Ti píše, že ve skutečnosti máš jen 1M flash osazené na desce, zatímco v IDE jsi mu řekl, že máš 4M – to je to ESP01. Zkus v IDE nastavit 1M flash a 64k SPIFFS, pak by to mělo proběhnout správně. Ovšem u toho Wemosu zatím fakt netuším – po nahrání přes sériový port jsi vypnul a zapnul napájení? To je totiž jediný, co mě zatím napadá…

      1. Jaky ma vyznam vlastne to 64k SPIFFS? To je nejaka rezervovana oblast?
        Tak vypis pro ESP01 se spravne velkou pameti:

        OTA server at: APOTA.local:8266
        Setup end.

        [begin] roundedSize: 0x0003C000 (245760)
        [begin] updateEndAddress: 0x000EB000 (962560)
        [begin] currentSketchSize: 0x0003D000 (249856)
        [begin] _startAddress: 0x000AF000 (716800)
        [begin] _currentAddress: 0x000AF000 (716800)
        [begin] _size: 0x0003B9E0 (244192)
        Start.

        Connect Failed
        Error z otaError: 2

        premature end: res:0, pos:0/244192
        Error z otaError: 4

        ERROR[0]: No Error

        1. Je to jen oblast, vyhrazená pro SPI souborový systém. V nových verzích jádra se bohužel nedá použít varianta bez vyhrazení oblasti. Hmm, tak teď to vypadá na stejnou situaci, jako s Wemos. Zkus prosím ještě jendu věc – cočasně zakaž na Win firewall (nezapomeň ho pak zase povolit). Vzpomínám si, že při prvním spuštění Arduino IDE se firewall ptal, jak povolit přístup aplikaci. Zaklikl jsem tam tenkrát obě volby – povolit přístup jak v domácí síti, tak ve veřejné síti. Ale čekal bych, že to neplatí pro ten Python.

  3. Firewall jsem vypnul a nepomohlo. Nicméně zkusím ještě hledat problém v NB, ještě tam běží ESET nad kterým nemám vládu. Zatím díky moc za podporu, dám vědět.

    1. Tak vyřešeno! Po delší době laborovaní s NB jsem zjistil, že celý problém opravdu způsobí Firewall. Myslel jsem si, že jsem Windows Firewall vypnul, ale stále běžel ESET Endpoint Security s vlastním nastavením firewallu a blokoval Pyton. Při prvním spuštění IDE se musí na firewallu povolit ještě Java (asi pro každý jiný modul ESP). Zkoušel jsem tedy Wemos D1 a ESP01 a oba již fungují.
      Při zapnutém ladícím výpise pro Wemos je na terminalu zobrazeno toto:
      http://tc.esy.es/ESP8266/4.png pro ESP01 je toto: http://tc.esy.es/ESP8266/5.png s tímto nastavením http://tc.esy.es/ESP8266/6.png Mám vyzkoušené Windows 7 a Windows 10, IDE 1.6.9 a core 2.3.0 Upload je opravdu velice rychly, na ESP01 navíc není třeba přepínat nastavení bootovacího pinu či vypínat/zapínat napájení, aby se modul resetoval.
      Takže díky moc a snad to pomůže i někomu dalšímu 🙂

      1. Děkuji za tip. Pomohlo mi jenom to s tím Pythonem ve firewallu. Už mi to taky funguje. Super!
        K.

  4. Nainstaloval jsem IDE1.6.9 a pokud zvolím některou z desek ESP8266, tak mi hlásí chybu “Deska nodemcuv2 (platforma esp8266, balík esp8266) není nalezena” netušíte někdo, co s tím?

  5. Jestli portable znamená, že knihovny a projekty mám v adresáři dokumenty, tak ano.

  6. ještě jsem zkusil aktualizovat ESP8266 v boards manageru, a hlásí mi to chybu “Nemohu najít boards.txt in C:\Users\karel\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.0.0. Není z doby před verzí-1.5?”
    boards.txt v tom adresáři fakt není.

    1. Verze jádra 2.0.0 je hrozně stará – měla by být 2.3.0 a nejspíš se jedná o poškozenou instalaci, tady fakt neporadím – schválně používám tu portable variantu, kde podobné problémy nemusím řešit…

  7. Tak jsem adresář ESP8266 v app data smazal a nainstaloval znovu, a vypadá to, že je funkční.

  8. Zdravím,
    mám Wemos d1 Mini, mohlo by někomu pomoci při chybové hlášce když se pokouší nahrát projekt pomocí OTA.
    “java.io.ioexception: cannot run program “python.exe”: createprocess error=2, the system cannot find the file specified”
    Jde o chybějící instalaci pythona.
    Důležité je po nainstalování ještě upravit soubor platform.txt, umístěn v mém případě
    “c:\Users\Admin\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\platform.txt”
    Upravte řádek z “tools.esptool.network_cmd.windows=python.exe” na “tools.esptool.network_cmd.windows=c:\Users\Admin\AppData\Local\Programs\Python\Python35\python.exe”
    Používám Win7.

    1. Dobrý den,
      díky za komentář, jen jednu drobnou poznámku – pokud při instalaci Pythonu zatrhnete volbu, aby se přidala cesta k python.exe do PATH proměnné, tak nemusíte modifikovat platform.txt. Takhle to mám nainstalované já…

  9. Zdravím,
    chtěl bych se zeptat jestli někdo nemá představu jak programovat pomocí OTA v režimu Client. Jde mi o to, že v režimu Client si nyní beru aktuální čas z NTP serveru, dle toho pak mám naprogramován jednoduchý scheduler. Změny naprogramování zatím provádím pomocí USB, rád bych ale toto řešil přes wifi. Programovat webserver se mi zatím nechce :). Našel jsem návod na provozování WiFi.mode(WIFI_AP_STA); – napadlo mne režim AP využívat pro OTA a režim STA, ale zatím se mi nedaří, potřeboval bych nakopnout správným směrem :). Děkuji

    1. Dobrý den,
      v režimu STA funguje OTA prakticky stejně. S Patrikem teď dávám dohromady šablonu pro vytváření Arduino projektu, který OTA podporuje. Pokud máte zájem, můžu Vám poslat aktuální archív k testování – zatím to testuje jen Patrik…

  10. Zdravím,
    nejsem žádný expert, ale když mi pošlete archív k testu, rád se samozřejmě podělím o výsledky :).

    1. Ok, nejde nám o experty – má to být šablona a návod pro začátečníky, takže čím víc lidí ji prověří, tím kvalitnější bude (aspoň to je můj názor)… Večer tedy čekejte mail 🙂

  11. Zdravím,
    měl bych dotaz. Zkouším OTA zde v příloze. Poprvé jsem to do ESP01 nahrál přes kabel teď se mi již ukazuje modul v sítových portech. Vybral jsem ho a chtěl jsem dát sériový monitor, ale chce to po mě heslo k přípojení k vývojové konzoli? Tušíte jaké je heslo nebo kde ho mám nastavit?

    Díky moc za radu.

    1. Dobrý den,
      sériový monitor v Arduino IDE je určený pro komunikaci přes sériový port s deskou. OTA pro ESP zase umožní nahrání firmware “přes vzduch”, ale nepřesměrovává Serial.print() na žádný síťový port. Proto Vám to nefunguje. Jako náhradu použijte stopaře (modul trace) a webový prohlížeč. Pokud chcete využít sériový monitor v IDE je třeba mít ESP připojené kabelem a v portech opět vybrat odpovídající sériový port, namísto portu síťového…

  12. Dobrý den, zkouším také tak trochu programovat arduino a vyrobil jsem si meteostanici na platformě wemos D1. meteostanici připojuji na pevnou IP adresu, díky které se vždy dostanu přesným port forwardem přes firewall ven a je vidět v internetu. OTA funguje bez problémů. Jenže chci mít meteostanice celkem 3 a zde přichází můj problém. Zatím jsem postavil druhý kousek, nahrál stejný program jako do první, pouze jsem posunul IP adresu o jednu výše. Jenže ouha druhé zařízení se mi stále nechce objevit v seznamu portů, abych mohl jeho program aktualizovat v případě potřeby. Je nějaké omezení počtu zařízení, které je možné spravovat přes OTA?
    Díky za radu. MV

    1. Dobrý den,
      o omezení nevím – běžně mívám v seznamu zařízení 2-3 OTA klienty. Zkuste ukončit IDE, spustit obě Vaše zařízení a teprve pak spustit IDE (a chvíli počkat, než se podíváte na seznam portů). Také prosím zkontrolujte, že každé zařízení má unikátní jméno…

    1. Ahoj,
      sice reklama, ale dobře – Česky jsem na tom webu nenašel ani stránku, ale je to open source, tak ji zde nechám. Jen doufám, že až ten systém nasbírá dostatečné množství oveček, tak se nestane closed source a plaťte, kdo to chcete používat…

Komentáře nejsou povoleny.