Opis
ModuÅ‚ WiFi oparty na ukÅ‚adzie ESP8266. Posiada wgrane oprogramowanie NodeMCU, który umożliwia programowanie za pomocÄ… jÄ™zyka skryptowego Lua. UkÅ‚ad wyposażony jest w 10 pinów GPIO (każdy z nich może być sterowany sygnaÅ‚em PWM), magistralÄ™ I2C, 1-Wire, 10-bitowy przetwornik analogowo-cyfrowy oraz antenÄ™ PCB. Dodatkowo na pÅ‚ytce umieszczony zostaÅ‚ konwerter USB-UART (CP2102), który umożliwia programowanie bezpoÅ›rednio poprzez port USB z wykorzystaniem Å›rodowiska Arduino IDE.
WiÄ™cej szczegóÅ‚ów o oprogramowania NodeMCU można znaleźć w serwisie GitHub. |
Wymiary modułu to: 49 x 25 mm , raster wyprowadzeń wynosi 2,54 mm
Lua jest jÄ™zykiem skryptowym mogÄ…cym dziaÅ‚ać jako samodzielnie lub jako rozszerzenie możliwoÅ›ci innych aplikacji. ZostaÅ‚ on zaimplementowany jako biblioteka jÄ™zyka C. Cechuje siÄ™ prostym kodem, wysokÄ… wydajnoÅ›ciÄ… oraz możliwoÅ›ciÄ… przenoszenia miÄ™dzy platformami. SzczegóÅ‚y na stronie domowej Lua.
Przy pierwszym uruchomieniu zalecamy aktualizację firmware według tej instrukcji. |
Specyfikacja
Przydatne linki |
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.
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
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
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.