Mjerite udaljenost Arduinom

Mjerite udaljenost Arduinom

Mjerenje prostora dugo se godina radilo ručno uz pomoć metra za mjerenje. Ako ste se ikad okušali u tom zadatku, shvaćate da je to zbilja naporno i dosta neprecizno zbog savijanja tankog lima od kojega je metar napravljen.

arduino ivor

Prije nekoliko godina pojavili su se digitalni mjerači udaljenosti koji rade na principu lasera. Jednostavni su za korištenje, ali i precizniji od tračnog metra. Njihova se cijena kreće od stotinu pa sve do tisuću kuna, ovisno o karakteristikama i, naravno, proizvođaču. Udaljenosti se mogu kretati od 5 do 100 metara, tako da su upotrebljivi i u vanjskom svijetu, a ne samo unutar doma. Digitalni mjerači udaljenosti rade tako da odašilju impuls, svjetlosni ili zvučni, koji se odbije od udaljenog predmeta i vrati do senzora, a uređaj mjeri proteklo vrijeme. Poznavajući vrijeme i brzinu gibanja, uređaj izračuna udaljenost između senzora i predmeta od kojega se odbio impuls. Odstupanje pri mjerenju obično je oko 2 mm.

Ultrazvučni senzor HC-SR04 koristi ultrazvučne valove kako bi odredio udaljenost do objekta.

 

mjerac 2

Napredniji mjerači sadrže opcije izračunavanja površina i volumena, Pitagorin poučak, zapisivanje izmjerenih vrijednosti u memoriju, a neki čak i povezivanje s pametnim telefonom preko Bluetootha. Zajednička odlika svim digitalnim mjeračima udaljenosti njihova je mobilnost. Napajanje izvedeno pomoću alkalnih ili punjivih litij-ionskih baterija će osiguravati pouzdano mjerenje na svakom mjestu. Ovisno o njihovu kapacitetu, broj mjerenja može iznositi i nekoliko desetaka tisuća po jednom punjenju. Jedini je nedostatak kod mjerenja to što morate imati konačnu udaljenost jer se impuls mora odbiti od predmeta i vratiti k senzoru, što bi moglo predstavljati problem ako želite, recimo, izmjeriti jedan dio livade koja nije ograđena nikakvom vrstom ograde.

Spajanje:

Od raznih senzora dostupnih na našem tržištu odabrali smo ultrazvučni senzor udaljenosti imena „hc-sr04“. Senzor ima maksimalnu udaljenost mjerenja od 4 m, ali navodno da se može povećati na 7 m korištenjem posebnih libraryja. Mi nismo isprobavali izvući maksimum jer smo bili zadovoljni i s 4 m. Kut mjerenja iznosi 15 stupnjeva, a preciznost nekakvih 1 cm. Senzor ima četiri priključka, dva su za napajanje od 5 V, dok su preostala dva za slanje i primanje impulsa. Ultrazvučni senzor je povoljan i može se kod nas kupiti po cijeni od 25 kn. Iako ima odstupanja pri većim udaljenostima i malo područje mjerenja, poslužit će nam pri izradi digitalnog mjerača udaljenosti. Želite li nešto precizniji uređaj s većim dometom, zaboravite na jeftine ultrazvučne senzore. Tada vam je potreban laserski senzor, koji je podosta skuplji. Cijene od tisuću kuna za laserski uređaj za mjerenje udaljenosti opravdane su vrhunskim senzorima i ostalim raznim mogućnostima.

Shema spajanja LED zaslona i ultrazvučnog sebzora s Arduinom.

mjerac 4

Za prikaz se može koristiti bilo koji od zaslona na tržištu, LCD ili LED, manje je bitno. Važnija stvar od odabira tehnologije zaslona njegova je komunikacija s Arduinom. Naš OLED zaslon dijagonale 0.91” i razlučivosti 128 x 32 komunicira s Arduinom putem I2C veze za koju su potrebne žice. OLED ekrani su izvrsni za uređaje koji rade na baterijskom napajanju jer troše vrlo malo električne energije. Zašto? Svima je poznato da LED rasvjeta troši manje električne energije od ostalih vrsta rasvjete, ali to nije sve. OLED ekran uključuje samo one piksele koji su potrebni da bi se prikazala poruka. Ostali pikseli koje vidimo kao „crne“ zapravo su ugašeni, što se najbolje može vidjeti kada se ekran uključi i počne s ispisom poruke. Pozadina neće promijeniti osvjetljenje, a pikseli potrebni za poruku će se uključiti. Kod LCD zaslona će uvijek biti uključeno pozadinsko osvjetljenje, tj. backlight. Bez njega nije moguće ispisati vidljive poruke na zaslon. Zašto biste uključivali sve kada možete uključiti samo one piksele koji su vam potrebni? Ušteda energije jako nam je bitna ako uređaj radi na baterijskom napajanju. Bijela slova na crnoj pozadini osiguravaju izvrstan kontrast i odličnu čitljivost čak i kod vrlo malih fontova. Razlučivost nije nešto posebno, ali će poslužiti. Iako je napajanje za zaslon 3,3 V, on savršeno radi i s 5 V. Nemojte pomisliti da je na shemi greška.

