Fyzikální kabinet FyzKAB
Články Moduly ESP32 a ESP32-CAM ESP32 – čidla a periférie ESP32 a ultrazvukový senzor HC-SR04

ESP32 a ultrazvukový senzor HC-SR04

Dalším senzorem, u kterého si ukážeme, jak jej připojit k vývojové desce s modulem ESP32 je ultrazvukový snímač HC-SR04. Ultrazvukový senzor slouží k určení vzdálenosti a využívá k tomu sonar. K modulu Arduino se často připojuje modul HC-SR04, který je levný a pro většinu aplikací dostačující. Zkusíme jej tedy připojit i k modulu ESP32.

ultrazvukový senzor HC-SR04

Ultrazvukový senzor HC-SR04, jak již bylo zmíněno, používá pro určení vzdálenosti k objektu sonar. Rozsah toto sonaru je od 2 cm do 400 cm (s přesností 0,3 cm), což je dobré pro většinu hobby projektů. Tento konkrétní modul je navíc dodáván s moduly ultrazvukového vysílače a přijímače, takže jej stačí opravdu jen připojit a začít měřit.

sensor module HC-SR04
Obrázek 1 – ultrazvukový senzor HC-SR04

Následující tabulka ukazuje klíčové vlastnosti a specifikaci ultrazvukového senzoru HC-SR04. 

Napájecí napětí 5 V DC
Pracovní proud 15 mA
Pracovní frekvence 40 kHz
Měřicí úhel 15°
Pin VCC Napájení senzoru (5 V)
Pin TRIG Pin spouštěcího pulzu (10 μms TTL pulz)
Pin ECHO Pin výstupu (TTL pulz, délka úměrná vzdálenosti)
GND zem GND

Jak funguje ultrazvukový senzor HC-SR04?

A už je tady zase ta fyzika! No, co jiného bychom na webu Fyzikální kabinet FYZKAB asi mohli čekat! Ultrazvukový senzor používá k určení vzdálenosti odrazu ultrazvukových vln. Celé to funguje na následujícím principu:

Ultrazvukový vysílač vydá vysokofrekvenční zvukový pulz (40 kHz), který se šíří vzduchem. Pokud narazí na překážku, odrazí se zpět a vrátí se do senzoru. Ultrazvukový přijímač přijme odražený zvuk (echo). Pro určení vzdálenosti nám tedy stačí změřit čas od vyslání sonarového pulzu do okamžiku jeho návratu. S přihlédnutím na rychlost zvuku ve vzduchu a dobu cesty (čas uplynulý mezi vysíláním a příjmem signálu) můžeme vypočítat vzdálenost k objektu podle následujícího vzorce:

vzdálenost = ((rychlost zvuku) × čas)/2

kde rychlost zvuku ve vzduchu při 20 °C je 343 m/s

Následující obrázek (obr. 4. 2) ukazuje celý tento proces z pohledu průběhu signálů modulu HC-SR04. TTL pulz o délce 10 μs na vstupním pinu TRIG spustí vysílání. Následuje vyslání osmi 40 kHz zvukových signálů. Po skončení posledního ze signálů se výstupní pin ECHO nastaví na úroveň HIGH, ze  které klesne na úroveň LOW až po přijetí navráceného zvukového signálu. Doba trvání úrovně HIGH na pinu ECHO tedy odpovídá času, který dosadíme do předchozího vzorce. A aby bylo fyzice učiněno zadost, je třeba ještě říci, proč je ve vzorci to dělení dvěma. Vysvětlení je jednoduché. Protože zvuk letí tam a pak zpět, skutečná vzdálenost k překážce je jen polovina vzdálenosti uražené zvukem.

signalovy diagram modulu HC-SR04
Obrázek 2 – průběh signálů modulu HC-SR04 při měření vzdálenosti

Chtělo by se říci, že když nyní víme, jak ultrazvukový senzor funguje, vrhneme se na jeho připojení k modulu ESP32. To jistě uděláme, ale nebude to tak rychlé, jak se můžete dočíst v řadě jiných návodů. Už nám to připadá skoro hloupé, ale i v tuto chvíli tu je problém!

