NAM – jak zdalnie wgrać oprogramowanie

Nettigo Air Monitor działa na oprogramowaniu tworzonym z użyciem bibliotek Arduino. Dziś kilka zdań o tym jak wgrać firmware na urządzenie.

Normalnie, nie powinno to nikogo interesować – aktualizacje są dystrybuowane przez serwer aktualizacji i jedyne co trzeba wybrać to kanał aktualizacji – stable czy beta. Alfa jeszcze jest, ale naprawdę nie polecam nikomu bez wyraźnego wskazania przez nas żeby z niego korzystał. Rzadko z niego korzystamy, zwykle gdy trzeba diagnozować mocno nietypowy problem.

Ale nie zawsze jest „normalnie„. Np. ostatnio mieliśmy przypadek NAMów instalowanych w wydzielonej sieci, nie mających dostępu do internetu. Dlatego tutaj opiszę kilka sposobów jak można bezpośrednio wgrać firmware na NAM.

Mała uwaga – opis dotyczy NAMów 0.3 opartych o ESP8266. Nowszym NAMom poświęcę chwilę na końcu.

Platformio – domyślny wybór

Firmware jest rozwijane w oparciu o biblioteki Arduino, ale nie w Arduino IDE. Korzystamy za Platformio CLI i wgrywanie firmware podczas testów/pisania nowych wersji zwykle robię z użyciem narzędzi dostarczonych przez Platformio, niezależnie czy mówimy o wgrywaniu przez USB czy „przez powietrze” (OTA, Over The Air).

Wymaga to ściągnięcia kodu, skonfigurowania środowiska (choć w Platformio większość dzieje się „samo„) i wtedy wystarczy coś w stylu pio run -t upload -e lang_pl --upload-port=/dev/ttyUSB0 Skompiluje i wgra.

Gdy nie mamy dostępu do sieci to nieco sprawa się komplikuje, trzeba np wcześniej pobrać wszystkie zależności i dopiero można skompilować i wgrać kod. Gdy to nie jest opcją albo po prostu nie chcecie z jakiś powodów bawić się w kompilowanie, wystarczy pobrać właściwą binarkę z odpowiedniej wersji i ją wgrać. Binarki są na GitHubie NAMF, po pobraniu zostanie tylko wgranie.

Wgrywanie przez USB

Dawniej w każdym wypadku w NAM był moduł typu Wemos z portem USB. Od dłuższego czasu NAMy PRO mają Bidamosa, prosty moduł oparty o ESP07s ale bez portu USB. Zmiana spowodowana była fatalną jakością Wemosów Pro przez dłuższy czas. Ciągłe problemy z zasięgiem, stabilnością czy działaniem I2C.

W przypadku NAMów z Bidamosem, opcja ta jest dostępna, ale wymaga posiadania konwertera USB/Serial.

Niezależnie od wariantu, musisz mieć esptool. Jest to program dostępny jako pakiet Pythona. Zainstaluj go przez pip:

python -m pip install esptool

Jeśli mamy NAM z Wemosem, to po podłączeniu pojawi się w komputerze nowy port szeregowy, na linuksie sprawdź dmesg zaraz po podłączenu, na Windows szukaj w Menedżerze Urządzeń. Na linuksie zwykle to jest USB0 (czyli cała ścieżka do portu to /dev/ttyUSB0) a na Windows COM4.

Uruchom terminal. Najpierw możesz wyczyścić flash: esptool --port /dev/ttyUSB0 erase-flash. Jest to nieobowiązkowe, ale warto to zrobić.

Następnie wgraj samą binarkę: esptool --port /dev/ttyUSB0 --baud 460800 write-flash 0x0 firmware.bin gdzie firmware.bin to nazwa pliku (jeśli jest w innym katalogu to musi być ze ścieżką) z firmware NAMF (np latest_en.bin), który ściągnięty został z GitHuba. Wpisz oczywiście port taki jak w twoim systemie.

Ratunku! nie mam portu USB

