niedziela, 17 lipca 2016

ESP8266 na poważnie cz. 3

Aaa kotki dwa - czyli jak skutecznie uśpić ESP-12

Dziś spróbujemy wprowadzić nasz moduł w stan uśpienia. Do wyboru jest kilka modów ograniczenia prądu pobieranego przez procesor. tu>>>>>>>>>



Mode
Min
Typical
Max
Units
802.11b, CCK 1Mbps, POUT=+19.5dBm

215

mA
802.11b, CCK 11Mbps, POUT=+18.5dBm

197

mA
802.11g, OFDM 54Mbps, POUT=+16dBm

145

mA
802.11n, MCS7, POUT =+14dBm

135

mA
802.11b, packet size of 1024 bytes, -80dBm

60

mA
802.11b, packet size of 1024 bytes, -70dBm

60

mA
802.11b, packet size of 1024 bytes, -65dBm

62

mA
Standby

0.9

uA
Deep sleep

10

mA
Saving mode DTIM 1

1.2

mA
Saving mode DTIM 3

0.86

mA
Shutdown

0.5

uA


Najlepiej opisany i najprostszy do wdrożenia jest "deep sleep".
W tym celu należy:
  1. Zewrzeć piny RST i GPIO 16
  2. Wywołać procedurę >>> ESP.deepSleep(10* 1000 * 1000); <<< w nawiasie przykładowe wprowadzenie w stan uśpienia na 10sek (1 = 1 us)
  3. warto po tej procedurze dodać delay(100)
  4. czekać
  5. po 10 sek procesor się samo-resetuje (pin 16 jest ustawiany na 0)
  6. ot i wszystko - działa 
  7. jeśli w miejsce czasu wstawimy 0 to moduł nie wybudzi się timerem ale będzie musiał być wzbudzony przez zewnętrzny RST 
Wyłączeniu podlega głównie transmisja WiFi i coś tam jeszcze ale bez szału.
W moim układzie w tym stanie pobór prądu spadł z 70 do 12 mA.  Niby 6 x  mniej ale 12mA to o rząd za dużo by zasilić to wszystko z bateryjki.
A jeszcze do tego należy rozewrzeć RST i GPIO 16 podczas programowania modułu.
Ponadto okazało się że moduł jest bardzo wrażliwy na przyłączenia na GPIO 15. Miałem na ten pin podane wyjście z odbiornika 433MHz. Wszystko ładnie pracuje do momentu wyłączenia napięcia. Po ponownym załączeniu moduł się wiesza - trzeba go ręcznie zresetować poprzez RST.  Odłączenie odbiornika i pozostawienie tego pinu w stanie pull-down przywraca prawidłowe działanie ESP.
W literaturze stanowczo zalecają omijanie szerokim łukiem pinów 0, 2 i 15 do wykorzystania we własnych aplikacjach. Jeśli dodamy do tego piny 6-11 zarezerwowane dla komunikacji wewnętrznej z pamięcią to okazuje się że na 16 pinów ESP tak naprawdę swobodnie możemy dysponować tylko GPIO 4,5,12,13,14. Pięć portów na 16 + ewentualnie dwa (Tx Rx) jeśli dobrze pokombinujemy i jeden analogowy. Hmm niewiele tego jest.
Stąd wniosek, kupowanie bardziej rozbudowanych w piny modułów ESP nie ma żadnego sensu (np ESP-12) lepiej już kupić ESP-07 z porządniejszą antenką na płytce i możliwością przyłączenia dodatkowej zewnętrznej. Pewnie dlatego pojawiła się wersja ESP-14 z dodatkowym 8-bitowym STM8S udostępniająca 22 piny i 5 wejść analogowych. Ale prawdę powiedziawszy wolę już układ ESP z Arduino ze względu na mnogość sprawdzonych bibliotek.

Tak więc ESP w roli samodzielnej pozostanie u mnie li tylko w niewielkich projektach i to raczej tam gdzie będę musiał stosować zasilanie bateryjne. Tylko te 12 mA...


