Teknoloji, Bilim ve Akıl
Arduino ile HC-SR04 Ultrasonik Mesafe Sensörü Nasıl Kullanılır?
Arduino

Arduino ile HC-SR04 Ultrasonik Mesafe Sensörü Nasıl Kullanılır?

5 dk okuma 1 okunma 0 yorum
Kısaca: HC-SR04, Trig pinine 10 mikrosaniyelik darbe gönderip Echo pininden dönen yankı süresini ölçer. Arduino bu süreyi 0.0343 ile çarpıp ikiye bölerek mesafeyi santimetre cinsinden hesaplar.
İçindekiler
  1. HC-SR04 Ultrasonik Sensör Nedir?
  2. HC-SR04 Teknik Özellikleri Nelerdir?
  3. HC-SR04 Nasıl Çalışır?
  4. Mesafe Hesaplama Formülü Nedir?
  5. HC-SR04 Arduino Bağlantısı Nasıl Yapılır?
  6. Temel HC-SR04 Arduino Kodu
  7. pulseIn Zaman Aşımı Neden Önemlidir?
  8. Ölçümler Neden Zıplıyor? Medyan Filtre ile Kararlı Okuma
  9. Sıcaklık Mesafe Ölçümünü Nasıl Etkiler?
  10. Örnek Proje: Arduino Park Sensörü
  11. HC-SR04 Kullanırken Sık Görülen Sorunlar ve Çözümleri
  12. Sahadan Pratik İpuçları

Arduino ile HC-SR04 ultrasonik mesafe sensörünü kullanmak için sensörün VCC pinini 5V, GND pinini GND, Trig ve Echo pinlerini ise iki dijital pine bağlamanız yeterlidir. Arduino, Trig pinine kısa bir darbe gönderir, Echo pininin HIGH kaldığı süreyi pulseIn() ile ölçer ve bu süreyi ses hızıyla çarparak mesafeyi hesaplar. Tüm işlem birkaç satır kodla yapılır.

Bu yazıda sensörün çalışma prensibini, bağlantı şemasını, temel ve filtreli kod örneklerini, sıcaklık düzeltmesini, basit bir park sensörü projesini ve sahada sık karşılaşılan ölçüm hatalarının çözümlerini ele alacağız.

HC-SR04 Ultrasonik Sensör Nedir?

HC-SR04, insan kulağının duyamayacağı yüksek frekanslı ses dalgaları kullanarak cisimlere olan mesafeyi ölçen düşük maliyetli bir sensör modülüdür. Üzerinde biri verici, diğeri alıcı olmak üzere iki silindirik dönüştürücü bulunur. Bu görünüm nedeniyle hobi projelerinde robotların gözü olarak da bilinir.

Sensör; engelden kaçan robotlar, park sensörleri, su deposu seviye ölçümü, kapı önü algılama ve kişi sayma gibi temassız mesafe ölçümü gereken pek çok projede kullanılır.

HC-SR04 Teknik Özellikleri Nelerdir?

ÖzellikDeğer
Çalışma gerilimi5V DC
Ölçüm aralığı (üretici değeri)Yaklaşık 2 cm ile 400 cm arası
Ses dalgası frekansı40 kHz
Ölçüm açısıYaklaşık 15 derece
Tetik darbesiEn az 10 mikrosaniye HIGH
Pin sayısı4 (VCC, Trig, Echo, GND)

Katalogdaki 400 cm değeri ideal koşullar içindir. Pratikte düz ve sert bir yüzeye karşı güvenilir ölçüm aralığı genellikle daha kısadır. Uzak mesafede ve eğimli yüzeylerde okumalar kararsızlaşır.

HC-SR04 Nasıl Çalışır?

Sensörün çalışma prensibi yarasaların ve denizaltı sonarlarının kullandığı yankı yöntemine dayanır. Ölçüm dört adımda gerçekleşir:

  1. Arduino, Trig pinine en az 10 mikrosaniye süren bir HIGH darbesi gönderir.
  2. Sensör, 40 kHz frekansında sekiz darbelik bir ses dalgası paketi yayar.
  3. Ses dalgası karşıdaki cisme çarpıp geri döner ve alıcı tarafından algılanır.
  4. Echo pini, dalganın gönderildiği andan geri geldiği ana kadar HIGH konumunda kalır.