Jeśli zaś twój NAM ma Bidamosa to procedura jest taka sama, ale musisz podłączyć konwerter (działający w logice 3.3V) do portów TX/RX oraz zasilanie i masę. Następnie, wciśnij i trzymaj przycisk PRG na Bidamosie i naciśnij RST. Po zwolnieniu RST możesz też zwolnić PRG. ESP8266 na Bidamosie jest trybie programowania i możesz zacząć wgrywać firmware tak jak z Wemosem. Po skończonym wgrywaniu, musisz nacisnąć RST by Bidamos wystartował.

Podpiąć się do Bidamosa możesz gdy jest wyjęty z NAMa bezpośrednio (przewodami jumper-wire) lub gdy jest w NAM. W NAM skorzystaj z gniazda EXT i podłącz go jak na poniższym zdjęciu. Gniazdo EXT mapuje piny Wemosa 1:1, tak jak jest w NAM. W lewym górnym rogu Wemosa w NAM są piny TX i RX, tak samo w gnieździe EXT – w lewym górnym rogu dwa pierwsze piny to TX i RX.

Teraz zauważyłem że ujęcie nie jest zbyt fortunne – nie widać podłączenia GND, więc tabelka:

Złącze konwerteraPin w gnieździe ext
RXTX (górny rząd, pierwszy od lewej)
TXRX (górny rząd, drugi od lewej)
GNDGND (górny rząd, drugi od prawej)
Vcc (zworka ustawiona na 3.3V)3V3 (dolny rząd, pierwszy od prawej)

Zdalne wgrywanie

W Arduino OTA ma dwa znaczenia. Określa sie tak zarówno proces pobierania nowego firmware z serwera uaktualnień jak i wgrywanie inicjowane z komputera w tej samej sieci co NAM. Opiszę teraz tą drugą procedurę, bo jej możesz użyć. Serwer uaktualnień jest pod naszą kontrolą.

Najpierw potrzebujesz narzędzia do wgrywania na ESP przez sieć lokalną. Platfomio wspiera zarówno wgrywanie prze USB jak i przez sieć. W tym drugim przypadku w platformio.ini trzeba ustawić upload_protocol = espota i: pio run -t upload -e lang_pl --upload_port=192.168.1.200 --auth=HASLO

No właśnie, pojawia się jakieś hasło. Wgrywanie firmware przez sieć lokalną jest możliwe gdy w konfiguracji NAMa jest:

  • ustawione hasło do panelu administratora
  • włączona autoryzacja
  • OTA zostało aktywowane

Aktywacja OTA polega na wejściu na URL IP_NAM/ota (w powyższym przykładzie będzie to http://192.168.1.200/ota). Po aktywacji przez 60 sekund (o ile jest ustawione i włączone hasło) będzie można rozpocząć wgrywanie firmware.

Czyli – odwiedzamy http://192.168.1.200/ota i wydajemy polecenie pio run jak wyżej.

Co zrobić jeśli nie masz Platformio i nie chcesz go instalować?

W repozytorium Arduino ESP32 jest skrypt w Pythonie – espota.py, który nam pozwoli wgrać zdalnie binarkę. Choć jest w repozytorium ESP32 to z ESP8266 też sobie świetnie radzi.

Ściągamy plik (trzy kropki w prawym górnym rogu i tam jest Download), zapisujemy lokalnie jako espota.py i (po aktywacji OTA w NAM): python espota.py -i 192.168.1.200 -f ~/SCIEŻKA_DO_PLIKU/firmware.bin -a HASŁO.

Jak pisałem, korzystam głównie z OTA wbudowanego w Platformio i mam wrażenie (przynajmniej w moim środowisku testowym) że to z Platformio działa nieco stabilniej. Przy tym skrypcie zdarzało się że proces ładowania się zacinał, ale generalnie działa.

NAM z ESP32

Zasadniczo, w przypadku ESP32, powyższe zasady są takie same, jedynie różnica jest przy wgrywaniu przez esptool – nie wgrywamy pod adres 0 pliku bin, ale trzeba cały obraz wgrać, który powinien być do pobrania oddzielnie na stronie z Releases na GitHub. Natomiast plik bin dla ESP32 można wgrać przez OTA.