ESP8266 - tanie i łatwe w użyciu WiFi do Arduino i bez Arduino

Hit! Czegoś takiego mi było trzeba. W bardzo umiarkowanej cenie można kupić niewielki układ, który nie tylko połączy Arduino z siecią bezprzewodową (także w standardzie “n”), ale także w wielu przypadkach będzie pracować bez Arduino. Poznajcie ESP8266, układ który wprowadzi sporo zamieszania w “Interncie rzeczy”.

ESP8266

 

Parametry układu imponują (jak za tę cenę i na tę wielkość). Co więc przydatnego dostajemy? Na początek - całkiem szybki procesor (RISC, 80MHz) i wcale niemało pamięci. Przede wszystkim jednak wsparcie dla WiFi, a konkretnie dla protokołów 802.11 b/g/n, w tym zarówno dla łączenia się do sieci, jak i tworzenia Access Pointa, przy czy obługiwany jest zarówno WEP, jak i WPA, WPA2 i WPS. Do tego mamy port szeregowy, przez który będziemy się komunikować z Arduino i zestaw prostych komend AT, które pozwolą nam zrobić co chcemy nie obciążając za bardzo układu nadrzędnego. I to wszystko co do szczęścia trzeba, żeby wykorzystać ESP8266 do komunikacji Arduino ze światem przez Wifi. Nie wszystko jednak, co dostajemy od tegoż układu.

ESP8266 to jednak także samodzielny układ. Występuje w kilku wersjach. Prezentowana jest najprostszą możliwą z wyprowadzonym portem szeregowym i dwoma wejściami/wyjściami GPIO. Są też dostępne wersje z większą liczbą wyprowadzeń GPIO.

ESP8266 i FTDI232

 

Jak więc jeszcze można użyć ESP8266? Można przygotować dla niego dedykowany program w C lub nawet rozszerzyć firmware, którego źródła są ogólnodostępne. Natomiast można też zrobić coś, co sprawi, że programowanie układu stanie się szybkie i bezbolesne. Szczególnie ucieszyć powinny się osoby, którym nie są obce dwie technologie - programowanie Arduino i Node.js . Dlaczego akurat takie osoby? Za sprawą projektu NodeMcu , który zbliża układy oparte na ESP8266 do Arduino, oferując podobną prostotę programownia i obsługi wejść/wyjść oraz do Node.js przejmując od niego filozofię programowania sterowanego zdarzeniami (event-driven) i interaktywny interpreter. Gdzieś w tle mamy projekt eLua , z którego pełnymi garściami czerpią twórcy NodeMcu. Co za tym idzie skryptów nie będziemy pisać w Javascripcie, jak można się było spodziewać po takim wstępie, tylko w języku Lua. To jednak nic strasznego, naprawdę.

Co można z tym zrobić? Bezprzewodowy czujnik temperatury, wysyłający raporty bezpośrednio do serwera www lub prezentujący wyniki jako serwer www, w oparciu o termometry Dallas DS18B20. Miniaturowy sterownik światła odbierający polecenia z tradycyjne przycisku ściennego, ale też przez sieć WiFi. Sterownik ogrzewania do pieca na ekogroszek, monitorujący jednocześnie temperatury poszczególnych rur. Prosty alarm wysyłający mailem informację o wykryciu ruchu przez czujkę podczerwieni. Zastosowań są niezliczone ilości.

Zacznijmy więc zabawę. Dzisiaj programować jeszcze nie będziemy, ale podłączymy układ do komputera, wgramy firmware i połączymy się z siecią wifi. Całkiem dużo jak na pierwszy dzień.

Wersja układu, którą posiadam ma wyprowadzone 8 pinów. Dwa od zasilania (3,3V i GND), dwa od komunikacji szerwegowej (RX, TX), dwa wejścia wyjścia (GPIO0 i GPIO2), reset oraz złącze CH_PD, które podłączamy do zasilania gdy układ ma działać.

