Start z NodeMCU (ESP8266) na Linuxie

Pewnie wielu z Was jeszcze nie wie co to jest. NodeMCU to płytka oparta na układzie ESP8266. Płytka została wyposażona w konwerter USB-UART (CH340), który pozwala na programowanie bezpośrednio za pomocą portu USB. Posiada moduł WiFi oraz szereg pinów dających możliwość rozbudowy o dodatkowe elementy.

Specyfikacja:

  • -Moduł zbudowany w oparciu o układ ESP8266 z anteną PCB

  • -Łączność WiFi w standardzie 802.11 b/g/n

  • -Możliwość programowania w LUA lub ARDUINO

  • -Zasilanie: 3.3V (lub 5V przez port USB)

  • -10 portów GPIO – PWM / I2C / SPI / 1-Wire

  • -Konwerter USB-UART – CH340

  • -Konwerter ADC – 10-bitowy

  • -30 pinów w rastrze 2,54mm ( Pasuje do płytek stykowych )

  • -Złącze micro USB

  • -Wymiary: 58 x 30mm

  • -Dwa przyciski: FLASH, służący do programowania, oraz RST (RESET)

  • -Cena: 15 – 25zł

Strona domowa NodeMCU – https://www.nodemcu.com/

A więc zaczynamy. Zakładam, że jesteś już w posiadaniu danej płytki. Pierwsze co zrobimy to sprawimy, żeby nastąpiła komunikacja między komputerem a płytką. W pierwszej kolejności musimy dodać naszego użytkownika do grupy uucp żeby nastąpiło połączenie serial port. Robimy to w następujący sposób: uruchamiamy konsolę i wpisujemy:

gpasswd -a username uucp

To nie wszystko. Musimy dodać naszego użytkownika do grupy dialout. Możesz to zrobić poleceniem:

sudo usermod -a -G dialout username

Kiedy już dodamy naszego użytkownika do tych grup będziemy potrzebowali programu do komunikacji. W tym momencie można wyróżnić takie programy jak: Dterm, Minicom, Picocom, Serialclient, Screen lub prawie wszystkim znane PuTTY. Ja korzystam ze Screen’a, mogę go polecić i na jego działania podstawie Wam połączenie. Przejdźmy do instalacji:

Instalacja w Debian/Ubuntu:

sudo apt-get install screen

Instalacja w systemie Arch:

sudo pacman -S screen

Po instalacji możemy sprawdzić czy nastąpi komunikacja między komputerem a naszym NodeMCU. Wywołujemy zatem takie bardzo przydatne polecenie jak dmesg żeby zobaczyć jak jest opisany w systemie byśmy mogli się do niego połączyć:

dmesg | grep tty

Powinniśmy ujrzeć takie linijki:

[    0.292437] console [tty0] enabled
[   13.753827] cdc_acm 4-4:1.1: ttyACM0: USB ACM device
[   13.755758] cdc_acm 4-4:1.3: ttyACM1: USB ACM device
[   13.758672] cdc_acm 4-4:1.9: ttyACM2: USB ACM device
[21759.508803] usb 1-1: cp210x converter now attached to ttyUSB0
[21842.801339] cp210x ttyUSB0: cp210x converter now disconnected from ttyUSB0
[21845.282826] usb 1-1: cp210x converter now attached to ttyUSB0

W ten sposób dowiedzieliśmy się, że został nadany mu port ttyUSB0. Zatem wykorzystajmy tę informację i połączmy się z nim przez screen’a. Będziemy potrzebować jeszcze jednej informacji, a mianowicie szybkość transmisji. Tu Ci podpowiem, że w tym przypadku najlepiej działa na 9600 lub 115200. Gdy już mamy to wszystko wpisujemy:

screen /dev/ttyUSB0 9600

Powinien wyświetlić się nam czarny ekran. Jeżeli tak jest – to dobry znak. Możemy nadusić guzik na płytce tz. RESET, który znajduje się po lewej stronie od portu microUSB. Jeżeli zacznie coś się dziać na ekranie to znaczy, że NodeMCU sobie gada.

