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.

Obsah:

  • Obecné poznámky
    • Základní odkazy
    • Vlastnosti hardware
    • Srovnání ESP32, ESP32-S2, ESP32-C3
    • Funkce jednotlivých pinů – původní ESP32
    • Funkce jednotlivých pinů – ESP32-C3
    • Deep sleep / low power
    • Různé
  • Konkrétní desky:
    • LilyGO TTGO T-Display
    • ESP32-CAM
    • LilyGO TTGO T-Energy
    • LilyGO TTGO T7 V1.4
    • Waveshare ESP32 e-paper driver
    • LILYGO T5 4.7 inch E-paper (ESP32 V3 16MB FLASH 8MB PSRAM)
    • ESP32-C3 bez USBtoSerial čipu

Základní odkazy

Vlastnosti hardware

  • Běžné funkce:
    • ESP32 GPIO interrupty.
    • Celkem 18 12bitových A/D vstupů ve dvou bankách (ADC1, ADC2).
    • 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.
    • GPIO 34-39 jsou jen vstupní a nemají zabudované pull-upy.
  • 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.
    • ULP koprocesor – Ultra Low Power koprocesor schopný provádět jednoduchý kód i když je procesor v deep sleep. Má k dispozici 8 kB SRAM.

Srovnání ESP32, ESP32-S2, ESP32-C3

Detailní srovnání např. zde: https://socialcompare.com/en/comparison/esp8266-vs-esp32-vs-esp32-s2

ESP32ESP32-S2ESP32-C3
ProcesorTensilica Xtensa LX6
32 bit Dual-Core @ 160 / 240Mhz
Tensilica Xtensa LX7
32 bit Single-Core @ 240Mhz
RISC-V 32-bit
Single-Core @ 160 MHz
Specifický datasheetESP32ESP32-S2ESP32-C3
Podpora v ESP32 Arduino core1.0.x1.0.x2.0.x
RAM520 kB320 kB400 kB
Bluetooth4.2není5.0
USB host (+ sw implementace USB client)neANOne
Přímá implementace serial-over-USB client (USB-CDC) / USB JTAGneneANO
EthernetANOnene
PSRAMANOANOANO (čip podle datasheetu podporuje, nevím o takovém modulu)
Hall senzor (magnetické pole)ANOnene
Teplotní senzorneANOANO
DACANOANOne
Nativní rozhraní pro kameru a LCDneANOne
Porovnání ESP32, ESP32-S2 a ESP32-C3

TODO: ESP32-S3


Funkce jednotlivých pinů – původní ESP32

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ů (původní ESP32)

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

Funkce jednotlivých pinů – ESP32-C3

Všechny piny jsou in/out, všechny piny mají možný pull-up.

Info: https://api.riot-os.org/group__cpu__esp32__esp32c3.html a https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf

pinfunkceomezení
0ADC1 factory-calibrated.;
RTC GPIO = can be used in deep-sleep mode
1ADC1 factory-calibrated.;
RTC GPIO = can be used in deep-sleep mode;
2ADC1 factory-calibrated.;
RTC GPIO = can be used in deep-sleep mode
boostraping = nastavuje chování při bootu
3ADC1 factory-calibrated.;
RTC GPIO = can be used in deep-sleep mode;
4ADC1 factory-calibrated.;
RTC GPIO = can be used in deep-sleep mode;
default I2C SCL;
external JTAG TMS
5ADC2 – není použitelné najednou s WiFi, není kalibrované;
RTC GPIO = can be used in deep-sleep mode;
Vref can be read with function adc_line_vref_to_gpio at GPIO5;
default I2C SDA;
external JTAG TDI
6external JTAG TCKpři startu projde krátký impulz (není stabilní) – LOW 5 ns
7external JTAG TDOpři startu projde krátký impulz (není stabilní) – LOW 5 ns
8boostraping = nastavuje chování při bootu
9UART1_RXD – lze přemapovatboostraping = nastavuje chování při bootu;
při bootu zapnut pullup
10UART1_TXD – lze přemapovatpři startu projde krátký impulz (není stabilní) – LOW 5 ns
11
12při bootu zapnut pullup
13při bootu zapnut pullup
14při bootu zapnut pullup
15při bootu zapnut pullup
16UART2_RXD – lze přemapovatpři bootu zapnut pullup
17UART2_TXD – lze přemapovatpři bootu zapnut pullup
18lze použít pokud nepoužíváte USBSerial / USB JTAGUSB JTAG D- (white);
při startu projde krátký impulz (není stabilní) – HIGH 50 ms
19lze použít pokud nepoužíváte USBSerial / USB JTAGUSB JTAG D+ (green)
20UART0R_XDpři bootu zapnut pullup; při bootu projde krátký impulz (není stabilní)- LOW 5 ns
21UARTU0_TXDpři bootu zapnuto jako výstup

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

