Wemos d1 mini: esp8266 trochę inaczej

wemos_01ESP8266 to mikrokontroler z wbudowanym modułem do komunikacji po WiFi. Pierwsze wersje z „gołym” czipem nie były tak łatwe do użycia a dostarczane oprogramowanie trochę chałupnicze. Za to niska cena (kilka dolarów) i całkiem spore możliwości sprawiły, że szturmem zdobyły rynek  DIY.

wemos_03Żeby ułatwić korzystanie z ESP8266, powstaje coraz więcej płytek bazowych. Działa to podobnie jak w przypadku  Arduino. Podstawowy czip otaczany jest stabilizatorami napięcia i dodatkowymi układami do komunikacji po USB. Do tego bootloader i już można programować ESP8266 za pomocą Arduino IDE.

Jedną z takich płytek bazowych bawiłem się ostatnio, a nazywa się: wemos d1 mini.

Co na płytce?

Jedną stronę płytki zajmuje czip ESP8266 ESP12E. Pod spodem umieszczono czip USB znany z chińskich wersji Arduino: CH340. Dzięki niemu możecie podłączyć ESP do Waszego komputera przez microUSB oraz programować układ z poziomu… Arduino IDE.

wemos_05Wszystkie instrukcje dotyczące instalacji oprogramowania znajdziecie na stronie projektu. Możecie również spojrzeć na ten filmik (link do bibliotek: http://arduino.esp8266.com/stable/package_esp8266com_index.json):

Kolejną ciekawostką jest umieszczenie stabilizatora RT9013. Dzięki niemu można zasilać czip z napięcia do 5.5v. Przypominam: ESP to maszynka chodząca na 3.3v.

Uwaga: ESP chodzi na napięciach do 3.3v, Arduino 5v. Uważajcie na łączenie ESP i Arduino – wyjście z np. portu szeregowego UNO może podsmażyć ESP. Podobnie sytuacja ma się z niektórymi czujnikami – pobudzone 3.3v mogą odpowiedzieć 5v. Uważajcie.

Całość dopełnia fizyczny reset na skraju krawędzi płytki i wyprowadzenia na raster 2.54mm.

Dlaczego wemos?

Dlaczego ESP8266? Odpowiedź nasuwa się sama: WiFi. Ten czip ma wbudowany interfejs WiFi b/g/n. Możecie nie tylko łączyć się z niego np. po tcp/udp, ale też stworzyć własny mini – serwer www.

ESP8266 to jednak znacznie więcej niż tylko port WiFi. To całkiem sprawny kontroler chodzący z częstotliwością 80 lub 160 MHz (Arduino: 16MHz) i wyposażony w 4MB pamięci programów flash (w porównaniu do 32kB w Arduino). Sporo mocy, jak na takie maleństwo!

Dlaczego wemos? USB! Łatwy do programowania przez Arduino IDE, wyprowadzenia pinów na raster 2.54mm, mały rozmiar – dużo łatwiej będzie go użyć, nie zwykłego ESP.

Kilka ciekawostek

USB

Najfajniejszym usprawnieniem jest port USB. Obsługiwany jest przez czip CH340 – ten sam, co w wielu klonach Arduino. Starsze systemy operacyjne, jak Windows XP, mogą wymagać instalacji dodatkowego sterownika. Znajdziecie go na stronie wemos w dziale download.

Po uzupełnieniu oprogramowanie dla Arduino IDE, po prostu podłączacie wemos kablem microUSB do Waszego  komputera i już możecie rozpoczynać zabawę w programowanie.

Zasilanie

Na płytce znalazł się stabilizator napięcia do 5.5v (maksymalnie 6v). Dzięki niemu możecie np. zasilić wemos’a z płytki Arduino. Zasilanie należy wtedy podłączyć do pinu oznaczonego 5v. Pin ten służy wtedy jako wejście. Całkiem przydatna funkcja.

Z drugiej strony, gdy wemos jest podłączony przez USB, zasilanie idzie z USB poprzez diodę B5819 na pin 5v i stabilizator 3.3v. Pin 5v możecie wtedy użyć jako zasilanie do innych układów.

Dzięki diodzie możecie bez obaw jednocześnie podłączyć zewnętrzne zasilanie przez pin 5v i programować układ przez USB. Spadek napięcia na diodzie to od 0.4 do ok. 0.6v (zależnie od przepływającego natężenia prądu) – o tyle będzie niższe napięcie na pinie 5v.

Gdzie wbudowany LED?

Jedną z charakterystycznych elementów płytek Arduino jest dioda podłączona do pinu D13. Nie mogło jej również zabraknąć w  wemos. Jedyna różnica jest taka, że podpięto ją pod GPIO2 kontrolera ESP, który jest wyprowadzony na pin D4.

I tutaj uwaga. W Arduino UNO pisaliśmy „digitalWrite(4)” i wiadomo było, że instrukcja ta odnosi się do pinu wyprowadzonego jako D4. Tutaj jest inaczej:

  • digitalWrite(4): zapis do portu GPIO4 kontrolera ESP (pin D2 wemos),
  • digitalWrite(D4): zapis do portu podmapowanego pod wyjście D4 na płytce wemos – w rzeczywistości GPIO2.

Mapowanie:

Pin wemos Funkcja Pin ESP-8266
TX TXD – nadawanie na porcie szeregowym TXD
RX RXD – odbiór RXD
A0 Wejście analogowe max 3.3V (o tym poniżej) A0
D0 IO: budzenie się ze stanu uśpienia GPIO16
D1 IO, SCL GPIO5
D2 IO, SDA GPIO4
D3 IO, 10k Pull-up GPIO0
D4 IO, 10k Pull-up, BUILTIN_LED GPIO2
D5 IO, SCK GPIO14
D6 IO, MISO GPIO12
D7 IO, MOSI GPIO13
D8 IO, 10k Pull-down, SS GPIO15
G Ground GND
5V 5V
3V3 3.3V 3.3V
RST Reset RST

To znaczy, żeby zapalić diodę możecie odwołać się do pinu ESP:

Lub wemos:

Nie dotykaj

Źródła sugerują, żeby w swoich aplikacjach nie używać GPIO0, GPIO2 i 12. Porty te używane są do programowania czipa.

Tryb GPIO 0 (D3, pull-up) GPIO 2 (D4, Pull-UP) GPIO 15 (D8, Pull-Down)
UART Download Mode (Programming) 0 1 0
Flash Startup (Normal) 1 1 0
SD-Card Boot 0 0 1

Stąd pull-up i pull-downy na nich. Jeżeli chcecie np. wymienić firmware, trzeba zewrzeć D3 do masy (przykład: tutaj).

Dodatkowo, GPIO0 (D3) staje się wyjściem przy starcie. Łatwo to zobaczyć na analizatorze logicznym:

wemos_10

GPIO 6-11 zarezerwowane są dla komunikacji w pamięcią i nie są wyprowadzone.

GPIO 16 (D0) odpowiedzialne jest za wybudzanie z uśpienia. Normalnie podłączone jest pod reset. Tutaj schematy Wemos tego nie pokazują. Podczas testów okazało się jednak, że takie połączenie znajduje się najprawdopodobniej pod „puszką”. Nie dało radę go używać jako port I/O.

Bezpieczne są GPIO 4 (D2), 5 (D1), 12 (D6),13 (D7),14 (D5) .

Dziwne robaczki

Po podłączeniu wemos do komputera, na konsoli szeregowej zobaczycie różne „robaczki”.

wemos_08

Jesteście ciekawi, co one oznaczają? To są wiadomości z bootloadera uruchamiającego całego czipa. Niestety, ktoś o dużym poczuciu humoru, ustawił szybkość tej transmisji na 74880.

Pod linuxem jest trudniej (o dziwo!). Okazuje się, że konsola szeregowa może tu działać tylko z określonymi szybkościami. Czyli:

Po prostu nie zadziała (podobnie cat). Znalazłem ciekawy tekst na ten temat: ESP8266, Ububntu and 74880 baud. Znajdziecie tam link do małego programiku „anybaud”:

Teraz wystarczy uruchomić screen (bez parametrów):

A w drugiej konsoli wpisać:

Zresetujcie ESP:

wemos_07

(reszta robaczków pochodzi już z mojego programu).

Wejścia analogowe

Wemos (czy ESP8266) oferuje tylko jedno wejście analogowe (w odróżnieniu do 6 analogowych A0..A5 w Arduino UNO), o rozdzielczości 10 bitów (0..1023 – jak w Arduino UNO). Co ciekawe – za jego pomocą można mierzyć napięcie przyłożone do pinu A0 lub napięcie zasilania modułu (na pinie vdd3p3). W drugim przypadku, pin A0 nie powinien być do niczego podłączony a w kodzie należy umieścić makro „ADC_MODE(ADC_VCC);”, np:

Na zasilaniu z USB program pokazywał 2.89v. Miernik przyłożony między pinami G i 3.3v pokazał równo 3.3v. Co oznacza więc ta wartość? Spójrzmy  na schemat płytki:

wemos_01

Widać stąd, że pin ADC jest na stałe podłączony rezystorem do masy (pull-down). W związku z tym, nie wydaje mi się, żeby ta funkcjonalność działała tu poprawnie.

Powodem takiego podłączenia jest to, że przetwornik A/D w ESP działa tylko do 1v (niektóre źródła wspominają 1.1v)!

Spójrzmy na ten dzielnik:

ADC = {A0 \cdot {{{R_2}} \over {{R_1}+{R_2}}}}

Stąd:

1 = {A0 \cdot {{{100k}} \over {{220k}+{100k}}}} = {A0 \cdot {0.3125}}

Maksymalna wartość A0:

A0 = {{1} \over {0.3125}}=3.2

Dzięki temu dzielnikowi możecie więc bezpiecznie mierzyć napięcia do poziomu zasilania czipu, więc 3.3v. Dzięki tej zmianie wejście analogowe będzie zachowywało się jak w Arduino.

Jak bardzo to jest dokładne? Podłączyłem do A0 źródło odniesienia napięcia 2.5v. Prosty program:

Dla testowego napięcia 2.5v, program pokazał „813”.

wemos_09

Ponieważ „1023” oznaczałoby 3.2v na wejściu A0, liczbę 813 można odczytać jako:
x = {{813 \cdot 3.2} \over 1023} = 2.543v

…co jest całkiem bliskie dla tego źródła odniesienia napięcia (2.499v).

Przetwornik ADC nie powinien być używany podczas transmisji – pomiary mogą być wtedy niedokładne (tutaj).

Tylko uwaga na Rx/Tx

Logika wemos/ESP działa działa na 3.3v. Jeżeli podłączycie wyjście (tx) portu szeregowego ESP z wejściem rx Arduino – nie ma problemu. Arduino zrozumie logikę 3.3v – mimo że samo posługuję się logiką 5v. Po prostu – poziomy logicznej 1 „zazębiają” się.

Gorzej jeżeli podłączycie tx (nadawanie) z Arduino na rx (odbiór) wemos. Wtedy na wejście wemos wejdzie 5v – i jest bardzo prawdopodobne, że je uszkodzi. W tą stronę (odbiór danych z Arduino) konieczne będzie zastosowanie dzielnika napięciowego (obniżającego poziom napięcia), konwertera logiki lub układu typu 4050.

Nie ma problemu, jeżeli będziecie łączyć wemos z np. Raspberry Pi. Obydwa „działają” na logice 3.3v.

Ale przede wszystkim WiFi…

Otwórzcie nowy projekt. Dodajcie do niego bibliotekę ESP8266WebServer. Teraz kod:

Teraz wystarczy podłączyć się telefonem z WiFi do sieci
wemosAPebs.

[25/09/2016] WEMOS down?!

Ze strony wemos.cc zniknęły wszystkie opisy wemos d1 mini. Niestety – usunięto nawet zasoby z serwera, więc linki są martwe. Czyżby koniec tego produktu?

Trochę dokumentacji znalazłem na ElectroDragon.

Działa jeszcze github: https://github.com/wemos/wemos.github.io/blob/master/Products/d1_mini.md.

Źródła

Dodaj komentarz