@wtFAQ
◀ Potenciometar i joystickLED matrica 8 x 8 ▶

Ultrazvučni senzor i zvuk

Ultrazvuk

Ultrazvuk je zvuk čija je frekvencija veća od 20 kHz, dakle viša od onoga što ljudsko uho može čuti. U prirodi ga koriste šišmiši i dupini za orijentaciju – šalju kratke impulse zvuka i prate njihovu jeku kako bi izračunali udaljenost do prepreka ili plijena. Sličan princip koristi i sonar na brodovima, kao i senzori za parkiranje na automobilima.

U elektronici koristimo ultrazvučne senzore upravo zbog te sposobnosti mjerenja udaljenosti pomoću zvučnog vala. Jedan od najčešće korištenih senzora je HC-SR04, koji je dovoljno precizan i jednostavan za upotrebu u hobističkim projektima.

HC-SR04 – kako radi ultrazvučni senzor

ultrazvučni senzor
HC-SR04 modul ima dva okrugla “oka” – jedan predajnik (TRIG) i jedan prijemnik (ECHO). Kada pošaljemo kratki impuls na pin TRIG, senzor emitira ultrazvučni signal. Taj signal se odbije od prepreke, a prijemnik ga zabilježi i vrati impuls na pin ECHO.

Arduino tada mjeri koliko je vremena proteklo između slanja i primanja impulsa. Budući da znamo brzinu zvuka u zraku, možemo izračunati udaljenost do objekta.

Brzina zvuka u zraku iznosi približno 343 m/s, odnosno 0.0343 cm/µs. Budući da zvuk putuje do prepreke i natrag, potrebno je to vrijeme podijeliti s 2.
Formula za izračun udaljenosti je:

\[ distance = \frac{duration}{2} \times 0.0343 \]

gdje je duration vrijeme trajanja impulsa u mikrosekundama. Rezultat distance dobijemo u centimetrima.

Vježba 1: Mjerenje udaljenosti

Spoji HC-SR04 ultrazvučni senzor i Arduino:

  • pin 9 spoji na TRIG
  • pin 10 spoji na ECHO
  • GND spoji na GND
  • 5V spoji na Vcc
// C++
const int trigPin = 9;
const int echoPin = 10;

float duration, distance;

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH);
  distance = (duration*.0343)/2;
  Serial.print("Distance: ");
  Serial.println(distance);
  delay(200);
}

Vježba 2: Zvuk koji “mjeri” udaljenost

Pomoću malog zvučnika (buzzer) možemo zvuk učiniti promjenjivim ovisno o udaljenosti. Ideja je jednostavna: što je objekt bliži, to će ton biti viši. Koristimo formulu:

\[ pitch = 4000 - distance \times 100 \]

Zadatak:

  • Spoji jedan izvod zvučnika (+) na Arduino pin 13, a drugi njegov izvod na GND.
  • Koristeći naredbu tone, pošalji izračunatu frekvenciju (pitch) na zvučnik u trajanju 150 ms.
  • Koristeći naredbu noTone ugasi zvuk na kraju petlje, kako bi dobio kratku pauzu u zvuku.
// C++
const int trigPin = 9;
const int echoPin = 10;
const int buzzer = 13;

float duration, distance;
int pitch = 0;

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(buzzer, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH);
  distance = (duration*.0343)/2;
  pitch = 4000 - distance * 100;
  if (pitch < 100)
    pitch = 100;
  tone(buzzer, pitch, 150);
  Serial.print("Distance: ");
  Serial.println(distance);
  delay(200);
  noTone(buzzer);
}

Dodatna pitanja i zadaci:

  • Zašto oduzimamo od 4000?
  • Koja je najmanja, a koja najveća frekvencija koju ima smisla koristiti? Zašto?
  • U kojoj mjernoj jedinici se prikazuje frekvencija?

ligtbulb Što smo naučili?

  • Ultrazvuk je mehanički val previsoke frekvencije da bi ga ljudi čuli.
  • HC-SR04 mjeri udaljenost slanjem i primanjem zvučnog impulsa.
  • Arduino mjeri vrijeme “leta” i iz njega računa udaljenost koristeći brzinu zvuka.
  • Vrijeme se pretvara u udaljenost formulom koja uključuje faktor 1/2, jer zvuk ide do prepreke i natrag.
  • Pomoću jednostavne formule možemo udaljenost pretvoriti u ton i tako višeosjetilno prikazati podatke senzora.
◀ Potenciometar i joystickLED matrica 8 x 8 ▶