Ultrazvučni senzor je uređaj koji meri rastojanje do predmeta ili prepreke pomoću zvučnih talasa. Radi tako što šalje zvučne talase visoke frekvencije (ultrazvuk) i meri vreme za koje se odjek vrati posle odbijanja od predmeta.
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.Merenje rastojanja ultrazvučnim senzorom i Arduinom
Slika 1: Merenje rastojanja ultrazvučnim senzorom i Arduinom
Zatim se izračunava vreme između slanja i prijema signala. Pošto je brzina zvuka u vazduhu oko 340 metara u sekundi, odnosno 0,034 cm po mikrosekundi, rastojanje do predmeta se dobija formulom:
Rastojanje = (vreme × brzina zvuka) / 2
Delimo sa 2 jer izmereno vreme obuhvata put do predmeta i put nazad.

Najvažnije:

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

Merenje rastojanja do prepreke ultrazvučnim senzorom na Arduinu – šema povezivanja
Slika 2: Merenje rastojanja do prepreke ultrazvučnim senzorom na Arduinu – šema povezivanja
Na šemi crvena žica vodi +5 V sa 5V pina Arduina, preko probne ploče, do Vcc pina senzora.
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
}
Ovaj kod pokazuje kako se meri rastojanje senzorom HC-SR04 i Arduinom. Senzor šalje ultrazvučni impuls preko trigger pina i osluškuje odjek preko echo pina. Funkcija pulseIn() meri koliko dugo echo pin ostaje HIGH, što odgovara vremenu za koje zvučni talas stigne do predmeta i nazad. Kada se to vreme pomnoži brzinom zvuka i podeli sa dva, dobija se rastojanje do predmeta u jednom smeru. Rezultat se prikazuje u Serial Monitor-u u centimetrima. Ovo je jednostavan, a koristan primer kako ultrazvučno merenje rastojanja radi u praksi.

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 HIGH dok 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:

  1. čeka da ECHO pin pređe u HIGH (početak impulsa),
  2. meri koliko dugo pin ostaje HIGH,
  3. 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 cm su u „mrtvoj zoni“ senzora i ne daju upotrebljiv odjek.
  • Predmet je predaleko: predmeti dalji od 400 cm su 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.
Pomeri predmet u opseg 2–400 cm i još jednom proveri povezivanje pinova.

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.
Ovi koraci mnogo smanjuju smetnje i čine merenja stabilnijim.

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?