Wracam więc do usypiania. 12 mA to stanowczo za dużo.
Ale Internetowa akademia mówi, że w stanie deep sleep mają być uA a nie mA. Szukam jeszcze raz danych.
Rzeczywiście. W tabelce zamieszczonej tutaj>>>
Mode Min Typ Max Unit
Transmit 802.11b, CCK 1Mbps, POUT=+19.5dBm
215
mA
Transmit 802.11b, CCK 11Mbps, POUT=+18.5dBm
197
mA
Transmit 802.11g, OFDM 54Mbps, POUT =+16dBm
145
mA
Transmit 802.11n, MCS7, POUT=+14dBm
135
mA
Receive 802.11b, packet length=1024 byte, -80dBm
60
mA
Receive 802.11g, packet length=1024 byte, -70dBm
60
mA
Receive 802.11n, packet length=1024 byte, -65dBm
62
mA
Standby
0.9
mA
Deep sleep
10
uA
Power save mode DTIM 1
1.2
mA
Power save mode DTIM 3
0.86
mA
Total shutdown
0.5
uA

Deep sleep to 10 uA a nie 10 mA. 1000x mniej! Ktoś łże.

Wracam do płytki i zasilam ją bezpośrednio z napięcia 3,3V
Stan pracy - 75 mA
Stan deep sleep - 470 uA
 No tak - miliampery brał przecież stabilizator 5/3,3V.
470uA - całkiem nieźle. Nie mam jak sprawdzić gdzie wycieka mi ta różnica pomiędzy 10 a 470 uA bo wymagało by to prucia pracowicie poskładanej płytki prototypowej. Na razie to bez znaczenia. Przy  takim poziomie poboru prądu praca z baterii nabiera sensu. Szczególnie że mam pewien pomysł.......

Całą procedurę usypinia można sobie skomplikować dodając dodatkowy parametr
ESP.deepSleep(uint32_t time_us, RFMode mode = RF_DEFAULT)

RF mode może przyjmować warości od 0-4

  •    RF_DEFAULT = 0,  //RF_CAL depends on init data from byte 108
  •      RF_CAL = 1,  //RF_CAL enabled causes large current drain after wake 170mA
  •      RF_NO_CAL = 2,  //RF_CAL disabled, small current drain after wake 75mA
  •      RF_DISABLED = 4  //RF disabled, smallest current drain after wake 15mA
  ale po co to stosować - to jeszcze nie wiem

Wejście analogowe

ESP-07, 08 i 12 mają dodatkowo wyprowadzony na zewnątrz płytki pin wejścia 10 bitowego przetwornika analogowo-cyfrowego. Szkoda że tylko jedno. Przetwornik czyta się standardowo


  
pomiar = analogRead(A0);

Wadą jest również zakres pomiarowy - 0 - 1 V co dla 10 bitów daje rozdzielczość 100uV .  A więc na poziomie szumów. Pewnie praktycznie do wykorzystania będzie 8 bitów.

Ale ESP ma jedną ciekawą właściwość związaną z wejściem ADC (czasami nie wiedzieć czemu nazywanym również TOUT)


 można nim pomierzyć napięcie zasilania  wewnątrz układu (na pinie 3 i 4)
W tym celu należy
  • wejście ADC ma wisieć w powietrzu nie podłączone
  • zadeklarować ADC_MODE(ADC_VCC)
  • w pętli głównej odczytać

float voltaje=0.00f;
voltaje = ESP.getVcc();
Serial.print(voltaje/1024.00f);
Serial.println(" V");

i powinno uzyskać się wynik w Voltach

Ale są jakieś dodatkowe warunki których nie bardzo rozumiem

  • The 107th byte in esp_init_data_default.bin(0~127byte) must be 0xFF
  • RF must be enabled (pewnie coś związane z wywołaniem funkcji DeepSleep)

więc cd niewątpliwie nastąpi.....

Brak komentarzy:

Prześlij komentarz