Bir cümlelik özet
Ultrasonik bir sensörle mesafeyi ölçüp, engel yaklaştıkça daha hızlı öten bir buzzer çalıştırarak arabalardaki park sensörünün mantığını Arduino ile kuracağız.
Neden önemli?
Arabaların arkasındaki park sensörünü çoğumuz duymuşuzdur: duvara yaklaştıkça bip sesleri sıklaşır, iyice yaklaşınca neredeyse sürekli öter. Bu aslında karmaşık bir sihir değil, iki basit fikrin birleşimidir: mesafeyi ölçmek ve mesafeye göre karar vermek.
Bu projede o iki fikri kendi ellerimizle birleştiriyoruz. Ultrasonik sensör bize “engel kaç santimetre uzakta?” sorusunun cevabını verir. Kodumuz da bu cevaba bakarak buzzer'ın ne sıklıkta öteceğine karar verir.
Bu ders ayrıca bir dönüm noktası: artık tek bir görevi yapan küçük programlar değil, tam bir proje kuruyoruz. Malzemeyi seçeceğiz, bağlantıyı kuracağız, kodu fonksiyonlara böleceğiz, test edeceğiz ve çıkan bir hatayı düzelteceğiz. Gerçek bir mühendislik akışı böyle işler.
Nasıl çalışır: Ultrasonik sensör
Ses dalgasıyla mesafe ölçmek
HC-SR04 adlı ultrasonik sensör, tıpkı bir yarasa gibi çalışır. Kulağımızın duyamayacağı kadar yüksek bir ses dalgası gönderir, bu dalga bir engele çarpıp geri döner ve sensör dalganın gidip gelme süresini ölçer.
Sesin havadaki hızı yaklaşık saniyede 340 metredir. Gidiş-dönüş süresini bilirsek mesafeyi hesaplayabiliriz. Süreyi 58'e bölmek bize santimetre cinsinden mesafeyi verir (dalga iki yol katettiği için bu sayı kullanılır).
Sensörün dört bacağı vardır:
- VCC: 5 volt güç.
- GND: Toprak (eksi uç).
- Trig: Sensöre “şimdi bir ses dalgası gönder” diyen tetik ucu.
- Echo: Dalga geri döndüğünde sinyal veren ok ucu.
Günlük hayattan örnek: Yarasa ve yankı
Karanlık bir mağarada yarasa, ses çıkarıp yankısının ne zaman geri döndüğünü dinleyerek önündeki duvarı “görür”. Bizim sensörümüz de aynı yankı fikrini kullanır. Bir başka örnek gemilerdeki sonar cihazıdır: su altına ses gönderip yankısını dinleyerek denizin derinliğini ölçer.
Malzeme ve bağlantı
Gerekli malzemeler
- 1 adet Arduino Uno (USB kablosuyla)
- 1 adet HC-SR04 ultrasonik sensör
- 1 adet aktif buzzer (vızıltı üreticisi)
- 1 adet breadboard (deney tahtası)
- Birkaç jumper (bağlantı) kablosu
Bağlantı şeması
Bağlantıları kısa bir liste olarak düşün:
- Sensör VCC → Arduino 5V
- Sensör GND → Arduino GND
- Sensör Trig → Arduino 9. pin
- Sensör Echo → Arduino 10. pin
- Buzzer artı (+) bacağı → Arduino 8. pin
- Buzzer eksi (−) bacağı → Arduino GND
Her şey USB veya pil paketiyle çalışan düşük gerilimdir; şebeke elektriği yoktur. İlk bağlantıyı yaparken Arduino'nun USB kablosunu bilgisayardan çıkarmak iyi bir alışkanlıktır.
Kodu fonksiyonlara bölmek
Bir önceki derste kodu fonksiyonlara bölmenin okumayı ve düzeltmeyi kolaylaştırdığını görmüştük. Bu projede iki fonksiyon kuracağız: biri mesafeyi ölçecek, diğeri o mesafeye göre buzzer'ı çalıştıracak.
Mesafe ölçen fonksiyon
long mesafeOlc() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH); // ses dalgasi gonder
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long sure = pulseIn(echoPin, HIGH); // yankinin gelme suresi
long mesafe = sure / 58; // santimetreye cevir
return mesafe;
}
pulseIn fonksiyonu, Echo ucunun ne kadar süre HIGH kaldığını mikrosaniye cinsinden ölçer. Bu süreyi 58'e bölünce santimetre cinsinden mesafeyi buluruz.
Buzzer'ı yöneten fonksiyon
Mesafe eşiklerine göre bekleme süresini değiştiririz. Engel yakınsa bekleme kısadır, bip sesleri sıklaşır.
void uyariVer(long mesafe) {
int bekleme;
if (mesafe < 10) bekleme = 100; // cok yakin
else if (mesafe < 20) bekleme = 300;
else if (mesafe < 40) bekleme = 600;
else {
noTone(buzzerPin); // uzak: sessiz
return;
}
tone(buzzerPin, 1000); // 1000 Hz oter
delay(100);
noTone(buzzerPin);
delay(bekleme); // eşige gore bekle
}
Kurulum ve ana döngü
const int trigPin = 9;
const int echoPin = 10;
const int buzzerPin = 8;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzerPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
long mesafe = mesafeOlc();
Serial.print("Mesafe: ");
Serial.print(mesafe);
Serial.println(" cm");
uyariVer(mesafe);
}
Seri monitörü (9600 baud) açtığında ölçülen mesafeyi santimetre cinsinden akarken görürsün. Bu, eşikleri kendi odana göre ayarlamana yardım eder.
Mini uygulama
Devreyi kur, üç fonksiyonu tek bir dosyada birleştir ve Arduino'ya yükle. Sonra şu test senaryolarını sırayla dene:
- Elini sensörden 50 cm uzakta tut. Seri monitörde büyük bir sayı görmeli, buzzer sessiz olmalı.
- Elini yavaşça yaklaştır. 40 cm altına inince yavaş bipler başlamalı.
- 20 cm altına inince bipler sıklaşmalı.
- 10 cm altına inince bipler iyice hızlanmalı.
- Seri monitördeki sayılara bakarak eşikleri (10, 20, 40) kendi isteğine göre değiştir.
Küçük bir geliştirme denemesi: 10 cm altında tone frekansını 1000 yerine 1500 Hz yaparsan çok yakın uyarısı daha keskin duyulur.
Projeyi güçlendirme planı
Proje: Akıllı Park Sensörü için yalnız çalışan bir gösterim hazırlamak yeterli değildir. İyi bir proje; hedefi, kullanıcıyı, sınırları, test koşullarını ve başarısız denemeleri de görünür kılar. Bu genişletme çalışmasında potansiyometreyle servo açısını sınırlar içinde değiştiren düzenek bağlamını kullanarak bağlantı şeması, derlenebilen Arduino kodu, seri monitör kaydı ve test sonucu oluştur. Dersin hedefi “Ultrasonik sensör ve buzzer'la mesafeye göre hızlanarak öten bir park sensörü yap” olsa da proje sayfasında ölçülmemiş bir sonucu kesin başarı gibi yazma.
1. Proje özeti ve kapsam
Önce üç cümle yaz: Çözmek istediğin sorun nedir, bu sorun kimin için önemlidir ve ilk sürüm özellikle neyi yapmayacaktır? Kapsam dışını belirtmek projeyi küçültmez; tamamlanabilir hâle getirir. Nasıl çalışır: Ultrasonik sensör ile Günlük hayattan örnek: Yarasa ve yankı arasındaki ilişkiyi projenin temel varsayımı olarak yaz ve bu varsayımı hangi testin doğrulayacağını belirt.
2. Kabul ölçütleri
- Kartın 5 V veya 3,3 V çalışma sınırı doğru mu?
- Pin numaraları kod ve devrede eşleşiyor mu?
- Seri monitör ölçümü beklenen aralıkta mı?
- Motor veya servo karttan doğrudan aşırı akım çekiyor mu?
- Güç kesildiğinde sistem güvenli duruma dönüyor mu?
“Proje: Akıllı Park Sensörü” için kabul ölçütlerini “çalışıyor” gibi belirsiz sözcüklerle bırakma. Süre, mesafe, doğru deneme sayısı, ekran genişliği veya kullanıcı adımı gibi gözlenebilir bir ölçü seç. Ölçüm mümkün değilse en azından üç ardışık denemede aynı davranışın görülüp görülmediğini kaydet.
3. Test matrisi
| Test | Koşul | Beklenen | Gerçek sonuç | Sonraki karar |
|---|---|---|---|---|
| Normal | Standart giriş ve tam bağlantı | Temel görev tamamlanır | Test sırasında doldur | Koru veya küçük iyileştirme yap |
| Sınır | En düşük ya da en yüksek kabul edilen değer | Sistem kararlı kalır | Test sırasında doldur | Eşiği veya kuralı gözden geçir |
| Hata | Eksik, yanlış ya da beklenmeyen giriş | Güvenli ve anlaşılır tepki | Test sırasında doldur | Hata yönetimi ekle |
| Tekrar | Aynı koşulda en az üç deneme | Benzer sonuçlar | Test sırasında doldur | Tutarsızlığın kaynağını araştır |
4. Sürüm günlüğü
“Proje: Akıllı Park Sensörü” projesinin her sürümü için tarih, değiştirdiğin tek ana karar, değişikliğin nedeni ve test sonucu yaz. İlk sürümün çalışmaması başarısızlık değildir; Nasıl çalışır: Ultrasonik sensör veya Günlük hayattan örnek: Yarasa ve yankı ile ilgili hangi varsayımın yeniden düşünülmesi gerektiğini gösteren veridir. Görsel kullanırken kişisel bilgi ve özel arka plan ayrıntılarını paylaşma.
5. Sunum ve öz değerlendirme
“Proje: Akıllı Park Sensörü” projesini iki dakikada anlatacak şekilde hazırlan: sorun, çözüm yaklaşımı, potansiyometreyle servo açısını sınırlar içinde değiştiren düzenek için en önemli test sonucu ve bir sonraki adım. “Tamamlandı” demek yerine hangi kısmın doğrulandığını ve hangi kısmın hâlâ geliştirilmesi gerektiğini açıkla.
Sık yapılan hatalar
Trig ve Echo pinlerini karıştırmak
Trig çıkış (OUTPUT), Echo giriş (INPUT) olmalıdır. İkisini pinMode içinde ters yazarsan sensör hiç ölçüm vermez. Kodun Trig'i tetikleyip Echo'yu dinlediğini kontrol et.
delay yüzünden takılmak: bir hata ve düzeltmesi
İlk denememizde buzzer çok yakınken bile tembel öttü. Sorun şuydu: uzak mesafede uyariVer fonksiyonu return ile çıkıyordu ama biz noTone yazmayı unutmuştuk, bu yüzden buzzer bir önceki sesi sürdürüyordu.
// Yanlis: uzakta ses kesilmiyordu
else {
return;
}
Düzeltme, return'den önce sesi kapatmaktı:
// Dogru: once sustur, sonra cik
else {
noTone(buzzerPin);
return;
}
Küçük bir eksik satır, davranışı tamamen değiştirebilir. Yukarıdaki tam kodda düzeltilmiş hali kullandık.
Sensörü yumuşak yüzeye çevirmek
Ultrasonik dalga, kumaş veya sünger gibi yumuşak yüzeylerde iyi yansımaz; ölçümler sıçrayabilir. Test ederken sert ve düz bir yüzey (kitap, duvar) kullan.
Güvenlik notu
- Tüm devre USB veya pil paketiyle beslenen düşük gerilimdir; asla şebeke elektriğine bağlama.
- Bu projede motor yoktur; ama ileride motor eklersen unutma: motorlar bir motor sürücüsü ve ayrı bir güç kaynağı ister, doğrudan Arduino pininden sürülmez.
- Buzzer sesi keskin olabilir; kulağına çok yakın tutma.
- Devreyi kurarken ve sökerken USB kablosunu çıkar; ilk çalıştırmayı bir yetişkinle birlikte yap.
- Kabloları ve sensörü sıvılardan uzak tut.
Park sensörü için ölçümlü test planı
Prototip, gerçek araç güvenlik sistemi olarak değil, mesafe ölçümü ve geri bildirim mantığını öğrenmek için değerlendirilmelidir. Sensör 5, 10, 20, 40 ve 80 santimetrede sabit bir hedefle denenir; her konumda en az beş okuma alınır. Beklenen ses veya ışık davranışı, ölçümlerin yayılımı ve yanlış alarm sayısı tabloya yazılır. Yumuşak kumaş, eğimli yüzey ve dar cisim gibi ultrasonu farklı yansıtan hedefler ayrıca denenerek sensörün sınırları görünür hâle getirilir.
Güvenli tasarımda motor veya araç hareketi kontrol edilmez. Sistem yalnız masa üstü eğitim düzeneğinde uyarı üretir. Ölçüm alınamazsa “yol açık” varsaymak yerine hata durumu gösterir. Bu tercih, sensör verisinin yokluğunu güvenli bilgiyle karıştırmama ilkesini öğretir.
Ders özeti
- Ultrasonik sensör, ses dalgasının gidiş-dönüş süresini ölçerek mesafeyi bulur; süreyi 58'e bölünce santimetre elde ederiz.
- Trig çıkış, Echo giriş pinidir;
pulseInyankı süresini okur. - Mesafe eşiklerine göre bekleme süresini değiştirerek buzzer'ın hızını artırıp azaltırız.
- Kodu
mesafeOlcveuyariVerfonksiyonlarına bölmek okumayı ve düzeltmeyi kolaylaştırır. - Seri monitör, gerçek ölçümleri görüp eşikleri ayarlamak için en değerli test aracımızdır.
Kontrol soruları
- HC-SR04 sensörü mesafeyi hangi fiziksel olayı kullanarak ölçer?
- Trig ve Echo pinlerinden hangisi çıkış (OUTPUT), hangisi giriştir (INPUT)?
pulseInfonksiyonundan gelen süreyi neden 58'e böleriz?- Buzzer engel yaklaştıkça neden daha sık öter? Kodun hangi kısmı bunu sağlar?
- Uzak mesafede buzzer'ın susması için
uyariVeriçinde hangi satır gereklidir?
Cevaplar
- Ses dalgasının (ultrasonik) bir engele çarpıp geri dönmesini, yani yankıyı kullanır. Gidiş-dönüş süresinden mesafe hesaplanır.
- Trig çıkıştır (OUTPUT), çünkü ona sinyal göndeririz; Echo giriştir (INPUT), çünkü ondan sinyal okuruz.
- Ses dalgası hem gidip hem geldiği için toplam yolu iki katıdır; 58'e bölmek bu gidiş-dönüşü hesaba katarak süreyi santimetreye çevirir.
- Mesafe küçüldükçe
ifblokları daha kısa birbeklemedeğeri seçer;delay(bekleme)kısaldığı için bipler arasındaki boşluk azalır ve sesler sıklaşır. noTone(buzzerPin);satırı gereklidir;return'den önce sesi kapatarak buzzer'ın önceki sesi sürdürmesini engeller.
Kaynak ve doğrulama notu
“Proje: Akıllı Park Sensörü” dersi için doğrulama odağı Nasıl çalışır: Ultrasonik sensör ile Günlük hayattan örnek: Yarasa ve yankı arasındaki ilişkinin örnekler üzerinde tutarlı çalışmasıdır. Arduino uyumlu kartlarda pin, gerilim ve akım sınırları modele göre değişebilir. Kod derlense bile devre güvenli olmayabileceğinden, motor ve servo gibi yükler uygun sürücü ve harici besleme ile kullanılmalıdır.
Sonraki ders
Proje: Çizgi İzleyen Robotun Mantığı