7. díl - Arduino - Vzdálenost s ultrasonickým modulem HC-SR04

Hardware PC Arduino Arduino - Vzdálenost s ultrasonickým modulem HC-SR04

V minulém tutoriálu o Arduinu jsme zapojovali LCD displej. Tentokrát si konečně změříme vzdálenost pomocí ultrasonického modulu HC-SR04.. Modul funguje tak, že vysílá zvukové signály, které se odrazí, modul je zaznamená a my změříme počet uplynulých milisekund. Pomocí vzorce a rychlosti zvuku ve vzduchu vypočteme vzdálenost. Dříve se používala funkce pulsein, která měřila počet milisekund, ale nyní již existuje NewPing Library,, která to vše vyřeší za nás a vrátí nám hodnotu v centimetrech (ale na konci článku to vyřešíme i postaru). Takže jí stáhneme a naimportujeme do Arduina, jak jsme se již naučili ve 4. díle.. K zobrazování vzdálenosti použijeme LCD display z minulého dílu,, takže kód zůstane zachovalý, jen jej mírně pozměníme - odebereme DHT11 a přidáme HC-SR04.

Schéma k Arduinu a HC-SR04

Schéma bude vypadat nějak takto.

Zapojíme vše podle následujícího schéma a rovnou se přesuneme k psaní kódu. Nejdříve s knihovnou NewPing:

#include <NewPing.h>
//naimportování knihovny NewPing

#include <LiquidCrystal.h>


int rs_pin = 2;
int e_pin = 3;
int d4_pin = 4;
int d5_pin = 5;
int d6_pin = 6;
int d7_pin = 7;


LiquidCrystal LCD(rs_pin, e_pin, d4_pin, d5_pin, d6_pin, d7_pin); //nám již známé nastavení LCD

int trig_pin = 52; //HC-SR04 má dva datové piny - Trigger
int echo_pin = 50; //a Echo
int max_vzdalenost = 500; //náš modul umí měřit do 500cm.
//Pro případ, že by byla vzdálenost větší, se měření ukončí, aby nedocházelo k problémům
NewPing metr(trig_pin, echo_pin, max_vzdalenost);
//newping vytvoří nový objekt, u nás s názvem metr. Jako parametry jsou trigpin, echopin a max vzdálenost

float vzdalenost;
// vzdálenost si vložíme do další proměnné
void setup()
 {
   LCD.begin(16,2);
   LCD.setCursor(0,0);
   LCD.print("itnetwork.cz");
   //známé spuštění LCD
 }

void loop()
 {
   vzdalenost = metr.ping_cm();
   //do proměnné vzdalenost uložíme výsledek funkce ping_cm, která za nás změří vzdálenost

   LCD.setCursor(0,1);
   LCD.print("            ");
   //Promazání předchozí hodnoty. Pokud bychom ze 103 cm přešli na 98, zůstane zde ta trojka
   //a display by napsal 983 cm

   LCD.setCursor(0,1);
   LCD.print(vzdalenost + 1); //vypíšeme vzdálenost

   //jedna přičteme proto, že čidlo je zhruba 1cm vysoké a když jej třeba přiložíme na stěnu,
   //abychom změřili vzdálenost protější, tak by byla hodnota o jeden cm menší
   //toto ovšem není nutné

   LCD.setCursor(12,1);
   LCD.print("cm");
   //už jenom napíšeme "cm"
   delay(500); //a chvilku počkáme
 }

Takto to vypadá s použitím knihovny NewPing. Je to mnohem jednodušší, ale nezobrazují se desetinná místa. Tento kód má díky knihovně ošetřené i velké vzdálenosti, takže když bude vzdálenost až moc velká, neměl by nám vypisovat nesmyslné hodnoty

A proč to dělat jednoduše, když to jde složitě, že? Bez knihovny NewPing to jde také, jen budeme muset počítat, posílat impulsy na piny a čekat až se vrátí:

#include <LiquidCrystal.h>


int rs_pin = 2;
int e_pin = 3;
int d4_pin = 4;
int d5_pin = 5;
int d6_pin = 6;
int d7_pin = 7;


LiquidCrystal LCD(rs_pin, e_pin, d4_pin, d5_pin, d6_pin, d7_pin); //nám již známé nastavení LCD

int trig_pin = 52; //HC-SR04 má dva datové piny - Trigger
int echo_pin = 50; //a Echo

