NodeMCU v2 - idealna płytka dla IoT
NodeMCU v2 jest płytką, która wykorzystuje cieszący się zasłużoną sławą układ ESP8266. Jeśli przyjrzymy się mu bliżej zauważymy, że wykorzystuje on najnowszą jego wersję w postaci 22 pinowego moduł ESP12E z wbudowanym 32-bitowym układem RISC taktowanym zegarem 80MHz. W odróżnieniu od standardowej wersji ESP12 wyróżnia się 10 portami GPIO, 2 portami UART oraz jednym 10-bitowym wejściem ADC. Każdy z portów GPIO może być wykorzystany jako PWM, I2c, SPI lub 1-Wire. NodeMCU v2 który otrzymałem do testów dzięki uprzejmości sklepu elty.pl można kupić za cenę 60 zł.
Jeśli nie znacie jeszcze rodziny układów ESP8266, to pewnie nie robi na Was większego wrażenia, dlatego musicie jeszcze wiedzieć, że układ ten posiada sporo niespodzianek. Najważniejszą jego cechą jest obsługa sieci Wi-Fi w standardach 802.11 b/g/n pracujących z częstotliwością 2,4 GHz. Posiada również wbudowany stos TPC/IP i może działać w trybach AP (Access Point), STA (standalone) oraz AP+STA. Dodatkowo dostajemy również wbudowany czujnik temperatury oraz wsparcie dla CCMP, TKIP, WEP, CRC, WPA/WPA2 i WPS.
Maksymalny pobór prądu podczas pracy w sieci Wi-Fi zależy od wersji w której pracuje. Kolejno są to: 215mA (b), 197mA (g) oraz 135ma (n). Obowiązuje tutaj logika na poziomie 3.3V, a maksymalne obciążenie I/O to 12mA.
Moduł NodeMCU v2 został wyposażony w stabilizator napięcia 3.3V oraz konwerter USB-to-UART CP2120, dzięki czemu jest możliwe zasilenie i programowanie płytki bezpośrednio z portu USB.
Programowanie płytki może odbywać się za pomocą języka skryptowego Lua lub za pomocą Arduino IDE. Domyślnie płytka dostarczana jest z wgranym firmware w wersji 0.9.5 dla tego pierwszego. Dlatego w pierwszej kolejności zajmiemy się właśnie tym sposobem.
Aktualizacja firmware:
Na początek zaktualizujemy sobie firmware. Możemy pobrać do tego całe drzewo repozytorium nodemcu-firmware.git lub pobrać plik samodzielnie: nodemcu_20150216.bin (0.9.6)
- github clone https://github.com/nodemcu/nodemcu-firmware.git
- cd nodemcu-firmware.git
- tools/esptool.py --port /dev/ttyUSB0 write_flash -fm dio -fs 32m -ff 40m 0x00000 pre_build/0.9.6/nodemcu_20150216.bin
NodeMCU v2 automatycznie przejdzie w tryb aktualizacji firmware i rozpocznie się proces wgrywania. Gdyby tak się jednak nie działo, zalecane jest przed wgraniem firmware przytrzymanie przycisku FLASH i naciśnięcie RESET.
Connecting...
Erasing flash...
Writing at 0x0004f800... (62 %)
Użytkownicy systemu Windows, mogą skorzystać z dedykowanej aplikacji nodemcu-flasher
Po tym zabiegu, będziemy mogli połączyć się dowolną konsolą szeregową do naszego NodeMCU - na przykład korzystając z programu minicom.
- minicom -D /dev/ttyUSB0 -b 9600
Po wydaniu polecenia node.restart() powinniśmy ujrzeć komunikat o wersji oraz informację o braku skryptu init.lua, który jest wykonywany przy uruchomieniu.
;
Spróbujmy czegoś prostego. Podepniemy pod timer wyświetlanie tekstu "test" co jedną sekundę. Wpisujemy z "palca":
- tmr.alarm(0, 1000, 1, function()
- print("test")
- end)
Wynikiem będzie cykliczne wyświetlanie tekstu "test".
Spróbujmy czegoś ciekawszego - połączymy się z siecią Wi-FI:
- wifi.setmode(wifi.STATION)
- wifi.sta.config("SSID","HASLO")
- print(wifi.sta.getip())
Skoro mamy połączenie z siecią, może malutki serwerek?
- srv=net.createServer(net.TCP)
- srv:listen(80,function(conn)
- conn:on("receive",function(conn,payload)
- conn:send("<h1>No siema!</h1>")
- conn:close()
- end)
- end)
Po wpisaniu adresu IP naszego NodeMCU w przeglądarce ujrzymy spodziewane powitanie:
A co z GPIO? To również bardzo proste. Spróbujemy zapalić niebieską diodę modułu. podłączoną do D4:
- gpio.mode(4,gpio.OUTPUT)
- gpio.write(4,gpio.LOW)
Analogicznie możemy odczytać stan podanego pinu:
- gpio.mode(4,gpio.INPUT)
- print(gpio.read(4))
Jak wspomniałem wcześniej, podczas uruchamiania, automatycznie wykonywany jest pliki init.lua. Musimy go zatem utworzyć i zapisać do niego nasz program. Np.: print("Boot!")
- file.open("init.lua","w")
- file.writeline([[print("Boot!")]])
- file.close()
- node.restart()
Po restarcie za pomocą polecnia node.restart() przy każdym włączeniu będzie pojawiał się komunikat "Boot!"
Plik możemy usunąć poleceniem file.remove("init.lua") lub sformatować pamięć poleceniem file.format(), usuwając tym samym wszystkie pliki.
Lua daje ogromne możliwości, a pełne API znajdziecie tutaj: https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_en
ESPlorer - wygodne IDE w Java lub Luatool
Pisanie programów za pomocą konsoli szeregowej jest oczywiście mało wygodne, dlatego z pomocą przyjdzie nam program ESPlorer. Działa na każdej platformie z zainstalowanym pakietem Java.
Dzięki niemu możemy wgrać program metodą "linia po linii" lub przesłać cały edytowany plik o podanej nazwie. Przykładowo program mrugający diodą co 500ms:
- gpio.mode(4,gpio.OUTPUT)
- state = 0
- tmr.alarm(0, 500, 1, function()
- if (state==0) then
- state = 1
- gpio.write(4, gpio.HIGH)
- else
- state = 0
- gpio.write(4, gpio.LOW)
- end
- end)
Alternatywnie możemy skorzystać z prostego narzędzia luatool: https://github.com/4refr0nt/luatool
- ./luatool.py --port /dev/ttyUSB0 --src file.lua --dest main.lua --baud 9600
Arduino IDE dla tradycjonalistów
NodeMCU v2 możemy również programować za pomocą Arduino IDE i znanej nam doskonale składni. W tym celu musimy zaopatrzyć się IDE w wersji >=1.6.4, gdzie wywołując okno ustawień "File > Preferences" wpisujemy dodatkowy adres URL dla menadżera płytek:
- http://arduino.esp8266.com/staging/package_esp8266com_index.json
Następnie z menu "Board > Boards Manager" instalujemy pakiet dla płytek zgodnych z esp8266:
Teraz wystarczy już tylko wybrać płytkę NodeMCU 1.0, częstotliwość 80MHz (lub podwojoną 160MHz), prędkość UART 115200 i wgrać nasz program. Tutaj mapowanie pinu niebieskiej diody jest trochę inne:
Skoro już tu jesteśmy, sprawdzimy jak radzi sobie nasz mały benchmark do kalkulacji liczby Pi przy milionie iteracji:
- #define ITERATIONS 1000000L // number of iterations
- #define FLASH 10000 // blink LED every 1000 iterations
- void setup() {
- pinMode(2, OUTPUT); // set the LED up to blink every 1000 iterations
- Serial.begin(115200);
- }
- void loop() {
- unsigned long start, time;
- unsigned long niter=ITERATIONS;
- int LEDcounter = 0;
- boolean alternate = false;
- unsigned long i, count=0;
- float x = 1.0;
- float temp, pi=1.0;
- Serial.print("Beginning ");
- Serial.print(niter);
- Serial.println(" iterations...");
- Serial.println();
- start = millis();
- for ( i = 2; i < niter; i++) {
- x *= -1.0;
- pi += x / (2.0f*(float)i-1.0f);
- if (LEDcounter++ > FLASH) {
- LEDcounter = 0;
- if (alternate) {
- digitalWrite(2, HIGH);
- alternate = false;
- } else {
- digitalWrite(2, LOW);
- alternate = true;
- }
- delay(1);
- }
- }
- time = millis() - start;
- pi = pi * 4.0;
- Serial.print("# of trials = ");
- Serial.println(niter);
- Serial.print("Estimate of pi = ");
- Serial.println(pi, 10);
- Serial.print("Time: ");
- Serial.print(time);
- Serial.println(" ms");
- delay(10000);
- }
Wyniki dla 80MHz:
Wyniki dla 160Mhz:
Jest moc? :) Porównamy jeszcze z innymi płytkami:
Płytka | Czas | Uwagi |
IntelGalileo Gen2 | 396 ms | czytaj więcej |
NodeMCU v2 @ 160MHz | 3176 ms | |
Linkit ONE | 4239 ms | czytaj więcej |
NodeMCU v2 @ 80MHz | 6251 ms | |
Arduino Zero | 19661 ms | czytaj więcej |
Arduino Uno | 57389 ms |
Wsparcie dla Arduino jest bardzo dobre - cały czas rozszerza się lista kompatybilnych funkcji i dedykowanych modułów, czujników i układów. Jeśli więc myślisz o małym urządzeniu pracującym w sieci Wi-FI, nic chyba lepszego dziś nie dostaniemy.
Reklama
Komentarze
Świetny tekst! Masz nosa do ciekawych układów i ich zastosowań :)
Od siebie mogę dorzucić, że ESP8266/Arduino można programować również przy pomocy rewelacyjnego CLion dzięki PlatformIO ( http://platformio.org/ ).
Nie znałem :) Chętnie sprawdzę
>Jeśli więc myślisz o małym urządzeniu pracującym w sieci Wi-FI, nic chyba lepszego dziś nie dostaniemy.
To jest chyba lepsze: http://www.acmesystems.it/arietta
Nie miałem jeszcze okazji - znalazło się na mojej liście :)
Za 1 szt ariettay masz 20szt esp.
Gdyby był w tej samej cenie to tak. Wolę kupić 5 modułów lua :)
Wpis super i za to dzięki. Ale kody na Twoim blogu do czytania to masakra... Mówię o tych dolnych i górnych indeksach. Bardzo to utrudnia czytanie. Przynajmniej mi.
:) dzięki - możesz podesłać screenshota na blog at jarzebski dot pl ?
trafiłem tu kiedyś przez przypadek i teraz jestem dosyc czestym gościem w poszukiwaniu ciekawostek jak właśnie prezentowane nodemcu.
mam kilka pytanek odnośnie tego sprzętu.
ile to ma ramu? nigdzie nie znajduję tej informacji.
dwa jak przełączać MHz?(80<->160)
trzy jaki zasięg po wifi - ile metrów od AP?
pozdrawiam.
Jeśli chodzi o zasięg polecam to:
Na pewno ma 4mbit pamięci flash, ale RAM nie wiem, sprawdzę to
80/160MHz przełączałem podczas wyboru boarda z Arduino IDE
Myślę, czy by na tym stacji pogodwej nie zrobić z twoich ostatnich tutoriali. Bateryjka i jazda. Ale bateryjke przez port USB? Ciekawe na ile by to podziałało na takiej baterii.
Możesz podpiąć się pod pin Vin 5v :)
Ta płytka nie ma wbudowanego czujnika temperatury :)
Miganie diodą led = 200kB ?
Samodzielnie wgryzałem się do mojego NodeMCU w. 0.9, a tu wszystko podane na tacy :) Proste rzeczy potrafię już zrobić, ale utknąłem na DS18B20. Na stronie http://nodemcu.com/index_en.html#fr_5475f7667976d8501100000f
jest przykład ale nie potrafię go zastosować. Rozumiem, że NodeMCU potrafi współpracować bezpośrednio z DS18b20 ? Proszę o taki skrypt w lua kt. czyta temp z czujnika i wyrzuca ją na serwer co jakiś czas.
Halo Houston, mam problem, jak na razie po:
print(wifi.sta.getip())
odpowiada "nil",
możesz pomóc ?
Trzeba się najpierw zalogować do sieci.
Wie ktoś może, ile można (bezpiecznie!) "wyssać" z wbudowanego LDO 3.3V? Poza potrzebami samego NodeMCU? Bo na zdjęciach w necie jest jakiś spory (0.5A?), a u mnie (też CP2102) jest (chyba) w SOT23-5. W sumie dużo nie potrzebuję, LCD na HD + DS18B20 + LED + pstryczki, ale wolałbym wiedzieć, co mogę.
Mam takie pytanie. Czy wgrywanie programu Arduino podmienia cały firmware? Czy po wgraniu programu Arduino mogę bez problemów wgrać program w Lua czy musze najpierw z powrotem firmware Nodemcu wgrać?
@S tak, podmienia caly firmware. musisz pozniej flashowac firmware zeby wgrac skrypty lua.
witam.
jestem akwarystą i mam sterownik na arduino, który kontroluje natężenie led oraz 2 przekaźniki, mierzy temperaturę i pH. Ostatnio kupiłem ESP aby postawić serwer i poprze stronę ustawiać parametry np oświetlenia.
Wpadłem na pomysł że z SD będę ładował HTML do ESP poprzez arduino. Mam wielki kłopot. arduino nie wczytuje mi zawartość pliku tylko zwraca 0/1. czy może mi ktoś pomóc?
Lub pokazać ja sterować włączeni/wyłączenie diod poprzez arduino z EPS
Witam,
znalazłem przypadkiem twój wpis w komentarzach dotyczących NodeMCU. Widziałem, że na arduino uruchomiłeś pomiar pH wody w akwarium. Własnie poszukuję takiego rozwiązania. Czy mógłbym prosić o jakieś wskazówki? Używałeś jakiegoś gotowego modułu do pomiaru pH z opcją podłączenia sondy pH przez BNC? Znalazłem takie płytki na aliexpress z Chin ale nigdzie nie znalazłem do nich dokumentacji niestety i nie wiem czy warto w to inwestować.
Z góry dzięki za wszelki wskazówki.
Pozdrawiam
Marcin
są takie sondy z gotowymi płytkami do których wpinasz sondę (BNC), a z płytki wychodzi Ci analog.
Świetny artykuł, zachęcił mnie do eksperymentowania.
Obsłuży moduł microSD, jak do niego podłączyć moduł microSD ?
Na module od karty mam: CS, SCK, MOSI, MISO, VCC, GND.
Podobna płytka to WeMos D1 Mini
http://www.wemos.cc/Products/d1_mini.html
oparta na tym samym układzie ESP8266, również zgodna z Arduino i NodeMcu. Producent oferuje gotowe płytki, m.in. z popularnymi czujnikami DHT11 czy DHT22, czy też moduł do kart Micro SD
http://www.wemos.cc/Products/mini_shields.html
Jak bezpośrednio adresowa porty?
ESP8266 ma calkiem niezla moc obliczeniowa:
Witam,
A ja nie mam pomysły jak się do tego dobrać:(
Próbuje podłączać do portu USB i wgrywać firmware ale płytka ani drgnie. Czy ma ktoś pomysł co z tym zrobić?
Cześć pierw wgraj sterowniki do usb CH 340
Mam ta sama plytke ale mam problem z pinem TX i RX, w Arduino IDE, programuje je jako SoftwareSerial(21,22) ale RX nie dziala... jakby był nie żywy.. ponadto jesli zmienię pini na inne jak (17,13), to i tak dane wylatuja z poprzedniego TX... tak jakby program w ogóle nie przypisywał serialu do wyznaczonego Pinu...
Mam ten sam problem, RX TX oraz PN532 NFC
Trafiłem przez przypadek - potem znów i znów - dobrze pozycjonująca się strona - ale i autor ciekawie pisze. Oby tak dalej - bo jesteś pierwszym źródłem polskojęzycznym ciągle TOPIE tworzącym niezłe artykuły. Jarzębski tak trzymaj!
Witam,
Komuś udało się uruchomić wewnętrzny czujnik temperatury ??? fajna opcja do sterowania wentylatorem przez PWM
Witam.
Mam problem z uruchomieniem serwera.
Mam płytkę chińską LoLin z wgranym nodemcu ze strony nodemcu-build.com z ustawieniami standardowymi.
Przy próbie połączenia z serwerem zrywa połączenie :Połączenie zostało zresetowane.
Gdy usunę linię: "conn:close()" napis "No siema!" się wyświetla, ale połączenie nie zostaje zakończone i kółeczko na karcie cały czas się kręci.
Co może być tego przyczyną?
Witam, jaki macie pomysł na zainstalowanie płytki esp8266 w Arduino IDE ? bo żaden link odnoszący się do http://arduino.esp8266.com/ nie działa ...może ma ktoś pliki i może mi podesłać ?
Witam
Dla mnie ciekawszym tematem było by podłączenie FT 800/801 do tego cacka
Wiem, że kiedyś tam dawno temu Korneliuszu poprawiłeś biblioteki do FT pod Arduino.
Będą działać z ESP???
Pozdrawiam.
ESP8266 12e nie uruchamia wgranego programu po restarcie zasilania
To jest uklad opisany na odwrocie płytki jako \'LoLin new NodeMcu V3\'
Wgrałem Flash.
Po wielu bojach wgrywam i startuję wreszcie programy przy pomocy ESPlorera ewentualnie LulaLoadera w jezyku Lua.
Układ uruchamia wczytany (skompilowany) program z rozszerzeniem lua lub lc). Jest komunikacja przez WIFI.
Działa dotąd dopóki nie wykonam restartu zasilania wyłączając i włączając napięcie zasilające płytkę ESP. Wtedy nastepuje tylko mignięcie niebieskiej diody na plytce i nic sie dalej nie dzieje. Ruter traci dostep wifi do ESP. Dokladnie tak samo dzieje sie zadaniu RESETU z przycisku na ESP albo z Esplorera. Próba z prostym programem (migajace stale diody na portach) daje identyczny skutek.
Oczywiście odłączenie płytki od komputera nie blokuje egzekucji programu o ile zostaje podtrzymane jej zasilanie.
Aby ponownie uruchomić program muszę ponownie wklikać przy pomocy Esplorera program.
Musze stwierdzić że ten problem dyskwalifikuje użyteczność ESP.
Moje pytanie dotyczy tego co należy zrobić aby ESP egzekwował wgrany program po każdorazowym restarcie zasilania (może trzeba dopisać w programie lua jakąś dodatkową instrukcję? Może problem wynika stąd, że moja płytka jest wadliwa?).
Skończyły mi się pomysły.
Będę wdzięczny za podpowiedzi
Uporałem sie z tą kwestią metodą prob i błedow. W uproszczeniu dziala to tak że istotna jest nazwa pliku Lua który sie pakuje do płytki. Jesli uzyjesz nazwy "init.lua" to program uruchamia sie włączeniu zasilania lub resecie płytki. Jesli dasz inną nazwe "dowolna.nazwa" wtedy nie uruchamia sie. To ma znaczenie przy edytowaniu i testowaniu programu w takim przypadku warto zadać dowolna nazwę poniewaz wtedy nie ma problemu z jego zatrzymywaniem.
To taka moja uwaga dla od nowicjusza dla nowicjuszy.
Swoja drogą zastanawia mnie ze tak trudno znaleźć w necie, na forach wyjasnienie na tak zasadniczą kwestię?
Korekta: zamiast "dowolna.nazwa" powinno być oczywiscie "dowolnanazwa.lua"
A może ktoś pomoże. Mam NodeMcu (klon) i jak wgrywam coś to mruga led k. anteny a nie k. wejścia USB. Co jest nie tak? Pozdrawiam