HC-SR04 Ultrasonik Mesafe Sensörü
HC-SR04, ses dalgası göndererek önündeki engele olan uzaklığı ölçen bir sensördür. Yarasaların ekolokasyonuyla aynı prensiple çalışır: bir ses darbesi gönderir, yankının geri dönmesini bekler ve geçen süreden mesafeyi hesaplar.
Ucuz olması, kütüphane gerektirmemesi ve 2–400 cm arası çalışması onu robotik projelerin en popüler sensörü yapar. Engelden kaçan robotlar, park sensörleri ve su seviyesi ölçerlerin çoğu bu sensörle kurulur.
Nasıl Çalışır?
Sensörün üzerinde iki silindirik göz bulunur: biri verici (T), diğeri alıcı (R).
- Trig pinine 10 mikrosaniyelik HIGH darbesi verilir.
- Sensör 40 kHz’de 8 darbelik ultrasonik ses paketi yayar.
- Ses dalgası engele çarpıp geri döner.
- Echo pini, ses gidip gelene kadar HIGH kalır.
- Bu HIGH süresi ölçülerek mesafe hesaplanır.
40 kHz insan kulağının duyamayacağı bir frekanstır; bu yüzden sensör çalışırken hiçbir şey duymazsınız.
Pin Bağlantısı
| HC-SR04 pini | Arduino |
|---|---|
| VCC | 5V |
| Trig | D9 (herhangi bir dijital pin) |
| Echo | D10 (herhangi bir dijital pin) |
| GND | GND |
HC-SR04 5V ile çalışır ve Echo pininden 5V sinyal verir. ESP8266 veya ESP32 ile kullanacaksanız Echo hattına gerilim bölücü (örneğin 1 kΩ + 2 kΩ) koymanız gerekir; aksi halde kartın pini zarar görebilir.
Mesafe Formülü
Sesin havadaki hızı yaklaşık 343 m/s, yani 0,0343 cm/µs’dir.
Ölçülen süre sesin gidiş ve dönüş toplamıdır; bu yüzden ikiye bölünür.
Mesafe (cm) = (Süre_µs × 0,0343) / 2Bu, pratikte kullanılan kısa haliyle şudur:
Mesafe (cm) = Süre_µs / 58,2Temel Kod
const int TRIG_PIN = 9;
const int ECHO_PIN = 10;
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
float mesafeOlc() {
// Temiz bir darbe icin once LOW
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// 30 ms timeout = yaklasik 5 metre
long sure = pulseIn(ECHO_PIN, HIGH, 30000);
if (sure == 0) {
return -1; // olcum yok
}
return sure * 0.0343 / 2.0;
}
void loop() {
float mesafe = mesafeOlc();
if (mesafe < 0) {
Serial.println("Olcum alinamadi");
} else {
Serial.print("Mesafe: ");
Serial.print(mesafe, 1);
Serial.println(" cm");
}
delay(100);
}pulseIn timeout’u neden önemli?
pulseIn() fonksiyonuna üçüncü parametre olarak timeout vermezseniz, sensör hiçbir yankı almadığında bir saniye boyunca bekler ve programınız donar. Menzil dışı bir ölçümde bu her döngüde tekrar eder.
30.000 µs’lik timeout, yaklaşık 5 metrelik bir sınıra karşılık gelir ve programın takılmasını engeller.
Sıcaklık Düzeltmesi
Sesin hızı sıcaklıkla değişir. Formül şudur:
Ses hızı (m/s) = 331,3 + (0,606 × Sıcaklık_°C)- 0 °C’de: 331 m/s
- 20 °C’de: 343 m/s
- 40 °C’de: 355 m/s
Yani 0 °C ile 40 °C arasında yaklaşık %7’lik bir fark oluşur. 100 cm’lik bir ölçümde bu 7 cm hata demektir.
Hassasiyet önemliyse ortam sıcaklığını bir DHT22 veya DS18B20 ile okuyup düzeltme uygulayabilirsiniz:
float mesafeOlcSicaklikli(float sicaklikC) {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long sure = pulseIn(ECHO_PIN, HIGH, 30000);
if (sure == 0) return -1;
float hizMs = 331.3 + (0.606 * sicaklikC); // m/s
float hizCmUs = hizMs / 10000.0; // cm/us
return (sure * hizCmUs) / 2.0;
}Teknik Özellikler
| Özellik | Değer |
|---|---|
| Çalışma gerilimi | 5 V DC |
| Çalışma akımı | ~15 mA |
| Ölçüm aralığı | 2 cm – 400 cm |
| Çözünürlük | ~3 mm |
| Ölçüm açısı | ~15° |
| Frekans | 40 kHz |
| Tetikleme darbesi | 10 µs TTL |
Ölçüm Neden Yanlış Çıkar?
Ultrasonik sensörün sınırlarını bilmek, onu doğru kullanmanın yarısıdır.
Yumuşak ve gözenekli yüzeyler. Kumaş, sünger, perde, halı sesi yutar. Sensör yankı alamaz ve 0 döndürür. Bu yüzden bir robot, önündeki kanepeyi “boşluk” sanabilir.
Açılı yüzeyler. Ses dalgası 45°‘den fazla eğimli bir yüzeye çarparsa sensöre geri dönmez, başka yöne sapar. Duvara açıyla yaklaşan robot duvarı göremez.
Çok küçük veya ince nesneler. 15°‘lik koninin içinde yeterli yansıtma alanı oluşturamayan bir kalem veya ince tel algılanmayabilir.
Çok yakın nesneler (< 2 cm). Sensör hâlâ darbe gönderirken yankı döner; bu süre ölçülemez ve sonuç anlamsız çıkar.
Yan yana birden fazla sensör. Bir sensörün darbesini diğeri kendi yankısı sanabilir (çapraz karışma). Birden çok sensör kullanıyorsanız sırayla ölçüm alın, aralarına en az 30 ms koyun.
Titreşim ve motor gürültüsü. DC motorların elektriksel gürültüsü Echo okumasını bozabilir. Sensör beslemesine 100 µF kondansatör eklemek ve motor beslemesini ayırmak yardımcı olur.
Rüzgâr ve hava akımı. Açık alanda güçlü hava akımı ses dalgasını saptırır.
Ölçümü Kararlı Hale Getirme
Tek bir okumaya güvenmek yerine birkaç ölçümün medyanını almak, ani hatalı değerleri temizler.
float kararliMesafe() {
float o[5];
for (int i = 0; i < 5; i++) {
o[i] = mesafeOlc();
delay(40); // capraz karismayi onlemek icin
}
// basit siralama
for (int i = 0; i < 4; i++) {
for (int j = i + 1; j < 5; j++) {
if (o[j] < o[i]) {
float t = o[i];
o[i] = o[j];
o[j] = t;
}
}
}
return o[2]; // ortadaki deger = medyan
}Ortalama yerine medyan tercih edilir, çünkü tek bir hatalı 0 okuması ortalamayı bozar ama medyanı etkilemez.
NewPing Kütüphanesi
NewPing kütüphanesi hem daha az kod yazmanızı sağlar hem de dahili medyan filtresi sunar.
#include <NewPing.h>
#define TRIG_PIN 9
#define ECHO_PIN 10
#define MAKS_MESAFE 400
NewPing sonar(TRIG_PIN, ECHO_PIN, MAKS_MESAFE);
void setup() {
Serial.begin(9600);
}
void loop() {
unsigned int cm = sonar.ping_cm(); // tek olcum
// unsigned int cm = sonar.convert_cm(sonar.ping_median(5)); // medyanli
Serial.print("Mesafe: ");
Serial.print(cm);
Serial.println(" cm");
delay(50);
}Kütüphane menzil dışında 0 döndürür.
HC-SR04 Yerine Ne Kullanılabilir?
| Sensör | Menzil | Avantaj | Dezavantaj |
|---|---|---|---|
| HC-SR04 | 2–400 cm | Ucuz, yaygın | Yumuşak yüzeyleri göremez |
| JSN-SR04T | 25–450 cm | Su geçirmez, tek problu | Yakın menzili zayıf |
| VL53L0X (ToF lazer) | 3–200 cm | Çok dar açı, hızlı, hassas | Güneş ışığında zorlanır |
| Sharp GP2Y0A21 (IR) | 10–80 cm | Küçük nesneleri görür | Yüzey rengine duyarlı |
| TFmini (LiDAR) | 30 cm – 12 m | Uzun menzil | Pahalı |
Robotun içinde dar bir alanı hassas taramanız gerekiyorsa VL53L0X, dış ortamda su altına yakın çalışacaksanız JSN-SR04T daha doğru tercihlerdir.
Özet
HC-SR04, 40 kHz ultrasonik ses darbesi gönderip yankının dönüş süresinden mesafeyi hesaplayan bir sensördür. Trig pinine 10 µs darbe verilir, Echo pininin HIGH kalma süresi ölçülür.
Bu derste şunları öğrendik:
- Sensörün ekolokasyon prensibini
Mesafe = Süre × 0,0343 / 2formülünüpulseIn()timeout parametresinin neden zorunlu olduğunu- Sıcaklığın ses hızını nasıl değiştirdiğini
- Yumuşak yüzey, açı ve çapraz karışma kaynaklı hataları
- Medyan filtre ile ölçümü kararlı hale getirmeyi
- Alternatif mesafe sensörlerini