Ultrazvučno merenje rastojanja (ESP32)


Ultrazvučni senzor meri udaljenost do objekta koristeći visokofrekventne zvučne talase (ultrazvuk). Senzor emituje kratak ultrazvučni impuls, zatim meri vreme potrebno da se odbijeni signal vrati nazad do senzora. Na osnovu tog vremena i poznate brzine zvuka moguće je izračunati rastojanje do objekta.

Ovakvi senzori se koriste u robotici, sistemima za izbegavanje prepreka, automatskim vratima, parking senzorima i mnogim IoT projektima. U ovoj vežbi koristićemo popularni ultrazvučni senzor HC-SR04 povezan sa ESP32 razvojnom pločom.

ESP32 i ultrazvučni senzor

Praktična realizacija

ESP32 povezan sa HC-SR04 senzorom tokom merenja udaljenosti do objekta.

Šema povezivanja ESP32 i HC-SR04

Šema povezivanja

Pregled svih veza između ESP32 razvojne ploče i ultrazvučnog senzora.

Pinovi HC-SR04 senzora

Priključci senzora

Detaljan prikaz VCC, Trig, Echo i GND pinova.

Kako radi ultrazvučni senzor?

Princip rada zasniva se na slanju i prijemu ultrazvučnih talasa. Senzor emituje impuls prema objektu, a zatim registruje odbijeni signal koji se vraća nazad. Merenjem vremena između slanja i prijema impulsa određuje se udaljenost objekta.

Princip rada:

Ultrazvučni talas putuje od senzora do objekta i nazad. Pošto se meri ukupno vreme putovanja, dobijeni rezultat se deli sa dva kako bi se dobila stvarna udaljenost do objekta.

Pinovi HC-SR04 senzora

HC-SR04 poseduje četiri osnovna priključka:

  • VCC – napajanje senzora
  • Trig – ulaz za pokretanje merenja
  • Echo – izlaz koji vraća informaciju o trajanju povratnog signala
  • GND – zajednička masa
Napomena:

Radi jednostavnijeg povezivanja u ovoj vežbi VCC pin senzora povezan je na 3V3 izlaz ESP32 ploče. Mnogi HC-SR04 moduli mogu da rade na ovom naponu, ali pojedini primerci mogu imati smanjen domet ili povremeno nepouzdana merenja. Za maksimalnu preciznost i deklarisani radni opseg preporučuje se napajanje senzora sa 5 V.

Formula za izračunavanje udaljenosti

Merenjem vremena između slanja i prijema ultrazvučnog impulsa udaljenost računamo pomoću formule:

Distance = (Time × Speed of Sound) / 2

Brzina zvuka u vazduhu iznosi približno 340 m/s, odnosno oko 0.034 cm/µs.

  • Time – izmereno vreme povratka signala
  • Speed of Sound – brzina zvuka u vazduhu
  • /2 – zato što signal putuje do objekta i nazad

Zašto koristiti ESP32?

ESP32 poseduje znatno veće mogućnosti od klasičnih mikrokontrolerskih ploča i omogućava jednostavno povezivanje senzora sa internetom.

  • ✅ Ugrađen Wi-Fi modul
  • ✅ Ugrađen Bluetooth
  • ✅ Veći broj GPIO pinova
  • ✅ Veća brzina izvršavanja programa
  • ✅ Pogodan za IoT projekte i automatizaciju

Potreban materijal

  • ESP32 razvojna ploča
  • HC-SR04 ultrazvučni senzor
  • Breadboard
  • Jumper provodnici
  • USB kabl za povezivanje sa računarom
  • Arduino IDE sa instaliranom ESP32 podrškom

Bezbednosne preporuke

  • Uvek povezati zajedničku masu (GND) između senzora i ESP32 ploče.
  • Pre uključivanja napajanja proveriti sve veze.
  • Ne postavljati prepreke preblizu senzoru jer minimalna udaljenost merenja iznosi nekoliko centimetara.
  • Kod korišćenja više ultrazvučnih senzora voditi računa o mogućim međusobnim smetnjama.

