Strona główna TECH Arduino ESP8266 i Arduino – OTA (Over The Air) Update

ESP8266 i Arduino – OTA (Over The Air) Update

21
ESP8266 i Arduino – OTA (Over The Air) Update
OTA (Over The Air) Update jest bardzo wygodnym mechanizmem, którego wykorzystanie znacznie podnosi wygodę korzystania z układu opartego na ESP8266. Jak sama nazwa sugeruje, wykorzystanie OTA pozwala na załadowanie programu do układu bez konieczności korzystania z programatora, portu szeregowego czy USB.
 

Takie rozwiązanie ma wiele zalet. W momencie zabudowania ESP8266 w obudowę, nie ma konieczności kombinowania jak tu wpiąć kabelek USB w urządzenie. Dużo szybciej można też zaktualizować oprogramowanie w większej ilości urządzeń podłączonych do sieci.

Postaram się, w tym poście, przedstawić w skrócie jak przygotować środowisko i samego ESP8266 do aktualizacji programu z wykorzystaniem OTA Update.

Do skorzystania z OTA potrzebny jest Python. Zarówno Arduino IDE jak i Visual Micro wykorzystuje skrypt napisany w Python-ie do zaktualizowania programu w ESP8266. Pierwszą czynnością, którą trzeba wykonać jest w związku z tym zainstalowanie Pythona w wersji 2.7.X. Po instalacji warto sprawdzić czy Python jest dodany do ścieżki systemowej i czy możemy go odpalić z konsoli wpisując: python.

Aby można było wybrać urządzenie sieciowe jako port docelowy do załadowania programu, zarówno Arduino IDE jak i Visual Micro muszą wykryć urządzenie podłączone do sieci. Wykorzystują do tego usługę Apple Bonjour (zdaję sobie sprawę, że to dziwne – ale tak własnie jest). Jeżeli więc nie mamy jej zainstalowanej – trzeba zainstalować. Z moich testów wynika, że wystarczy zainstalować Apple Bonjour dla drukarek. Ja pobrałem i zainstalowałem wersję, którą można znaleźć pod tym linkiem.

Teraz musimy odpowiednio przygotować ESP8266, do aktualizacji przez sieć. Najlepiej zacząć od gotowego przykładu, który mamy dostępny jeżeli zainstalowaliśmy obsługę ESP8266 do naszego IDE. Otwórzmy szkic BasicOTA.ino (w Arduino IDE znajdziemy go w menu Plik->Przykłady->Arduino OTA->Basic OTA.ino).

Szkic jest bardzo czytelny, nie będę się więc nad nim zbytnio rozwodził. Przed załadowaniem trzeba jeszcze właściwie uzupełnić zmienne ssid (nazwa naszej sieci WiFi) i password (hasło do sieci). Szkic ładujemy oczywiście klasycznie przez połączenie szeregowe.

Po załadowaniu szkicu powinniśmy uzyskać w menu połączenia nowy port sieciowy, który będzie się nazywał mniej więcej tak: esp8266-xxxxxx at adres_IP (jeżeli nowy port sieciowy nie pojawił się w menu, może być konieczny restart IDE).

Tak to wygląda w Arduino IDE:

 

Tak wygląda w VisualMicro:

 

Teraz możemy spróbować załadować szkic przez port sieciowy (czyli de-facto wykonać OTA Update) – i … to tyle :).

Szkic BasicOTA.ino możemy wykorzystać jako szkic bazowy, jeżeli chcemy wykorzystywać OTA w naszym projekcie i rozbudowywać go o inne funkcjonalności, których wymagamy od układu.

