Pierwsze spotkanie z ESP8266

tech • 2256 słów • 11 minut czytania

Ta notatka została oznaczona jako wymagająca dopracowania: tranp img.
Zawartość wpisu może ulec zmianie, zatem zapraszam do ponownych odwiedzin w niedalekiej przyszłości :)

Do zabawy z układami ESP8266 skłonił mnie pomysł na jeden z układów w ramach rozwiązania zadania w Szkole Konstruktorów EdW, ale o tym indziej. Oczywiście, w swoich zasobach kilka takich modułów już dawno posiadłem (ponad rok temu), ale jak to bywa, różnych elementów i modułów prosto z chińskich fabryk u mnie dużo. Tylko z czasem, aby zrealizować pomysły lub przeprowadzić interesujące eksperymenty, jakby wprost proporcjonalnie mniej, więc leżą w szafie (pudłach). Ale oto nadszedł i czas…

Moduły WiFi oparte na chipsecie ESP8266 firmy Espressif Systems jest obecnie jednym z najpopularniejszych sposobów na dostęp do sieci WiFi we własnych elektronicznych projektach. I to wszystko za naprawdę dobrą (małą) cenę i prostotę obsługi. Nic więc dziwnego, że zyskał on taką popularność. Ale to nie jedyny moduł/chipset, firma go produkująca już opracowała jego ulepszonego brata - ESP8285, czy nieco mocniejszy dwu-rdzeniowy ESP32. A i konkurencja powoli wyrasta, jak choćby RTL8710.

Wstęp w modny obecnie świat IoT (Internet of Things) staje się coraz prostszy…

Moduły i chipset ESP8266

Moduł WiFi oparte na chipie ESP8266 działają w standardzie 802.11 b/g/n na częstotliwości 2,4 GHz. Układ ESP8266, a obecnie to ESP8266EX z wymaganymi certyfikatami, jest w istocie typowym SoC-em (System-on-a-chip), wykonanym w architekturze RISC, bazującym na 32-bitowym rdzeniu Xtensa LX106 serii Diamond firmy Tensilica. Posiada trochę wewnętrznej pamięci RAM (64KiB dla instrukcji i 96KiB dla danych), interfejs QSPI dla zewnętrznej pamięci Flash oraz to co najważniejsze interfejs Wi-Fi IEE802.11 b/g/n z obsługą WEP, WPA/WPA2. Do tego standardowo kilka - 16 pinów ogólnego przeznaczenia, sprzętowe interfejsy SPI, I2C, I2S, UART, IRDA, PWM, a nawet jeden 10-bitowy przetwornik ADC. Wszystko napędzane z częstotliwością 80MHz i zasilane 3.3V. Więcej szczegółów można znaleźć w dokumentacji.

esp8266ex-block

Twórca układu ESP8266 udostępnia bodajże tylko jeden gotowy moduł oparty na swym układzie - WROOM-02, nie licząc płytek deweloperskich i innych narzędzi. Większość dostępnych modułów, bardzo do siebie zresztą podobnych opracowały zewnętrzne chińskie firmy. Najbardziej popularne i dostępne są produkty firmy AI-Thinker (widzę, że firma ta produkuje także kilka innych modułów z szeroko pojętej telekomunikacji, bo zdaje się że w kilku pudlach znajdę ich wyroby). I to dzięki niej za sprawą modułu ESP8266-01 w sierpniu 2014 rozpoczęła się wielka kariera układu.

Moduły różnią się głównie wielkością płytki oraz ilością wyprowadzonych pinów, niestety oprócz wersji ESP-01 wszystkie maja nieco mniejszy niż 2.54 mm rozstaw. A także rozmiarem pamięci NOR FLASH, choć najczęściej jest to 4Mbit (512kB) lub 32Mbit (4MB), obecnie wersja EX może obsłuzyć do 16MB. Wszystkie zawierają anteną - PCB i/lub gniazdko antenowe, a niektóre dodatkowe diody LED sygnalizujące pracę układu i transmisję.

Poniżej podglądowo kilka modułów z rodziny ESP-XX na podstawie obrazków w sieci, obecnie niektóre już wycofane, a niektóre w nowszych wersjach lub nowe produkty, jak na przykład ESP-14.

esp-modules