Model ESP32 korišćen u ovoj vežbi

U ovoj vežbi koristi se razvojna ploča ESP32 DevKit V1 (DOIT), jedan od najčešće korišćenih ESP32 modela. Vežbu je moguće realizovati i na drugim ESP32 pločama, jer se ultrazvučni senzor može povezati na gotovo bilo koje digitalne GPIO pinove. Jedina razlika može biti raspored pinova na samoj ploči.

ESP32 DevKit V1

ESP32 DevKit V1

Razvojna ploča korišćena u ovoj vežbi za povezivanje i programiranje ultrazvučnog senzora.

Napomena:

U ovoj vežbi Trig pin ultrazvučnog senzora povezan je na GPIO 5, dok je Echo pin povezan na GPIO 18. Po potrebi mogu se koristiti i drugi digitalni pinovi, uz odgovarajuću izmenu programa.

Priprema Arduino IDE okruženja

Pre nego što započnemo programiranje, potrebno je da Arduino IDE bude podešen za rad sa ESP32 pločama. Ako si već radio prethodne ESP32 vežbe, ovaj korak je verovatno već završen. U suprotnom, potrebno je uraditi sledeće:

  • U meniju File → Preferences pronađi polje Additional Boards Manager URLs i dodaj adresu:

    https://espressif.github.io/arduino-esp32/package_esp32_index.json
  • Nakon toga otvori Tools → Board → Boards Manager i instaliraj paket: ESP32 by Espressif Systems.
  • Kao razvojnu ploču izaberi: ESP32 Dev Module ili DOIT ESP32 DevKit V1.
Važno:

Nakon instalacije ESP32 paketa i izbora odgovarajuće ploče, Arduino IDE je spreman za programiranje, učitavanje programa i komunikaciju sa ultrazvučnim senzorom.

Šema povezivanja

Za povezivanje ultrazvučnog senzora HC-SR04 sa ESP32 mikrokontrolerom potrebno je pravilno povezati napajanje i signalne pinove. U ovoj vežbi koristićemo jednostavno povezivanje pri kome se senzor napaja sa 3.3 V izlaza ESP32 ploče.

HC-SR04 poseduje četiri priključka:

  • VCC – napajanje senzora
  • GND – zajednička masa
  • Trig – pin za pokretanje merenja
  • Echo – pin kojim senzor vraća rezultat merenja

Povezivanje između senzora i ESP32 ploče prikazano je na šemi na početku lekcije, a koristi sledeće veze:

  • VCC → 3V3
  • GND → GND
  • Trig → GPIO 5
  • Echo → GPIO 18
Napomena:

HC-SR04 je originalno projektovan za rad na 5 V, ali u ovoj vežbi koristi se napajanje od 3.3 V radi jednostavnijeg povezivanja sa ESP32 pločom. Većina senzora će u ovoj konfiguraciji raditi bez problema, ali maksimalni domet može biti nešto manji od deklarisanog.

Nakon povezivanja svih provodnika možemo preći na pisanje programa koji će pokretati ultrazvučni impuls, meriti vreme povratka signala i izračunavati udaljenost objekta.

Kako funkcioniše ultrazvučno merenje rastojanja?

Da bismo razumeli kako ESP32 meri rastojanje pomoću ultrazvučnog senzora HC-SR04, potrebno je da znamo šta se dešava tokom jednog merenja. Proces je veoma brz i odvija se u svega nekoliko milisekundi, ali se može podeliti na nekoliko jednostavnih koraka.

ESP32 šalje signal senzoru da započne merenje. Senzor zatim emituje ultrazvučni talas koji putuje kroz vazduh, odbija se od objekta i vraća nazad do senzora. Na osnovu vremena potrebnog da se signal vrati moguće je izračunati udaljenost objekta.

