Vývojová deska SP32-Cam je malé zařízení, které pro svůj účel, tj. snímání okolí kamerou, je dostačující a má překvapivý výkon. Bohužel, pokud z něj chceme udělat komplexnější platformu, narazíme na několik problémů. Jeden z nich je čtení analogových hodnot z externích senzorů.
Při použití klasické ESP32, lze zjistit, že není problém k takové desce připojit externí senzor a číst analogové hodnoty. Bohužel deska ESP32-Cam tohle tak jednoduše neumožňuje. Když se podíváme na piny této desky, zjistíme, že tam nejsou žádné volné pro externí senzor.
Všechny piny jsou obsazeny připojenou kamerou, SD kartou nebo Wi-Fi. Pokud chceme používat tyto součásti, tak přesto, že se piny tváří jako volné, vždy jedno ze zařízení nebude fungovat.
OV2640 CAMERA | ESP32 | Variable name in code |
D0 | GPIO 5 | Y2_GPIO_NUM |
D1 | GPIO 18 | Y3_GPIO_NUM |
D2 | GPIO 19 | Y4_GPIO_NUM |
D3 | GPIO 21 | Y5_GPIO_NUM |
D4 | GPIO 36 | Y6_GPIO_NUM |
D5 | GPIO 39 | Y7_GPIO_NUM |
D6 | GPIO 34 | Y8_GPIO_NUM |
D7 | GPIO 35 | Y9_GPIO_NUM |
XCLK | GPIO 0 | XCLK_GPIO_NUM |
PCLK | GPIO 22 | PCLK_GPIO_NUM |
VSYNC | GPIO 25 | VSYNC_GPIO_NUM |
HREF | GPIO 23 | HREF_GPIO_NUM |
SDA | GPIO 26 | SIOD_GPIO_NUM |
SCL | GPIO 27 | SIOC_GPIO_NUM |
POWER PIN | GPIO 32 | PWDN_GPIO_NUM |
MicroSD card | ESP32 |
CLK | GPIO 14 |
CMD | GPIO 15 |
DATA0 | GPIO 2 |
DATA1 / flashlight | GPIO 4 |
DATA2 | GPIO 12 |
DATA3 | GPIO 13 |
Kam připojit analogový senzor
Na desce se nachází signalizační dioda na GPIO_33. Když se podíváme do schématu, je vidět, že je připojena ke standardnímu pinu desky. A právě to nám umožní připojit externí čidlo pro analogové čtení.
Postup jak připojit externí senzor místo LED1
1. Musí se odpájet dioda LED1. Dioda je tam přilepena a pouhým tavením cínu ji z desky nelze dostat. Musí se použít trochu síly, ale opatrně, protože kontakty se rádi odtrhávají.
2. Na anodu se připájí drátek, který bude sloužit jako vstup pro externí senzor.
Jak měřit napětí
Důležité informace pro práci se vstupy.
- ESP32-Cam má vstupy, na které lze přivést maximálně 3.3V.
- Napájení desky ESP32-Cam je 5V, ale v pohodě snese 7.2V, takže lze použít dvě dobíjecí baterie po 3.6V
Pro změření dostupného napětí z baterií a tím hlídat, zda není nutné baterie dobýt, se musí navrhnout dělič napětí, který hodnotu maximálního napětí baterií sníží na povolených 3.3V.
Dělič napětí je jednoduchý obvod, který redukuje velké napětí na menší.
Pomocí 2 rezistorů a vstupního napětí lze vytvořit výstupní napětí, které je zlomkem vstupního. Níže je vzorec, který se používá k výpočtu rezistorů, které potřebujete v obvodu:
Takže finální schéma vypadá takto:
Samozřejmě, že pro vstupní napětí 7.2V se budou hodnota rezistoru lišit (1.2-1.4kΩ). Online kalkulátor napěťového děliče - otevřít.
Lze také použít obousměrný konvertor logické úrovně. Bi-Directional Logic Level Converter (LLC) snižuje napětí ze signálu. To je doporučená metoda pro vyrovnání signálů řazení, které vyžadují vysokorychlostní komunikaci (sériová komunikace s vysokou přenosovou rychlostí, I2C atd.).
Signál s vysokým napětím se jednoduše připojí na VN piny a na druhé straně (LV) vystoupí signál s nižším napětím. S deskou zobrazenou na obrázku jsou k dispozici 4 kanály.
Čtení hodnoty z napěťového děliče
#define PIN_IN_VOLT 33 // Monitoring voltage
#define LED_SIGNAL 14 // LED signal for on/off battery
void setup() {
//GPIO input monitor voltage value
pinMode (PIN_IN_VOLT, INPUT);
//GPIO input signal LED ON/OFF
pinMode (LED_SIGNAL, OUTPUT);
digitalWrite(LED_SIGNAL, HIGH);
}
void loop() {
int voltageSer=analogRead(PIN_IN_VOLT);
float voltValue = ((voltageSer * 3.3) / 4095);
Serial.print(voltageSer); Serial.print(" - "); Serial.println(voltValue);
if(voltValue<1.8){
digitalWrite(LED_SIGNAL, LOW);
delay(1000);
digitalWrite(LED_SIGNAL, HIGH);
delay(1000);
}else{
digitalWrite(LED_SIGNAL, HIGH);
delay(10000);
}
}
Základní kód je velmi jednoduchý. Na pinu 14 je připojena LED dioda, která signalizuje zapnutí systému. Na pin 33 se přivádí signál v podobě analogových hodnot, které se přepočítávají na napětí. V sériovém monitoru lze vidět hodnoty odpovídající míře napětí. Pokud je na pin 33 přiváděno maximální možné napětí tak v sériovém monitoru je hodnota 4095.
Čtení analogové hodnoty pomocí ESP32 znamená, že můžete měřit různé úrovně napětí mezi 0V a 3.3V. Naměřenému napětí je pak přiřazena hodnota mezi 0 a 4095, kde 0V odpovídá 0 a 3.3V odpovídá 4095. Jakékoli napětí mezi 0V a 3.3V bude mít odpovídající hodnotu mezi nimi.
Pro testování byl celý systém napojen na regulovatelný zdroj.
Po snižování napětí pod kritickou hodnotu, kdy systém ještě pracuje, začne dioda na pinu 14 blikat.
ADC je nelineární
V ideálním případě bychom při použití pinů ADC ESP32 očekávali lineární chování. To se však neděje. Toto chování znamená, že ESP32 není schopen rozlišit 3.3V od 3.2V. Získáte stejnou hodnotu pro obě napětí: 4095. Totéž se děje pro velmi nízké hodnoty napětí: pro 0V a 0.1V získáte stejnou hodnotu: 0. Na to musíte pamatovat při použití pinů ADC ESP32.
Graf hodnot v závislosti na snižujícím se napětí.
Podobný zdroj pro desku ESP32:
https://randomnerdtutorials.com/esp32-adc-analog-read-arduino-ide/
https://www.electronicshub.org/esp32-adc-tutorial/