Lekce 9 - Měříme vzdálenost s HC-SR04

06.03.2013 14:54

V 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ět

Diskusní téma: Lekce 9 - Měříme vzdálenost s HC-SR04

Datum
Vložil
Titulek

3ks ultrasonic 1xtrigger

Zdravím , potřeboval bych ušetřit nějaký ten pin na arduinu a potřebuji použít 3ks ultrazvuk. čidel , napadá vás jak vyřešit program pro obsloužení 3 čidel s použitím společného trig signálu ? nějak se mi to nedaří
Díky
Packa

Datum
Vložil
Titulek

Re: 3ks ultrasonic 1xtrigger

Nejtriviálněji: 1 vývod (OUT) použít pro společně spojené Trig senzorů a 3 vývody (INP) pro každý jeden vývod Out senzoru. Programově pošlu Trig a přečtu délku pulzu na 1.Out, pošlu druhý Trig a přečtu délku pulzu na 2. Out a opět pošlu Trig a přečtu délku pulzu na 3. Out. Počkám, kolik potřebuji (např.500ms) a jedem dál - dokola = v Loop.
Pak je možno třeba použít knihovnu NewPing, která umožňuje 1 nebo více senzorů.

Datum
Vložil
Titulek

X ks ultrasonics

Ja by som sa chcel spýtať či by bolo možné pripojiť napríklad aj 30 ultrasonic senzorov.
1. Napadá mi riešenie dodatočného IO dekodera za dig. vystupy z arduina a dekoder by mohol postupne cez 30 tranzistorov "volať" aj 30 senzorov na analog. vstup Arduina.
2. Taktiež som sa dočítal o 1-wire protokole, ktorý ale pri distance senzorov neviem nájsť.
Prosím o radu zapojenia pre 1. možnosť, alebo ak by niekto vedel o nejakej možnosti riešenia 2., taktiež by som bol veľmi vdačný.

Datum
Vložil
Titulek

Re: X ks ultrasonics

Ahoj o5, ak to aj niekto číta. Podarilo sa mi vyriešiť zapojenie jedneho arduina, momentalne minimalne pre 255 senzorov a postup ma potencial aj pre podstatne väčšie množstvo. Chcem sa spýtať ale na jednu vec. Všimol som si že ak sa prúd, podľa zapojenia, môže ocitnúť aj na Echo pin-e tak sa vytvori nekonečný odpor. Nemáte niekto nejaký naozaj podrobný datasheet kde je celé zapojenie senzora aby som mal šancu prísť na to prečo sa tak správa?

Aj keď taký nemáte ocením aj správu typu, "prepáč, neviem o tako datasheet-e" :)

Datum
Vložil
Titulek

Napájení

Mám problém s napájením, čidlo nemá skoro žádný odběr a serial monitor zobrazuje 0.02cm furt dokola. Zkoušel jsem napájení 3,3-8V a bylo to furt stejné. Celá destička s čidlem vypadá ok, nic nechybí a zapojení drátů jsem kontroloval 100x. Při odpojení napájení čidla jsou hodnoty taky 0.02cm. Takže koupit nové čidlo??

Datum
Vložil
Titulek

úrprava na měřič rychlosti

Zajímalo by mě, jestli by to šlo programově předělat na měření rychlosti, když už teď měřím vzdálenost, tak podle toho by šla dopočítat i rychlost měřeného objektu že? Díval jsem se, že maximální dosah signálu je cca 450cm. úhel vysílání je cca 15°.
Ptám se proto, že už delší dobu přemýšlím nad výrobou měřiče rychlosti hokejovéh puku, který poletí až 130 km/h. Myslíte, že bych byl schopen zachytit, takový malý předmět v tak velké rychlosti na tak malou vzdálenost?

Datum
Vložil
Titulek

Re: úrprava na měřič rychlosti

radary pro měření rychlosti fungují na principu doplerova jevu (to znamená že když se těleso od kterého se vlny odrážejí pohybuje, mění se frekvence (jako když jede třeba sanitka a když se blíží, má vyšší tón houkačky než když se vzdaluje))

Datum
Vložil
Titulek

Re: Re: úrprava na měřič rychlosti

Chápu to dobře že to nejde

Datum
Vložil
Titulek

Re: úrprava na měřič rychlosti

V praxi při hře je to podle mě nereálné, ale umím si představit, že by tě zajímala rychlost, jakou dokáže hráč udělit puku. To znamená postavit puk na místo měření a dát "golfáka". Pak bych asi uvažoval nad principem dvou optických závor kousek za sebou.

Vzpomněl jsem si teď na video, kde měřili rychlost kulky z pistole a prováděli to tak, že byly za sebou dvě cívky ve tvaru mezikruží a střílelo se jejich prostředkem.

Datum
Vložil
Titulek

Re: úrprava na měřič rychlosti

Rychlost puku:
130 km/h = 130* 1000/3600 m/s = 36.11 m/s

doba pobytu v meritelnem dosahu:
4.5m / 36.11m/s = 0.124 s

rychlost zvuku ~ 346 m/s, vzdalenost 9 m (2x450cm) urazi za 0.026s, mereni samo ma rezii v radu desitek az stovek mikrosekund, pocitejme 1 milisendu.

Tedy objekt ve vzdalenosti 4.5m jsme schopni zmerit za 0.027 s.

puk bychom tedy byli schopni zmerit behem pruletu 4.5x, coz je dost na hrane, protoze musime zamezit zmateni mereni odrazy od vzdalenejsich predmetu (nejsnaz prodlouzenim doby mezi merenimi) a zaroven potrebujeme interval mereni mensi, nez 1/2 doby pruletu puku, abychom meli zarucene aspon 2 hodnoty.

Za optimalnich podminek (dostatecne odrazivy puk v prazdnem prostoru letici primo prez nas v merenem kuzelu - idealne jeho stredem - a zadne dalsi rusive odrazy) jsme schopni zmerit ten puk zarucene 4x (coz je 2x vic nez teoreticke minimum), ale v realnych podminkach asi budeme muset volit vetsi pauzu mezi merenimi, takze budeme radi, kdyz ten puk zmerime 2x a spocteme z jeho vzdalenosti a dobou mezi merenimi nejake cislo.

Jenze vlivem nahodnych chyb, preslechu, odrazu atd. bude tohle cislo nekdy odpovidat rychlosti, nekdy bude zcela mimo. (A predpokladame, ze se tam neprimota zadny hrac, hokejka ani nic jineho.)

Takze s trochou stesti budeme mit priblizne spravnou hodnotu, s trochou smuly nebudeme mit nic rozumneho - sazka do loterie. Ale pri opakovanych pokusech (treba merit strelbu hrace na prazdnou branu a sledovat, zda se v treningu zlepsuje) muzeme stejne dostat statisticky spravne vysledky pri dostatecnem poctu opakovani.

Pokud poleti puk kolmo na smer mereni, neni sance. Pokud to bude v realnem zapase, tak nam to mereni znici hraci okolo a i pokud tam nebudou, tak je znacna sance, ze nenamerime nic rozumneho - nejde se tedy na to vubec spolehnout (ve smyslu "a rozhodujici branku vstrelil hrac rychlosti 128 km/h")
a zaroven bychom radi nejak eliminovali nahodne chyby mereni, takze s

<< 1 | 2 | 3 | 4 | 5 >>

Vyhledávání

arduino8.cz © 2015 Všechna práva vyhrazena.