3.1 Mjerenje udaljenosti
Cilj ovog primjera je izmjeriti udaljenost ultrazvučnim senzorom iz kita. Senzor odašilje kratak prasak zvuka, sluša odjek koji se odbija od onoga što se nalazi pred njim, i izračuna koliko je taj objekt daleko. Rezultat se ispisuje u Serial Monitor u centimetrima.
Ovo je i prvi primjer koji koristi biblioteku i Qwiic modul, pa je spajanje najlakše u cijelom kitu: jedan kabel i gotov si.
U ovoj dokumentaciji naučit ćeš:
- Kako ultrazvučni senzor mjeri udaljenost mjerenjem vremena odjeka.
- Kako spojiti Qwiic modul jednim kabelom i bez jumper žica.
- Što je biblioteka, i kako je instalirati i koristiti.
- Zašto ovaj senzor treba dva poziva funkcije da bi ti dao jedno mjerenje.
- Kako prepoznati vrijednost koja nije pravo mjerenje.
Potreban hardver:
- 1x Soldered NULA MINI pločica
- 1x Breadboard
- 1x Ultrazvučni senzor udaljenosti (HC-SR04)
- 1x Qwiic kabel
- 1x USB-C kabel
Spajanje komponenti
1. Umetni NULA MINI pločicu na breadboard
Utisni pločicu u jedan kraj breadboarda tako da njezina dva reda pinova sjednu s obje strane središnjeg kanala, s čipom okrenutim prema dolje.

2. Utisni Qwiic kabel u pločicu
NULA MINI ima jedan Qwiic konektor, na rubu pločice između tipki USER i RST. To je bijeli konektor označen s qwiic na silkscreenu. Utisni kabel dok ne klikne.

- i +. To je konektor za bateriju, i Qwiic kabel u njega ne ulazi.PWR svjetlo je upaljeno. Nije važno kada ga spojiš. Qwiic module je sigurno utiskivati u bilo kojem redoslijedu i u bilo kojem trenutku.Ako želiš vidjeti točno o kojem se konektoru radi na goloj pločici, ovdje je istaknut:

3. Utisni drugi kraj u senzor
Senzor su dvije pločice spojene poleđinom na poleđinu: plavi ultrazvučni modul koji nosi dva srebrna pretvarača, i ljubičasta Soldered pločica koja nosi elektroniku koja obavlja razgovor. Na ljubičastoj pločici silkscreenom je ispisano ULTRASONIC SENSOR QWIIC, i ona ima dva Qwiic konektora, po jedan na svakom kraju.
Utisni slobodni kraj kabela u bilo koji od njih. Spojeni su međusobno, pa nije važno koji odabereš. Drugi je tu da možeš dalje nalančati još jedan modul.

ON. On postavlja adresu na koju senzor odgovara, a kod očekuje tvorničku postavku. Mijenjao bi je samo ako bi želio staviti dva takva senzora na isti kabel.4. Usmjeri senzor u otvoreni prostor
Okreni senzor tako da dva srebrna pretvarača gledaju u prostoriju, i drži prostor pred njima čistim. To su dijelovi koji odašilju i slušaju zvuk, pa je sve što na njima leži (stol, kabel, tvoja ruka) jedina stvar koju će senzor ikada naći.

Kako senzor mjeri udaljenost
Zvuk kroz zrak putuje poznatom, ravnomjernom brzinom: oko 343 metra u sekundi, što izlazi na 0.0343 centimetra po mikrosekundi. Ta fiksna brzina je cijeli trik. Ako znaš koliko je zvuku trebalo da dođe negdje, znaš koliki je put prešao.
Zato senzor odašilje vrlo kratak cvrkut na oko 40 kHz, previsok da bi ga čovjek čuo, iako šišmiš s njim ne bi imao problema, i pokreće štopericu. Cvrkut otputuje, u nešto udari, i dio njega se odbije natrag. U trenutku kada ga senzor čuje da se vraća, zaustavlja štopericu.

