Uoo-light cz. 1½: Trochę o ESP8266 i NodeMCU

Uoo-light cz. 1½: Trochę o ESP8266 i NodeMCU

Obiecałem, że w drugiej części naszej przygody z projektowaniem włącznika przedstawię moje pajączki. Trudno jednak opowiadać o prototypach bez słowa wyjaśnienia z czego są zbudowane. Opowieść o „sercu” naszego projektu to na pewno materiał na cały wpis. Następny już na pewno będzie o urządzeniu prototypowym – obiecuję.

Skąd to się wzięło?

Moduły ESP-01 (po lewej) i NRF24L01
Źródło: homecircuits

Jak doskonale pamiętasz, drogi Czytelniku, na początku miało być trochę inaczej. W pierwszym podejściu planowane było użycie NRF24L01. Zanim jednak udało mi się ruszyć ten projekt z miejsca, na horyzoncie pojawił się tani moduł WiFi – ESP-01, który w środowisku Arduino zaczął być bardzo popularny. Kusząca byłą zwłaszcza cena. Moduł wyglądał bardzo podobnie do NRF. Identyczna ilość pinów, podobne rozmiary, taka sama antena PCB. Udostępniał on zbiór komend AT, które pozwalały na zalogowanie się do sieci WiFi czy stworzenie prostego Access Pointa. Komendy również umożliwiały proste operacje – np. pobranie danych z adresu http. Tyle w zupełności wystarczy na proste projekty na Arduino. Moduł wydawano w wielu wersjach (ESP-01, ESP-02, ESP-03…) różniących się rozmiarami, ilością GPIO, rodzajem anteny (PCB, ceramiczne i gniazda na antenę zewnętrzną). Do wyboru do koloru. Sam kupiłem moduł ESP-07 (tak jak wspominałem lubiłem rzeczy uniwersalne, a w tym modelu była zarówno wewnętrzna antena ceramiczna jak i gniazdo do podłączenia zewnętrznej). Niestety moduł ten ma raster pinów 2.0mm – więc nie da się go prosto wpiąć w płytkę prototypową, co utrudniało trochę uruchomienie. Próby podłączenia go do modułu FTDI nie powiodły się (teraz wiem, że moduły FTDI co prawda mogą być źródłem napięcia 3.3V, ale nie są zbyt wydajne prądowo. brakowało też paru rezystorów pull-up).

Niemniej innym użytkownikom w internecie udawało się uruchomienie i zaczęli się zastanawiać: skoro na pokładzie znajduje się wydajny procesor do obsługi WiFi – to po co jeszcze podpinać do tego urządzenia lichy 8-bitowy mikrokontroler (jakim jest Arduino, a w zasadzie mikroprocesor Atmela będący głównym elementem Arduino).  Zaczęły się próby tworzenia środowiska, dzięki któremu możliwe byłoby wgrywanie programów bezpośrednio na nasz moduł. Równolegle nowsze wersje modułów zaczęły być wyposażane w coraz większe pamięci flash, co również zwiększało możliwości wprowadzenia własnego oprogramowania.

Prosto, prościej, NodeMCU

IMG_2663Jak rozmawia się z takim ESP-01? W najprostszy możliwy sposób – wydaje się komendy AT poprzez interfejs UART (Universal Asynchronous Receiver and Transmitter) – poziomy logiczne 3.3V. Wystarczy podpiąć konwerter USB <-> TTL (ja mam na układzie FTDI) ustawić zworkę na 3.3V, podłączyć zasilanie do modułu, podpiąć 4 rezystory (3 pul-up i jeden pull-down) i można programować układ. Proste? Okazało się, że niektórzy stwierdzili, że niewystarczająco :). I tak oto powstał NodeMCU. Jak to się programuje? NodeMCU ma gniazdo micro USB. Podpinamy do komputera – pojawia się nowy port COM (przynajmniej na Windowsie i Linuksie nie było potrzeby doinstalowywania czegokolwiek). Można programować. Koniec zabawy. Elektronika tylko dla wybranych odeszła do lamusa (hehe – żartuję – elektronika dla wybranych odeszła już dawno wraz z nadejściem Arduino).

