ESP32 – poznámky

Programování mikrokontroléru ESP32 – rozcestník na zdroje a poznámky. Můj interní Google Doc překlopený do formy blog postu. Třeba vám pomůže. Ekvivalentní post k ESP8266.

Základní odkazy:

  • Přehledný datasheet čipu ESP-32.
  • ESP32 core pro Arduino IDE – github repo. Jen zdrojáky, bez dokumentace.
  • ESP-IDF dokumentace na webu Espressifu. Ve vztahu k ESP-32 Arduino Core jen velmi volná, nasměruje na správný cíl.
  • Nástroj pro ladění problémů: ESP exception decoder. Nainstalujte si do Arduino IDE, objeví se v menu Tools. Pokud v aplikaci dojde k exception, nakopírujte ji ze serial monitoru do tohoto nástroje a ukáže vám stacktrace, kde k chybě došlo.

Vlastnosti hardware:

  • Běžné funkce:
    • ESP32 GPIO interrupty.
    • Celkem 18 12bitových A/D vstupů ve dvou bankách (ADC1, ADC2).
      • Vrací hodnoty 0-4095 pro napětí 0-3.3 V.
      • Ale podle tohoto článku nejsou na začátku a konci lineární, efektivně měří asi od 0.15 do 3.10 V.
      • Poznámky k tomu, jak nastavit rozlišení a citlivost A/D vstupů.
    • 10 vstupů umí detekovat dotyk lidské ruky.
    • 2 8bitové D/A výstupy.
    • 16 PWM kanálů.
    • 2 I2C kanály – na libovolných GPIO pinech.
    • SPI.
  • Specifické funkce nad rámec toho, co je běžné:
    • ESP-NOW – jednoduchý bezdrátový protokol pro rychlé a energeticky levné předávání zpráv mezi ESP8266 a ESP-32. Není to wifi. Jiná dema.
    • Pulse counter. Počítání pulsů na vstupech.
    • Více variant PWM. LEDC a SigmaDelta.
      • LED PWM. Specifické PWM pro řízení LED, běží asi i když je procesor v low power modu.
    • PSRAM, „pseudo-static RAM“. Některé moduly mají 2 MB až 8 MB další RAM paměti nad rámec těch cca 420 kB interní RAM. Dostanete se k ní pomocí ps_malloc(). Více info.
      • Moduly *-WROOM jsou bez PSRAM
      • Moduly *-WROVER mají PSRAM
      • Pokud je více než 4 MB PSRAM, na první pohled je vidět jen 4 MB. Další paměť je potřeba získat odlišnými funkcemi. Info.
      • V Arduino IDE je třeba v nastavení boardu zapnout podporu PSRAM.
    • Senzor magnetického pole. Info. Jen na „velkém“ ESP32, chybí v ESP32-S2.

Omezené použití pinů:

  • GPIO2 musí být LOW pro začátek nahrávání aplikace přes sériový port. Tj. pokud máte bare modul a chcete nahrávat aplikaci, musíte si vyvést jumper nebo natvrdo připojit GPIO2 na LOW. Info. Info.
  • GPIO12 nastavuje při startu napětí pro interní flash paměť. Info. Asi je nejjednodušší se mu vyhnout. Už jsem se setkal s modulem, kde když nebyl tento pin připojen na LOW, tak modul nefungoval – neviděl flash paměť. Info.
  • GPIO15 řídí to, zda při startu vypisuje ESP32 na sériový port informace. Pak je dále volně použitelný.
  • I2C na defaultních portech 21,22 – podle této issue se může stát, že způsobí bootloop – opakované resety při startu (alespoň pro modul WROOM). Výpis na seriovém portu vždy končí chybou
    csum err:0x12!=0xb8
    (samozřejmě s různými čísly).
    Nicméně když jsem zaznamenal podobný problém, byl to projev nedostatečně silného napájecího zdroje.
  • Analogové vstupy z banky ADC2 není možné používat souběžně s WiFi. U WiFi aplikací je tedy k dispozici jen 8 A/D vstupů z banky ADC1.
  • GPIO 34, 35, 36, 39 jsou pouze pro vstup. Nemají pull-upy. Není možné je použít pro výstup.
  • Zde je jiná soupiska poznámek k tomu, jaké piny je možno použít.

Deep sleep / low power:

  • Detailní popis deep sleep režimů, tj. jak uspat ESP32 do režimu s nízkou spotřebou; jak ho probudit (umí toho hodně, daleko více než ESP8266); jak zjistit, proč se probudilo. Text zde.
    • Probuzení externím signálem jen na pinech označených jako RTCIO.
    • Informace o tom, kdo probudil MCU ze spánku:
      esp_sleep_wakeup_cause_t duvod = esp_sleep_get_wakeup_cause();
  • Jak zajistit, aby aplikace neztratila data po dobu deep sleep? To je nutné třeba u počítadla impulzů z měřidla rychlosti větru (srážkového čidla, plynoměru) aby nebylo potřeba posílat po každém kliknutí data na server. ESP32 má „RTC Memory“ – celých 8 kB (a dalších 8 kB „slow RTC memory“ pro low-power koprocesor)! Jde o SRAM, jejíž obsah přežije deep sleep a reset (ale ne výpadek napájení). Ukázka.
  • Čas běží i v deep sleep! ESP32 má „RTC timer“, který běží i v deep sleep. Info. Dá se načíst pomocí gettimeofday() nebo time().
    • Přesnost času není absolutní, je to poháněné RC oscilátorem. Na hodinky to není, na orientační informaci ano.
      • Za běžné pokojové teploty to za 1 hod naměřilo 3628 sekund, tj. odchylka +0,77 %. Dobré.
    • Fce millis() vrací milisekundy od posledního resetu a po deep sleep začíná znovu od nuly; gettimeofday () / time() vrací sekundy od posledního zapnutí či uploadu sketche a při deep sleep běží na pozadí dál.
  • U deep sleep trvá docela dlouho (několik sekund!), než začne běžet aplikace – než se naloaduje z flash do RAM a spustí. Proto existuje “deep sleep wake stub”, který může být v RTC RAM a který se spustí jako první, ještě před bootem celého ESP. Ukázka použití.
  • K dispozici je také „light sleep“ se spotřebou cca 3 mA, kdy sice procesor neběží, ale paměť se zachovává a po obnovení provozu nedojde k resetu – kód pokračuje z místa, kde přepnul do ligh sleep, bez zdržení.