Princip rada:

Ultrazvučni talas putuje od senzora do objekta i nazad. Što je objekat udaljeniji, potrebno je više vremena da se odbijeni signal vrati do senzora.

1. ESP32 šalje TRIG impuls

ESP32 na TRIG pin šalje veoma kratak impuls u trajanju od 10 mikrosekundi:

digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

Na ovaj način ESP32 daje komandu senzoru da započne novo merenje.

2. Senzor emituje ultrazvučni signal

Nakon prijema TRIG impulsa, HC-SR04 automatski emituje paket ultrazvučnih talasa frekvencije 40 kHz. Istovremeno postavlja ECHO pin u stanje HIGH.

3. Signal putuje do objekta i vraća se

Ultrazvučni talas putuje kroz vazduh sve dok ne naiđe na prepreku. Nakon odbijanja vraća se nazad do senzora.

Dok signal putuje:

  • ECHO = HIGH – merenje je u toku
  • ECHO = LOW – signal se vratio i merenje je završeno

4. ESP32 meri trajanje impulsa

ESP32 koristi funkciju pulseIn() kako bi izmerio koliko dugo je ECHO pin bio u stanju HIGH:

long duration = pulseIn(echoPin, HIGH);

Dobijena vrednost predstavlja vreme putovanja ultrazvučnog talasa izraženo u mikrosekundama.

Izračunavanje udaljenosti

Nakon merenja vremena, udaljenost se izračunava pomoću formule:

float distance = duration * 0.034 / 2;

Broj 0.034 predstavlja brzinu zvuka izraženu u centimetrima po mikrosekundi, dok se rezultat deli sa dva zato što signal putuje do objekta i nazad.

Primer izračunavanja:

Ako je trajanje ECHO impulsa 1000 μs, ultrazvučni talas je prešao približno 34 cm. Pošto je signal putovao do objekta i nazad, stvarna udaljenost objekta iznosi približno 17 cm.

Tok merenja

Vreme Događaj
t₀ ESP32 šalje TRIG impuls
t₁ Senzor emituje ultrazvučni signal i postavlja ECHO = HIGH
t₂ Odbijeni signal se vraća do senzora
t₃ ECHO prelazi u LOW i merenje se završava
t₃ − t₁ Trajanje impulsa koje koristi ESP32 za izračunavanje udaljenosti

Program za merenje rastojanja

Sledeći program pokreće ultrazvučni senzor, meri vreme povratka signala i izračunava udaljenost objekta u centimetrima.

// Merenje rastojanja pomoću HC-SR04 senzora i ESP32

const int trigPin = 5;
const int echoPin = 18;

long duration;
float distance;

void setup() {

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  Serial.begin(115200);
}

void loop() {

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH);

  distance = duration * 0.034 / 2;

  Serial.print("Distance: ");
  Serial.print(distance, 2);
  Serial.println(" cm");

  delay(500);
}

Objašnjenje programa

  • pinMode(trigPin, OUTPUT) – TRIG pin postavlja kao izlaz.
  • pinMode(echoPin, INPUT) – ECHO pin postavlja kao ulaz.
  • pulseIn() – meri trajanje HIGH impulsa na ECHO pinu.
  • distance = duration * 0.034 / 2 – izračunava udaljenost u centimetrima.
  • Serial.print() – prikazuje rezultat u Serial Monitor prozoru.
Napomena:

Za pregled rezultata potrebno je otvoriti Serial Monitor u Arduino IDE okruženju i podesiti brzinu komunikacije na 115200 bps.

Najčešći problemi i rešenja

Nema očitavanja udaljenosti

Mogući uzroci:

  • Objekat je preblizu senzoru (manje od približno 2 cm).
  • Objekat je van dometa senzora.
  • TRIG i ECHO pinovi nisu pravilno povezani.
  • Nije povezana zajednička masa (GND).
  • Greška u programu ili izboru GPIO pinova.