Krótki przegląd wszystkich modułów z małą charakterystyką można znaleźć na stronie wiki społeczności ESP8266.

Ja posiadam wersję ESP-01 (info), to na niej się właśnie bawię. Moduł ten chyba nie jest już produkowany, ale jeszcze jest dostępny u wielu chińskich dostawców. Do tego bardziej rozbudowany moduł ESP-07 (info) z anteną ceramiczną wraz z gniazdkiem na zewnętrzną, a także wersję ESP-12 (info dla nieco nowszej wersji 12F) wraz płytkami-adapterami na raster 2,54 z goldpinami.

Społeczność wokół ESP8266

Wokół układu ESP8266 i modułów wyrosła bardzo wielka społeczność. Producent ma swoje ESP8266 Developer Zone, ale większość i tak skupia się wokół forum ESP8266 Community Forum. Przeglądając choćby tweety z tagiem #ESP8266 czy konto @ESP8266 można się przekonać jak wiele różnych projektów i produktów powstaje na tej platformie.

Ogrom informacje można znaleźć w sieci, z tego co się orientuję zasoby te są niezliczone. Ja mogę polecić dokumentację oraz jedną ze stron, o jaką zahaczyłem - ESP8266 Quick Start. Dobrym wstępem, jeśli chodzi głownie o styczność z AT w ESP8266, może być seria artykułów o modułach WiFi na znanej stronie Mikrokontrolery - Jak zacząć? Standardowe użycie dowolnej wyszukiwarki pozwoli znależć w sieci to co potrzebne, w dowolnym języku ;)

Duża społeczność kreci się również wokół nieoficjalnych projektach firmware-u tworzonego głownie przez otwartą społeczność lub inne niezależne firmy. Najbardziej popularny jest ten korzystający z języka Lua, istnieje również soft oparty na Pythonie, Basicu, czy dla Arduinowców w C/C++ z API znanym z tej platformy. Niektórym z nich przyjrzę się bliżej, pewnie w następnym spotkaniu, przy pisaniu testowej aplikacji.

Podłączenie i komunikacja (AT)

Do testów i pierwszej zabawy wykorzystałem moduł ESP-01, jego pinologia przedstawiam poniżej.

esp-01-pins

Schemat podłączenia układu za pomocą UART-a z dowolnym terminalem szeregowym, na przykład z komputerem poprzez wykorzystanie przejściówki USB-UART poniżej.

esp-01-connections

Co ważne, należy pamiętać, że układ pracuje pod napięciem 3,3V i takie też poziomy logiczne powinny być podawane na wejścia modułu. Można trafić w sieci na informacje, jakoby praca na 5V poziomach logicznych TTL nie sprawiała problemów i nic złego się nie wydarzyło (Is ESP8266 I/O really 5V tolerant?). To jednak warto przestrzegać podanych warunków pracy, aby nie uświadczyć jakiś niespodzianek. Mój kabelek-adapter USB-UART bazujący na PL2303HX standardowo pracuje na poziomach logicznych 3,3V. W ostateczności można wykorzystać jakiś moduł konwertera stanów logicznych lub sklecić coś na szybko z wykorzystaniem diody Zenera lub prostego dzielnika napięciowego.

esp-01-talk

Do połączenia z modułem używam terminala PuTTY, łącząc się na porcie COM3 (tutaj widoczny jest mój konwerter) z prędkością 115200 baud (z taką mi się udało, starsze wersje działają na 9600), bez parzystości, 8 bitów danych, 1 stop. Za którymś razem udało się pomyślnie nawiązać połączenie, moduł wypluł jakiś czytelny ciąg znaków. Super!

Próbuję wysłać proste AT, aby upewnić się, że wszystko działa poprawnie, a tu mały zonk. Po wprowadzeniu komendy i zatwierdzeniu jej Enter-em nic się nie dzieje, brak odpowiedzi i jakiejkolwiek reakcji układu. Jak się później okazało, PuTTY przy wciśnięciu Enter-a wysyła specjalny telnetowy znak końca linii ^M, a to za mało, bo brakuje typowego znaku końca linii CL RF, który można wprowadzić za pomocą kombinacji Ctrl+J, zaraz po wciśnięciu Enter-a. Niby nic wielkiego, a jednak, mały szczegół, może trochę popsuć humor. Oczywiście w Faq 4.16.4 opisano takie zachowanie terminala, ale kto by czytał helpy i inne faq…