Echo pininin HIGH kaldığı süre, sesin cisme gidip geri gelmesi için geçen toplam süredir. Mesafe bu süreden hesaplanır.

Mesafe Hesaplama Formülü Nedir?

Ses, yaklaşık 20 derece oda sıcaklığında havada saniyede 343 metre yol alır. Bu değer mikrosaniye başına 0.0343 santimetreye karşılık gelir. Ölçülen süre gidiş ve dönüşü kapsadığı için sonuç ikiye bölünür:

Mesafe (cm) = Süre (mikrosaniye) x 0.0343 / 2

Örneğin Echo pini 1166 mikrosaniye HIGH kaldıysa hesaplama şöyle olur: 1166 x 0.0343 / 2 ≈ 20 cm. Birçok kaynakta görülen süre / 58 formülü de aynı hesabın sadeleştirilmiş halidir.

HC-SR04 Arduino Bağlantısı Nasıl Yapılır?

Bağlantı için Arduino Uno veya Nano, HC-SR04 modülü ve dört adet jumper kablo yeterlidir.

HC-SR04 PiniArduino PiniAçıklama
VCC5VBesleme
TrigD9Tetik sinyali (çıkış)
EchoD10Yankı sinyali (giriş)
GNDGNDToprak

Trig ve Echo için herhangi iki dijital pin kullanılabilir. Kodda pin numaralarını değiştirmeniz yeterlidir.

Temel HC-SR04 Arduino Kodu

Aşağıdaki kod her yarım saniyede bir mesafeyi ölçer ve seri monitöre yazdırır. Herhangi bir kütüphane gerektirmez.

const int TRIG_PIN = 9;
const int ECHO_PIN = 10;

void setup() {
  Serial.begin(9600);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
}

void loop() {
  // Trig pinini temizle
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);

  // 10 mikrosaniyelik tetik darbesi
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  // Echo süresini ölç, 30 ms zaman aşımı
  unsigned long sure = pulseIn(ECHO_PIN, HIGH, 30000UL);

  if (sure == 0) {
    Serial.println("Menzil disi veya yankı alinamadi");
  } else {
    float mesafe = sure * 0.0343 / 2.0;
    Serial.print("Mesafe: ");
    Serial.print(mesafe);
    Serial.println(" cm");
  }

  delay(500);
}

Kodu yükledikten sonra Arduino IDE üzerinden seri monitörü 9600 baud hızında açın. Elinizi sensörün önünde ileri geri hareket ettirdiğinizde değerlerin değiştiğini görürsünüz.

pulseIn Zaman Aşımı Neden Önemlidir?

pulseIn() fonksiyonu zaman aşımı verilmezse varsayılan olarak bir saniyeye kadar bekler. Sensör yankı alamadığında program bu süre boyunca kilitlenir. 30000 mikrosaniyelik zaman aşımı yaklaşık 5 metrelik gidiş dönüş süresini kapsar ve menzil dışı durumda programın hızla devam etmesini sağlar. Zaman aşımı dolduğunda fonksiyon 0 döndürür.

Ölçümler Neden Zıplıyor? Medyan Filtre ile Kararlı Okuma

Ultrasonik sensörlerde arada bir alakasız bir değer okunması normaldir. Yansıma açısı, yumuşak yüzeyler veya ortamdaki başka ses kaynakları tek seferlik hatalı okumalara neden olur. Bu sıçramaları ortalama almak yerine medyan filtre ile temizlemek daha etkilidir. Ortalama, tek bir hatalı değerden etkilenirken medyan onu tamamen dışarıda bırakır.

const int TRIG_PIN = 9;
const int ECHO_PIN = 10;
const int ORNEK_SAYISI = 5;

float tekOlcum() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  unsigned long sure = pulseIn(ECHO_PIN, HIGH, 30000UL);
  if (sure == 0) return -1;
  return sure * 0.0343 / 2.0;
}