Připojení HC-SR04 k ESP32

Myslíme si, že čtenář, který s námi již absolvoval některé předešlé články o připojování různých čidel k modulu ESP32, už asi začíná tušit, že se zde opět bude hovořit o napěťových úrovních. Bohužel je to tak! Zatímco v řadě různých návodů pojednávajících o připojení sonarového čidla HC-SR04 k modulu ESP32 se setkáte kupříkladu s následujícím „bezproblémovým“ schématem (viz obr. 3), my z toho teď začneme dělat vědu 😉.

ESP32 - Ultrasonic Sensor Wiring Diagram
zdroj obrázku: https://randomnerdtutorials.com/esp32-hc-sr04-ultrasonic-arduino/
Obrázek 3 – schéma propojení sonarového čidla a modulu ESP32, které je doporučováno na internetu

Na obrázku vidíme, že sonarové čidlo je napájeno napětím Vin desky ESP32, tedy 5 V. Signálové vodiče jsou připojeny přímo na GPIO piny. Jelikož jsme například u čidla BMP180 mohli vidět, že pětivoltové napájení ještě nemusí být problém, podíváme se na elektrické schéma sonarového čidla HC-SR04, tam bychom se měli dozvědět více.

HC-SR04 schema
Obrázek 4 – elektrické schéma sonarového čidla HC-SR04
(čidlo je vyráběno několika výrobci, schéma některých výrobců se může mírně lišit)

Naši pozornost by měl upoutat obvod EM78P153S v levém dolním rohu, ze kterého jsou vyvedeny signálové linky TRIG a ECHO přímo na výstupní piny. Tento obvod je napájen napětím 5 V a jak vstup P50 (pin 1), tak P67 (pin 2) pracují na pětivoltové TTL úrovni (viz katalogový list mikrokontroléru EM78P153S). V případě signálu TRIG je napětí drženo na nízké úrovni LOW (pomocí pull-down rezistoru ve vstupu obvodu) a externí startovní signál jej „nadzvedne“ na úroveň HIGH. To by se ještě třívoltovou logikou modulu ESP32 dalo zvládnout. Se signálem ECHO je to ale jinak. Výstupní úroveň HIGH jasně diktuje obvod EM78P153S a ten je pětivoltový a jeho výstup také. Přímé připojení modulu ESP32 k tomuto pinu je skutečný risk, jdoucí za hranici možností modulu ESP32! A je jedno, zda je výrobcem sonarového čidla daný výstup v mikrokontroléru EM78P153S programově nastaven jako otevřený kolektor s pull-up rezistorem nebo přímý TTL výstup.

Na druhou stranu musíme ale říci, že jsme se nenechali vyděsit a skutečně jsme zapojení z obrázku 2 vyzkoušeli. A ono funguje! Modul ESP32 to (asi) přežil, takže řada čtenářů se bude divit, proč tedy plašíme. Druhá část čtenářů se zase bude podivovat nad pětivoltovou „výdržností“ modulu ESP32. Toto je věčné téma! Opět to vypadá, i když sám výrobce modulu ESP32 to neustále vyvrací, že modul ESP32 vydrží více, než je deklarováno. Otázkou je ale jak dlouho modul ESP32 za takových podmínek vydrží pracovat. Nechceme se do těchto diskuzí pouštět, my zde chceme prezentovat korektní zapojení sonarového čidla k modulu ESP32.