Zatem przyjmijmy, że mamy cośtam cośtam (przykłady podam później). Teraz przejdźmy do flashowania naszego NodeMCU, czyli do wgrania nowego oprogramowania. Nie jest to rzecz skomplikowana, niemniej trzeba tylko wiedzieć jak to zrobić. Będziemy potrzebować pewnego narzędzia o nazwie esptool oraz nowego oprogramowania. Najpierw przystąpimy do zbudowania nowego firmware dla naszej płytki. Zrobić to można na tej stronie.

Po pierwsze musisz podać swój adres email. Nie jest on po to by przesyłali Tobie okazje na nowe produkty, ale po to by dostarczyć Tobie link gdzie pobierzesz przygotowaną paczkę. Oczywiście możesz dołączyć do listy mailingowej, ale musisz wyrazić na to zgodę i zaznaczyć ptaszkiem pole przy Join our mailing list. Dla niektórych będzie to przydatne a dla niektórych nie. Następna pozycja to Select branch to build from. Tutaj wybieracie wersję dla naszego oprogramowania. Jeżeli nie jesteś przygotowany by zaznaczyć co innego niż release to pozostaw to zaznaczone. Później mamy sekcję Select modules to include. Tu już sami musicie zdecydować co potrzebujecie, w zależności czy macie jeszcze elementy rozbudowy do tej płytki. Podstawowe rzeczy już macie zaznaczone i śmiało już można na tym działać. Przykładowo ja sobie zaznaczę encoder, który może przyśpieszyć przetwarzanie kodu. Po prawej stronie od nazwy modułu jest ikonka po której naciśnięciu można przeczytać do czego dany moduł służy. Ostatnio dokupiłem sobie czujnik ciepła/wilgotności na allegro za 10zł, którego jeszcze nie zdążyłem przetestować, ale w każdym razie ja zaznaczam jeszcze moduł DHT. Kolejną opcjonalną pozycją jest LFS options (for release & dev branches). Lua Flash Store (LFS) umożliwia wykonywanie kodu i stałych bezpośrednio z pamięci flash. Cała pamięć RAM jest więc dostępna do odczytu i zapisu danych. Ja osobiście tego nie potrzebuję, więc tego nie zaznaczam. Kolejną rzeczą jest Miscellaneous options. Do dyspozycji mamy obsługę TLS/SSL, opcję debugowania oraz obsługę kart SD. Z tych rzeczy mnie akurat najbardziej interesuje TLS/SSL, ponieważ będę mógł w ten sposób obsłużyć pewne ciekawe funkcje z serwerem. Zmierzając do końca mamy jeszcze tylko Affiliate, gdzie wyświetla się reklama i tam można kupić dodatkowe podzespoły do naszej płytki (warto sobie przejrzeć żeby dać się ponieść fantazji ku nowym projektom). Na samym końcu mamy przycisk Start your build; gdy już mamy pozaznaczane wszystko co chcemy wciskamy go i czekamy na email z linkiem do pobrania specjalnie przygotowanego dla nas oprogramowania.

W czasie kiedy oczekujemy na link przechodzimy do kolejnego narzędzia – esptool. Jest to narzędzie napisane w Pythonie służące do wgrania oprogramowania do naszego NodeMCU. Pobrać je można na tej stronie, klikając zielony przycisk Code a następnie Download ZIP. Pobieramy. Przygotowujemy sobie folder gdzie rozpakowujemy zawartość tego archiwum. To jest pierwsza opcja.

Jest jeszcze druga opcja, którą bardziej polecam – instalację przez Python-pip. Najpierw pobieramy dodatek Python-pip:

Instalacja Debian/Ubuntu:

sudo apt-get install python-pip

Instalacja w systemie Arch:

sudo packman - S python-pip

A następnie (we wszystkich linuxach jednakowo):

pip install esptool

I nasze narzędzie do flashowania płytki powinno zostać zainstalowane.

Sprawdzamy naszego maila. Powinniśmy dostać dwa linki z dwoma wersjami – float i integer. Jeżeli naprawdę nie potrzebujesz to pobierz standardową wersję, czyli float. Pobierasz plik *.bin z podanego linka i najlepiej przenieś go od razu do folderu z esptool’em, czyli (u mnie) esptool-master lub jak pobierałeś przez pip – obojętnie gdzie, byle był pod ręką (klawiszem).