Wiemy jak to programować – teraz jeszcze pytanie czym – jakie narzędzia i jakie języki. Otóż NodeMCU zostało wyposażone w firmware, który jest interpreterem języka LUA (Tak jak w dawnych czasach Commodore C64 był automatycznie wyposażony w interpreter BASIC). Wystarczy podpiąć, otworzyć połączenie na COM-ie (prędkość 9600) za pomocą Hyperterminala czy Putty (Windows) albo Minicoma (Linux) i można wydawać komendy. Nie zgłębiłem tej metody uruchamiania softu, bo dużo bardziej zaciekawiła mnie możliwość wgrywania kody skompilowanego w C++. Jest to możliwe na kilka sposobów. Można stworzyć własny toolchain lub posłużyć się instrukcjami tych, którzy już przygotowali sobie środowisko. Jest to opcja szczególnie przydatna do zaawansowanych projektów jak odtwarzacz radia internetowego (swoją drogą taki był właśnie temat mojej pracy magisterskiej – tyle, że w 2006 roku nie dało się tego zrobić na jednym module za 2$ – tylko za pomocą elektroniki o wartości około 150$). We wspomnianym projekcie wgrano zmodyfikowany FreeRTOS, zapewniając sobie wielowątkowe środowisko.  Jako, że nie do końca rozumiem zawiłości licencyjne tego klona i jako, że jestem z natury leniwy – nie wybrałem tego rozwiązania – tylko trzecie – najprostsze w obsłudze i implementacji oraz najwygodniejsze w obsłudze: IDE Arduino dla ESP8266.

Jak to się (programu)je?

Najpierw należy zainstalować środowisko Arduino. Niby prościzna – ale jest mały myk. Jeśli zainstalujesz najnowszą wersję Arduino IDE (obecnie to 1.6.7 do pobranie tutaj) To nie będzie można w prosty sposób zainstalować platformy ESP8266. No ale my nie idziemy na łatwiznę (z wyjątkiem tych przypadków, gdy idziemy) i chcemy mieć wszystko najnowsze. Pobieramy i instalujemy więc najnowszą wersję nie bacząc na to, że później będzie trudniej. Następnie chcielibyśmy zainstalować narzędzia i platformę ESP8266 (nie będziemy przecież głupiego Arduino programować – mamy wyższe ambicje – a przynajmniej wydajniejszy sprzęt). Na stronie IDE ESP8266, w instrukcji instalowania za pomocą Board Managera, jest napisane, że należy zainstalować Arduino 1.6.5 – a my już mamy nowszą. „Może jednak zadziała” – pomyśli pewnie niejeden czytelnik tego bloga. Nie – nie zadziała. Sprawdzałem. Nie jest to jednak na szczęście jedyny sposób instalacji. W dalszym punkcie instrukcji jest bowiem opcja „Using git version”. Tu już jawnie instrukcja nas zachęca do użycia Arduino w wersji 1.6.7 (akurat takie mamy – hurra). Należy się jeszcze doposażyć w Pythona – koniecznie w wersji 2.7. Nie martw się jednak, drogi czytelniku, jeśli masz nowszą wersję. Mogą sobie one spokojnie koegzystować równolegle  na komputerze. Teraz należy według instrukcji sklonować projekt w najnowszej wersji do katalogu „hardware” (na Windows 7 64-bit jest to C:\Program Files (x86)\Arduino\hardware). Niestety uprawnienia do tego katalogu powodują pewne problemy z klientem Gita, którego być może nawet nie masz. Prościej więc chyba będzie ściągnąć pliki bezpośrednio ze strony gita projektu i wrzucić je do katalogu hardware (do podkatalogu „esp8266com”). Następnie pozostaje odpalić skrypt pythona (w konsoli z uprawnieniami administratora):

cd esp8266/tools
c:\Python27python get.py

Uruchamiamy Arduiono i pojawiły nam się nowe platformy. Spójrz w Narzędzia -> Płytka:

