Robotunuzun duvarlara çarpmasını nasıl engellersiniz? Veya bir aracın arkasındaki park sensörü "Bip Bip" derken neyi ölçer? Cevap: Ses Dalgaları. Bu projede, yarasaların ve yunusların kullandığı SONAR teknolojisini Arduino ile birleştireceğiz.

1. Yarasalar ve Sesin Fiziği

HC-SR04, insanların duyamayacağı frekansta (Ultrasonik - 40kHz) ses dalgaları yayar. Bu dalgalar bir engele çarpıp geri döner. Sensör, sesin gidiş-dönüş süresini ölçerek mesafeyi hesaplar.

Sonar Mantığı
HC-SR04 ENGEL Giden Sinyal (Trigger) Dönen Yankı (Echo) Yol = Hız x Zaman Mesafe = (Süre / 2) x Ses Hızı
Neden 2'ye bölüyoruz? Çünkü sensörün ölçtüğü süre, sesin gidip VE gelme süresidir. Bize sadece tek yön (gidiş) lazım olduğu için süreyi ikiye böleriz.

2. HC-SR04 Anatomisi

Sensör üzerinde 4 adet pin bulunur. Bunların ne işe yaradığını bilmek, kod yazarken işimizi kolaylaştırır.

  • VCC Güç: +5V hattına bağlanır.
  • TRIG Tetik (Trigger): Hoparlördür. Arduino buraya "BAĞIR!" sinyali gönderir.
  • ECHO Yankı (Echo): Mikrofon görevi görür. Ses geri döndüğünde Arduino'ya "DUYDUM!" sinyali verir.
  • GND Toprak: Eksi (-) hatta bağlanır.
⚠️ Teknik Özellikler
  • 📏 Menzil: 2cm - 400cm (4 Metre)
  • 🎯 Hassasiyet: 3mm
  • 📐 Görüş Açısı: 15 Derece (Dar açılı)
  • Voltaj: 5V DC

3. Arduino Bağlantısı

Sensörü breadboard üzerine takıp jumper kablolarla Arduino'ya bağlayalım. Örnekte Pin 9 ve Pin 10 kullanacağız.

ARDUINO UNO 5V GND D9 D10 VCC TRIG ECHO GND BAĞLANTI ŞEMASI

4. Kodlamadan Önce Matematik

Arduino kodlarında sıkça göreceğiniz 0.034 sayısının sırrını çözelim. Bu, santimetre cinsinden Sesin Hızıdır.

Sesin havadaki hızı = 340 metre / saniye

1. Bunu cm'ye çevir: 34000 cm / saniye

2. Saniyeyi mikrosaniyeye çevir (Arduino mikrosaniye ölçer):
34000 cm / 1.000.000 µs = 0.034 cm/µs

5. Yazılım (Kodlama)

Aşağıdaki kodu kopyalayıp Arduino IDE'ye yapıştırın. Kodun yanında her satırın ne işe yaradığını yazdım.

Arduino Sketch C++
// Pin Tanımlamaları
const int trigPin = 9;   // Ses gönderme pini
const int echoPin = 10;  // Ses alma pini

// Değişkenler
long sure;      // Sesin gidip gelme süresi (mikrosaniye)
int mesafe;     // Hesaplanan mesafe (cm)

void setup() {
  pinMode(trigPin, OUTPUT); // Trig çıkış olarak ayarlandı
  pinMode(echoPin, INPUT);  // Echo giriş olarak ayarlandı
  Serial.begin(9600);       // Seri haberleşme başlatıldı
}

void loop() {
  // 1. Temizlik: Trig pinini sıfırla
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  // 2. Ateşleme: 10 mikrosaniyelik ses dalgası gönder
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // 3. Okuma: Echo pini HIGH olduğu süreyi ölç
  // pulseIn() fonksiyonu bize mikrosaniye döner
  sure = pulseIn(echoPin, HIGH);

  // 4. Hesaplama: Yol = Hız x Zaman
  // (0.034 ses hızıdır, 2'ye bölüyoruz çünkü gidiş-dönüş)
  mesafe = sure * 0.034 / 2;

  // 5. Ekrana Yazdırma
  Serial.print("Mesafe: ");
  Serial.print(mesafe);
  Serial.println(" cm");

  delay(100); // Biraz bekle
}
        

6. İpuçları ve Hatalar

Bağlantılarınızı kontrol edin. Özellikle VCC ve GND doğru mu? Ayrıca sensör 2cm'den daha yakın veya 4 metreden daha uzaksa "0" değeri döndürür (Menzil dışı).

Ultrasonik sensörler sert yüzeylerde (duvar) iyi çalışır ama kumaş, sünger gibi sesi emen yüzeylerde veya açılı yüzeylerde hatalı ölçüm yapabilir. Yazılımsal olarak 10 ölçüm yapıp ortalamasını almak (Averaging) sorunu çözer.

Evet var! "NewPing" kütüphanesini indirirseniz, yukarıdaki uzun matematiksel kodları yazmak yerine sadece sonar.ping_cm() yazarak mesafeyi alabilirsiniz. Profesyonel projelerde bu kütüphane önerilir.