Různé

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

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


LILYGO T5 4.7 inch E-paper (ESP32 V3 16MB FLASH 8MB PSRAM)

How to turn off the blue LED light?
To turn off the blue LED, you must call epd_poweroff_all(), which will turn off the entire power supply controlled by PWM_EN. Note that it cannot be turned off when powered by USB. It can only be turned off when powered by battery. For details, refer to examples/demo


ESP32-C3 bez USBtoSerial čipu

ESP32-C3 = Risc-V jádro. Má i USB rozhraní, takže pro „sériový port přes USB“ a programování není potřeba USB-to-Serial adaptér.

Nicméně:

  • Je plně a spolehlivě podporováno až v ESP32 Arduino Core 2.0.5 (= je potřeba zaktualizovat podporu desek ESP32 v Arduino, na 1.0.6 to nefunguje)
  • Má dvě sady serial rozhraní:
    • Fyzické rozhraní Serial (UART0, funkce Serial.println a další), které je možné přes usb-to-serial připojit na jiný USB kabel než je ta nativní instance. Na toto rozhraní jdou debug hlášky arduino ESP32 core a boot messages!
    • Virtuální USBSerial (UART1, funkce USBSerial.println a další), napojený na implementaci USB rozhraní v ESP32 a použitelné i bez externího čipu
  • Debugovací zprávy ze Serial na USBSerial lze přesměrovat nastavením build parametru USB-CDC on boot : ENABLED. Pak také i Serial.prinln posílá na USBSerial.
  • V aplikaci tedy musíte konfiguračně používat Serial (ESP32, ESP32-C2) a USBSerial (ESP32-C3 bez zapnutého USB-CDC on debug).
  • Pokud je zařízení v deep sleep, pokus o programování přes USBSerial ho nevzbudí a tedy selže. Je třeba před programováním udělat standardní dvojklik – stisknout a držet BOOT, stisknout RESET, pak pustit BOOT.
  • Tlačítko BOOT je (na rozdíl od ESP32 a ESP8266) na pinu 9.

POZOR! Pokud v aplikaci použijete tento standardní kód pro inicializaci Serial portu a máte zapnuto USB-CDC on boot: enabled (tj. Serial je ta nativní implementace USB CDC):

Serial.begin( 115200 );
while(!Serial) delay(1);

tak se to na tom druhém řádku zasekne v případě, že není není připojený sériový kabel k počítači na kterém běží nějaký serial monitor. Tj. stav Serial==false znamená, že není spojení s protistranou (zatímco na hardwarové lince to znamená jen to, že ještě nedoběhla inicializace sériového portu).

Ekvivalentně pokud máte USB-CDC on boot: disabled a výše uvedený kód použijete s USBSerial.

Obecně: pro sériový port přes nativní USB implementaci je while(!Serial) špatný nápad.


Konkrétní deska https://www.aliexpress.com/item/1005004477968500.html je bez USB-to-Serial čipu.

  • musí být flash mode: DIO , jinak nenabootuje
  • LED D4 = IO12, D5 = IO13
  • tlačítko BOOT = IO9

dokumentace https://wiki.luatos.com/chips/esp32c3/board.html

Advertisement

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 )

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