Nerealne ili nestabilne vrednosti

  • Objekat ima nepravilnu površinu koja loše odbija ultrazvuk.
  • Senzor nije pravilno usmeren ka objektu.
  • Prisutan je šum u napajanju ili loš kontakt na breadboard ploči.

Korišćenje više ultrazvučnih senzora

  • Pokretati merenja jednog po jednog senzora.
  • Postaviti senzore na većem međusobnom rastojanju.
  • Voditi računa da jedan senzor ne prima signal koji je poslao drugi senzor.
Picture

Praktični zadatak

U ovom zadatku treba da iskoristiš ultrazvučni senzor HC-SR04 i ESP32 kako bi proverio kako se menja izmerena udaljenost u zavisnosti od položaja objekta.

Cilj vežbe je da razumeš kako senzor „vidi“ prostor i koliko su merenja stabilna i precizna u realnim uslovima.

Zadatak:

Postavi objekat (kutiju, knjigu ili zid) ispred senzora i posmatraj vrednosti u Serial Monitor-u. Pokušaj da izmeriš udaljenost za sledeće vrednosti:

• 10 cm
• 20 cm
• 50 cm
• 100 cm

Uporedi prikazane vrednosti sa stvarnim rastojanjem izmerenim lenjirom i zapiši razlike ako postoje.

Dodatni izazovi

  • Pomeraj objekat polako i posmatraj kako se vrednosti menjaju u realnom vremenu.
  • Probaj različite površine (karton, plastika, tkanina) i uporedi stabilnost merenja.
  • Proveri kako se senzor ponaša kada je objekat pod uglom.
Pitanje za razmišljanje:

Zašto senzor ponekad pokazuje nestabilne vrednosti i kako oblik i materijal objekta utiču na refleksiju ultrazvučnog talasa?
Picture

Razumevanje ograničenja, smetnji i naprednih detalja o radu ultrazvučnih senzora

Do sada smo videli kako HC-SR04 funkcioniše, kako ESP32 šalje TRIG impuls i kako meri vreme pomoću ECHO pina. Sada prelazimo na realne situacije koje mogu uticati na tačnost merenja i stabilnost očitavanja.


1. Minimalna i maksimalna udaljenost senzora

HC-SR04 ima fizička ograničenja u dometu merenja:

  • Minimalno rastojanje: oko 2 cm – objekat je preblizu da bi se talas pravilno odbio.
  • Maksimalno rastojanje: oko 400 cm – signal postaje preslab i ne vraća se pouzdano.

Ako je objekat preblizu ili predaleko, pulseIn() često vraća 0 jer ECHO signal nije detektovan.


2. Površine i refleksija ultrazvuka

Tačnost merenja zavisi od materijala i oblika objekta.

Površina Refleksija Stabilnost
Ravna i tvrda (zid, drvo) Odlična Visoka
Zaobljena (flaše, cevi) Srednja Varira
Meka (tkanina, sunđer) Slaba Nestabilna
Neravna (rešetke, šipke) Nepravilna Nepouzdana

Ako je objekat pod uglom, ultrazvuk se može odbiti u stranu i senzor neće dobiti povratni signal.


3. Brzina zvuka i uticaj temperature

Brzina zvuka u vazduhu nije konstantna. U kodu se obično koristi približno 340 m/s.

Brzina zvuka raste približno 0.6 m/s za svaki 1°C porasta temperature.

Zbog toga se u spoljnim uslovima mogu javiti mala odstupanja (oko 2–5%).


4. Smetnje kod više senzora (crosstalk)

Ako koristiš više ultrazvučnih senzora, oni mogu „čuti“ jedan drugog.

Problem: senzor A detektuje signal senzora B i daje pogrešan rezultat.