To, že výše uvedené zapojení není správné, si uvědomují i jiní autoři a zkoušejí tento problém řešit, například:

  • Napájení sonarového čidla HC-SR04 napětím 3,3 V – světe div se, ono to funguje! Díky tomu najdete i tyto možnosti zapojení. Problém je, že čidlo pak měří špatně. Opakované měření stejné vzdálenosti vykazuje značný rozptyl. Takže pokud bychom chtěli pomocí sonaru jen určovat přítomnost překážky, tak by to použít asi šlo, ale na určení přesné vzdálenosti to rozhodně není (zapomeňte na přesnost 0,3 cm!)
  • Použití jiného čidla – to zase není tak špatný nápad. Problém 3,3 V nemá jen modul ESP32, ale i další, například Arduino DUE nebo Raspberry. Někteří výrobci na to již zareagovali a začali vyrábět čidla kompatibilní s čidlem HC-SR04, jen jeho pracovní napětí je nyní v rozsahu 3–5 V. Kupříkladu existuje varianta HC-SR04P (Low-Voltage UltraSonic Distance Sensor), který má již tento napěťový rozsah. Ale bohužel v ČR se zatím nedá koupit. Obdobně existuje čidlo PARALLAX 28015, které není zcela kompatibilní (má jen jeden společný řídicí pin - START/ECHO), ten lze v ČR koupit, ale jeho cena je „za hranicí dobrého vkusu“.

  • Úprava výstupní napěťové úrovně na pinu ECHO je opět kouzlením pomocí napěťového děliče. Návod na tuto úpravu lze také najít, čeká vás přeškrabování vodiče na desce plošného spoje a „bastlení“ odporového děliče z externích rezistorů. Následující fotografie asi vše řekne za nás. 😕
nabastleny delic
Obrázek 5 – vytvoření napěťového děliče na pinu ECHO z externích rezistorů

Opravdu vede cesta jen těmito „nábližkami“?

Jde to i jinak – aneb opět převodník logické úrovně (5 V a 3,3 V) na scéně!

Obdobně jako jsme nabádali v případě připojení pětivoltového displeje, postačí použít převodník napěťových úrovní! Jak prosté, milý Watsone! Jediný rozdíl proti případu s pětivoltovým LCD, zde nebudeme používat převodník pro I²C sběrnici, ale UART převodník úrovní 5 V-3,3 V. V případě dvojnásobného převodníku je cena necelou dvacku! Je to opravdu tak velká investice, aby se internet musel hemžit schématy zapojení, která už v samé své podstatě ohrožovali modul ESP32, jehož cena je několikanásobně vyšší? Opravdu je argument: „Ale ono to takhle funguje“, tím jediným, co nás opravňuje k legalizaci prasáren?

prevodnik 5V-3_3V
Obrázek 6 – 2× UART převodník napěťových úrovní 5 V-3,3 V

Jak vidíme, osazení tohoto převodníku (viz obrázek 6) je trochu jiné než v případě I²C převodníku. I když to není úplně pravda. V případě linky označené TX (signál z 3,3 V na 5 V) jde o stejný princip jako u I²C sběrnice – dokonce je tato linka obousměrná a opravdu ji lze použít i pro I²C sběrnici. V případě linky RX (signál z 5 V na 3,3 V) jde o „úplně normální“ dělič napětí a pochopitelně tato linka by obousměrně nebo pro I²C použít nešla. Schéma jednoho ze dvou kanálů ukazuje následující schéma:

schema prevodniku 5V-3_3V
Obrázek 7 – elektronické schéma napěťového převodníku (vlevo linka TX, vpravo linka RX)

Námi navrhované připojení sonarového čidla HC-SR04 k modulu ESP32 je tedy dle následujícího diagramu (viz obr. 8). De facto jde o stejné zapojení jako je na obrázku 2, jen jsou signály TRIG a ECHO připojeny přes jeden kanál napěťového převodníku 5 V-3,3 V. Je potřeba zkontrolovat, zda jsou země na převodníku propojeny nebo je propojit připojením vodiče GND k oběma zemi na straně LV i HV. A máme vyřešeno.

schema zapojeni s prevodnikem
Obrázek 8 – schéma připojení sonarového čidla k modulu ESP32 pomocí napěťového převodníku

Následující tabulka ukazuje propojení jednotlivých pinů vývojové desky s modulem ESP32, napěťového převodníku a sonarového čidla HC-SR04:

ESP32 3,3 V-5 V převodník Ultrazvukový senzor
VIN HV VCC
3V3 LV ---
GPIO 5 TXI TXO TRIG
GPIO 18 RTO RTI ECHO
GND GND GND

Ovládací program v prostředí Arduino IDE