Zanim będziemy wgrywać oprogramowanie zalecane jest wpierw usunąć dotychczasowe dane. Robimy to za pomocą polecenia:

esptool.py --port <serial-port-of-ESP8266> erase_flash

Czyli w moim przypadku, uwzględniając port:

esptool.py --port /dev/ttyUSB0 erase_flash

Teraz uwaga!!!. Zakładam, że Ty tak samo jak ja masz tę najbardziej popularną płytkę, czyli NodeMCU v3 4MB. W przeciwnym razie musisz doczytać dokumentację esptool’a REAME.md lub wywołać polecenie esptool.py –help. Ja tylko delikatnie przybliżę o co chodzi. Ogólnie składnia wgrywania nowego firmware jest taka:

esptool.py --port <serial-port-of-ESP8266> write_flash -fm <flash-mode> 0x00000 <nodemcu-firmware>.bin

flash-mode jest qio dla większości ESP8266 ESP-01/07 (dla modułów 512 kBajtów) i dio dla większości ESP32 and ESP8266 ESP-12 (większych lub równych 4MB). ESP8285 wymaga parametru dout.

Z poziomu konsoli przechodzimy do katalogu gdzie jest nasz plik *.bin. Moja regułka wygląda tak:

esptool.py --port /dev/ttyUSB0 write_flash -fm dio 0x00000 nodemcu-release-10-modules-2020-12-23-08-38-32-float.bin

I gotowe! Mamy wgrane najnowsze oprogramowanie z wybranymi przez siebie modułami. Teraz możemy zajrzeć do naszego NodeMCU przez screen’a:

screen /dev/ttyUSB0 9600

Przypominam, że jeżeli mamy czarny ekran wciskamy guzik RESET, który jest po lewej od portu microUSB.

Teraz trochę o programowaniu. Standardowo płytkę tę się programuje w języku skryptowym Lua (możliwe są opcje jeszcze C/C++ i microPython, ale to trzeba sobie zainstalować i o tym kiedy indziej). Język uznaje się za stosunkowo prosty w obsłudze. Jak bardzo prosty? Sprawdźmy.

Przechodzimy do naszej uruchomionej sesji screen’a i wpisujemy linijkę:

print("Godoj mi")

Po czym powinien nam się wyświetlić oczekiwany napis. Teraz coś innego:

gpio.mode(4,gpio.OUTPUT)

Czarymary! Dioda na naszej płytce się zapaliła! Teraz ją wyłączmy, bo razi po gałach.

gpio.mode(4,gpio.LOW)

Nasza płytka ma w sobie moduł WiFi. Sprawdźmy więc jak się sprawdza w praktyce. Najpierw ustalmy czy na chwilę obecną ma jakikolwiek adres IP:

print(wifi.sta.getip())

Nil, znaczy, że nie ma. Spróbujmy połączyć go z naszą siecią WiFi:

station_cfg={}
station_cfg.ssid="NazwaSieci"
station_cfg.pwd="Hasło"
wifi.sta.config(station_cfg)
print(wifi.sta.getip())

W ten właśnie sposób połączyliśmy się z naszą siecią i uzyskaliśmy adres IP. Co teraz wyczarujemy? Spróbujmy postawić na naszym NodeMCU prostą stronę www. Nie da się? Spróbuj tego a się przekonasz!

srv=net.createServer(net.TCP) 
srv:listen(80,function(conn) 
    conn:on("receive",function(conn,payload) 
    print(payload) 
    conn:send("<h1>Portal internetowy pierwsza klasa.</h1>")
    end) 
end)

Żeby sprawdzić czy działa wpisz w przeglądarkę adres IP uzyskany przy połączeniu do sieci. I co, nie da się? Da się!

W NodeMCU istnieje pewien plik, który jest uruchamiany przy starcie. Tym plikiem jest init.lua. Spróbujmy więc coś do niego wpisać. Napiszmy kod, który nadpisze plik init.lua i który wyświetli nam przy starcie nazwę hosta po czym zrestartuje płytkę:

file.open("init.lua","w")
file.writeline([[print("Nazwa hosta to:")
print(wifi.sta.gethostname())]])
file.close()
node.restart()