Za OLED ekran koristit ćemo poseban library. U ponudi stoji i OLED zaslon dijagonale 0,96” i razlučivosti 128 x 64 ako poželite ispisati više vrijednosti ili u većem fontu.

Na samom početku moramo uključiti sve libraryje koji su nam potrebni za naš program. Ultrazvučni senzor je vrlo jednostavan i ne zahtijeva nikakve libraryje za razliku od OLED zaslona, koji je vrlo složen i koristi ih nekoliko. Naravno, također moramo imati naredbu koja će definirati koji tip zaslona koristimo. Pinove 11 i 12, na koje spajamo ultrazvučni senzor, preimenovat ćemo radi lakšeg snalaženja u daljnjem kodu. 11 ćemo nazvati „Trigger“ jer on odašilje signal, a 12 „echo“, tj. reflektirani signal.

U void setupu je potrebno definirati trig kao izlazni, a echo kao ulazni signal kako bi naš Arduino mogao znati smjer kretanja impulsa. Također moramo pokrenuti komunikaciju sa zaslonom pomoću naredbe u8g2.begin();

Korištena naredba dosta podsjeća na naredbu serial.begin(9600), koja pokreće komunikaciju sa serial monitorom na programu Arduina. A što je serial monitor nego virtualni zaslon na kojem se ispisuju poruke. Zbilja ima logike. 9600 kod serial.begina predstavlja brzinu komunikacije i ona se može mijenjati po potrebi, a naš OLED zaslon to nema.

U void loopu definiramo dvije varijable – „vrijeme“ i „udaljenost“. Njihovo značenje ne moramo posebno objašnjavati. „Triggerom“ odašiljemo signal trajanja 10 mikrosekundi. Varijabli vrijeme dodat ćemo vrijednost vremena potrebnog da pin „echo“ detektira reflektirani signal, odnosno vrijeme potrebno da signal dođe do prepreke, odbije se i vrati nazad do senzora.

Brzina je definirana kao omjer prijeđenog puta i vremena. Iz tog izraza lako dobijemo jednadžbu pomoću koje izračunamo udaljenost preko proteklog vremena. Kako znamo kojom se brzinom kreće impuls? Ultrazvučni senzor odašilje ultrazvučni impuls, a što je to nego zvuk? Brzina zvuka nam je svima poznata i iznosi otprilike 350 m/s. Udaljenost = vrijeme * brzina. Kako nam je vrijeme mjereno u milisekundama, brzinu zvuka moramo prebaciti u centimetre po milisekundi kako bi se množenjem u jednadžbi dobila udaljenost u centimetrima. Ne zaboravite da je izmjereno vrijeme potrebno da signal dođe do prepreke, odbije se i vrati, stoga je potrebno vrijeme podijeliti s 2 da bismo dobili vrijeme potrebno samo u jednom smjeru.

Ispitivanje preciznosti mjerenja kako bismo kasnije mogli korigirati odstupanja

mjerac 5

Budući da se void loop petlja konstantno vrti iz početka, prije svakog novog zapisivanja na zaslon moramo obrisati sadržaj koji se već nalazi na zaslonu. Zašto? Zaslon ima svoju unutarnju memoriju na koju se šalje poruka i zaslon ispisuje tu poruku tek nakon vašeg odobrenja. Ako ne obrišete zaslon prije sljedećeg pisanja, može se dogoditi da se drugi tekst zapiše preko prvog. U tom slučaju čitljivost će biti ravna nuli. Zaslon čistimo pomoću naredbe u8g2.clearBuffer(). Zaslon vam na mogućnost daje da birate kojom veličinom i vrstom fonta želite ispisivati poruke. Naredbom u8g2.setFont(u8g2_font_logisoso28_tr) zaslonu govorite kojim fontom želite ispisati poruku. Ime fonta upisujete u zagradu, a tipove fontova možete pronaći na web stranici koja je navedena na našem Githubu. Prije samog početka pisanja poruke važno je definirati „kursor“, tj. pokazivač. Naredbom u8g2.setCursor(0,31) definiramo mjesto početka pisanja. Prva vrijednost definira stupac, a druga vrijednost definira redak. Uzmite u obzir da redak 0 nije donji lijevi kut nego gornji lijevi. Ako postavite pokazivač u 0,0 i pokušate ispisati poruku, ona neće biti vidljiva na zaslonu, stoga je potrebno postaviti na 0,32. Budući da je zaslon širok 32 piksela, 32. redak je posljednji, tj. donji. Mi smo uzeli 32. redak kako bi bolje izgledalo jer je font visine 28. Veći fontovi poput 32 često mogu bit odsiječeni kod nekih simbola, pa ih nismo htjeli koristiti. Naravno, fontovi veći od 32 uopće ne stanu na zaslon i bit će djelomično odrezani. Sada kada smo pokazivačem definirali mjesto početka pisanja, možemo ispisati željenu vrijednost. Naredba za ispis u8g2.print(udaljenost). I na kraju dodajemo mjernu jedinicu „cm“, koja je pomaknuta za 75 piksela udesno kako bi nam stali svi troznamenkasti brojevi. Obavezno je pozvati naredbu u8g2.sendBuffer() da bi zaslon ispisao poslanu poruku. Zapisivanje tekstualnih poruka možemo riješiti i na drugačiji način.

