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.
    • Long-range Wifi – pokud je na obou stranách spoje ESP32, je možné i s malou anténou na plošňáku dosáhnout (pomalé) spojení na stovky metrů. Info.
    • Použití hardwarového watchdogu v Arduino IDE.

Informace o jednotlivých gpio pinech

pinfunkceomezení
0– může budit zařízení ze spánku
– touch 1
– ADC2_CH1 (nelze s WiFi)
spouští při bootu programovací režim
1– při bootu posílá HIGH nebo PWM
– serial0 TX
2– může budit zařízení ze spánku
– touch 2
– ADC2_CH2 (nelze s WiFi)
3– při bootu posílá HIGH nebo PWM
– serial0 RX
4– může budit zařízení ze spánku
– touch 0
5– SPI-SSpři bootu posílá HIGH nebo PWM
6při bootu posílá HIGH nebo PWM
7při bootu posílá HIGH nebo PWM
8při bootu posílá HIGH nebo PWM
9při bootu posílá HIGH nebo PWM
10při bootu posílá HIGH nebo PWM
11při bootu posílá HIGH nebo PWM
12– může budit zařízení ze spánku
– ADC2_CH5  (nelze s WiFi)
nastavuje při startu napětí pro interní flash paměť
13– může budit zařízení ze spánku
– ADC2_CH4 (nelze s WiFi)
14– může budit zařízení ze spánku
– ADC2_CH6  (nelze s WiFi)
při bootu posílá HIGH nebo PWM
15– může budit zařízení ze spánku
– ADC2_CH3 (nelze s WiFi)
– při bootu posílá HIGH nebo PWM
– řídí to, zda při startu vypisuje ESP32 na sériový port informace. Pak je dále volně použitelný
16
17
18– SPI-SCK
19– SPI-MISO
20
21– I2C SDA (ale I2C lze spustit na kterýchkoli pinech)
22– I2C SCL (ale I2C lze spustit na kterýchkoli pinech)
23– SPI-MOSI
24
25– může budit zařízení ze spánku
– DAC1
– ADC2_CH8  (nelze s WiFi)
26– může budit zařízení ze spánku
– DAC2
– ADC2_CH9 (nelze s WiFi)
27– může budit zařízení ze spánku
– touch 7
– ADC2_CH7  (nelze s WiFi)
28
29
30
31
32– ADC1_CH4 – použitelný i s wifi
– může budit zařízení ze spánku
– touch 9
33– ADC1_CH5 – použitelný i s wifi
– může budit zařízení ze spánku
– touch 8
34– ADC1_CH6 – použitelný i s wifi
– může budit zařízení ze spánku
jen vstup, nemá pullup
35– ADC1_CH7 – použitelný i s wifi
– může budit zařízení ze spánku
jen vstup, nemá pullup
36– ADC1_CH0 – použitelný i s wifi
– může budit zařízení ze spánku
jen vstup, nemá pullup
37– ADC1_CH1 – použitelný i s wifi
– může budit zařízení ze spánku
jen vstup, nemá pullup
38– ADC1_CH2 – použitelný i s wifi
– může budit zařízení ze spánku
jen vstup, nemá pullup
39– ADC1_CH3 – použitelný i s wifi
– může budit zařízení ze spánku
jen vstup, nemá pullup

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.
    • ADC1_CH0 (GPIO 36)
    • ADC1_CH1 (GPIO 37)
    • ADC1_CH2 (GPIO 38)
    • ADC1_CH3 (GPIO 39)
    • ADC1_CH4 (GPIO 32)
    • ADC1_CH5 (GPIO 33)
    • ADC1_CH6 (GPIO 34)
    • ADC1_CH7 (GPIO 35)
  • 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.
  • Tyto piny při bootu posílají HIGH nebo PWM signál: 1, 3, 5, 6-11 (SPI flash), 14, 15.

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í.
  • Pro buzení zařízení ze sleepu je možné použít jen následující piny: 0, 2, 4, 12-15, 25-27, 32-39

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:
    • malá červená LED ze spodní strany desky (!) je na GPIO 33; svítí při LOW
    • velká bílá 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í
  • Aplikace:
  • 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.
  • Vlastnosti jednotlivých PINů:
    • GPIO12 – OK (může budit zařízení ze spánku; ADC2_CH5 – nelze s WiFi)
    • GPIO13 – přes 47k na 3V3, takže nelze použít pro analog in (může budit zařízení ze spánku)
    • GPIO15 – přes 47k na 3V3, takže nelze použít pro analog in (může budit zařízení ze spánku; při bootu posílá HIGH nebo PWM; řídí to, zda při startu vypisuje ESP32 na sériový port informace a pak je dále volně použitelný)
    • GPIO14 – OK (může budit zařízení ze spánku; ADC2_CH6 – nelze s WiFi; při bootu posílá HIGH nebo PWM)
    • GPIO2 – přes 47k na 3V3, takže nelze použít pro analog in (může budit zařízení ze spánku; touch 2 – možná kvůli tomu rezistoru nebude fungovat)
    • GPIO4 – při HIGH sepne „blesk“; (může budit zařízení ze spánku; touch 0 – možná kvůli tomu rezistoru nebude fungovat)
    • GPIO16 je na mých modulech stále high; podle schématu je zapojeno přes 10k na 3V3 a dále na pin CS# u PSRAM; používá se tedy asi pro řízení PSRAM a pro aplikaci není dostupné
    • GPIO0 – OK po bootu; LOW při bootu spouští programovací režim (může budit zařízení ze spánku; touch 1; ADC2_CH1 – nelze s WiFi)
    • GPIO3 – serial RxD, programovací port
    • GPIO1 – serial TxD, programovací port