Przejdźmy na wyższy poziom. Przecież musi być sposób na wygodniejsze programowanie. Powstał ku temu program o nazwie ESPlorer, ale powolutku. Program ten jest napisany w Javie, więc od tego trzeba zacząć. Standardowo nasze Linuxowe systemy jej nie mają, dlatego trzeba ją zainstalować.

Instalacja w Debian/Ubuntu:

sudo apt-get install default-jre

Instalacja w systemie Arch:

sudo packman -S default-jre

Teraz dopiero możemy przejść do programu ESPlorer. Zaglądamy na stronę https://esp8266.ru/esplorer/ lub bezpośrednio kliknij – Pobierz. Pobieramy archiwum na dysk. Wypakowujemy folder o nazwie ESPlorer. Przechodzimy do konsoli i właśnie do tego folderu. Trzeba nadać odpowiednie uprawnienia, żeby plik ESPlorer.jar był wykonywalny. W tym celu używamy polecenia:

chmod +x ESPlorer.jar

Kiedy już to zrobimy nie pozostaje nam nic innego jak tylko uruchomić program. Korzystając ciągle z wiersza poleceń wprowadzamy następującą linijkę:

java -jar ESPlorer.jar

Czekamy chwilkę aż program dojdzie do siebie. Po chwili zobaczymy już nie surowy terminal, ale bardziej przyjazne GUI. Wymienię kilka cech programu ESPlorer:

  • Podświetlanie składni w kodzie LUA i Python

  • Motywy kolorów edytora kodu: domyślne, ciemne, Eclipse, IDEA, Visual Studio

  • Funkcje edytorów Cofnij / Ponów

  • Autouzupełnianie kodu (Ctrl + spacja)

  • inteligentne wysyłanie danych do ESP8266 (bez głupiego wysyłania ze stałym opóźnieniem linii), sprawdzanie poprawnej odpowiedzi z ESP8266 po każdej linii.

  • Fragmenty kodu

  • Szczegółowy loging

  • I o wiele, wiele więcej…

Jeżeli nie działa od razu – nie szkodzi. Ustawiamy port, prędkość transmisji, odłączamy i podłączamy z powrotem płytkę – zakończy to tym samym sesję screen’a i odda władzę ESPlolerowi. Wciskamy guzik RESET i możemy przejść do testowania NodeMCU z innego już punktu widzenia.

Klasyczny przykład bardziej złożonej funkcji. Sprawmy żeby nasza dioda migała (możesz skopiować całość, język Lua przewiduje komentarze i nie bierze ich pod uwagę podczas kompilacji):

LEDpin = 4         -- Deklarujemy diodę kryjącą się pod pinem nr. 4
delayuS = 500000   -- Ustawiamy częstotliwość w mikrosekundach. Przykładowo 0.5 sek.
gpio.mode(LEDpin,gpio.OUTPUT)-- Polecenie, które włącza diodę
while(1)           -- Definiujemy niekończącą się pętlę
do
gpio.write(LEDpin,gpio.HIGH)-- Polecenie włączające diodę
tmr.delay(delayuS) -- Czas opóźnienia, częstotliwość
gpio.write(LEDpin,gpio.LOW)-- Polecenie gaszące diodę
tmr.delay(delayuS) -- I znów opóźnienie przed kolejnym zapaleniem się diody
end

Ciekawe, prawda? Mamy już odpowiedni schemat/bazę pod stroboskop. Możemy zresetować i płytka znów wróci do siebie.

A teraz na sam koniec najważniejsza strona, biblia NodeMCU, dokumentacja, gdzie są wymienione i opisane wszystkie funkcje z przykładami. Od tego momentu zaczynasz swoją własną przygodę z programowaniem mikrokontrolerów.
Pozdrawiam

NodeMCU Documentation

Related posts

One Thought to “Start z NodeMCU (ESP8266) na Linuxie”

  1. […] gotowymi, przygotowanymi plikami. Jeżeli potrzebujesz więcej informacji na ten temat zapraszam do mojego artykułu opisującego podstawy pracy z ESP8266 oraz m.i. obsługę programu ESPTool. W tym artykule […]

Leave a Comment