float medyanOlcum() {
  float degerler[ORNEK_SAYISI];
  int adet = 0;

  for (int i = 0; i < ORNEK_SAYISI; i++) {
    float m = tekOlcum();
    if (m > 0) degerler[adet++] = m;
    delay(30); // yankıların karışmaması için bekleme
  }

  if (adet == 0) return -1;

  // Ekleme sıralaması
  for (int i = 1; i < adet; i++) {
    float anahtar = degerler[i];
    int j = i - 1;
    while (j >= 0 && degerler[j] > anahtar) {
      degerler[j + 1] = degerler[j];
      j--;
    }
    degerler[j + 1] = anahtar;
  }

  return degerler[adet / 2];
}

void setup() {
  Serial.begin(9600);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
}

void loop() {
  float mesafe = medyanOlcum();
  if (mesafe < 0) {
    Serial.println("Olcum yok");
  } else {
    Serial.print("Filtreli mesafe: ");
    Serial.print(mesafe, 1);
    Serial.println(" cm");
  }
  delay(200);
}

Ölçümler arasındaki 30 milisaniyelik bekleme önemlidir. Önceki darbenin yankısı hâlâ ortamda dolaşırken yeni ölçüm başlatılırsa sensör eski yankıyı yeni sanabilir.

Sıcaklık Mesafe Ölçümünü Nasıl Etkiler?

Sesin havadaki hızı sıcaklığa bağlıdır. Yaklaşık hesap için şu formül kullanılır:

Ses hızı (m/s) = 331.3 + 0.606 x Sıcaklık (°C)

Bu formüle göre 0 derecede ses hızı yaklaşık 331 m/s, 35 derecede ise yaklaşık 352 m/s olur. Aradaki fark, soğuk bir depoda ve sıcak bir yaz gününde aynı mesafenin birkaç yüzde farklı ölçülmesine yol açar. Hobi projelerinde bu fark genellikle önemsizdir, ancak su deposu seviyesi gibi hassas ölçümlerde düzeltme yapmak gerekir.

Sitemizde anlattığımız DHT11 sıcaklık ve nem sensörü ile ortam sıcaklığını okuyup ses hızını dinamik olarak hesaplayabilirsiniz:

float sicaklik = 24.0; // DHT11 ile okunan değer
float sesHiziCmUs = (331.3 + 0.606 * sicaklik) / 10000.0;
float mesafe = sure * sesHiziCmUs / 2.0;

Örnek Proje: Arduino Park Sensörü

HC-SR04 ile yapılabilecek en öğretici projelerden biri, araçlardaki park sensörünü taklit eden bir devredir. Cisim yaklaştıkça buzzer daha sık öter, çok yakında ise sürekli öter.

Önceki bağlantıya ek olarak aktif bir buzzerın artı ucunu D8 pinine, eksi ucunu GND pinine bağlayın.

const int TRIG_PIN = 9;
const int ECHO_PIN = 10;
const int BUZZER_PIN = 8;

float mesafeOku() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  unsigned long sure = pulseIn(ECHO_PIN, HIGH, 30000UL);
  if (sure == 0) return 999;
  return sure * 0.0343 / 2.0;
}

void setup() {
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(BUZZER_PIN, OUTPUT);
}

void loop() {
  float d = mesafeOku();

  if (d < 10) {
    digitalWrite(BUZZER_PIN, HIGH);   // çok yakın: sürekli ses
    delay(100);
  } else if (d < 100) {
    int aralik = map((int)d, 10, 100, 80, 600);
    digitalWrite(BUZZER_PIN, HIGH);
    delay(60);
    digitalWrite(BUZZER_PIN, LOW);
    delay(aralik);
  } else {
    digitalWrite(BUZZER_PIN, LOW);    // güvenli mesafe
    delay(200);
  }
}

map() fonksiyonu 10 ile 100 cm arasındaki mesafeyi 80 ile 600 milisaniye arasındaki bekleme süresine dönüştürür. Eşik değerlerini kendi kullanımınıza göre değiştirebilirsiniz.

HC-SR04 Kullanırken Sık Görülen Sorunlar ve Çözümleri

