Skip to Content
SensörlerHC-SR04 Ultrasonik Mesafe Sensörü

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).

  1. Trig pinine 10 mikrosaniyelik HIGH darbesi verilir.
  2. Sensör 40 kHz’de 8 darbelik ultrasonik ses paketi yayar.
  3. Ses dalgası engele çarpıp geri döner.
  4. Echo pini, ses gidip gelene kadar HIGH kalır.
  5. 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 piniArduino
VCC5V
TrigD9 (herhangi bir dijital pin)
EchoD10 (herhangi bir dijital pin)
GNDGND

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) / 2

Bu, pratikte kullanılan kısa haliyle şudur:

Mesafe (cm) = Süre_µs / 58,2

Temel 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

ÖzellikDeğer
Çalışma gerilimi5 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°
Frekans40 kHz
Tetikleme darbesi10 µ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örMenzilAvantajDezavantaj
HC-SR042–400 cmUcuz, yaygınYumuşak yüzeyleri göremez
JSN-SR04T25–450 cmSu geçirmez, tek probluYakın menzili zayıf
VL53L0X (ToF lazer)3–200 cmÇok dar açı, hızlı, hassasGüneş ışığında zorlanır
Sharp GP2Y0A21 (IR)10–80 cmKüçük nesneleri görürYüzey rengine duyarlı
TFmini (LiDAR)30 cm – 12 mUzun menzilPahalı

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 / 2 formü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