u8g2.drawStr(75,31,»cm») naredba nam skraćuje programski kod jer pozicioniranje pokazivača i definiranje tekstualne poruke možemo izvršiti pomoću jedne naredbe. Na prvi dojam možda nije nešto bitno, ali kada bismo htjeli ispisivati veći broj tekstualnih poruka, naš kod bi se poprilično skratio.
Na kraju se nalazi vremenska odgoda od jedne sekunde jer nam je potpuno nepotrebno imati brža očitavanja udaljenosti.

Kućište:

DIY projekti najčešće su napravljeni tek toliko da bi radili. Funkcionalnost je daleko ispred estetike, no ako imate vremena, možete se pozabaviti ljepšim kućištem od pleksiglasa ili ga možda čak isprintati uz pomoć 3D printera. Naše kućište je za prvu ruku napravljeno od kartona. Možda nije najbolji izbor, ali funkcionira! Dimenzijama 10 x 5 x 3 cm kućište je dovoljno malo da bi bilo praktično, a dovoljno veliko da bi unutar njega stali Arduino, ultrazvučni senzor, zaslon i baterijsko napajanje. Zbog ušteda dimenzija možda je bolje za napajanje koristiti bateriju od 9 V. Punjive litij-ionske baterije imaju nazivni napon od 3,7 V, koji nije dovoljan za napajanje Arduina i ultrazvučnog senzora, zato bismo morali koristiti step-up pretvarač. Ne želimo previše komplicirati, tako da ćemo se zadržati na bateriji od 9 V.

mjerac 6

Napomena:

Uređaj nije pouzdan mjerač udaljenosti i služi za edukativne svrhe. Ne oslanjajte se na njegovu preciznost na udaljenostima većim od 1,5 m. Ultrazvučni senzor ima velik kut slanja impulsa koji pri većim udaljenostima postaje ogroman, odnosno impuls nije usmjeren i zahvaća veće područje. Upravo zbog toga dolazi do lošeg odbijanja ultrazvučnog impulsa, koji pri svom povratku ima izobličenja i senzor očitava veoma neprecizne vrijednosti. Nije isto odbija li se impuls od okomite površine poput zida ili zaobljene poput bočice za vodu.
Baterija se spaja na pin „Vin“ i njezin napon mora biti u intervalu od 7 do 12 V.

Dodatne mogućnosti: 

Programski kod je napravljen da bi očitavao vrijednosti svake sekunde. To se vrijeme može mijenjati, ali ne smije biti niže od 50 ms zbog „tromosti“ senzora. S nižim vrijednostima može se dogoditi da senzor šalje sljedeći impuls prije nego se vrati prethodni. Uvijek je dobro raditi sa sigurnim vrijednostima. Dodavanjem tipkala umjesto vremena očitavanja možemo postaviti uvjetnu naredbu if koja će ispitivati stanje vanjskog tipkala. Tako će uređaj mjeriti udaljenosti samo ako je tipkalo pritisnuto. Na taj način radi većina profesionalnih uređaja. 

Ako vam je dostupan 3D printer, na našem Githubu možete pronaći gotov 3D model kućišta mjerača udaljenosti spreman za printanje, kao i programski kod.

Ocijeni sadržaj
(0 glasova)

// možda će vas zanimati

Newsletter prijava


Kako izgleda naš posljednji newsletter pogledajte na ovom linku.

Skeniraj QR Code mobitelom i ponesi ovu stranicu sa sobom

Mjerite udaljenost Arduinom - VidiLAB - QR Code Friendly


Copyright © by: VIDI-TO d.o.o. Sva prava pridržana.