Bir cümlelik özet
Engel algılama, robotun önündeki nesneye olan mesafeyi bir sensörle ölçüp, belirlediğimiz bir eşik değerinin altına düştüğünde durmasını veya yön değiştirmesini sağlayan karar mantığıdır.
Neden önemli?
Önceki derste motorların nasıl döndüğünü ve bir motor sürücüsünün onlara nasıl güç verdiğini gördük. Ama sadece hareket eden bir robot, önündeki duvarı görmez; ona çarpar. Gerçek bir robot yalnız hareket etmez, aynı zamanda çevresini algılar ve buna göre karar verir.
Bu ders, daha önce ayrı ayrı öğrendiğin üç parçayı birleştirir:
- Algıla: Sensör mesafeyi ölçer.
- Karar ver: Program mesafeyi bir eşik ile karşılaştırır.
- Uygula: Motor sürücüsü robotu durdurur veya döndürür.
Buna algıla–karar ver–uygula döngüsü denir ve neredeyse tüm robotların temelini oluşturur. Bir robot süpürgenin masaya çarpmadan dönmesi, park sensörünün bip sesi, bir dronun yere yaklaşınca yavaşlaması hep aynı fikirdir.
Engeli nasıl "görürüz"?
Robot gözle görmez. Bunun yerine mesafeyi sayıya çeviren sensörler kullanırız. İki yaygın seçenek var.
Ultrasonik sensör (HC-SR04)
Bu sensör kulağımızın duyamayacağı kadar yüksek frekanslı bir ses dalgası gönderir. Ses bir engele çarpıp geri döner; sensör sesin gidip gelme süresini ölçer.
Bunu bir mağarada bağırıp yankının dönmesini beklemeye benzetebilirsin. Yankı çabuk dönerse duvar yakındır, geç dönerse uzaktır. Ses havada yaklaşık 340 metre/saniye hızla gider. Süreyi bilirsek mesafeyi hesaplayabiliriz.
- Trig pinine kısa bir sinyal göndeririz; sensör sesi yollar.
- Echo pini, yankı dönene kadar yüksek (HIGH) kalır.
- Bu sürenin uzunluğu bize mesafeyi verir.
Ultrasonik sensör 2 cm ile yaklaşık 4 metre arasını iyi ölçer ve rengi önemsemez.
Kızılötesi (IR) sensör
Kızılötesi sensör gözle görünmeyen bir ışık gönderir ve geri yansıyan ışığı ölçer. Yakın engelleri hızlı algılar; ancak menzili daha kısadır ve nesnenin rengiyle güneş ışığından etkilenebilir. Siyah bir yüzey ışığı yuttuğu için daha zor görülür.
Basit kural: Uzağı ve rengi önemsemeden ölçmek istiyorsan ultrasonik; çok yakın ve hızlı bir "var/yok" cevabı istiyorsan kızılötesi genelde daha uygundur.
Eşik değeri: "Ne kadar yakın çok yakın?"
Robot bir mesafe ölçer, örneğin 42 santimetre. Peki bu tehlikeli mi? Bunu robota biz söyleriz. Belirlediğimiz sınıra eşik (threshold) denir.
Eşiği bir güvenlik çemberi gibi düşün. Robotun etrafında görünmez bir daire var; bir nesne bu dairenin içine girerse robot tepki verir.
Örnek: Eşik = 15 cm.
- Ölçülen mesafe 40 cm ise: yol açık, ilerlemeye devam et.
- Ölçülen mesafe 12 cm ise: engel çok yakın, dur.
Eşiği çok küçük seçersen robot engele çarpmadan duramayabilir. Çok büyük seçersen robot her şeyden korkar ve hiç ilerlemez. Doğru değeri robotun hızına ve boyutuna göre denemelerle buluruz.
Karar mantığı: önce sözde kod
Kod yazmadan önce mantığı günlük dile yakın sözde kod ile yazmak, çözümü net görmemizi sağlar.
Tekrar (sürekli):
mesafe = sensörden mesafeyi oku
Eğer mesafe < 15 santimetre ise
motorları durdur
kısa bir süre geri git
sağa dön
Değilse
ileri git
Bu mantık aslında daha önce öğrendiğin üç yapı taşının birleşimidir: sürekli tekrar (döngü), bir koşul (eğer) ve sıralı komutlar. Robotik, bu tanıdık fikirleri fiziksel dünyaya bağlar.
Aynı mantık Arduino ile
Şimdi aynı fikri gerçek bir Arduino (C++) koduyla yazalım. Ultrasonik sensörle mesafeyi santimetre cinsinden okuyan küçük bir yardımcı fonksiyon kullanıyoruz.
const int trigPin = 9;
const int echoPin = 10;
const int esik = 15; // santimetre cinsinden eşik
long mesafeOku() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH); // ses dalgasını gönder
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long sure = pulseIn(echoPin, HIGH); // yankı süresini ölç
return sure * 0.034 / 2; // süreyi mesafeye çevir
}
Ses gidip geri döndüğü için toplam süreyi ikiye böleriz; 0.034 ise sesin bir mikrosaniyede aldığı yoldur (santimetre olarak).
Ana döngüde bu mesafeyi eşikle karşılaştırırız:
void loop() {
long mesafe = mesafeOku();
if (mesafe < esik) {
dur(); // her iki motoru durdur
delay(200);
geriGit(300); // kısa süre geri git
saga_don(400); // yeni yön ara
} else {
ileriGit(); // yol açıksa devam et
}
}
dur(), ileriGit(), saga_don() gibi fonksiyonların içi bir önceki dersteki motor sürücüsü komutlarıyla doldurulur. Böylece iki ders birbirine bağlanır: sensör karar verir, sürücü uygular.
Gürültüyü temizleme: filtreleme fikri
Sensörler kusursuz değildir. Ultrasonik sensör bazen tek bir yanlış ölçüm verebilir; örneğin yol açıkken aniden "3 cm" der. Bu tek hatalı okumaya inanıp robotu durdurursak, robot sebepsiz yere zıplar gibi davranır.
Çözüm fikri filtreleme: tek bir okumaya değil, birkaç okumaya birden bakarız.
Basit bir yöntem, üst üste birkaç ölçüm alıp ortasını (veya ortalamasını) kullanmaktır:
üç ölçüm al
en uçtaki tuhaf değeri at
kalan değerlere göre karar ver
Bir başka basit kural: robotu ancak arka arkaya iki ölçüm de eşiğin altındaysa durdur. Böylece tek bir yanlış okuma kararı bozmaz. Filtreleme, gerçek robotları çok daha kararlı ve güvenilir yapan küçük ama önemli bir alışkanlıktır.
Mini uygulama
Kağıt üzerinde bir "koridor testi" tasarla. Kod yazman gerekmiyor; amaç mantığı kurmak.
- Robotunun eşik değerini seç (örneğin 20 cm). Neden bu değeri seçtiğini bir cümleyle yaz.
- Aşağıdaki üç durum için robotun ne yapması gerektiğini yaz:
- Ölçülen mesafe 55 cm.
- Ölçülen mesafe 18 cm.
- Sensör tek seferde "2 cm", hemen ardından "60 cm", sonra tekrar "58 cm" ölçtü.
- Üçüncü durumda robotun neden hemen durmaması gerektiğini filtreleme fikriyle açıkla.
İpucu: Üçüncü durumda tek "2 cm" büyük olasılıkla hatalı bir okumadır.
Sık yapılan hatalar
Ortak toprak (GND) bağlamayı unutmak
Sensör ve Arduino aynı GND hattını paylaşmazsa ölçümler anlamsız çıkar. Sinyallerin ölçülebilmesi için ortak bir referans şarttır.
Eşiği yanlış seçmek
Eşik robotun durma mesafesinden küçükse, robot fark ettiğinde durmaya yer kalmaz. Robotun hızlandıkça daha erken karar vermesi gerektiğini unutma.
Tek okumaya güvenmek
Filtreleme yapmadan tek ölçüme göre karar vermek, robotu titrek ve öngörülemez yapar. Birden fazla okumaya bak.
Sensörü yanlış yöne bakacak şekilde takmak
Sensör hafif yukarı bakıyorsa alçak engelleri, çok aşağı bakıyorsa zemini "engel" sanır. Sensörü yere paralel ve önü açık şekilde yerleştir.
Güvenlik notu
Hareket eden bir robot düşebilir, parmak veya saç sıkıştırabilir ve etrafındaki eşyalara çarpabilir. Test etmeden önce şunlara dikkat et:
- Güvenli bir alan aç. Masanın kenarından uzak, geniş ve boş bir zeminde test et; robot kenardan düşebilir.
- Ellerini, saçını ve kabloları tekerleklerden ve dişlilerden uzak tut. Dönen parçalar sıkıştırabilir.
- Önce düşük hızda dene. Robotu ilk çalıştırdığında yavaş başlat; mantık doğruysa hızı sonra artır.
- Motor sürücüsü ve ayrı bir düşük gerilimli pil kullan. Motorları doğrudan Arduino pininden besleme; motorlar ayrı pil paketinden, sürücü üzerinden güç almalı. Arduino ile pilin toprağını (GND) ortak bağla.
- Asla şebeke elektriği (priz) kullanma. Yalnız düşük gerilimli pil paketleri.
- Motorlarla ve aletlerle çalışırken bir yetişkin yanında olsun.
Ders özeti
- Engel algılama, sensörle ölçülen mesafeyi bir eşikle karşılaştırıp buna göre karar veren mantıktır.
- Ultrasonik sensör ses yankısıyla, kızılötesi sensör yansıyan ışıkla mesafeyi ölçer.
- Eşik değeri robotun ne kadar yakında tepki vereceğini belirler; robotun hızına ve boyutuna göre seçilir.
- Karar mantığı "algıla–karar ver–uygula" döngüsüdür: sensör okur, program eşikle karşılaştırır, motor sürücüsü hareketi uygular.
- Filtreleme, birden çok okumaya bakarak tek hatalı ölçümün robotu yanıltmasını önler.
Kontrol soruları
- Ultrasonik sensör mesafeyi nasıl ölçer?
- "Eşik değeri" ne demektir ve neden robota biz belirleriz?
- Ölçülen mesafe eşikten büyükse robot ne yapmalıdır?
- Filtreleme neden gereklidir? Bir örnek ver.
- Motorları neden doğrudan Arduino pininden değil, ayrı bir pil ve motor sürücüsünden beslemeliyiz?
Cevaplar
- Kulağımızın duyamadığı yüksek frekanslı bir ses dalgası gönderir; ses engele çarpıp geri döner ve sensör bu gidiş-dönüş süresini ölçer. Süreyi sesin hızıyla çarpıp ikiye bölerek mesafeyi buluruz.
- Eşik, robotun tepki vereceği sınır mesafesidir. Robot "yakın"ın ne demek olduğunu kendisi bilmez; bunu robotun hızına ve boyutuna göre biz belirleriz.
- Yol açık demektir; robot ilerlemeye devam eder.
- Sensörler bazen tek seferlik yanlış okuma verebilir. Tek okumaya güvenirsek robot sebepsiz durur veya zıplar. Örneğin yol açıkken gelen tek bir "2 cm" değeri, birkaç okumaya birden bakınca yok sayılabilir.
- Motorlar Arduino pininin veremeyeceği kadar çok akım çeker ve karta zarar verebilir. Ayrı pil paketi motorlara güç verir, motor sürücüsü bu gücü kontrol eder; Arduino sadece komut gönderir. GND ortak bağlanır.
Kaynak ve doğrulama notu
“Engel Algılama” dersi için doğrulama odağı Engeli nasıl "görürüz"? ile Kızılötesi (IR) sensör arasındaki ilişkinin örnekler üzerinde tutarlı çalışmasıdır. Robot davranışı yalnız kodla açıklanamaz; mekanik yapı, güç sistemi, sensör konumu ve zemin koşulları birlikte değerlendirilmelidir. Test sonuçları aynı parkurda birkaç tekrar yapılarak kaydedilmelidir.
Sonraki ders
Çizgi İzleme: Robotun zemindeki bir çizgiyi sensörlerle takip ederek bir rotayı kendi başına izlemesi.