Vývojovou desku s modulem ESP32 naprogramujeme pomocí prostředí Arduino IDE. Oproti jiným čidlům ultrazvukový senzor HC-SR04 nepotřebuje instalaci žádné speciální knihovny. Můžeme tedy rovnou zapsat následující program (vysvětlení kódu je opět v komentářích programu)

Kód (určení vzdálenost mezi senzorem a překážkou)

/* Sonarove cidlo – ukazka */

const int trigPin = 5;   // konstanta urcujici pin TRIG
const int echoPin = 18;  // konstanta urcujici pin ECHO

#define SOUND_SPEED 0.034   //definice rychlosti zvuku (cm/us)

long duration; // promenna pro namereny cas (us)
float distanceCm;   // promenna pro vypocitanou vzdalenost

// funkce SETUP se spusti jednou pri stisknuti tlacitka reset nebo pri zapnuti desky.
void setup() {
  Serial.begin(115200);   // prenosova rychlost serioveho vystupu
  pinMode(trigPin, OUTPUT);   // nastaveni pinu trigPin na vystup
  pinMode(echoPin, INPUT);   // nastaveni pinu echoPin na vstup
}

// funkce LOOP bezi stale dokola.
void loop() {
  digitalWrite(trigPin, LOW);   // nastaveni TRIG na uroven LOW
  delayMicroseconds(2);   // 2us pockat, aby se se LOW ustalilo
  digitalWrite(trigPin, HIGH);   // zacatek 10us startovniho pulzu (TRIG na HIGH)
  delayMicroseconds(10);   // cekani 10us
  digitalWrite(trigPin, LOW);   // konec start pulze (trig na LOW)

  duration = pulseIn(echoPin, HIGH);   // urci pocet us stavu HIGH na pinu ECHO

  distanceCm = duration * SOUND_SPEED/2;   // vypocet vzdalenosti z casu a rychlosti

  Serial.print("Distance (cm): ");   // vypis vysledku na Serial Monitor
  Serial.println(distanceCm);
delay(5000);   // 5s pocakt, pak nasleduje dalsi mereni
}

Po kompilaci a nahrání kódu do vývojové desky otevřete Serial Monitor (součást prostředí Arduino IDE). Při nastavení sériového monitoru na přenosovou rychlost 115 200, po stisknutí tlačítka RST na desce ESP32 a restartu desky by se v okně Seriál Monitory měla každých 5 vteřin vypisovat vzdálenost k nejbližšímu objektu. Něco, jako je znázorněno na obrázku níže.

vystup na Serial Monitoru
Obrázek 9 – ukázka výstupu naměřené vzdálenosti

Závěr

V tomto článku jsme si opět ukázali základní připojení jednoho z mnoha čidel, které lze využívat ve svých projektech. Opět samotná aplikace daného čidla závisí na konkrétní představě daného vývojáře. Už neřešíme, zda tímto čidlem budete měřit výšku hladiny ve studni nebo navigovat po bytě robotický cvičný cíl pro Vašeho kocoura. Hlavním přínosem bylo především opětovné upozornění na nutné respektování napěťových úrovní jednotlivých funkčních částí celého zapojení. Je skvělé, jak internet umožňuje sdílet své projekty a zkušenosti celé řadě vývojářů z široké „bastlířské“ komunity. Ale i přes tuto možnost pouhého přebírání již fungujících řešení a zapojení, je třeba vždy tyto „levně“ získané informace podrobit alespoň částečně kritickému myšlení. Dostupnost datových listů jednotlivých součástek a modulů (a hlavně jejich studium!) je oním pověstným „B“ k prvotnímu „A“, které přestavuje tvůrčí přístup Crtl+C a Ctrl+V.

Budeme rádi, pokud stejně obezřetně přistoupíte i k našim článkům a pokud zde najdete nějaké nesrovnalosti, dejte nám to vědět. Ani naše články nejsou řádným neochvějným dogmatem a rádi pro změnu zase načerpáme Vaše zkušenosti – a to jen o sonarovém čidle HC-SR04 a modulu ESP32!

UPOZORNĚNÍ:
Nesouhlasíme s vyřazením Newtonových zákonů, Ohmova zákona a zákona zachování energie z učiva fyziky základních škol v České republice!