Trafiłem wielokrotnie w sieci na informacje, gdzie niektórzy zalecali aktualizację oprogramowania modułu, gdy ktoś napotkał na taki problem. Dziwne, może w którejś nowszej wersji dodano obsługę specjalnego telnetowego znaku?

Ostatecznie wszystko zaczęło działać, więc można było się pobawić z komunikacją po AT. Wszystkie dostępne komendy AT z małym opisem można znaleźć na wiki AT Command set. Nie będę tutaj się zajmował tą tematyką.

esp-putty

Test poprawności komunikacji między modułem a terminalem można przeprowadzić używając prostej komendy AT, a za pomocą AT+GMR można sprawdzić wersję posiadanego oprogramowania. Z poziomu systemu można również zrestartować układ za pomocą komendy AT+RST, w odpowiedzi dostaniemy trochę informacji diagnostycznych przy bootowaniu:

 ets Jan  8 2013,rst cause:4, boot mode:(3,7)

wdt reset
load 0x40100000, len 816, room 16
tail 0
chksum 0x8d
load 0x3ffe8000, len 788, room 8
tail 12
chksum 0xcf
ho 0 tail 12 room 4
load 0x3ffe8314, len 288, room 12
tail 4
chksum 0xcf
csum 0xcf

2nd boot version : 1.2
  SPI Speed      : 40MHz
  SPI Mode       : QIO
  SPI Flash Size : 4Mbit
jump to run user1

rl-B-
Ai-Thinker Technology Co. Ltd.

invalid

W sumie podobne dane powinny być widoczne po poprawnym podłączeniu układu i jego starcie, ale u mnie są “krzaczki”, możliwe, że ta cześć nadawana jest z inną prędkością niż 115200, ale nie udało mi się tego jednoznacznie ustalić.

Układ raportuje dosyć starą wersję, a dodatkowo ten invalid korci mnie, aby przeprowadzić aktualizację oprogramowania, ale nim to zrobię spróbuję uruchomić/skonfigurować moduł Wi-Fi.

Na początek należy ustawić tryb pracy radia wifi w roli stacji (klienta) poprzez AT+CWMODE=1, a następnie ustawić konfigurację sieci z jaką moduł ma się połączyć - polecenie AT+CWJAP. Gdy moduł nawiąże połączenie z AP, można podejrzeć jego lokalne adresy (IP, MAC) używając komendy AT+CIFSR.

OK
AT+CWMODE=1

OK
AT+CWJAP="MalTest","dupa123"

OK
AT+CIFSR
+CIFSR:STAIP,"192.168.1.21"
+CIFSR:STAMAC,"18:ff:55:a2:49:46"

OK

Znając adres mogę ping-nać z kompa podłączony moduł ;)

C:\Users\malcom>ping 192.168.1.21

Badanie 192.168.1.21 z 32 bajtami danych:
Odpowiedź z 192.168.1.21: bajtów=32 czas=592ms TTL=255
Odpowiedź z 192.168.1.21: bajtów=32 czas=601ms TTL=255
Odpowiedź z 192.168.1.21: bajtów=32 czas=579ms TTL=255
Odpowiedź z 192.168.1.21: bajtów=32 czas=503ms TTL=255

Statystyka badania ping dla 192.168.1.21:
    Pakiety: Wysłane = 4, Odebrane = 4, Utracone = 0
             (0% straty),
Szacunkowy czas błądzenia pakietów w millisekundach:
    Minimum = 503 ms, Maksimum = 601 ms, Czas średni = 568 ms

Można również podejrzeć do jakiej sieci (AP) moduł się podłączył - AT+CWJAP?. Jak również za pomocą AT+CWLAP wylistować będące w zasięgu modułu dostępne sieci.

AT+CWJAP?
+CWJAP:"MalTest"

OK
AT+CWLAP
+CWLAP:(3,"MalTest",-35,"20:cf:30:d6:82:08",1)
+CWLAP:(3,"UPC244608630",-90,"54:e5:e1:4e:2a:1b",1)
[...]
+CWLAP:(0,"UPC Wi-Free",-89,"fe:94:e3:29:4b:eb",13)
+CWLAP:(3,"Paula",-91,"cc:22:88:cc:56:67",1)

