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”.
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.
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.
Miłej rewolucji Internetu rzeczy. Do następnego razu.
Istnieje jeszcze wsparcie tego modułu w Espruino (JavaScript) http://www.espruino.com/ESP8266 oraz w MicroPython https://github.com/micropython/micropython/pull/990
Z pewnymi ograniczeniami ze względu ma małą ilość pamięci operacyjnej ale zawsze to dodatkowe opcje do wyboru.
Witam,
Chciałbym się zwrócić do Ciebie o pomoc, ponieważ nie znam nikogo innego kto by mógł mi pomóc w temacie modułów ESP8266.
Mam taki moduł podłączony bezpośrednio do przejściówki opartej o FTDI232 i jak podłączam go, to diody RX i TX na przejściówce zaczynają migać.
Podłączyłem Vcc do napięcia zasilania 3,3V z przejściówki, pin GND do masy z przejściówki, CH_PD do 3,3V z przejściówki, no i oczywiście RX do TX, a TX do RX.
Diody na przejściówce cały czas migają a komunikacji nie mam.
Z góry dziękuję za jakąkolwiek pomoc.
Układ ESP8266 nalezy ponownie przeflashowac. Miganie diod jest jednym z efektów
Witam. Jak używa się w tych modułach połączenia do serwera WPS? Konkretnie mam moduł ESP-07
Czy dzisiaj wiedziałbyś jak ściągnąć najnowszą wersję firmware z NodeMcu. Na dodatek z jakimi modułami???
Tak, ściągałem, zmieniło się jedno – można zamówić przygotowanie firmware skompilowanego według potrzeb – z wybranymi modułami. Podaje się e-mail, na których przychodzi powiadomienie gdy plik jest gotowy do pobrania.
Rozumiem że taki moduł można podłączyć do przekaźnika pinami GPIO, będzie się to potem komunikowało po Wi Fi z Maliną? Jak wygląda sprawa z zasilaniem moduł pracuje 3,3V przekaźnik na 5V, jak to pogodzić? No i ostatnie pytanie czy w Domoticzu będzie to wykrywane?
W skrócie można, ale trzeba zasilić moduł na 5V i przekonwertować napięcia do 3,3V. Być może da się to zrobić prościej, ale musiałbym przetestować. Tak czy inaczej potrzeba 5V i 3,3V do zasilania. Postaram się zrobić wpis o tym.
Dzięki za szybką odpowiedź ;] czekam zatem na wpis 🙂