Lekce 9 - Měříme vzdálenost s HC-SR04
06.03.2013 14:54V tomto díle si ukážeme, jak efektivně a celkem levně měřit vzdálenost pomocí ultrazvukového modulu HC-SR04. Jedná se o kompaktní modul o velikosti velikosti cca 44x20mm, který je již samostatně funkční a není již potřeba připojovat další součástky. Jeho cena se pohybuje okolo 100Kč. Má celkem 4 piny z čehož je jeden napájecí, druhý pro vstupní puls, další pro výstupní puls a samozřejmně také zem. Je možné ho napájet 5V.
Pokud sjte si zapojili 7-segmentový displej z minulého dílu, můžete toto zapojení využít a zobrazovat naměřenou vzdálenost na tomto displeji, nebo informace z měření do počítače a zobrazovat pomocí SerialMonitor. Samozřejmně můžete použít i jiné druhy zobrazení hodnoty na jiném druhu dipleje tak i pomocí řade LED diod připojených k Arduinu.
Nejdříve si ukážeme základní zapojení pouze s ultrazvukovým modulem. Schéma nepřikládám, je tak jednoducjé, že by byla ztráta času ho vytvářet. Modul je také hezky popsaný, takže by neměl být problém.
Program pro měření vzálenosti je opravdu jednoduchý:
#define ECHOPIN 2 // Echo pin z HC-SC04 na pin 2 #define TRIGPIN 3 // Trig pin z HC-SC04 na pin 3 void setup() { //Nastaví sériovou komunikaci Serial.begin(9600); //Nastaví pin 2 jako vstupní pinMode(ECHOPIN, INPUT); //Nastaví pin 3 jako výstupní pinMode(TRIGPIN, OUTPUT); } void loop() { // Vyšle impuls do modulu HC-SR04 digitalWrite(TRIGPIN, LOW); delayMicroseconds(2); digitalWrite(TRIGPIN, HIGH); delayMicroseconds(10); digitalWrite(TRIGPIN, LOW); // Spočítá vzdálenost float distance = pulseIn(ECHOPIN, HIGH); distance= distance*0.017315f; // odešle informace na sérivý port Serial.print(distance); Serial.print("cm\n"); //počká 1 sekundu delay(1000); }
Jak můžete vidět v kódu, objevila se nám tam nová funkce a to pulseIn(pin, HIGH). Tato funkce vrací počet mikrosekund od detekovaní pulsu a to buď v hodnotě LOW nebo HIGH. Takže k vysvětlení. Po vyslání impulsu do modulu program počká na zpětné odeslání pulzu od modulu, kdy funkce pulseIn() nám vrátí potřebný počet mikrosekund. S tímto číslem můžeme dále pracovat. Vezmeme v úvahu rychlost zvuku 346,3 m*s-1 a to při teplotě suchého vzduchu 25°C. To znamená, že za 1mikrosekundu urazí v metrech 346,3/1000000 což je 0,0003463 metru. Převedo na cm to je 0,03463cm/mikrosekundu. Vzhledem k tomu, že signál jde od čidla k předmětu, kde se odrazí a zase zpět, musíme tuto vzdálenost ještě vydělit číslem 2. Výsledek je. že se vzdálenost bude rovnat počtem mikrosekund násobených číslem 0,017315. Výsledek zašleme na seriový port, kde se každou vteřinu zobrazí.
Tak doufám, že Vám vše funguje. Nezapomeňte si nastavit stejnou rychlost v Serial Monitoru jako máte v programu. Návod bude stejný jako v lekci zde.
Meření je docela přesné, pouze v zapojení s displejem jsem nechal přesnost na celé centimetry. V profesionálním meření je třeba počítat, že rychlost zvuku se bude nepatrně měnit v závislosti na teplotě, vlhkosti a tlaku vzduchu.
———
ZpětDiskusní téma: Lekce 9 - Měříme vzdálenost s HC-SR04
Datum | 07.02.2023 |
---|---|
Vložil | Ondra |
Titulek | funkce pulse in |
Podle me funkce pulsein vam bude merit blbosti.
V prekladu znamena ze pokud je nastaveno na echo=high potom funkce ceka az se zmeni signal z low na high a potom zacne merit cas a potom zastavi timer az prejde echo z high do low.
Ale vy potrebujete merit skutecny cas ktery ubiha jiz od doby kdy aktivujete PIN trig.
Podle me na to takhle jednoduse funkce pulsein nejde pouzit - ta vam meri delku pulsu (viz vyse) a nikoliv dobu od aktivace trigeru
Reads a pulse (either HIGH or LOW) on a pin. For example, if value is HIGH, pulseIn() waits for the pin to go from LOW to HIGH, starts timing, then waits for the pin to go LOW and stops timing. Returns the length of the pulse in microseconds or gives up and returns 0 if no complete pulse was received within the timeout.
———
Datum | 19.12.2018 |
---|---|
Vložil | dddddddddddddd |
Titulek | je to gud |
smrdi mi nohy
———
Datum | 30.07.2017 |
---|---|
Vložil | Michal |
Titulek | Měniče proti sobě |
Zdravím Vás, měření vzdálenosti u tohoto modulu funguje jen na bázi odrazu? Přemýšlel jsem nad tím, zda by to fungovalo, kdyby se měniče vyletovaly, připájeli na původní místa pomocí kabelů a umístily proti sobě tj. že by signál z T šel přímo do R bez odrazu. Zkoušel to někdo?
———
Datum | 24.10.2016 |
---|---|
Vložil | Karel |
Titulek | vrácená hodnota mimo rozsah |
co vrátí čidlo pokud měří jiný rozměr než pro které je určeno ?
———
Datum | 14.10.2016 |
---|---|
Vložil | radek |
Titulek | více senzorů |
je možno, popřípadě jak zapojit více senzorů do jednoho ardurina mega? (jmenovitě 5)
———
Datum | 27.05.2015 |
---|---|
Vložil | gilhad |
Titulek | Arduino Nano |
Zkusil jsem tohle měření s Arduino Nano a dostával jsem výsledky o polovinu větší, tak jsem si to upravil na:
distance= distance*0.017315f /1.5;
a už to běhá správně. Asi chyba v měření času, budu to muset někdy otestovat víc.
Obecně by ten vzorec měl asi být ve tvaru
distance= zmereny_cas * konstanta + offset;
protože při měření a zpracování dochází k drobnému zpoždění a taky potřebujeme zahrnout místo, odkud tu vzdálenost měříme. Asi bych pro přesné hodnoty udělal sadu měření na různé vzdálenosti a výše zmíněné konstanty z ní dopočítal, abych získal hodnoty kalibrované pro své konkrétní zařízení a zapojení.
———
Datum | 07.07.2017 |
---|---|
Vložil | Ďurislaw |
Titulek | Re: Arduino Nano |
Hmmm, potrebujem poradiť :
čo znamená "f" vo vzorci distance= distance*0.017315f /1.5;
Parameter ? - Aký
Dajaká hodnota ? - Aká, nikde ani zmienka
Prečo je teda vo vzorci uvedená ?
:)))
———
Datum | 20.08.2017 |
---|---|
Vložil | Float |
Titulek | Re: Re: Arduino Nano |
Jedná se o datový typ float. Za ten se píše f.
———
Datum | 22.08.2017 |
---|---|
Vložil | Ďurislaw |
Titulek | Re: Re: Re: Arduino Nano |
Ďakujem :-))
———
Datum | 21.05.2015 |
---|---|
Vložil | Piter |
Titulek | Měření vzdálenosti |
Problém vyřešený s HC-SR04 :-) .Nakonec byl na tom Ultrasonic vadný odpor R8.Výměna za novej odpor s hodnotou 4,7Kohmu.Ten odpor jsem zjistil že od kamaráda který má ten stejný typ.Jinak všem děkuji za spolupráci.