BP–07 · Başlangıç projesi

Ultrasonik Park Sensörü

Arabaların arka tamponundaki park sensörleri, yarasaların kullandığı yöntemle çalışır: ses gönderir ve yankıyı dinler. Bu projede HC-SR04 ultrasonik sensörle mesafe ölçüp yaklaştıkça hızlanan bir uyarı sistemi kuracağız.

SeviyeBaşlangıç
Süre45 dk
Malzeme8 çeşit
HC-SR04pulseIn()Ses hızıFonksiyon dönüş değerielse ifZaman aşımı

Proje hakkında

HC-SR04 sensörü, insan kulağının duyamayacağı 40 kHz frekansta kısa bir ses darbesi gönderir. Ses bir engele çarpıp geri döndüğünde sensör bunu algılar. Arduino, sesin gidip gelmesi için geçen süreyi ölçer ve ses hızını kullanarak mesafeyi hesaplar.

Mesafeyi üç bölgeye ayıracağız: güvenli bölgede yeşil LED yanacak, yaklaşınca sarı LED ve aralıklı bip sesi, çok yakında ise kırmızı LED ve sürekli ses devreye girecek. Bip aralığı mesafeyle birlikte kısalacak; tıpkı gerçek bir araç park sensörü gibi.

  • Ultrasonik sensörlerin çalışma prensibini
  • pulseIn() ile mikrosaniye hassasiyetinde süre ölçmeyi
  • Değer döndüren fonksiyon yazmayı
  • else if ile çok kademeli kararlar vermeyi

Malzeme listesi

Projeyi tamamlamak için aşağıdaki 8 çeşit malzemeye ihtiyacınız var. Parçaların çoğu Arduino başlangıç setlerinde hazır olarak bulunur.

Arduino Uno R3 1 adet

Projenin beyni. Nano veya Mega ile de aynı kod çalışır.

Breadboard 1 adet

Lehimsiz devre kurmak için yarım boy (400 delik) yeterlidir.

HC-SR04 ultrasonik sensör 1 adet

2–400 cm ölçüm aralığı, 5V ile çalışır.

Pasif buzzer 1 adet

Aktif buzzer da kullanılabilir; ton sabit kalır.

5 mm LED (yeşil, sarı, kırmızı) 3 adet

Her renkten birer tane.

220 Ω direnç 3 adet

LED'ler için.

Jumper kablo (erkek-erkek) 12 adet

USB A-B kablosu 1 adet

Kodu yüklemek ve kartı bilgisayardan beslemek için.

Devre bağlantıları

Bağlantıları USB kablosu takılı değilken yapın. Her satır, bileşenin hangi bacağının Arduino'nun hangi pinine gideceğini gösterir; çizgi rengi önerilen kablo rengidir.

HC-SR04 VCC5VSensör beslemesi
HC-SR04 TrigD9Ses darbesini tetikler
HC-SR04 EchoD10Yankı süresini bildirir
HC-SR04 GNDGND
Buzzer +D8
Yeşil LED anotD5220 Ω direnç üzerinden
Sarı LED anotD6220 Ω direnç üzerinden
Kırmızı LED anotD7220 Ω direnç üzerinden
LED katotları ve buzzer −GNDOrtak − hattı
Sensörü breadboard'un kenarına, "gözleri" dışarı bakacak şekilde takın. Önünde kablo veya başka bir parça olursa yankıyı yanlış yerden alır ve hatalı ölçüm yapar.

