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
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