OK

Skoro już mam działającą sieć, mogę spróbować zaktualizować oprogramowanie wprost spod systemu AT. Wystarczy skorzystać z polecenia AT+CIUPDATE, które w 4 krokach przeprowadzi cały proces.

AT+CIUPDATE
+CIPUPDATE:1
+CIPUPDATE:2
+CIPUPDATE:3
+CIPUPDATE:4

OK

Poszczególne etapy to:

  1. Znalezienie serwera aktualizacji
  2. Połączenie z serwerem
  3. Pobranie wersji/softu
  4. Uruchomienie aktualizacji

Niestety nie zawsze to działa, sam się o tym przekonałem. W moim przypadku wisiało na etapie 3. Możliwe, że tak długo się pobierał nowy soft, ale po kilku(nastu) minutach przerywałem proces.

Inną opcją jest typowe flashowanie modułu, a o tym dalej przy podmianie firmware-u.

Flashowanie modułu

Flashowanie to potoczna nazwa programowania pamięci flash różnych urządzeń, modułów czy chipsetów, zwykle ograniczająca się do skasowania starej zwartości i wgrania nowej. Podobnie wygląda sprawa z modułami ESP8266, gdzie możemy bez problemu „wgrać’ do pamięci flash dowolne dane, w naszym przypadku oprogramowanie - firmware.

Do procesu flashowania trzeba odpowiednio przygotować hardware - na GPIO0 wymusić stan niski przed uruchomieniem układu (ewentualnie przed resetem). Spowoduje to przejście układu w tryb flahsowania. Istnieje kilka innych trybów bootowania, kiedyś do nich wrócę.

Do procesu potrzebny jest tez jakieś odpowiednie narzędzie, czyli software. Temat rzeka, znaleźć można wiele flasherów, ale ja jedynie zaprzyjaźniłem się z pythonowym esptool.py i ESP8266 Flash Download Tools (producenta układu w wersji GUI).

No i oczywiście nowy firmware w wersji binarnej do załadowania również będzie konieczny. Tutaj nie musimy ograniczać się do oprogramowania udostępnianego przez producenta układu lub modułu, ale także wykorzystać inne nieoficjalne produkcje, a trochę ich się pojawiło. Kilku z nich przyjrzę się później. Na razie flashuję!

Do testów chcę chciał załadować nowy oficjalny firmware, który mżna znaleźć na stronach producenta wraz z SDK i innym przydatnymi materiałami, link do najnowszych wydań. Od jakiegoś czasu to właśnie na forum ESP8266 Developer Zone znajdują się wszelkie informacje i releasy. W sieci można jeszcze trafić na informacje, czy materiały, które korzystają ze starej wersji, jaka ciągle dostępna jest na githubie. Firma chyba zarzuciła używanie githubowych repozytoriów na, bo nic tam się za bardzo nie dzieje…

Istnieją dwa rodzaje SDK: Non-OS SDK i RTOS SDK, w skrócie różnią się tym, że wersja RTOS bazuje na systemie operacyjnym FreeRTOS, a standardowe SDK używa timerów i callbacków. Binarki z obsługą komend AT znajdują się w wersji Non-SDK i taką pobieram z sieci. Aktualna wersja to 2.0 z 19 lipca 2016 roku.

Mały zonk! W release notes (w paczce czy na stronach wydania) można znaleźć ciekawą informację:

Since the release of ESP8266_NONOS_SDK_V1.5.0, AT firmware is too large to use 4Mbit flash. Please choose flash with at least 8Mbit capacity.

Mój moduł ma tylko 512KB, więc poszukuję ostatniej wersji mieszczącej się w 4MBit Flashu, czyli ostatniego wydania 1.4. Tutaj mała dygresja, trochę shitowe to forum, bo ciężko znaleźć oraz przeglądać stare wpisy. Ale posiłkując się googlami, trafiłem na stronę z wydaniem 1.4 - esp_iot_sdk_v1.4.0 z 18 września 2015 roku.

W katalogu z binarkami dla AT (bin\at) znajduje się plik readme.txt z informacjami niezbędnymi do flahsowania firmware-u. Korzystam z metody non-boot, czyli bezpośrednie programowanie pamięci Flash, zatem szukam informacji dotyczących właśnie takiej metody.