Adım adım kurulum

  1. Sensörü yerleştirin

    HC-SR04'ü breadboard'un bir kenarına, dört pini ayrı sütunlara gelecek şekilde takın. Pin isimleri kartın üzerinde yazar.

  2. Sensörü bağlayın

    VCC'yi 5V'a, GND'yi GND'ye, Trig'i D9'a, Echo'yu D10'a bağlayın.

  3. LED'leri ekleyin

    Yeşil, sarı ve kırmızı LED'leri yan yana dizin. Uzun bacaklarını 220 Ω dirençler üzerinden D5, D6 ve D7'ye, kısa bacaklarını GND'ye bağlayın.

  4. Buzzer'ı bağlayın

    Buzzer'ın + bacağını D8'e, − bacağını GND'ye bağlayın.

  5. Kodu yükleyin ve ölçün

    Kodu yükleyip Seri Port Ekranını açın. Elinizi sensörün önünde ileri geri hareket ettirerek ölçülen mesafeyi gözlemleyin.

  6. Doğruluğu kontrol edin

    Sensörün önüne bir cetvel koyup 10, 20 ve 30 cm'de bir kitap tutun. Ölçümlerin 1 cm hassasiyetle tutması gerekir.

  7. Bölgeleri ayarlayın

    Kodun loop() kısmındaki 50, 20 ve 5 cm sınırlarını kendi kullanımınıza göre değiştirin.

Arduino kodu

Kodları Arduino IDE'ye yapıştırıp yükleyebilirsiniz. Türkçe karakterler yalnızca yorum satırlarında kullanıldı; Seri Port Ekranına yazdırılan metinlerde bilerek kullanılmadı.

Üç bölgeli, mesafeye göre hızlanan park sensörü.

park_sensoru.ino
// Ultrasonik Park Sensörü
// RobotikHocasi.com

const int trigPin = 9;
const int echoPin = 10;
const int buzzerPin = 8;
const int yesilLed = 5;
const int sariLed = 6;
const int kirmiziLed = 7;

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

// Mesafeyi cm cinsinden ölçüp döndüren fonksiyon
long mesafeOlc() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);     // 10 µs'lik tetik darbesi
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  long sure = pulseIn(echoPin, HIGH, 30000);   // En fazla 30 ms bekle
  if (sure == 0) {
    return 999;   // Yankı gelmedi: menzil dışında
  }
  return sure * 0.034 / 2;   // Ses hızı 0,034 cm/µs, gidiş-dönüş için /2
}

void ledleriAyarla(bool yesil, bool sari, bool kirmizi) {
  digitalWrite(yesilLed, yesil);
  digitalWrite(sariLed, sari);
  digitalWrite(kirmiziLed, kirmizi);
}

void loop() {
  long mesafe = mesafeOlc();

  Serial.print("Mesafe: ");
  Serial.print(mesafe);
  Serial.println(" cm");

  if (mesafe > 50) {
    // Güvenli bölge
    ledleriAyarla(true, false, false);
    noTone(buzzerPin);
    delay(200);
  }
  else if (mesafe > 20) {
    // Dikkat bölgesi: yaklaştıkça bip aralığı kısalır
    ledleriAyarla(false, true, false);
    tone(buzzerPin, 1000, 80);
    delay(map(mesafe, 20, 50, 150, 500));
  }
  else if (mesafe > 5) {
    // Tehlike bölgesi
    ledleriAyarla(false, false, true);
    tone(buzzerPin, 1500, 60);
    delay(map(mesafe, 5, 20, 70, 150));
  }
  else {
    // Dur! Sürekli ses
    ledleriAyarla(false, false, true);
    tone(buzzerPin, 2000);
    delay(100);
  }
}

Kod açıklaması

digitalWrite(trigPin, HIGH); delayMicroseconds(10);

Sensöre en az 10 mikrosaniyelik bir tetik darbesi gönderir. Sensör bu sinyali alınca 8 adet 40 kHz'lik ses dalgası yayar.

pulseIn(echoPin, HIGH, 30000)

Echo pininin HIGH kaldığı süreyi mikrosaniye cinsinden ölçer. Üçüncü parametre zaman aşımıdır; 30 ms içinde yankı gelmezse 0 döndürür ve program takılmaz.

sure * 0.034 / 2

Ses havada yaklaşık 340 m/s, yani 0,034 cm/µs hızla ilerler. Ölçülen süre gidiş ve dönüşü içerdiği için ikiye böleriz.

