środa, 11 listopada 2026

_ESP-01, nie działająca OTA czyli Arduino i znikający port sieciowy

 

Co gdy OTA na twój ulubiony ESP-01 nie działa a wszystkie inne ESP grzecznie zgłaszają się w Arduino do zdalnej aktualizacji - jeśli masz samo to czytasz właściwy wpis. Dziś bowiem o tym co można zrobić czyli jak przechytrzyć Arduino IDE 2.x?




Znasz li ten ten ból... 

Projekt IoT jest zapięty na ostatni guzik. Programuję  małego, czarnego ESP-01 (z zawrotnym 1MB pamięci). Na pokładzie śmiga stabilny serwer WebSockets, który gada z panelem na tablecie, adres IP ustawiony na sztywno a wszystko pięknie upakowane w puszce w ścianie.

Ale nadejszała chwila aktualizacji kodu, więc odpalam Arduino mając w planach OTA, bo przecież nikt normalny nie będzie wykuwał modułu ze ściany, żeby podpiąć konwerter USB-UART. Jeszcze dla pewności sprawdzam ping - leci w 8 milisekund. Więc otwieram Arduino IDE 2.3.2, rozwijam listę portów i... nic. Zero. Null. Portu sieciowego mojego ESP-01 nie ma!

Dziś opis kilkugodzinnej batalii z niedomagającym mDNS w Windowsie, priorytetami w ESP8266 i o tym że to nie  Arduino IDE, ale terminal CMD wciąż rządzi. A wszystko to przy wdzięcznej pomocy ulubionego asystenta GEMINI. Zaczynamy!

Krok 1: Poszukiwanie winnego (czyli "U mnie działa")

Zaczęło się od klasyki gatunku. Moduł działa, odpowiada na ping 192.168.2.177, ale Arduino go nie widzi. Co sprawdzamy najpierw?

  • Flash Size: Ustawiony na 1MB (FS:64KB OTA:~470KB). Idealnie, miejsca na aktualizację jest aż nadto (program ważył ok. 300 KB).
  • Ping -a: Próbujemy rozwiązać nazwę hosta w Windowsie. Zamiast pięknego ESP_ssr, system wypluwa z powrotem samo IP.
  • Złorzeczenie na Windows Defender: Oczywiście, to na pewno wina Zapory! Przestawiamy sieć na "Prywatną", wpuszczamy proces mdns-discovery.exe do reguł, ba – robimy twardy reset IDE.

I co? ***** (cenzura).  Inne moduły ( ESP32-C3) wciąż ochoczo wyskakują w portach Arduino IDE a mały ESP-01 milczy jak grób. Czyli to nie wina Windowsa, nie wina rutera (żaden IGMP Snooping nie tnie pakietów). Mam winnego (chyba) ESP-01.

Krok 2: Anatomia zbrodni (Dlaczego ESP milczy?)

Dlaczego moduł, który błyskawicznie odpowiada na żądania WebSockets, jest głuchy na prośby o port OTA z komputera? Przyczyny mogą być dwie:

  • Bug statycznego IP (IGMP): W architekturze ESP8266 przypisanie adresu na sztywno przez WiFi.config() często powoduje, że moduł nie rejestruje się prawidłowo w grupie rozgłoszeniowej multicast. Komputer pyta "kto ma port OTA?", a ESP-01 w ogóle tego kanału nie nasłuchuje.
  • Walka Dawida z Goliatem (TCP vs UDP): ESP8266 to jednordzeniowy maluch. WebSockets (TCP) to pakiety, które traktowane są przez stos sieciowy LwIP jak VIP-y. Jeśli IDE wyśle paczkę mDNS (UDP) dokładnie wtedy, gdy procesor mieli choćby pustą ramkę WebSocket (albo bufor RAMu jest na granicy wyczerpania), pakiet UDP leci prosto do kosza. A u mnie WebSocket ma co mielić.

FAKTY: Serwer OTA na porcie 8266 w naszym układzie działa.

PODEJRZANY: może ESP-01  nie potrafi "krzyknąć" o tym do Arduino IDE.

Krok 3: Traktujemy Aduino z buta (Rozwiązanie siłowe)

Skoro wiem, że OTA żyje pod adresem 192.168.2.177, trzeba zignorować zawodny skaner mDNS w środowisku graficznym i wbić się do modułu siłą, przez wiersz poleceń.

Jak wgrać plik OTA, gdy Arduino IDE nie widzi portu:

  • Generujemy plik .bin: Zamiast klikać "Wgraj" w Arduino, wchodzimy w Szkic -> Eksportuj skompilowany plik binarny. W folderze projektu pojawia się nasz plik (np. ssr_new.ino.bin).
  • Kopanie w trzewiach Arduino: Musimy znaleźć Pythona i skrypt wgrywający, które Arduino ukrywa u siebie na dysku.

Skrypt znajduje się tu: C:\Users\TwojaNazwa\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\tools\espota.py

Python jest tu: C:\Users\TwojaNazwa\AppData\Local\Arduino15\packages\esp8266\tools\python3\3.7.2-post1\python.exe

skrypt dla ułatwienia kopiujemy do katalogu z plikiem .bin naszego ESP-01

Uwaga (błąd DLL): Jeśli myślisz, że ułatwisz sobie życie, kopiując sam plik python.exe do swojego folderu z projektem – zapomnij. Dostaniesz błędem braku python37.dll prosto w twarz. Ścieżka do pythona musi być pełna!

  • Magiczna komenda CMD: Odpalamy czarne okno konsoli (w folderze ze skompilowanym binem) i wklejamy pełną ścieżkę do Pythona w cudzysłowach, dodajemy skrypt, IP modułu, nazwę pliku i na końcu (co bardzo ważne!) flage -a z  hasłem OTA. Gdybym zapomniał to przypomni mi o tym komunikat  [Errno 10061] Authentication Failed.

U mnie pełna komenda w oknie terminala wyglądała tak:

"C:\Users\kpras\AppData\Local\Arduino15\packages\esp8266\tools\python3\3.7.2-post1\python.exe" espota.py -i 192.168.2.177 -f ssr_new.ino.bin -a 177

Wciskam Enter i nagle... dzieje się magia:
Authenticating...OK Uploading.......................................................................

Podsumowanie

Jeśli Wasz ESP-01 ze statycznym IP też kiedyś zdecyduje się na zabawę w chowanego z Arduino IDE, nie traćcie czasu na restarty komputera. Generujcie .bin, odpalajcie terminal i aktualizujcie to na własnych zasadach!

Duże podziękowania asystentowi GEMINI - bez niego ta robota trwałaby "nieco" dłużej.

A co będzie dalej - zobaczy nasz ulubiony ciąg dalszy.....

Brak komentarzy:

Prześlij komentarz