Zapojení:

  • Minimální konfigurace ESP32 core modulu a její programování přes USB-Serial převodník. Text zde.

Důležité knihovny:

  • tzapu WiFiManager – Nepište jméno wifi sítě a její heslo do zdrojáku, ale zadejte je do aplikace z mobilky přes webový browser. Odkaz na development verzi, která podporuje i ESP-32.
  • joysfera Tasker – Periodické či odložené spouštění úkolů. Strašně jednoduché a dobře funkční. Článek od autora (Petr Stehlík).

Ostatní poznámky:

  • Při používání SPIFFS (filesystému ve flash paměti) to na rozdíl od ESP8266 nenamountuje filesystém, pokud není naformátován! Jednoduché řešení: zavolat SPIFFS.begin(true). Bool parametr, který u ESP8266 neexistuje, znamená „format on failure“.
  • HW akcelerovaný AES256 – https://gist.github.com/cnlohr/96128ef4126bcc878b1b5a7586c624ef

Srovnání ESP32 a ESP32-S2:


Poznámky k jednotlivým modulům

LilyGO TTGO T-Display

Můj oblíbený modul ESP32 + barevný display 1.14″ 135×240, s podporou pro LiPo baterky – za méně než 7 USD.

ESP32-CAM

ESP32-S s kamerou OV2640 a 4 MB PSRAM.

  • nákup
  • pinout a schema zapojení
  • kamera má rozlišení až 1600×1200; pro použití plného rozlišení je potřeba zapnout jen jeden framebuffer (pomalejší); při 800×600 fungují dva framebuffery
  • Deska nemá USB – ukázka, jak zapojit na USB-serial adapter a vhodný USB-serial adapter s vyvedeným napájením 5 V i 3.3 V
  • Detailnější popis API – projekt esp32-camera na githubu
  • Pinout:
    • LED („blesk“) je na GPIO 4, svítí při HIGH
    • pro programování je třeba dát pin 0 na nulu
    • při použití SD karty nejsou v podstatě žádné volné piny
      • ale podle tohoto popisu (poslední komentář) lze komunikaci s SD kartou přepnout do 1bit režimu, takže se uvolní piny pro další využití
  • demonstrační projekt pro webserver s real-time daty a rozpoznáváním tváří
  • Deska není úsporná, v deep sleep žere 6 mA.
    • Analýzu proč (a návrh řešení) udělal Chiptron zde.
    • Přesněji – konkrétně u desky, kterou jsem měřil, osciluje spotřeba při prostém přepnutí ESP do deep sleep mezi 0 a 20 mA, průměr je kolem těch 6 mA.
    • Maximální spotřeba (při focení) je kolem 550 mA; provozní stav při zapnuté wifi je cca 200 mA.
  • Pokud vám nefunguje kamera nebo některé piny, zde najdete checklist; i já jsem narazil na to, že byl modul v desce špatně zapájený – viz popis.

LilyGO TTGO T-Energy

ESP32 s držákem na akumulátor 18650, obvodem pro řízení nabíjení a 8 MB PSRAM.

  • schema
  • GPIO35 je připojeno na akumulátor přes 100k/100k odporový dělič (= vidí polovinu napětí akumulátoru).
  • modrá LED je na GPIO5 (svítí při HIGH)
  • červená LED = nabíjení (když není baterie, bliká krátkými pulzy)
  • zelená LED = nabito

Spotřeba?

  • Při napájení 5 V:
    • Pokud se nabíjí akumulátor, odebírá to 500 mA, ve špičkách (WiFi) až 750 mA.
    • Pokud je akumulátor nabitý, má to standardní spotřebu jako běžné ESP32:
      • cca 30 mA pro 80 MHz a vyplou WiFi
      • cca 70 mA pro 240 MHz bez WiFi komunikace
      • cca 360 mA pro WiFi komunikaci
  • Z akumulátoru se odebírá jen cca 0.1 mA při deep sleep (!!!).

Nabíjení akumulátoru se zastaví na cca 4.1 V, tj. nevyužívá to plnou kapacitu, prodlužuje životnost.

1 komentář

Filed under Mikrokontroléry - Arduino, ESP8266, Picaxe, ...

One response to “ESP32 – poznámky

  1. Pingback: ESP8266 – poznámky | pebrou

Zanechat odpověď

Vyplňte detaily níže nebo klikněte na ikonu pro přihlášení:

Logo WordPress.com

Komentujete pomocí vašeho WordPress.com účtu. Odhlásit /  Změnit )

Google photo

Komentujete pomocí vašeho Google účtu. Odhlásit /  Změnit )

Twitter picture

Komentujete pomocí vašeho Twitter účtu. Odhlásit /  Změnit )

Facebook photo

Komentujete pomocí vašeho Facebook účtu. Odhlásit /  Změnit )

Připojování k %s