float doba; //do této proměnné uložíme dobu, za kterou se zvuk vrátí
float vzdalenost;
// vzdálenost si vložíme do další proměnné
void setup()
 {
   LCD.begin(16,2);
   LCD.setCursor(0,0);
   LCD.print("itnetwork.cz");
   //známé spuštění LCD

   pinMode(echo_pin, INPUT);   //tentokrát budeme potřebovat
   pinMode(trig_pin, OUTPUT);  //vstupní a výstupní piny
 }

void loop()
{
   digitalWrite(trig_pin, LOW);
   delayMicroseconds(2);
   digitalWrite(trig_pin, HIGH);
   delayMicroseconds(10);
   digitalWrite(trig_pin, LOW);
   // Před měřením je třeba na trigpin vyslat několik impulsů
   //protože to probíhá rychle, máme zde delayMicroseconds,
   //která pozastaví program na mikrosekundy

   doba = pulseIn(echo_pin, HIGH);
   //punkce pulsein nám vrátí čas, za který se vrátí impuls
   vzdalenost = (doba / 2) / 29.1;
   //protože signál jde tam a zase zpátky, tak jej musíme vydělit dvěma
   //poté ještě vezmeme úvahu rychlost zvuku a máme výsledek



   //do proměnné vzdalenost uložíme výsledek funkce ping_cm, která za nás změří vzdálenost
   LCD.setCursor(0,1);
   LCD.print("            ");
   //Promazání předchozí hodnoty. Pokud bychom ze 103 cm přešli na 98, zůstane zde ta trojka
   //a display by napsal 983 cm
   LCD.setCursor(0,1);
   LCD.print(vzdalenost + 1); //vypíšeme vzdálenost
   //jedna odečteme proto, že čidlo je zhruba 1cm vysoké a když jej třeba přiložíme na stěnu,
   //abychom změřili vzdálenost protější, tak by byla hodnota o jeden cm menší
   LCD.setCursor(12,1);
   LCD.print("cm");
   delay(500); //a chvilku počkáme
 }

Takto to vypadá bez knihovny. Musíme posílat impulsy na piny a poté přepočítávat hodnotu. Navíc má tento způsob tendenci "skákat" s hodnotami, čím dále, tím více. U 10 cm skáčou jen desetinná místa, ale u 80 cm už skáčou i jednotky, někdy i více než o dvě.

Měření vzdálenosti s Arduinem

Toto měření je samozřejmě jen orientační. Pokud bychom chtěli přesné hodnoty, budeme muset přesně změřit výšku čidla (senzory jsou zhruba v polovině), vzít v potaz teplotu a vlhkost, třeba pomocí DHT11 a další faktory. To by ale bylo složité, takže nám to bude stačit takto.

O funkčnosti se můžete přesvědčit na následujícím videu:

Ke stažení jsou opět k dispozici okomentované zdrojové kódy od obou možností.

Od příštího dílu už začnu seriál směřovat k mému projektu, na kterém momentálně dělám, abych už mohl napsat o praktickém stavění větších projektů. Podívali bychom se na to, jak s Arduinem spínat větší zátěže než maximum pro pin, tedy více než 20mA.


 

Stáhnout

Staženo 145x (2.23 kB)
Aplikace je včetně zdrojových kódů

 

  Aktivity (2)

Článek pro vás napsal Adam Ježek
Avatar
Autor se převážně věnuje Arduinu a psaní tutoriálů z této oblasti, občas napíše příležitostně nějakou tu zprávičku. Většinu svého volného času momentálně věnuje Linuxu a/nebo Raspberry Pi. Také umí C#, HTML, CSS, PHP a Python.

Jak se ti líbí článek?
Celkem (12 hlasů) :
55555


 


Miniatura
Předchozí článek
Arduino - LCD Display
Miniatura
Všechny články v sekci
Arduino
Miniatura
Následující článek
Arduino - Spínání velké zátěže

 

 

Komentáře

Avatar
00
Člen
Avatar
00:

Kde se dá koupit HC-SR04?

 
Odpovědět 24.8.2014 9:43
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na 00
Adam Ježek:

Buď na eBayi (odkaz na začátku článku), nebo do googlu zadej "buy HC-SR04" :)

Odpovědět  +1 24.8.2014 10:32
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
OBU
Redaktor
Avatar
OBU:

doporučuji http://www.dx.com/…supplies-436
je tam vše a hlavně free shipping ... ale člověk si hold počká no :/

 
Odpovědět 4.10.2014 18:30
Avatar
mnauik
Člen
Avatar
mnauik:

Já kupuji přes ebay od číňanů, sice si počkám, ale mají to levně a free shipping

Odpovědět  +2 4.10.2014 19:10
minusuj mě, ale zdůvodni to ;)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.