Z drugiej strony mam układ FTDI232 z możliwością wyboru napięcia 5V i 3,3V. Pozwala on na komunikację z układem ESP8266 przez port USB i dowolny terminal na komputerze. Ja do komunikacji użyłem IDE Arduino, który posiad wbudowany monitor portu szeregowego (serial monitor) - czyli umożliwia wysyłanie komend i odczytywanie zwrotnej transmisji.

Najpierw jednak należy ze sobą połączyć oba układy RX łączymy z TX, TX z RX. VCC łączymy z VCC. Tutaj należy się upewnić, że zworka wyboru napięcia ustawiona jest na 3,3V, bo tylko z takim napięciem działa ESP8266. Co więcej port szeregowy także nie toleruje sygnałów o innym napięciu - to bardzo istotnie przy łączeni z Arduino. Potem masę (GND) łączymy z masą. Pozostało jeszcze do CH_PD (Chip Enable Pin) podłączyć napięcie, bo to jest warunkiem działania. W przypadku gdy chcemy wprowadzić układ w tryb programowania (flashowania, wgrywania firmware), GPIO0 łączymy z masą. Na razie jednak tego nie robimy, bo wydamy dla testu kilka komend.

Pierwsza komenda, która warto wydać to AT. W odpowiedzi powinniśmy otrzymać, jak za starych, dobrych, modemowych czasów, OK. W dalszej kolejności możemy sprawdzić wersję aktualnie wgranego oprogramowania (firmware) przez AT+GMR, przestawić wifi w tryb kliencki - AT+CWMODE=1 oraz sprawdzić listę dostępnych sieci w okolicy wraz z mocą sygnału AT+CWLAP. Po każdej komendzie oczywiście konieczny jest “enter” (CR+LF). I właśnie tego typu komendami będziemy się komunikować z Arduino i w podobny sposób zlecać transmisję IP.

Zostawmy to jednak, by wgrać oprogramowanie NodeMcu. Z githuba ściągamy nodemcu_latest.bin (lub inny według preferencji). Instalujemy narzędzie esptool (w pythonie). Alternatywą są inne programy Windowsowe nie wymagające pythona, jednak skoro jest wieloplatformowy esptool, to nie ma sensu o nich pisać.

Gdy już mamy wszystko przygotowane, łączymy GPIO0 z GND, podłączmy i uruchamiamy flashowanie:

# sudo ./esptool.py --port /dev/ttyUSB0 write_flash 0x000000 nodemcu_512k_latest.bin
Connecting...
Erasing flash...
Writing at 0x0007ec00... (100 %)
Leaving...

Powyższy przykład pochodzi z systemu Ubuntu, w Windows inaczej nazywają się porty, natomiast idea pozostaje ta sama.

Po poprawnym zakończeniu procesu układ można odłączyć od zasilania, a pin GPIO0 od masy. Po restarcie i połączeniu można wydawać polecenia w języku Lua:

> wifi.setmode(wifi.STATION)
> print(wifi.sta.getip())
nil
> wifi.sta.config("mojasiec","tajnehaslo")
> print(wifi.sta.getip())
192.168.7.164

Co sie konkretnie stało? Układ został przełączony w tryb klienta. Po sprawdzeniu IP okazało się, że nie ma przydzielonego (co logiczne). Następnie skonfigurowana została sieć WiFi, w najprostszy możliwy sposób z podaniem SSID i hasła sieci. Następnie układ połączył się z siecią, pobrał adres IP przez DHCP i zapytany o adres IP podał go. Po odłączeniu restarcie układ automatycznie (i błyskawicznie) łączy się z siecią. Proste? Genialne?

Na koniec małe porównie wielkości ESP8266 z popularnym układem do komunikacji w tym samym paśmie częstotliwości - NRF24L01.

ESP8266 & NRF24L01

 

Miłej rewolucji Internetu rzeczy. Do następnego razu.