LilyGO TTGO T-Energy

ESP32 s držákem na akumulátor 18650, obvodem pro řízení nabíjení a 8 MB PSRAM a malou spotřebou v deep sleep.

  • 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.

LilyGO TTGO T7 V1.4

Malá deska s ESP32, 8 MB PSRAM a napájecím/nabíjecím obvodem pro lithiový akumulátor (s konektorem 2p Molex Picoblade).

  • Shop. Domovská stránka produktu.
  • Pinout.
  • Schema.
  • LED
    • červená – svítí stále
    • zelená – na pinu 19, svítí při HIGH
    • modrá – nabíječka (bliká = není akumulátor, svítí = nabíjí, zhasnuto = nabito/provoz z akumulátoru)
  • měření akumulátoru je na pinu 35 ADC1_CH7
    • je ovlivněno spotřebou čipu a režimem provozu
    • přepočtové koeficienty pro provoz z akumulátoru (při napájení z USB ukazuje více):
      • procesor 240 MHz, flash 80 MHz, wifi:
        • double batteryVoltage = ((double) analogRead(35) ) * 3.3 / 4096.0 * 2.2175;
      • procesor 80 MHz, flash 40 MHz, bez WiFi
        • double batteryVoltage = ((double) analogRead(35) ) * 3.3 / 4096.0 * 2.2552;
  • spotřeba desky v deep sleep 0.90 mA (mj. kvůli té stále svítící červené LED)
  • spotřeba z akumulátoru za provozu je od 25 mA (CPU 80 MHz, flash 40 MHz, bez WiFi) až k 300 mA (WiFi, 240 MHz/80 MHz)
  • na pinu 32 je něco připojeného – netuším, co. Analogové čtení dává od 0.2 do 0.9 V; při provozu z baterie to má velký rozkmit, při napájení z USB malý. Ve schematu není zakresleno.
  • vybitý akumulátor nabíjí proudem 500 mA; s rostoucím napětím klesá proud; nabíjení končí na napětí cca 4.14 V

Waveshare ESP32 e-paper driver

1 thought on “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