long mesafeOlc() { ... return ...; }

Bu fonksiyon void değil long türünde değer döndürür. loop() içinde long mesafe = mesafeOlc(); yazarak sonucu bir değişkene alırız.

delay(map(mesafe, 20, 50, 150, 500))

Mesafe 50 cm'deyken 500 ms, 20 cm'deyken 150 ms bekler. Böylece engel yaklaştıkça bip sesleri sıklaşır.

Nasıl çalışır?

HC-SR04'ün üzerindeki iki silindirden biri hoparlör (T: transmitter), diğeri mikrofondur (R: receiver). Trig pinine darbe geldiğinde sensör ses dalgasını gönderir ve Echo pinini HIGH yapar. Yankı geri döndüğünde Echo pini LOW olur. Echo pininin HIGH kaldığı süre, sesin gidiş-dönüş süresine eşittir.

Örneğin 20 cm uzaktaki bir engel için ses toplam 40 cm yol alır: 40 / 0,034 ≈ 1176 µs. Sensör yumuşak yüzeylerde (kumaş, sünger) ve eğik açılı yüzeylerde ses enerjisi dağıldığı için zayıf yankı alabilir. Bu yüzden en iyi sonucu sert ve sensöre dik duran yüzeylerde verir.

Sorun giderme

Mesafe hep 999 veya 0 görünüyor
Trig ve Echo kablolarının yeri karışmış olabilir. Ayrıca sensörün VCC pininin 5V'a bağlı olduğundan emin olun; 3.3V ile çalışmaz.
Ölçümler zaman zaman zıplıyor
Normaldir. Üç ölçüm yapıp ortalamasını alarak veya ortanca değeri kullanarak sonuçları yumuşatabilirsiniz.
Çok yakında (2 cm altı) yanlış değer
HC-SR04'ün kör bölgesi yaklaşık 2 cm'dir. Bu mesafenin altında güvenilir ölçüm yapamaz.
Buzzer hiç susmuyor
Sensörün önünde çok yakın bir engel (kablo, breadboard kenarı) olabilir. Sensörün önünü açın.

Geliştirme fikirleri

Projeyi tamamladıysanız, aşağıdaki fikirlerle bir adım öteye taşıyabilirsiniz.

LCD'de mesafe

I2C LCD ekran ekleyerek mesafeyi santimetre cinsinden ekrana yazdırın.

Engelden kaçan robot

Aynı mesafe fonksiyonunu motor sürücüyle birleştirerek engel algılayan robot yapın.

Dijital cetvel

Bir butona basınca ölçümü donduran taşınabilir bir mesafe ölçer yapın.

Su seviyesi ölçer

Sensörü bir su deposunun üstüne yerleştirerek doluluk oranını hesaplayın.

Sık sorulan sorular

HC-SR04'ü 3.3V kartlarla kullanabilir miyim?
Sensör 5V ister ve Echo çıkışı 5V'tur. ESP32 gibi 3.3V kartlarda Echo hattına bir gerilim bölücü ekleyin veya HC-SR04P gibi 3.3V uyumlu bir sürüm kullanın.
Sıcaklık ölçümü etkiler mi?
Evet. Ses hızı her 1 °C için yaklaşık 0,6 m/s değişir. Hassas uygulamalarda bir sıcaklık sensörüyle düzeltme yapılabilir.
Neden NewPing kütüphanesini kullanmadık?
NewPing işi kolaylaştırır, ama sensörün nasıl çalıştığını öğrenmek için ölçümü kendimiz yazmak daha öğreticidir. İleride rahatlıkla kütüphaneye geçebilirsiniz.

Bir sonraki projeye hazır mısınız?

Başlangıç serisindeki 10 projeyi sırayla tamamladığınızda sensör, motor ve ekran kullanımının temellerini öğrenmiş olursunuz.

Başlangıç projelerine dön