screen1

Świetnie – jak widać można wybrać NodeMCU jak i różne moduły ESP, o których pisałem wcześniej. To nie koniec dobrych wiadomości. Oprócz pojawienia się nowych płytek pojawiły się również nowe przykłady. Wybierz NodeMCU z listy i zerknij co słychać w Plik -> Przykłady.

screen2

Mnóstwo pyszności – gotowych do wgrywania na nasz moduł (wystarczy w kodzie zmienić SSID i hasło na takie, jakie mamy w naszej sieci WiFi). Ale o tym będzie w następnym wpisie (tak tym z pajęczymi prototypami).

Under da hood

W następnym wpisie będzie o programowaniu (i prototypach – obiecałem) – a teraz troszkę ponudzę o tym co taki NodeMCU ma pod maską. Udajmy się zatem do dokumentu na GitHubie zawierającego schemat modułu. Przeanalizujmy sobie tego PDF-a. Pierwsza strona nie nastręcza nam wątpliwości. Nic na niej nie ma – ta strona schematu ma prawdopodobnie spełniać rolę strony tytułowej – okładki. Świetnie nam idzie – przejdźmy do strony drugiej. Tu również nie mamy wątpliwości – Moduł ESP-12 jest elementem oczywistym :).

sch02
ESP-12 MODULE

Obok modułu są 4 rezystory pełniące funkcję Pull-up i jeden rezystor Pull-down. Przy każdym uruchomieniu/resecie modułu ESP-12E, GPIO2 musi się znajdować w stanie WYSOKIM (3.3V) a GPIO15 w stanie NISKIM (0V – stąd jeden Pull-down). GPIO0 również powinien się znajdować w stanie WYSOKIM podczas uruchomienia (podczas programowania będziemy zmieniać jego stan na NISKI). nRST również musi być w stanie WYSOKIM (nRST – not RESET). Tak samo pin EN (Module enabled). Pozostają dwa kondensatory, z których C1 stabilizuje układ resetu (głupio by było, żeby chwilowe zakłócenia resetowały nam żarówkę) a C2 jest kondensatorem tantalowym – i stabilizuje nam zasilanie 3.3V.

sch01
ESP-12 CORE

 

Na trzeciej stronie jest konwerter USB na UART z odpowiednimi elementami (głównie kondensatory na liniach zasilania).

sch03
USB TO UART

Obok konwertera tabela stanów, którą realizuje układ na dwóch tranzystorach:

sch04

No i oczywiście przyda nam się gniazdko micro USB – również na trzeciej stronie:

sch05
Micro USB

Na stronie czwartej elementy zasilania. Linie zasilające USB mają napięcie 5V. ESP potrzebuje napięcie zasilania z zakresu 3.0 – 3.6V. Rozwiązaniem jest prosty stabilizator napięcia.

sch06
POWER

Jest to typowy schemat stabilizatora z kondensatorami niwelującymi zakłócenia. Zwróć uwagę na to, że linia 5V nazywa się VDD5V, a na poprzedniej stronie 5V z wtyczki micro USB trafiało do linii VDD USB. Gdzie one się łączą? A tutaj:

sch07

Dlaczego przez diodę? Żeby zapobiec wstecznemu zasileniu naszego źródła zasilania (komputer z gniazdem USB, ładowarka) w przypadku, gdy cały moduł jest zasilany przez nóżkę VDD5v. Drugim powodem jest fakt, że jeśli układ jest zasilany z nóżki, a nie z USB – to znaczy, że po stronie gniazdka USB nic nie ma – i nie jest potrzebne zasilanie konwertera UART – dzięki temu oszczędzamy trochę miliamperów (przydatne zwłaszcza przy zasilaniu bateryjnym). A dlaczego dioda Schottky’ego? Pewnie dlatego, że ma niski spadek napięcia w kierunku przewodzenia i przy zasilaniu 5V z USB uzyskujemy na linii VDD5V napięcie 4,7V – w zupełności wystarczające dla naszego stabilizatora.

