Niewielki pobór mocy oraz moduły komunikacyjne opracowane z użyciem wspomnianego we wstępie mikrokontrolera idealnie nadają się do zastosowania we własnych projektach z dziedziny IoT. Kurs będzie obejmował użycie modułów ESP przy tworzeniu własnych elementów IoT, takich jak: bezprzewodowa stacja pogodowa, bezprzewodowe moduły wykonawcze oraz czujniki.
Na początek
W kursie zostanie użyty moduł ESP-12-Q. Jest on zgodny z wersją ESP-12, różni się jedynie dodatkowymi pinami na spodzie PCB. Moduł wymaga zasilania napięciem 3,3 V. Przy współpracy z systemem nadrzędnym zasilanym napięciem innym niż 3,3 V, należy zastosowań konwerter poziomu napięcia.
Fabrycznie nowy moduł pracuje pod kontrolą oprogramowania wykonanego przez producenta. Komunikacja odbywa się w oparciu o transmisję UART, parametry połączenia są następujące:
1. Prędkość transmisji: 115200 b/s (w starszych wersjach jest to 9600 b/s).
2. 8 bitów danych.
3. Bez bitu parzystości.
4. 1 bit stopu.
Sposób sterowania wykorzystuje zasadę request/response i opiera się o komendy AT. Do pierwszych testów wystarczy zwykły konwerter USB/UART. Należy zwrócić uwagę na napięcie na liniach Rx i Tx, aby nie przekraczały poziomu 3,6 V, czyli maksymalnego napięcia dla mikrokontrolera ESP8266.
Z racji tego, że układ mikrokontrolera ESP8266 można programować własnym kodem z wykorzystaniem komunikacji UART, pinu GPIO0 użyto do sterowania bootloaderem. Po ustawieniu GPIO0 bootloader ładuje kod programu z pamięci Flash, natomiast po wyzerowaniu oczekuje na nowy kod i zadpisuje go w pamięci Flash. Podstawową aplikację modułu pokazano na rysunku 1. Rezystory R1…R3 dodano, aby w momencie pisania własnego oprogramowania nie stworzyć zwarcia poprzez zmianę poziomu pinu podłączonego na stałe do któregoś z biegunów zasilania.
Pierwsze uruchomienie
Moduł należy podłączyć do przejściówki USB/UART krzyżując linie Rx i Tx. Do komunikacji można zastosować dowolny terminal – tutaj zostanie użyty darmowy program Putty. Po włączeniu zasilania w konsoli powinny pojawić się wiadomości takie, jak na rysunku 2 lub bardzo podobne (zależnie od wersji oprogramowania). Wiadomość „ready” oznacza poprawny start oprogramowania i gotowość do pracy.
Aby przetestować poprawną pracę modułu, można sprawdzić wersję oprogramowania za pomocą polecenia AT+GMR. Odpowiedź modułu, jak na rysunku 3, informuje nas nie tylko w wersji programu, ale też o tym, że wszystko zostało poprawnie połączone i że ustawiliśmy poprawne parametry transmisji.
Kilka słów wyjaśnienia odnośnie do samych komend. Wszystkie zaczynają się od przedrostka „AT”, za którym – najczęściej po znaku „+” – jest umieszczana komenda i jej argumenty. Polecenie jest interpretowane w chwili, gdy moduł odbierze znaki powrotu karetki i nowej linii. Należy zwracać szczególną uwagę na kolejność tych znaków, ponieważ przeciwnym razie komenda zostanie zignorowana. W przypadku korzystania z Putty kombinacje klawiszy generujące niezbędne kody to:
− Powrót karetki: CTRL+M.
− Znak nowej linii: CTRL+J.
Każde polecenie, oprócz wyniku zawsze zwraca status „OK” lub „ERROR” zależnie od rezultatu jego wykonania. Zależnie od oprogramowania, może też pojawić się komunikat „Busy p….”, który informuje o tym, że moduł jest zajęty i nie przyjmie komendy. Listę dostępnych komend znajdziemy na stronie producenta.
Aktualizacja firmware
Do aktualizacji zostanie wykorzystany program Flash_Download_Tools następnie należy pobrać oprogramowanie ze strony producenta bbs.espressif.com kategoria SDKs. W chwili pisania artykułu najnowszą wersją jest 1.5.3 – opcja Non-OS SDK. Do wgrania oprogramowania na ESP wymagane są 4 pliki:
− esp_init_data_default – adres 0xFC000.
− blank.bin – adres 0xFE000.
− boot_v1.5.bin – adres 0x00000.
− user1.2048.new.5.bin – adres 0x01000.
Należy zauważyć, że nazwy mogą się nieznacznie różnić w zależności od wersji oprogramowania. Przed aktualizacją trzeba przełączyć ESP-12 w stan aktualizacji oprogramowania, wymuszając poziom niski na GPIO0 i restartując moduł. Okno oprogramowania służącego do zapisu pamięci Flash modułu pokazano na rysunku 4. Prędkość transmisji pokazana na rysunku może różnić się, zależnie od ustawień oprogramowania. Po aktualizacji i przełączeniu modułu w tryb normalnej pracy (ustawienie GPIO0) i wydaniu komendy AT+GMR moduł powinien odpowiedzieć podając numer nowej wersji oprogramowania. Po aktualizacji oprogramowania warto przywrócić nastawy fabryczne, co uchroni nas od potencjalnych problemów. Można to zrobić za pomocą komendy AT+RESTORE.
„Hello World”
Czas na najciekawsze – pokazanie możliwości modułu ESP-12 w wersji sterowanej komendami AT. Pierwszym programem będzie klasyczne „Hello World” dla mikrokontrolerów, czyli miganie diodą LED. Do tego celu oprócz modułu ESP-12 wykorzystano również płytkę Arduino UNO R3, ale można zastosować dowolny mikrokontroler wyposażony w interfejs UART lub USART. Środowisko wykorzystane do napisania kodu to Arduino IDE z powodu integracji z modułem ESP-12 i możliwości tworzenia kodu na ten moduł, co przyda się w następnych częściach. Uproszczony schemat ideowy połączeń pokazano na rysunku 5.
Oprogramowanie testowe jest nieskomplikowane. Moduł ESP nasłuchuje na porcie 80, kiedy przyjdzie nowy pakiet zasygnalizuje to wysyłając przez UART +IPD,<ID>,<len>:<data>, gdzie:
− ID pojawia się, gdy ESP jest ustawione na opcję pozwalającą zawierać więcej niż jedno połączenie (maksymalnie 5) i zawiera ID połączenia.
− Len długość pakietu danych.
− Data dane pakietu.
Teraz trzeba przygotować ESP do współpracy z Arduino, w tym celu wysłana zostanie komenda zmieniająca prędkość transmisji UART. Z racji tego, że Arduino ma tylko jeden sprzętowy interfejs UART, który będzie wykorzystany do komunikacji z komputerem, ESP będzie korzystał z programowej transmisji UART.
Zmiana ustawień transmisji polega na wydaniu polecenia AT+UART_DEF=9600,8,1,0,0rn, gdzie:
− 9600 jest prędkością transmisji.
− 8 jest liczbą bitów przypadających na jedną paczkę danych.
− 1 bit stopu.
− 0 – bez bitu parzystości.
− 0 – wyłączona kontrola przepływu.
Dopisek _DEF oznacza, że ta konfiguracja zostanie zapisana w pamięci nieulotnej Flash w sekcji user parametr. Po tym, należy przyłączyć ESP do Arduino – uproszczony schemat ideowy połączeń pokazano na rysunku 5. Zamiast pinów 2 i 3 na płycie Arduino można wykorzystać dowolne inne, ale wtedy należy zmodyfikować oprogramowanie. Z racji tego, że Arduino UNO R3 ma tylko jedno wyprowadzenie 3,3 V, zostawimy pin GPIO0 niepodłączony. Dokumentacja mówi, że ten pin przy normalnej pracy może być albo ustawiony, albo w stanie nieustalonym.
Odpowiednie oprogramowanie sterujące pokazano na listingu 1. Po zaprogramowaniu mikrokontrolera, na monitorze szeregowym (ważne: należy wybrać monitor szeregowy, a nie monitor portu szeregowego), znajdującym się w IDE zostaną wyświetlone się informacje o tym, co obecnie wykonuje ESP. Zostanie tam też pokazany adres IP, który należy wpisać w oknie przeglądarki. Po jego wpisaniu, zostanie pokazana tabela z 2 możliwościami ON – OFF, którymi steruje się diodą LED.
Programowanie modułu ESP-12
Do programowania modułu ESP-12 wykorzystane zostanie, jak było wspomniane wcześniej, środowisko Arduino IDE z powodu gotowych bibliotek wspomagających pisanie oraz możliwości programowania modułu bezpośrednio z tego środowiska omijając dodatkowe programy. Wszystko, czego obecnie potrzebujemy, to przejściówka USB ¨ UART oraz zasilanie 3,3 V. Kolejnym krokiem jest dodanie tzw. „płytek” do Menedżera Płytek w Arduino IDE. Dokładną instrukcję można znaleźć pod adresem www.github.com/esp8266/Arduino. Teraz można wybrać już opcję Generic ESP8266 Module z menu Narzędzia ¨ Płytka. Konfiguracja powinna wyglądać następująco:
− Flash Mode: „DIO”.
− Flash Frequency: „40MHz”.
− Upload Using: „Serial”.
− CPU Frequency: „80 MHz”.
− Flash Size: „2M (1M SPIFFS)”.
− Debug port: „Disabled”.
− Debug Level: „Brak”.
− Reset Method: „ck”.
− Upload Speed: „256000”.
− Port: (tutaj należy wybrać port, na którym jest przyłączony moduł).
Upload Speed może się różnić w zależności od wersji IDE i/lub płytki, w przypadku opisywanym w artykule jest to 256000, trzeba doświadczalnie dobrać prędkość by wgrywanie skończyło się sukcesem.
Kod „Hello World” na ESP-12 działa tak samo jak w wersji na Arduino. Dzięki społeczności Arduino, można użyć wielu gotowych już bibliotek przy rozwijaniu oprogramowania dla ESP-12. W tym wypadku zostały użyte biblioteki do połączenia z siecią Wi-Fi oraz realizujące komunikację TCP.
Po wgraniu kodu, wyprowadzenie GPIO0 nie może już być wyzerowane. Po jego ustawieniu lub pozostawieniu go niepodłączonym, moduł wymaga restartu. W konsoli pojawią się informacje o starcie modułu, potem o sukcesie lub niepowodzeniu połączenia do sieci i adres IP. Wpisanie adresu IP, który zostanie wyświetlony przez konsolę na pasku adresowym w oknie przeglądarki WWW, pokaże nam znów taką stronę, jak we wcześniejszym przykładzie. Zauważalną zmianą w tych dwóch przykładach jest szybkość ładowania się stron oraz wykonywania poleceń, na korzyść ESP, co pokazuje dosadnie, jakie możliwości ma ten mały moduł. Mając do wykorzystania w przypadku ESP-12-Q 16 pinów (trzeba zwrócić szczególną uwagę na piny wymagające podłączenia przez rezystory do któregoś z biegunów zasilania) oraz interfejsy komunikacyjne, takie jak I2C, SPI czy UART, przetwornik A/C, można zrealizować sterowanie wieloma urządzeniami z interfejsem w postaci WWW. Interfejsy I2C lub SPI będą świetnie się sprawdzały w przypadku wykorzystania modułu jako czujnika bezprzewodowego. Zwykłe piny GPIO mogą być wykorzystane do sterowania przekaźnikami, co daje możliwość zdalnego sterowania urządzeniami.
Następnymi rzeczami omówionymi w tym cyklu będzie sterowanie bezprzewodowe pinami, z wykorzystaniem modułów przekaźnikowych, odczyt danych z czujników i gromadzenie ich na stronie WWW, a także sterowanie bardziej skomplikowanymi rzeczami jak radio FM.
Moduł może być programowany w języku „C” „C++ (Arduino)” oraz „LUA”. W cyklu przeważać będzie język „C++ (Arduino)” z powodu ilości bibliotek dostępnych dla użytkownika, co znacznie usprawnia pisanie softu.
Jakub Kisiel
ww.microgeek.eu