Rešenja:

  • Aktiviraj senzore jedan po jedan (sekvencijalno).
  • Fizički ih razmakni najmanje 10 cm.
  • Usmeri ih u različitim pravcima ili koristi pregrade.

5. Timeout i stabilnost programa

Funkcija:

duration = pulseIn(echoPin, HIGH);

može da blokira ESP32 ako nema povratnog signala.

Bolje rešenje je korišćenje timeout-a:

duration = pulseIn(echoPin, HIGH, 30000UL);

Ako nema signala u zadatom vremenu, funkcija vraća 0 i program nastavlja rad.


6. Najčešći uzroci pogrešnih merenja

  • Nema zajedničke mase (GND nije povezan)
  • Pogrešno povezani TRIG i ECHO pinovi
  • Loš kontakt na breadboard-u
  • Objekat je premali ili slabo reflektuje zvuk
  • Senzor nije pravilno usmeren

7. Brza provera da li senzor radi ispravno

  1. Testiraj na zidu (najstabilniji rezultat)
  2. Koristi predmet veličine dlana na 10–50 cm
  3. Pomeri objekat i posmatraj promene u realnom vremenu
  4. Ako stalno daje 0 ili ekstremne vrednosti → proveri kablove ili senzor

8. Vizuelno razumevanje

Kratko vreme ECHO HIGH → objekat je blizu
Dugo vreme ECHO HIGH → objekat je daleko

ESP32 ne meri direktno udaljenost – on meri vreme povratka signala.


Zaključak

Ova sekcija objašnjava realna ograničenja ultrazvučnih senzora i probleme koji se javljaju u praksi. Razumevanje ovih faktora je važno za projekte kao što su:

  • autonomni roboti
  • sistemi za izbegavanje prepreka
  • parking senzori
  • pametni alarmi
  • IoT merni sistemi

Čitanje podataka sa ESP32 u Processing-u

Do sada smo rezultate merenja prikazivali u Serial Monitor-u Arduino IDE-a. Međutim, iste podatke možemo prikazati i grafički u realnom vremenu pomoću programa Processing.

ESP32 šalje podatke preko serijskog porta u obliku teksta:

Distance:23.45

Processing taj tekst prima, analizira i iz njega izdvaja broj koji predstavlja izmerenu udaljenost.

Processing kod za prijem podataka sa ESP32


import processing.serial.*;

Serial myPort;
float val = 0;

void setup() {

  size(400, 200);

  printArray(Serial.list());

  if (Serial.list().length > 0) {

    String portName = Serial.list()[0];
    println("Connecting to: " + portName);

    myPort = new Serial(this, portName, 115200);
    myPort.bufferUntil('\n');
  }
}

void draw() {

  background(255);
  fill(0);
  textSize(20);

  text("Distance: " + val + " cm", 50, 100);
}

void serialEvent(Serial p) {

  String data = p.readStringUntil('\n');

  if (data != null) {

    data = trim(data);

    if (data.startsWith("Distance:")) {

      // sigurnije izdvajanje broja
      String value = split(data, ":")[1];
      val = float(value);
    }
  }
}

Kako ovaj kod radi?

  • ESP32 šalje podatke u obliku tekstualnih linija.
  • bufferUntil('\n') osigurava da Processing čita ceo red odjednom.
  • serialEvent() se automatski poziva kada stigne nova linija.
  • Linija se deli pomoću split(data, ":") i uzima se samo brojni deo.
  • Dobijena vrednost se čuva u promenljivoj val i prikazuje u prozoru.

Zašto Processing umesto Serial Monitora?

Processing omogućava da podatke ne samo čitamo, već i vizuelizujemo:

  • grafove u realnom vremenu
  • animacije kretanja objekta
  • radar prikaz udaljenosti
  • interaktivne simulacije

Na ovaj način ESP32 postaje deo grafičkog sistema za prikaz senzorskih podataka, a ne samo tekstualni izlaz.

Picture