Pretvaranje tog vremena u udaljenost traži jednu malu korekciju:
Udaljenost = (Vrijeme × 0.0343) ÷ 2
Na ovom modulu taj račun nikada ne moraš raditi sam. Ljubičasta prilagodna pločica ima svoj mali mikrokontroler koji vodi štopericu, obavi računanje i drži odgovor u centimetrima pripremljen da ga pokupiš.
Zašto u ovom primjeru nema brojeva pinova
Pogledaj kod ispod i primijetit ćeš da nešto manjka. Svaki primjer do sada počinjao je imenovanjem pina, nečim kao const int LED_PIN = 5;. Ovaj ne imenuje nijedan, a objekt senzora stvara se praznih ruku:
Ultrasonic_Sensor hc;
To je zato što Qwiic kabel nije četiri odvojene žice koje vodiš kamo želiš. To je fiksni svežnjić od četiri: 3.3 V, masa i dvije signalne linije sabirnice koja se zove I2C. Na NULA MINI te dvije signalne linije trajno su spojene na IO6 i IO7. Nisu čak ni izvedene na headere. Nema se što birati, pa se biblioteci nema što reći.
Ono što biblioteka mora znati je s kojim modulom na kabelu razgovara, jer I2C dopušta da nekoliko modula dijeli jedan par žica. Svaki od njih odgovara na svoj broj, koji se zove adresa, a adresa ovog senzora je 0x30. Biblioteka to već zna, i zato ni begin() ne prima argumente.
Instalacija biblioteke
Biblioteka je kod koji je napisao netko drugi a ti ga posuđuješ. Bez nje bi morao sam mjeriti vrijeme pulsa odjeka i sam raditi računanje; s njom pozoveš getDistance() i dobiješ broj.
Ovom primjeru treba Soldered Ultrasonic Distance Sensor Arduino library. Ako si prošao Postavljanje Arduino okruženja, već je imaš. Ako nisi, otvori Tools → Manage Libraries, potraži je i instaliraj onu koju objavljuje Soldered Electronics.
fatal error: Ultrasonic-distance-sensor-easyC-SOLDERED.h: No such file or directory, biblioteka nije instalirana. Instaliraj je i prevedi ponovno. Spajanje i pločica nisu problem.Čitanje senzora ide u dva koraka
Skica ne traži jednostavno udaljenost. Umjesto toga radi ovo:
hc.takeMeasure();
delay(MEASURE_WAIT_MS);
int distance = hc.getDistance();
Tri linije gdje si možda očekivao jednu, a razlog je to što mjerenje traži stvarno vrijeme. takeMeasure() govori senzoru da ode i obavi posao: pošalje cvrkut, sluša, vodi štopericu, spremi odgovor. Taj zahtjev se vraća odmah. Pločica je samo poslala uputu, nije čekala rezultat.
Senzoru zatim treba trenutak. Odustaje od slušanja nakon oko 38 milisekundi ako odjek nikada ne dođe, pa mjerenje u najgorem slučaju može toliko trajati. Skica čeka 50 ms, ugodno dulje, prije nego getDistance() pokupi gotov odgovor.
Nije svaki broj pravo mjerenje
Ovaj senzor radi od oko 2 centimetra do oko 4 metra. Dalje od toga zvuk se vraća preslab da bi ga se prepoznalo, a senzor nema načina da ti to kaže. Nema odgovor "nije nađeno". Jednostavno ti ipak preda broj.
U praksi taj broj izađe vrlo velik, negdje blizu 1000 cm, i pomiče se po nekoliko centimetara od vrijednosti do vrijednosti. Deset metara je daleko izvan svega što ovaj senzor stvarno može čuti, pa vrijednost od nekoliko stotina centimetara ili više tretiraj kao "ništa nije nađeno", a ne kao daleki objekt.
Ista se stvar događa i s objektom dobro unutar dosega, ako je taj objekt slučajno mekan ili strmo zakrenut od senzora. Jastuci, zavjese i džemperi upijaju zvuk; tvrda ravna površina okrenuta pravo prema senzoru odbija ga najbolje.
0 i ispisuje No echo received, nothing in range. umjesto udaljenosti. Ta zaštita je tu za senzor koji odgovori ničim, a to je drugačija greška: neutisnut ili neispravan modul, a ne prazna prostorija. U normalnoj upotrebi tu poruku nećeš vidjeti, pa je ne traži kao dokaz da stvari rade.Kod
/**
**************************************************
*
* @file 3.1_Measuring_Distance.ino
* @brief Primjer koji pokazuje kako izmjeriti udaljenost pomoću Soldered ultrazvučnog senzora udaljenosti.
* Senzor odašilje kratak ultrazvučni puls i onda sluša njegov odjek. Mjeri koliko je
* odjeku trebalo da se vrati, iz tog vremena izračuna udaljenost i predaje nam odgovor preko easyC-a.
* Izmjerena udaljenost ispisuje se u centimetrima u Serial Monitor.
* Za detalje, shemu spajanja i više, pogledaj dokumentaciju primjera na: <link placeholder>
* @author Soldered
***************************************************
*/
/*
Uključivanje biblioteke daje nam pristup gotovim funkcijama koje teški posao rade za nas. Ovdje uključujemo
Soldered biblioteku za ultrazvučni senzor udaljenosti, da ne moramo sami računati udaljenost iz sirovih vremena.
Ako Arduino IDE prijavi da ovu datoteku ne može naći, instaliraj biblioteku kroz
Sketch -> Include Library -> Manage Libraries i potraži "Soldered Ultrasonic".
*/
#include "Ultrasonic-distance-sensor-easyC-SOLDERED.h"
/*
Ovdje stvaramo naš objekt senzora, koji smo nazvali "hc". Objekt je naš način razgovora sa senzorom: svaku funkciju
koju na njemu pozovemo, pozivamo preko ovog imena.
Primijeti da ne predajemo nikakve brojeve pinova. Ovaj senzor spaja se preko easyC-a, a to je Soldered ime za I2C
vezu preko jednog kabela, a I2C uvijek koristi ista dva pina na pločici (IO6 i IO7 na NULA pločici),
pa biblioteka već zna gdje ga naći. Utisni Qwiic kabel i nema se što spajati.
*/
Ultrasonic_Sensor hc;
/*
Ovoliko čekamo nakon što zatražimo mjerenje, u milisekundama. Senzoru treba trenutak da svoj puls pošalje
van i sluša odjek, a odustaje nakon 38 milisekundi ako odjek ne dođe. Čekamo malo dulje od
toga da odgovor uvijek bude gotov dok za njega pitamo.
*/
const int MEASURE_WAIT_MS = 50;
void setup() {
/*
Serial.begin() uspostavlja serijsku komunikaciju između tvoje pločice i drugog uređaja, u ovom primjeru s tvojim
računalom preko USB kabela. Ovdje ga koristimo da bismo mogli ispisati izmjerenu udaljenost u Serial Monitor.
*/
Serial.begin(115200);
/*
begin() priprema senzor za upotrebu. Za easyC senzor to pokreće I2C komunikaciju i govori biblioteci na koju
adresu da se obraća, a za ovaj senzor je to 0x30. Senzor bi uvijek trebao biti inicijaliziran prije nego počnemo
čitati iz njega.
*/
hc.begin();
//Ispiši početnu poruku da znamo da se program uspješno pokrenuo.
Serial.println("Ultrasonic Measuring Distance Example started!");
Serial.println("Move an object in front of the sensor to see the distance change.");
}
void loop() {
/*
Čitanje easyC senzora ide u dva koraka. takeMeasure() je prvi: traži od senzora da pošalje puls i
izmjeri vrijeme odjeka. Senzor taj posao obavi sam i zapamti odgovor, i zato onda moramo čekati
prije nego ga pokupimo.
*/
hc.takeMeasure();
delay(MEASURE_WAIT_MS);
/*
getDistance() je drugi korak: dohvaća odgovor koji je senzor izračunao i spremio, već pretvoren u
centimetre. Vrijednost se vraća kao cijeli broj centimetara, a to je i sva točnost koju ovaj senzor
iskreno može ponuditi, pa je spremamo u int a ne u decimalni broj.
*/
int distance = hc.getDistance();
/*
Senzor odgovara s 0 kada nije čuo nikakav odjek, što se događa kada ništa nije u dosegu ili kada površina
pred njim raspršuje zvuk. To nije pravo mjerenje, pa to i kažemo umjesto da prijavimo udaljenost od
nula centimetara, što bi upućivalo na objekt koji dotiče senzor.
*/
if (distance == 0) {
Serial.println("No echo received, nothing in range.");
} else {
/*
Serial.print() ispisuje podatke u Serial Monitor bez prelaska u novi red, dok Serial.println() ispisuje
podatke i onda preskače u novi red. Njihovim kombiniranjem možemo iz nekoliko dijelova sagraditi jednu čitljivu liniju.
*/
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
}
/*
delay() je funkcija koja započinje pauzu u kodu. Bez ove pauze vrijednosti bi promicale daleko
prebrzo da bi ih se pročitalo, a ona i pušta odjeke prošlog pulsa da se ugase prije nego zatražimo sljedeći.
Slobodno eksperimentiraj s ovom vrijednošću.
*/
delay(500);
}
Što bi trebao vidjeti
Prenesi skicu, pa otvori Tools → Serial Monitor i postavi baud rate na 115200. Nakon dvije početne linije dobivaš novu vrijednost dvaput u sekundi.
Usmjeri senzor preko prostorije i mahni rukom pred njim, i brojevi prate ono što je najbliže:
Većina tih vrijednosti stoji oko 52 cm, a tu je najbliži objekt mirno sjedio. Vrijednosti koje skaču (160 cm, 96 cm, 39 cm) su trenuci kada se nešto pomaknulo kroz vidno polje senzora, ili kada je zvuk umjesto toga našao nešto dalje.
int a ne u decimalni broj.Sada usmjeri senzor u prazan prostor, ili pravo gore u strop, i slika se potpuno mijenja:
Gotovo svaka linija sada pokazuje negdje između 996 i 1000 cm. To je način na koji senzor nalazi ništa, kako je opisano iznad, a ne objekt deset metara daleko. Korisno je prepoznati taj skup vrijednosti, jer ti kaže da pločica i senzor savršeno dobro razgovaraju međusobno, a problem je samo u tome kamo je senzor usmjeren.
Probaj sam: promijeni delay(500) na kraju petlje u delay(100) i prenesi ponovno. Vrijednosti sada dolaze oko šest puta u sekundi umjesto dvaput, i praćenje ruke koja se kreće postaje mnogo glađe. Skratiš li ga još mnogo više, svaki novi cvrkut izlazi dok se odjeci prošlog još odbijaju po prostoriji, što brojeve tjera da skaču.
Cijeli primjer
Pogledaj cijeli kod primjera na linku ispod:
3.1_Measuring_Distance.ino
Primjer koji čita Qwiic ultrazvučni senzor udaljenosti i ispisuje udaljenost u centimetrima u Serial Monitor.