21 KOMENTARZE

  1. Witam i dzięki!
    Dzięki temu wpisowi uruchomiłem sobie upload nowych wersji oprogramowania po WiFi 🙂
    Mam jeszcze pytanie odnośnie serial monitora. Mianowicie w Arduino IDE po otwarciu monitora, woła on o hasło… Nie mogę nigdzie znaleźć tego hasła.
    Natomiast vMicro (Visula Studio) o hasło nie woła, ale też nic nie wyświetla i nie wysyła.
    Może zna kolega rozwiązanie problemu?

    • Witaj !
      Cieszę się bardzo, że wpis się przydał 🙂
      Jeżeli chodzi o hasło, to bardzo dziwne. Hasło można sobie założyć (np. tutaj jest filmik jak to zrobić: https://www.youtube.com/watch?v=zs5Alm2-_YY), ale pierwsze słyszę żeby było jakieś domyślne zintegrowane w firmware.
      Na moim UNO i nodeMcu, z którego korzystałem nie było takich efektów.
      Ja bym spróbował przeładować firmware, bo wygląda to tak jakby wgrany do układu firmware miał taką funkcję. Lepiej zastąpić go fabrycznym. O wgrywaniu firmware do Arduino i nodeMcu jest sporo artykułów w necie.

      Pozdrawiam 🙂

  2. Cześć, dzięki za ten post, ułatwił mi życie 🙂
    Myślę, że warto wspomnieć, że w razie błędu podczas wgrywania przez OTA należy wyłączyć firewall. U mnie bez tego w ogóle nie było możliwości wgrania. Mam zainstalowanego Comodo Internet Security.
    Poza tym wszystko działa bez problemu.
    Pozdrawiam.

    • Cieszę się, że pomogłem 🙂
      U mnie nie było problemu z firewallem, ale mam tylko standardowy – windowsowy. Być może Comodo wymusiło takie restrykcje.

  3. Dziękuje za opis procedury. Jednak w moim przypadku wczytanie przez wifi szkicu chyba nadpisuje szkic
    basic OTA i kolejny update już nie jest możliwy bez połączenia kablowego. Jak skonfigurować moduł, aby
    można było wielokrotnie dokonywać update przez wifi? pozdrawiam wg

    • Jeżeli nadpiszesz szkic zawierający obsługę OTA szkicem, który takiego kodu nie zawiera to logiczne jest że nie będzie ono działać.
      Tak jak napisałem na końcu posta, kod obsługujący OTA musi być częścią szkicu. Najlepiej rozbudować po prostu Basic OTA.ino o funkcjonalności, które chcemy dodać. Jeżeli realizujemy jakieś dodatkowe funkcjonalności związane z komunikacją przez WiFi to trzeba czasem trochę pokombinować, ale jest to do ogarnięcia.
      Pozdrawiam i powodzenia 🙂

  4. Póki co nie mogę tego rozgryźć na BasicOTA. Wyłączam antywirusa, zaporę i wiąż mam komunikat „No Answer”

    • Hmm… A czy ESP pojawia się w IDE jako dostępne urządzenie ? Nie wiem, czy używasz Visual Micro czy klasycznego IDE dla Arduino. Skrypt BasicOTA trzeba najpierw wgrać do ESP po kabelku a następnie wyłączyć/włączyć zasilanie ESP. Czasem konieczne jest zrestartowanie połączenia WiFi po stronie komputera i zrestartowanie IDE. Zainstalowałeś wcześniej apple bonjour ?

  5. Tak. Pojawia się w IDE jako dostępne urządzenie. Nie używam Visual Micro. Tak, wgrywam BasicOTA przez port com (po USB). Nie pamiętam, czy włączałem i wyłączałem ESP, zatem to jeszcze sprawdzę. Komputer chodzi po skrętce. IDE restartowałem również, bo tak to wynikało ze opisu. Apple Bonjour zainstalowałem dopiero pod koniec prób. Sądziłem, że gdy urządzenie jest widoczne po restarcie IDE i mogę je wybrać do update, pojawia się pytanie o hasło to Apple nie jest konieczne.
    Jednak po wpisaniu hasła lub po jego zakomentowaniu wciąż jest tak samo, czyli No Answer lub No Answer after Authentication.
    Sprawdzę jeszcze wyłączenie ESP po wgraniu po kablu. Zobaczę też czy da się wgrać OTA na innym kompie, beż antywira. No i gdzieś widziałem też sugestię co do zrestartowania routera po wgraniu programu na płytkę, ale to dotyczyło mDNS, którego również jak dotąd nie udało mi się użyć, a odpowiedź na ten problem zdaje się być nierozwiązana i wiele osób ma z mDNS problem.

  6. Sprawdziłem i rzeczywiście ESP trzeba po wgraniu softu po kablu wyłączyć i włączyć ponownie i wtedy OTA działa poprawnie. Wygląda na to, że dotąd pomijałem wyłączanie i włączanie.

  7. Ludzie doradźcie o co chodzi:
    Arduino:1.8.7 (Windows 10), Płytka:”NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, 4M (1M SPIFFS), v2 Lower Memory, Disabled, None, Only Sketch, 115200″

    Szkic używa 268856 bajtów (25%) pamięci programu. Maksimum to 1044464 bajtów.
    Zmienne globalne używają 29876 bajtów (36%) pamięci dynamicznej, pozostawiając 52044 bajtów dla zmiennych lokalnych. Maksimum to 81920 bajtów.
    15:35:21 [ERROR]: Bad Answer: ERR: ERROR[8]: Flash config wrong real: 1048576 IDE: 4194304

    wybrany port szeregowy
    nie istnieje albo Twoja płytka nie jest podłączona

    Ciągle mam taki błąd przy próbie wgrywania sketch-u.

  8. Warto dodać przed .begin() ArduinoOTA.setHostname(„jakas_nazwa”) która pojawi się na liście. W przypadku kilkunastu urządzeń w sieci robi się kłopot ze znalezieniem odpowiedniego….

  9. Dziękuję za ten artykuł. Był pomocny w uruchomieniu OTA na 8266. Warto zwrócić uwagę na niuanse takie jak to że tylko wersja 2.7.x pythona jest przydatna do realizacji OTA oraz że podczas jego instalacji należy koniecznie ustawić właściwą ścieżkę do pliku python.exe ( a nie zostawiać defoltowych ustawień kreatora instalacji!).
    Mam jeszcze kolejny problem po zainstalowaniu OTA, może zna Pan rozwiązanie. Mianowicie nie ma możliwości wykorzystania pinów D9 i GPIO10 jako wyjść do sterowania np. LEDów, co było możliwe przed wgraniem kodu poprzez OTA. Może to być potrzebne przy bardziej „nogożernych” aplikacjach. Czy zna Pan przyczynę i czy jest może na to jakiś sposób?

    • Dzięki za te uwagi o wersji Python-a. Trochę już czasu minęło odkąd realizowałem ten projekt i pojawiło się na pewno sporo zmian – ja takich problemów nie miałem. Natomiast odnośnie pinów – D9 i GPIO10 są wykorzystywane jako RX i TX podczas komunikacji ze sprzętowym UART. Można oczywiście je zablokować dla komunikacji szeregowej, ale odpada debugowanie programu w taki sposób. Wydaje mi się, że wystarczy zakomentować Serial.begin(..), jeżeli jest gdzieś w kodzie i te piny powinny być dostępne. Nie testowałem tego jednak – nie mam w tej chwili ESP pod ręką.

Skomentuj PStrejczek Anuluj odpowiedź

Proszę wpisać swój komentarz!
Proszę podać swoje imię tutaj