Bir cümlelik özet
Çizgi izleme, robotun iki kızılötesi sensörle zemindeki koyu bir çizgiyi görüp sol ve sağ motor hızlarını ayarlayarak o çizgi boyunca ilerlemesidir.
Neden önemli?
Önceki derslerde robotun önündeki engeli mesafe sensörüyle algılamayı öğrendik. Şimdi robotu bir adım öteye taşıyoruz: robot yalnız durmayacak, kendisine çizilmiş bir yolu takip edecek.
Çizgi izleme, robotik yarışmalarının en klasik görevidir. Ama sadece yarışma için değil; fabrikalarda kutu taşıyan robotlar ve depolarda raf arasında dolaşan araçlar da benzer mantıkla yerdeki işaretleri izler.
Bu ders, bütün modülün özünü bir arada gösterir: algıla – karar ver – uygula döngüsü. Sensör çizgiyi algılar, program bir karar verir, motorlar bu kararı harekete çevirir.
Kızılötesi çizgi sensörü nasıl çalışır?
Işığı yansıtan ve yutan yüzeyler
Kızılötesi (IR) çizgi sensörü, zemine görünmez bir kızılötesi ışık gönderir ve geri yansıyan ışığı ölçer. İşin sırrı yüzeyin rengindedir:
- Açık renk (beyaz zemin): Işığın çoğunu geri yansıtır. Sensör "çok ışık geldi" der.
- Koyu renk (siyah çizgi): Işığın çoğunu yutar. Sensör "az ışık geldi" der.
Yani sensör aslında rengi değil, yansıyan ışık miktarını ölçer. Bir el fenerinin beyaz kâğıtta parlak, siyah kadifede sönük görünmesi gibi.
Çoğu çizgi sensörü sonucu basit bir dijital sinyal olarak verir: çizgi üzerindeyse 1, beyaz zemindeyse 0 (bazı modüllerde tam tersi olabilir; kendi modülünü mutlaka test et).
İki sensörle "nerede olduğumuzu" anlamak
Tek sensör çizgiyi görüp göremediğini söyler ama yönü söyleyemez. Bu yüzden robotun ön alt tarafına, çizginin iki yanına gelecek şekilde iki sensör yerleştiririz: biri sol, biri sağ.
İki sensörün dört olası durumu vardır:
| Sol sensör | Sağ sensör | Anlamı | Yapılacak |
|---|---|---|---|
| Çizgi yok | Çizgi yok | Robot çizginin ortasında, ikisi de beyazda | Düz git |
| Çizgi var | Çizgi yok | Robot sağa kaymış, çizgi solda kaldı | Sola dön |
| Çizgi yok | Çizgi var | Robot sola kaymış, çizgi sağda kaldı | Sağa dön |
| Çizgi var | Çizgi var | Kavşak veya kalın çizgi | Özel durum |
Buradaki mantık ilk bakışta ters gelebilir: sol sensör çizgiyi görüyorsa sola döneriz. Çünkü sol sensör çizgiye değdiyse robot çizgiden sağa doğru kaymış demektir; onu geri ortalamak için sola çekmemiz gerekir.
Dönüşü nasıl yaparız? Motor hızlarını ayarlamak
Robot iki tekerlekli ve her tekerlekte bir motor olduğunu düşünelim. Dönmek için ayrı bir direksiyon yok; bunun yerine iki tekerleği farklı hızlarda döndürürüz.
Bir kürek teknesini hatırla: sağ küreği daha hızlı çekersen tekne sola döner. Robot da aynen böyle çalışır:
- Sola dönmek için: sol motoru yavaşlat, sağ motoru hızlı tut.
- Sağa dönmek için: sağ motoru yavaşlat, sol motoru hızlı tut.
- Düz gitmek için: iki motor da aynı hızda.
Bu yönteme diferansiyel sürüş denir. Sert dönüşlerde bir tekerleği neredeyse durdurur, hatta geri döndürebiliriz; yumuşak düzeltmelerde ise sadece küçük bir hız farkı yeterlidir.
Sözde kod: temel çizgi izleme
Önce mantığı günlük dile yakın sözde kodla yazalım:
Sürekli tekrarla
sol = sol sensörü oku
sağ = sağ sensörü oku
Eğer sol beyaz ve sağ beyaz ise
iki motoru da orta hızda ileri sür (düz git)
Değilse eğer sol çizgi ve sağ beyaz ise
sola dön (sol motoru yavaşlat)
Değilse eğer sol beyaz ve sağ çizgi ise
sağa dön (sağ motoru yavaşlat)
Değilse
kavşak veya kayıp durumunu ele al
Bu sözde kod, hangi programlama diline geçersek geçelim aynı kalır. Şimdi onu Arduino diline çevirelim.
Arduino örneği
Aşağıdaki örnek, iki çizgi sensörü ve bir motor sürücüsü (örneğin L298N) kullanır. Motor hızını PWM ile analogWrite üzerinden veriyoruz:
const int SOL_SENSOR = 2; // sol IR sensör
const int SAG_SENSOR = 3; // sağ IR sensör
const int SOL_MOTOR = 5; // sol motor hız (PWM)
const int SAG_MOTOR = 6; // sağ motor hız (PWM)
const int HIZLI = 160; // 0-255 arası
const int YAVAS = 60;
void loop() {
int sol = digitalRead(SOL_SENSOR); // 1 = çizgi görüldü
int sag = digitalRead(SAG_SENSOR);
if (sol == 0 && sag == 0) { // ikisi de beyaz
analogWrite(SOL_MOTOR, HIZLI);
analogWrite(SAG_MOTOR, HIZLI); // düz git
} else if (sol == 1 && sag == 0) { // çizgi solda
analogWrite(SOL_MOTOR, YAVAS);
analogWrite(SAG_MOTOR, HIZLI); // sola dön
} else if (sol == 0 && sag == 1) { // çizgi sağda
analogWrite(SOL_MOTOR, HIZLI);
analogWrite(SAG_MOTOR, YAVAS); // sağa dön
}
}
Not: Bu örnek yalnız hız pinlerini gösterir. Gerçek robotta motorun yönünü belirleyen pinleri de (ileri/geri) setup() içinde ayarlaman gerekir. Sensörlerin 1 mi 0 mı verdiğini kendi modülünde ölçmeden bu değerlere güvenme.
Zor durumlar: kavşak ve kaybolma
Gerçek pistlerde iki özel durum robotu şaşırtır.
Her iki sensör de çizgi görüyorsa
Bu genelde bir kavşak ya da kalın bir işaret çizgisidir. Basit bir robotta karar kolaydır: düz devam et. Daha gelişmiş robotlarda önceden verilmiş bir yön kararını uygulayabiliriz.
Hiçbir sensör çizgi görmüyorsa (kaybolma)
Eğer robot çizgiden tamamen çıkarsa iki sensör de beyaz görür. Yukarıdaki basit kodda bu durum "düz git" ile karışır ve robot kaybolur. Bunu çözmenin bilinen bir yolu, son görülen yönü hatırlamaktır:
Eğer iki sensör de beyazsa
Eğer çizgiyi en son solda gördüysem
yerinde sola dönerek çizgiyi ara
Değilse
yerinde sağa dönerek çizgiyi ara
Yani robot çizgiyi kaybettiğinde rastgele gitmez; en son hangi yöne kaydığını hatırlar ve o yöne dönerek çizgiyi geri bulmaya çalışır. Bir süre hâlâ bulamazsa güvenlik için motorları durdurmak iyi bir fikirdir.
Motoru neden doğrudan Arduino'ya bağlamıyoruz?
Bu, çizgi izleyen bir robotta en sık sorulan sorulardan biri.
Arduino pinleri çok küçük akım verir (pin başına birkaç miliamper). Bir DC motor ise kalkışta yüzlerce miliamper çeker. Motoru doğrudan pine bağlarsan Arduino'yu bozarsın.
Bu yüzden araya bir motor sürücüsü (örneğin L298N) koyarız. Arduino sürücüye "şu hızda ileri git" diye zayıf bir sinyal gönderir; sürücü de asıl gücü ayrı bir pil paketinden motorlara aktarır.
İki önemli kural:
- Motorların gücü ayrı bir pil paketinden gelmeli, Arduino'nun USB'sinden değil.
- Arduino'nun toprağı (GND) ile pil paketinin eksi ucu ortak toprakta birleşmeli. Ortak toprak olmazsa sensör ve sürücü aynı "sıfır" noktasında anlaşamaz ve robot düzensiz davranır.
Mini uygulama
Malzeme ile ya da tamamen kâğıt üstünde yapabileceğin bir alıştırma.
- Beyaz bir kartona siyah bantla yumuşak kıvrımlı bir yol çiz. Keskin köşe yerine yay kullan; keskin dönüşleri basit robotlar kaçırır.
- Aşağıdaki tabloyu doldur: robot her durumda ne yapmalı? Her satır için sol motor ve sağ motor hızını "hızlı / yavaş / dur" olarak yaz.
| Sol sensör | Sağ sensör | Sol motor | Sağ motor |
|---|---|---|---|
| beyaz | beyaz | ? | ? |
| çizgi | beyaz | ? | ? |
| beyaz | çizgi | ? | ? |
| çizgi | çizgi | ? | ? |
- Robotun bir an için çizgiden çıktığını hayal et. Yukarıdaki "son yönü hatırla" mantığını üç adımlık bir sözde kodla kendi cümlelerinle yaz.
- Robotun sürekli sağa sola sallanarak (zigzag yaparak) ilerlediğini gözlemledin diyelim. Hangi değeri değiştirerek bu sallanmayı azaltabilirsin? (İpucu:
HIZLIileYAVASarasındaki farka bak.)
Sık yapılan hatalar
Sensör mantığını ters kabul etmek
Her modül 1 ve 0 değerlerini aynı vermez. Kimi modül çizgide 1, kimi 0 verir. Kod yazmadan önce sensörü çizgi üstünde ve beyazda test edip hangi değeri verdiğini not et.
Sol/sağ dönüşü karıştırmak
Sol sensör çizgiyi görünce sola dönmek ilk anda ters gelir. Robot fiziksel olarak dönene kadar hangi yönün doğru olduğunu düşün; gerekirse robotu elinle iterek test et.
Kayıp durumunu unutmak
Sadece üç durumu (düz, sağ, sol) kodlayıp "iki sensör de beyaz" halini "düz git" saymak, robot çizgiden çıkınca onu kaybettirir. Kayıp durumunu ayrıca ele al.
Hızı en yüksek yapmak
Robotu tam hızda çalıştırmak heyecanlı görünür ama hızlı robot dönüşü kaçırır ve çizgiden fırlar. Önce düşük hızda dene, çalıştıktan sonra hızı azar azar artır.
Motoru ayrı güçle beslememek
Motorları Arduino'nun 5V pininden beslemeye çalışmak en sık görülen elektronik hatasıdır. Motorlar ayrı pil paketinden beslenmeli, topraklar ortak olmalı.
Güvenlik notu
- Hareketli bir robot çarpabilir, masadan düşebilir veya parmağını sıkıştırabilir. Test etmeden önce zeminde geniş ve boş bir alan aç, robotu masa kenarından uzak tut.
- Parmaklarını, saçını ve kabloları tekerleklerden ve dişlilerden uzak tut. Dönen dişli saçı ve ipi kolayca dolar.
- Robotu ilk kez düşük hızda dene. Kontrolden çıkarsa hemen durdurabilmek için pil bağlantısını kolayca kesebileceğin bir düzen kur.
- Motorlar için mutlaka motor sürücüsü ve ayrı, düşük gerilimli pil paketi kullan; sensörlerle ortak toprağı unutma. Asla şebeke (priz) elektriği kullanma.
- Lehim, kesici alet ve motor bağlantılarında bir yetişkinden yardım iste. Pil ısınırsa çalışmayı durdur.
Ders özeti
- Kızılötesi çizgi sensörü rengi değil, yüzeyden yansıyan ışık miktarını ölçer; koyu çizgi az, açık zemin çok ışık yansıtır.
- İki sensörle robotun çizgiye göre solda mı sağda mı kaydığını anlar ve buna göre düzeltiriz.
- Robot, iki tekerleğin hızını farklılaştırarak (diferansiyel sürüş) döner; sola dönmek için sol motoru yavaşlatırız.
- Kavşak (iki sensör de çizgi) ve kaybolma (iki sensör de beyaz) özel durumlardır; kaybolmada son görülen yön hatırlanır.
- Motorlar ayrı bir pil paketiyle motor sürücüsü üzerinden beslenir ve Arduino ile ortak toprak paylaşır.
Kontrol soruları
- Kızılötesi çizgi sensörü siyah çizgi üzerinde neden "az ışık" ölçer?
- Sol sensör çizgiyi, sağ sensör beyazı görüyorsa robot hangi yöne dönmeli ve neden?
- "Diferansiyel sürüş" ile robot direksiyon olmadan nasıl döner?
- İki sensör de beyaz gördüğünde robotun çizgiyi kaybetmemesi için hangi bilgiyi hatırlaması gerekir?
- DC motoru neden doğrudan Arduino pinine bağlamak yerine motor sürücüsü ve ayrı pil kullanırız?
Cevaplar
- Çünkü koyu yüzeyler kızılötesi ışığın çoğunu yutar; sensöre geri yansıyan ışık az olur ve sensör bunu "çizgi üzerindeyim" olarak yorumlar.
- Sola dönmeli. Sol sensör çizgiye değdiyse robot çizgiden sağa kaymış demektir; sola dönerek çizgiyi tekrar ortalar.
- İki tekerleği farklı hızlarda döndürerek. Bir taraf yavaşlayıp diğeri hızlı dönünce robot yavaş dönen tekerlek yönüne kıvrılır; ayrı bir direksiyon gerekmez.
- Çizgiyi en son hangi tarafta (sol/sağ) gördüğünü. Bu yönü hatırlayıp o tarafa dönerek çizgiyi geri arar.
- Arduino pinleri motorun çektiği akımı karşılayamaz ve zarar görür. Motor sürücüsü zayıf kontrol sinyalini alıp gücü ayrı pil paketinden aktarır; ortak toprak sayesinde iki devre aynı sıfır noktasında anlaşır.
Kaynak ve doğrulama notu
“Çizgi İzleme” dersi için doğrulama odağı Kızılötesi çizgi sensörü nasıl çalışır? ile İki sensörle "nerede olduğumuzu" anlamak 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
Robot Kol Mantığı: Eklemli bir robot kolun her ekleminin nasıl kontrol edildiğini ve bir nesneyi tutup bırakma adımlarını inceliyoruz.