SorunOlası SebepÇözüm
Sürekli 0 okunuyorTrig ve Echo kabloları ters veya gevşekBağlantıları ve pin numaralarını kontrol edin
Rastgele büyük değerlerYankı alınamıyor veya yansıma sapıyorZaman aşımı ve medyan filtre kullanın
Kumaş veya süngere karşı ölçüm yokYumuşak yüzey sesi emiyorSert ve düz yüzeylerde kullanın
Eğik duvarda hatalı ölçümSes dalgası sensöre geri dönmüyorSensörü yüzeye dik konumlandırın
İki sensör birbirini bozuyorAynı anda ölçüm yapılıyorSensörleri sırayla ve aralıklı tetikleyin
ESP32 veya 3.3V kartta sorunEcho çıkışı 5V seviyesindeEcho hattına gerilim bölücü ekleyin

Sahadan Pratik İpuçları

Masa üzerinde kusursuz çalışan HC-SR04 devreleri, gerçek ortama taşındığında farklı davranabilir. Denemelerimizde öne çıkan birkaç gözlem şunlardır:

  • Uzun kablo sorun çıkarır: Sensör ile Arduino arasındaki kablo uzadıkça Echo sinyali bozulabilir. Mümkünse kısa ve düzgün kablo kullanın.
  • Kasa içine gömmeyin: Sensörün önüne yakın duran kasa kenarları yankı yapar ve sabit yanlış değerler üretir. Dönüştürücüler kasadan hafifçe dışarı taşmalıdır.
  • Nem ve toz: HC-SR04 su geçirmez değildir. Dış ortamda veya su deposu gibi nemli yerlerde su geçirmez muadil modüller tercih edilmelidir.
  • Güç kaynağı: Motorların da çalıştığı robot projelerinde besleme dalgalanmaları okumaları bozar. Sensör beslemesine yakın bir kondansatör eklemek kararlılığı artırır.

Kütüphane kullanmak isterseniz Arduino IDE kütüphane yöneticisindeki NewPing kütüphanesi zaman aşımı, birden fazla sensör yönetimi ve medyan ölçüm gibi özellikleri hazır sunar. Ancak sensörün mantığını öğrenmek için yukarıdaki kütüphanesiz kodla başlamak daha faydalıdır.

Sık Sorulan Sorular

HC-SR04 en fazla kaç metre ölçer?
Üretici değeri yaklaşık 4 metredir. Pratikte güvenilir sonuç alınan mesafe, yüzeyin sertliğine, düzlüğüne ve sensöre olan açısına bağlı olarak genellikle daha kısadır.
HC-SR04 3.3V ile çalışır mı?
Standart HC-SR04 modülü 5V ile çalışmak üzere tasarlanmıştır. ESP32 gibi 3.3V mantık seviyeli kartlarda sensörü 5V ile besleyip Echo hattına gerilim bölücü eklemek veya 3.3V destekli muadil modülleri kullanmak gerekir.
HC-SR04 su seviyesi ölçümünde kullanılabilir mi?
Kapalı depolarda yukarıdan su yüzeyine ölçüm yapılarak kullanılabilir. Ancak modül nem ve yoğuşmaya dayanıklı değildir. Uzun süreli kullanım için su geçirmez ultrasonik sensörler daha uygundur.
Neden süre 58 ile bölünüyor?
Ses santimetre başına yaklaşık 29 mikrosaniyede ilerler. Gidiş ve dönüş hesaba katıldığında bu değer 58 mikrosaniyeye çıkar. Yani süreyi 58 ile bölmek, 0.0343 ile çarpıp ikiye bölmenin sadeleştirilmiş halidir.
Birden fazla HC-SR04 aynı Arduino ile kullanılabilir mi?
Evet. Her sensör için ayrı Trig ve Echo pinleri kullanılır. Sensörler birbirinin yankısını algılamaması için aynı anda değil, aralarında kısa beklemeler olacak şekilde sırayla tetiklenmelidir.
Ölçüm değerleri neden sürekli dalgalanıyor?
Dalgalanmanın yaygın sebepleri yansıma açısı, yumuşak yüzeyler, ortam gürültüsü ve besleme dalgalanmalarıdır. Medyan filtre kullanmak, ölçümler arasında bekleme bırakmak ve sensörü yüzeye dik konumlandırmak sonuçları belirgin şekilde kararlı hale getirir.
Ramazan Yeşildal
Ramazan Yeşildal

Karaman merkezli bilgi teknolojileri yöneticisi ve bağımsız yazılım geliştirici.

0 Yorum

Yorum yazın

E-posta adresiniz yayınlanmaz. Yorumlar onaydan sonra görünür.