NodeMCU i Blink

Dzisiaj pokażę Wam jak przy pomocy NodeMCU zrobić rzecz, który zrobił przynajmniej raz każdy użytkownik Arduino. Mowa tu o przykładzie Blink, czyli mruganie diodą. Jest to dla każdego wstęp do bardziej zaawansowanych programów. NodeMCU jest płytką wyposażoną w procesor ESP8266 oraz układy wspomagające. Dzięki temu wystarczy kabel USB, komputer i można już wgrywać programy do NodeMCU. Z „gołym” ESP jest więcej zachodu – potrzebujesz zasilania, konwertera USB/Serial i przy każdej aktualizacji programu trzeba pamiętać o podpinaniu odpowiednich GPIO do zasilania czy GND… NodeMCU to ESP8266 gotowe od razu do pracy.

Zrobimy to na dwa sposoby: wykorzystując Arduino IDE i firmware NodeMCU, czyli takie, które umożliwa porgramowanie płytki w Lua.

Jak przystosować Arduino IDE do współpracy z ESP8266, czyli również NodeMCU opisywaliśmy we wpisie: ESP8266, IoT – praktyczny przykład cz. 4 – Arduino IDE, dlatego ten punkt możemy pominąć.

Jeżeli mamy już uruchomione Arduino IDE ze wsparciem dla ESP8266, to musimy pamiętać o kilku rzeczach. Przede wszystkim należy wybrać odpowiednią płytkę, w naszym przypadku jest to NodeMCU 1.0 (ESP-12E Module), następnie tak jak w przypadku Arduino trzeba wybrać odpowiedni port, więc jeżeli mamy podpięte jednocześnie np. Arduino UNO i NodeMCU, to nie zapomnijmy o jego zmianie. Resztę ustawień możemy zostawić w spokoju, powinny one wyglądać mniej więcej tak:1

Kolejną sprawą jest fakt, że dioda umieszczona na NodeMCU nie jest podpięta do pinu 13 jak a Arduino UNO, tylko do pinu 16. Dalej jest już prosto, jeżeli mamy otwarty przykład Blink, to zamieniamy wszystkie wystąpienia pinu 13 na 16 i klikamy „Upload”. Odczekujemy chwilę, ponieważ kompilacja i wgrywanie programu trwa trochę dłużej, niż w przypadku Arduino (można to zmienić ustawieniem „Upload Speed”, wybieramy wtedy prędkość programowania, jednak przy zbyt wysokich prędkościach mogą pojawić się błędy). Voilà, dioda miga.

Teraz pora na NodeMCU i Lua. Powinniśmy zacząć od wgrania na płytkę odpowiedniego firmware, czyli oprogramowania które pozwoli nam obsługiwać płytkę przy użyciu skryptów pisanych w Lua. Zacznijmy więc od pobra… stop, nie ma tak łatwo, autorzy twierdzą, że ze względu na rosnącą liczbę modułów, które można dodać do firmware, gotowe pliki które można wgrać nie będą dostępne. Żeby zdobyć firmware, musimy je sobie wygenerować. Na szczęście powstała do tego odpowiednia strona, na której podajemy jedynie swój mail, na który otrzymamy plik oraz wybieramy interesujące nas moduły. W naszym wypadku domyślne moduły są wystarczające, więc podajemy mail i czekamy kilka minut. Teraz możemy przejść do wgrania oprogramowania.

Dzięki temu, że płytka posiada wbudowany konwerter USB-Serial, nie potrzebujemy nic, oprócz komputera (w naszym wypadku jest to komputer z Linuksem), oraz kabla microUSB. Jeżeli mamy już plik z firmware, to musimy jeszcze pobrać program, którego użyjemy do flashowania, najprościej zrobić to wpisując w konsoli:

wget https://raw.githubusercontent.com/themadinventor/esptool/master/esptool.py

Jeżeli pobraliśmy esptool w to samo miejsce, w którym znajduje się plik .bin z oprogramowaniem, to teraz wpisujemy:

python2.7 esptool.py --baud=115200 --port=/dev/ttyUSB0 write_flash 0x000000 nodemcu-master-11-modules-2016-06-29-19-55-41-integer.bin

Pamiętaj, że nazwa pliku będzie inna. Teraz wystarczy przytrzymać przycisk FLASH, nacisnąć RST i puścić FLASH żeby płytka przeszła w tryb programowania. Klikamy Enter i czekamy:

viciu@home-ntg:~/Desktop/nodemcu$ python2.7 esptool.py --baud=115200 --port=/dev/ttyUSB0 write_flash 0x000000 nodemcu-master-11-modules-2016-06-29-19-55-41-integer.bin
esptool.py v1.2-dev
Connecting...
Running Cesanta flasher stub...
Flash params set to 0x0000
Writing 393216 @ 0x0... 393216 (100 %)
Wrote 393216 bytes at 0x0 in 34.2 seconds (91.9 kbit/s)...
Leaving...

Mamy już wolną drogę do pisania skryptów w Lua, jak się do tego zabrać pisaliśmy już w artykule ESP8266, IoT – praktyczny przykład cz. 1 (od akapitu „Test połączenia”).

Tutaj znowu muszę wrócić do numerowania pinów, niestety dla firmware NodeMCU jest inne, niż używane dla Arduinowego. W tym przypadku wbudowana dioda podpięta jest do pinu 0. Posługując się wcześniejszym poradnikiem odnośnie programu ESPlorer przystępujemy do napisania naszego programu, który wygląda tak:

LED_PIN = 0

gpio.mode(LED_PIN, gpio.OUTPUT)
value = true

tmr.alarm(0, 1000, 1, function ()
    gpio.write(LED_PIN, value and gpio.HIGH or gpio.LOW)
    value = not value
end)

Jak widać, podobnie jak w Arduino musimy ustawić, czy pin będzie wejściowy, czy może wyjściowy. Dalej tworzymy pętle, która będzie zmieniała stan pinu co sekundę. Używamy tutaj funkcji tmr.alarm, zamiast po prostu while. Dlaczego? Ponieważ gdybyśmy jej użyli do zmieniania stanu pinów, to stracilibyśmy możliwość dalszej komunikacji z płytką. Program wykonywałby się w nieskończoność, a my stracilibyśmy możliwość dalszego wgrywania skryptów. Nie oznacza to, że płytka stałaby się bezużyteczna, po prostu musielibyśmy wgrać od nowa firmware. Jeżeli jesteście ciekawi, to możecie to sprawdzić używając takiego kodu:

LED_PIN = 0
US_TO_MS = 1000

gpio.mode(LED_PIN, gpio.OUTPUT)

while true do
   gpio.write(LED_PIN, gpio.HIGH)
   tmr.delay(500 * US_TO_MS)
   gpio.write(LED_PIN, gpio.LOW)
   tmr.delay(500 * US_TO_MS)
end

Po dokumentację, dzięki której można zrobić z płytką inne rzeczy odsyłam do: https://nodemcu.readthedocs.io/