***********************NON-BOOT MODE***********************
download
eagle.flash.bin             0x00000
eagle.irom0text.bin         0x40000
blank.bin
	Flash size 4Mbit:       0x3e000 & 0x7e000
	Flash size 8Mbit:       0x7e000 & 0xfe000
	Flash size 16Mbit:      0x7e000 & 0x1fe000
	Flash size 16Mbit-C1:   0xfe000 & 0x1fe000
	Flash size 32Mbit:      0x7e000 & 0x3fe000
	Flash size 32Mbit-C1:   0xfe000 & 0x3fe000
esp_init_data_default.bin  (optional)
	Flash size 4Mbit:       0x7c000
	Flash size 8Mbit:       0xfc000
	Flash size 16Mbit:      0x1fc000
	Flash size 16Mbit-C1:   0x1fc000
	Flash size 32Mbit:      0x3fc000
	Flash size 32Mbit-C1:   0x3fc000

*NOTICE*:
UPDATE is not supported in non-boot mode

***********************************************************

Dane te zawierają informacje o adresach (offsetach) pod jakie należy zapisać poszczególne części (obrazy binarne) oprogramowania.

Przy flashowaniu esptool-em wystarczy podać pliki i odpowiadające im offsety zgodnie z załączonymi informacjami w pliku:

esptool.py --port COM3 --baud 115200 write_flash \
	0x00000 esp_iot_sdk_v1.4.0\bin\at\noboot\eagle.flash.bin \
	0x40000 esp_iot_sdk_v1.4.0\bin\at\noboot\eagle.irom0text.bin \
	0x3e000 esp_iot_sdk_v1.4.0\bin\blank.bin \
	0x7e000 esp_iot_sdk_v1.4.0\bin\blank.bin \
	0x7c000 esp_iot_sdk_v1.4.0\bin\esp_init_data_default.bin

I po kilkunastu sekundach mamy nowy soft:

esp-tool

Podobnie wygląda sprawa przy wykorzystaniu graficznego ESP Flash Download Tool, podajemy dane i jazda!

esp-flash1

Bieżąca prace i postęp programowania można podejrzeć w konsoli, która stratuje wraz z programem

esp-flash2

Po aktualizacji od razu lepiej, nowa wersja i jest oczekiwane “ready” po zbootowaniu programu ;)

-lrl--r-
ready
AT

OK
AT+GMR
AT version:0.50.0.0(Sep 18 2015 20:55:38)
SDK version:1.4.0
compile time:Sep 18 2015 21:32:07
OK
AT+RST

OK

 ets Jan  8 2013,rst cause:1, boot mode:(3,7)

load 0x40100000, len 23200, room 16
tail 0
chksum 0x72
load 0x3ffe8000, len 948, room 8
tail 12
chksum 0x50
ho 0 tail 12 room 4
load 0x3ffe83b8, len 3888, room 12
tail 4
chksum 0x1d
csum 0x1d
rl--rl---b
l-
ready

Wszystko poszło gładko i pomyślnie, można się bawić dalej ;)

Moje pierwsze spotkanie z ESP8266 dobiega końca. Zabawa była przednia i tak naprawdę dopiero się zaczęła. Chociaż było to tylko spojrzenie na te wspaniałe małe, tanie moduły. Choć głownie były to proste eksperymenty i jeszcze prostsza komunikacja po AT, bez drążenia tematu. To trzeba przyznać, że jest to tylko wierzchołek góry lodowej.

Za pomocą komend AT można zrobić naprawdę wiele - zarządzać masą innych ustawień sieciowych, tworzyć i uruchamiać serwery oraz wysyłać i odbierać dane. Każdy kto chciałby w pełni wykorzystać podsystem komend AT znajdzie w sieci stosowne informacje.

Mnie bardziej interesuje wykorzystanie wewnętrznego mikrokontrolera modułu i jego programowanie, dlatego w najbliższym kolejnym spotkaniu z tym modułem będę chciał spróbować pobawić innymi firmware-ami, które to umożliwiają.

Komentarze (0)

Dodaj komentarz

/dozwolony markdown/

/nie zostanie opublikowany/