Merenje rastojanja ultrazvučnim senzorom i Arduinom
Arduino mikrokontroler šalje signal sa digitalnog pina (obično povezanog na pin Trig senzora) i tako pokreće slanje ultrazvučnih talasa. Kada talasi naiđu na prepreku, odbijaju se nazad ka senzoru i prima ih pin Echo.
Rastojanje = (vreme × brzina zvuka) / 2
Delimo sa 2 jer izmereno vreme obuhvata put do predmeta i put nazad.
Najvažnije:
- Trig pin: pokreće ultrazvučni impuls.
- Echo pin: prima odbijeni impuls.
- Brzina zvuka: oko 340 m/s = 0,034 cm/µs
- Najčešći model senzora: HC-SR04
Zadatak
U ovoj vežbi koristimo ultrazvučni senzor (na primer HC-SR04) da izmerimo rastojanje do predmeta. Arduino šalje signal senzoru da pošalje ultrazvučne talase. Talasi putuju kroz vazduh, odbijaju se od predmeta i vraćaju do senzora. Merenjem vremena za koje se odjek vrati izračunavamo koliko je predmet udaljen od senzora.Arduino program u nastavku pokazuje kako se upravlja senzorom, kako se računa rastojanje i kako se rezultat prikazuje u Serial Monitor-u.
Šema povezivanja
Za trigger i echo koristimo dva digitalna pina. Narandžasta žica povezuje digitalni pin 9 Arduina sa Trigger pinom senzora, a žuta žica digitalni pin 10 sa Echo pinom senzora.
Na kraju se GND Arduina povezuje sa GND pinom senzora i kolo je zatvoreno.
Kako ultrazvučni senzor meri rastojanje – više detalja
HC-SR04 ultrazvukom meri rastojanje do prepreke ispred sebe: šalje ultrazvučni signal (talas visoke frekvencije, oko 40 kHz), čeka da se vrati i meri vreme povratka.Na osnovu vremena između slanja i prijema signala izračunava se rastojanje.
Korak po korak: kako HC-SR04 meri trajanje
1. Arduino šalje TRIGGER signal
Na trigger pin (obično pin 9) Arduino šalje:
digitalWrite(trigPin, HIGH);
delayMicroseconds(10); // 10 mikrosekundi
digitalWrite(trigPin, LOW);
Time senzoru kaže: „Pošalji ultrazvučni impuls!“
2. Senzor sam šalje 8 ultrazvučnih talasa (na 40 kHz)
To traje veoma kratko (manje od 1 ms). U isto vreme HC-SR04 aktivira echo pin.
3. Echo pin prelazi u HIGH
Kada senzor pošalje impuls, echo pin postaje HIGH. Ostaje HIGH dok ultrazvučni signal putuje.
4. Senzor prima odbijeni talas
Kada se ultrazvučni talas odbije od predmeta i vrati, echo pin prelazi u LOW.
To znači:
- Echo pin = HIGH → signal je na putu.
- Echo pin = LOW → signal se vratio, merenje je završeno.
Kako se meri trajanje
Arduino koristi funkciju pulseIn() da izmeri koliko dugo je echo pin bio HIGH, u mikrosekundama (μs):
long duration = pulseIn(echoPin, HIGH);
Zatim se rastojanje računa ovako:
float distance = duration * 0.034 / 2;
Zašto * 0.034 / 2?
Brzina zvuka: 340 m/s = 0,034 cm/μs.
Delimo sa 2 jer signal putuje do predmeta i nazad.
| Vreme | Događaj |
|---|---|
| t0 | Arduino šalje signal od 10 μs na TRIG pin |
| t1 | HC-SR04 šalje ultrazvučni talas i postavlja ECHO na HIGH |
| t2 | Talas se odbije i stigne nazad, ECHO prelazi u LOW |
| t2 - t1 | Trajanje impulsa u mikrosekundama (μs) |
Kod za merenje rastojanja ultrazvučnim senzorom
// Merenje rastojanja ultrazvučnim senzorom HC-SR04
int trigerPin = 9; // pin povezan na Trig pin ultrazvučnog senzora
int echoPin = 10; // pin povezan na Echo pin ultrazvučnog senzora
long dur; // trajanje impulsa
float dist; // izračunato rastojanje
void setup() {
// podešavanje pinova
pinMode(trigerPin, OUTPUT); // Trig pin je izlaz
pinMode(echoPin, INPUT); // Echo pin je ulaz (čita povratni signal)
Serial.begin(115200); // serijska veza na 115200 bauda
}
void loop() {
// slanje impulsa od 10 mikrosekundi na trigger pin
digitalWrite(trigerPin, LOW); // trigger pin je prvo LOW
delayMicroseconds(2); // pauza od 2 mikrosekunde
digitalWrite(trigerPin, HIGH); // trigger pin na HIGH
delayMicroseconds(10); // HIGH traje 10 mikrosekundi
digitalWrite(trigerPin, LOW); // ponovo LOW
// vreme za koje se odjek vrati
dur = pulseIn(echoPin, HIGH); // trajanje HIGH impulsa na echo pinu
// rastojanje u cm: zvuk prelazi oko 0,034 cm za mikrosekundu,
// a delimo sa 2 jer talas ide do predmeta i nazad
dist = dur * 0.034 / 2;
// ispis rezultata u Serial Monitor
Serial.print("Distance: ");
Serial.print(dist, 2); // ispis sa 2 decimale
Serial.println(" cm"); // jedinica je centimetar
delay(500); // kratka pauza pre sledećeg merenja
}
Kako dužina trigger impulsa utiče na rad senzora
Trajanje trigger impulsa
1. Impuls kraći od 10 μs
HC-SR04 traži trigger impuls od najmanje 10 mikrosekundi da bi poslao ultrazvuk. Kraći impuls (npr. 5 μs) senzor možda neće primetiti i neće poslati ultrazvučne talase. Tada pulseIn(echoPin, HIGH) vraća 0, jer ECHO pin nikada ne pređe u HIGH.
2. Impuls duži od 10 μs
Mnogi HC-SR04 moduli rade i kada trigger impuls traje 20 μs ili 50 μs, jer senzor reaguje na prvu rastuću ivicu i sam odbrojava 10 μs. Ipak, to je van zvanične specifikacije i na nekim primercima može biti nepredvidivo. Za pouzdan rad preporučuje se tačno 10 μs.
3. Impuls duži od vremena povratka odjeka (t₂ − t₁)
Trigger impuls pokreće slanje ultrazvuka, ali je merenje na ECHO pinu nezavisno. Čak i ako trigger ostane HIGH (npr. 50 μs), merenje na ECHO pinu počinje od trenutka kada senzor pošalje talas, a ne kada se trigger završi. Višak trajanja triggera senzor zanemaruje.
⚠️ Mogući problemi sa predugim impulsima
- Unutrašnje vremensko upravljanje može da se poremeti (senzor može poslati više od 8 impulsa).
- Sledeća merenja mogu da kasne.
- Očitavanja mogu postati nestabilna.
Za stabilne rezultate uvek koristi standardni redosled za trigger:
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
Pregled u tabeli
| Trajanje triggera | Ponašanje |
|---|---|
| < 10 μs | ultrazvuk se ne šalje |
| = 10 μs | ispravan rad |
| > 10 μs | može da radi, ali se ne preporučuje |
| > vreme povratka odjeka | ne utiče na merenje na ECHO pinu |
Kako se ECHO pin sam menja
ECHO pin prelazi u HIGH sam od sebe – ne postavlja ga program, već hardver senzora HC-SR04.
Kako to radi
Kada se senzoru pošalje trigger impuls:
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
u senzoru se dešava sledeće:
- Šalje se osam ultrazvučnih impulsa frekvencije 40 kHz.
- ECHO pin se odmah postavlja na
HIGH. - ECHO pin ostaje
HIGHdok se ne primi odjek. - Kada se odjek primi, ECHO pin se vraća na
LOW.
Vreme koje ECHO provede u stanju HIGH odgovara vremenu puta ultrazvučnog talasa do predmeta i nazad.
Merenje impulsa
Funkcija pulseIn() meri ovo HIGH vreme u mikrosekundama:
long duration = pulseIn(echoPin, HIGH);
Ova funkcija:
- čeka da ECHO pin pređe u
HIGH(početak impulsa), - meri koliko dugo pin ostaje
HIGH, - vraća trajanje u mikrosekundama.
Pošto ECHO izlazom upravlja senzor, pin se na Arduinu samo podesi kao ulaz:
pinMode(echoPin, INPUT);
Nisu potrebni pozivi digitalWrite(echoPin, …), jer ECHO liniju pokreće hardver senzora.
Poboljšanja programa
U odnosu na prvi program, pouzdanost i čitljivost su poboljšane ovako:
- Ispravan režim pina: Echo pin je podešen kao
INPUT, da bi Arduino mogao da čita povratni impuls. - Kod u funkciji: slanje triggera i čekanje odjeka su izdvojeni u funkciju
measureDistance(), pa je program pregledniji. - Vremensko ograničenje: funkcija
pulseIn()dobija treći parametar (timeout), da program ne bi stao ako odjeka nema. - Provera greške: kada nema odjeka, funkcija vraća
-1, a program ispisuje „van opsega“ umesto pogrešnog rastojanja. - Konstante: brzina zvuka je imenovana konstanta, pa se lako menja.
// Merenje rastojanja senzorom HC-SR04 – poboljšana verzija
const int triggerPin = 9; // Trig pin ultrazvučnog senzora
const int echoPin = 10; // Echo pin ultrazvučnog senzora
const float SOUND_SPEED = 0.034; // brzina zvuka u cm/μs
void setup() {
// podešavanje pinova
pinMode(triggerPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(115200);
}
void loop() {
// merenje i ispis rastojanja
float distance = measureDistance();
if (distance < 0) {
Serial.println("Van opsega ili nema odjeka");
} else {
Serial.print("Distance: ");
Serial.print(distance, 2);
Serial.println(" cm");
}
delay(500);
}
/**
* Šalje TRIG impuls od 10 μs, čeka ECHO i vraća rastojanje u cm.
* Vraća -1 ako odjek ne stigne na vreme.
*/
float measureDistance() {
// trigger impuls
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
// čekanje odjeka, najduže 30 ms
long duration = pulseIn(echoPin, HIGH, 30000UL);
if (duration <= 0) {
return -1.0;
}
// izračunavanje rastojanja
return (duration * SOUND_SPEED) / 2.0;
}
Rešavanje problema
Nema očitavanja
Ako pulseIn() vraća nulu, obično znači da HC-SR04 nije primio odjek. Najčešći uzroci:
- Predmet je preblizu: predmeti bliži od
2 cmsu u „mrtvoj zoni“ senzora i ne daju upotrebljiv odjek. - Predmet je predaleko: predmeti dalji od
400 cmsu van najvećeg dometa, pa odjek ne stiže. - Problem sa žicama: labavi ili zamenjeni trigger i echo pinovi mogu da spreče slanje ili prijem impulsa.
Smetnje između senzora
Kada istovremeno radi više ultrazvučnih senzora, njihovi impulsi mogu da se mešaju, pa se dobijaju pogrešne nule ili povremeno pogrešna očitavanja:
- Senzori jedan za drugim: pokreći senzore redom, sa malom pauzom (npr. 50 ms) između merenja.
- Razmak: postavi senzore bar 10 cm jedan od drugog (ili ih okreni pod uglom), da se ultrazvučni snopovi manje preklapaju.
- Zaklon: male pregrade ili cevčice od sunđera oko predajnika i prijemnika svakog senzora usmeravaju zvuk.
Proveri znanje
Otvori kviz
Kviz: ultrazvučni senzor
1. Koliko dugo mora da traje impuls na Trig pinu?
2. Šta meri funkcija pulseIn(echoPin, HIGH)?
3. U kom opsegu HC-SR04 pouzdano meri?
4. Kako se smanjuju smetnje kada radi više senzora?
| Prethodno |< Merenje nepoznatog otpornika |
Sledeće Uvod u servo motore >| |