Kolejna strona – dwa rzędy nóżek NodeMCU – bardzo przydatna ściąga – opisy na module bywają miejscami nieczytelne lub niezrozumiałe – na tym obrazku widzimy wszystko doskonale :).

sch08
NodeMCU pinout

Strona szósta – dwa przyciski: RESET i FLASH. Oba przyciski nie przydają się za bardzo podczas programowania, bo środowisko Arduino samo je aktywuje (za pomocą sygnałów DTR i RTS w porcie COM) .RESET przydaje się jednak do ponownego uruchomienia programu, natomiast FLASH jest podpięty do GPIO0 i może nam służyć w trakcie działania programu jako zwykły guzik. Na schemacie jest również dioda świecąca podłączona do GPIO16 (to również jak w przypadku guzika FLASH może być nasz kontakt ze światem). Rezystor R10 nie jest fabrycznie montowany – jeśli się pojawi (a tak naprawdę nie musi być to rezystor – można zewrzeć te pola kroplą cyny)) – GPIO16 będzie spięte z resetem i będzie wykorzystane z Sleep Mode (tryb uśpienia pozwalający oszczędzać energię). Nas jednak interesuje praca ciągła – chcielibyśmy mieć stały dostęp do naszej żarówki.

sch09

I tak oto dotarliśmy do ostatniej strony schematu. Co na niej? ESP-12 ma jeden pin wyposażony w konwerter analogowo-cyfrowy pozwalający na odczyt napięcia. Niestety zakres napięciowy tego wejścia to 0.0V – 1.0V. Zazwyczaj moduły Arduino mają zakres od 0V do VCC (czyli 3.3V dla ESP8266). Projektant NodeMCU też tak chciał. Zastosował proste rozwiązanie – dzielnik napięciowy na dwóch rezystorach. Przyłożenie napięcia 3.3V do ADC_EXT spowoduje przepływ przez oba rezystory prądu 10,3125 μA (ze wzoru I=U/R) Napięcie na R14 będzie więc równe (ze wzoru U=RI) 1.03125V – wystarczająco blisko tego co chcieliśmy uzyskać :). Zwróćmy uwagę, że wbrew temu co sugerują opisy nóżek na płytce NodeMCU, Zarówno ADC jak i ACD_EX są wyprowadzone – możemy skorzystać z bezpośredniego dostępu do pinu.

sch10

I już znamy każdy element naszego modułu NodeMCU. Czas zejść piętro niżej

Co siedzi w samym module ESP-15E?

esp-07 inside
ESP-07 – wnętrze

Nie miałem chwilowo pod ręką ESP-12E (z wyjątkiem tych w moich NodeMCU)., więc postanowiłem specjalnie na potrzeby tego bloga odlutować „kapturek” jednemu z moich ESP-07. W środku niewiele: ESP8266 (mózg całego modułu), Pamięć flash (ten chrabąszcz z 8 nóżkami), Generator kwarcowy (srebrny prostokąt – taktuje układ odpowiednią częstotliwością), kilka kondensatorów (w tym dwa do kwarcu), kilka rezystorów, jedna LED-a. Mniej więcej to samo siedzi w naszym ESP-12 – tylko, że antena jest na PCB, pamięć flash ma większą pojemność a dodatkowe GPIO są wyprowadzone na pinach na dolnej, trzeciej krawędzi (dzięki takiemu rozwiązaniu ESP-12E pozostaje kompatybilne pinowo z ESP-07).

Podsumujmy

Wiemy już jaki sprzęt będziemy programować, z czego się składa i jak działa. Mam nadzieje, że ten wpis będzie dla kogoś ściągawką (czasem warto szybko zerknąć na pin-out, czy sprawdzić jakie napięcia przyjmuje wejście analogowe). Następny krok to elektroniczne „Hello world” i zbudowanie pierwszego urządzenia prototypowego. Wszystko to już niedługo (oby) – w następnym wpisie. Zapraszam.

One thought on “Uoo-light cz. 1½: Trochę o ESP8266 i NodeMCU

Dodaj komentarz