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.
Adım adım kurulum
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.
Sensörü bağlayın
VCC'yi 5V'a, GND'yi GND'ye, Trig'i D9'a, Echo'yu D10'a bağlayın.
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.
Buzzer'ı bağlayın
Buzzer'ın + bacağını D8'e, − bacağını GND'ye bağlayın.
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.
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.
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ü.
// 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 / 2Ses 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
Ölçümler zaman zaman zıplıyor
Çok yakında (2 cm altı) yanlış değer
Buzzer hiç susmuyor
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.