#16 MEBKİT-Mobil Araç Kiti-Çizgi İzleyen Robot
Merhabalar, bu yazımızda MEBKİT-Mobil Araç Kiti-Çizgi İzleyen Robot devresini anlatacağım. Robotik dünyasına adım atanların, MEB Robot ya da TEKNOFEST gibi yarışmalara hazırlananların en sık karşılaştığı bileşenlerden biri şüphesiz çizgi izleyen sensör modülleridir. Bu yazımızda, projelerinizde sıklıkla kullanacağınız 3’lü kızılötesi çizgi izleyen sensör kartını yakından tanıyacağız.
Devre bağlantı şeması, mBlock programı blok şeması, Arduino programı ayrıntılı kod kısmı, devre kurulumu detaylı anlatımı ve devre çalışma videosu şu şekildedir.
Çizgi İzleyen Modül Nedir?
Çizgi izleyen modül, otonom hareket eden robotların yerdeki çizgiyi (genellikle siyah zemin üzerindeki beyaz çizgiyi veya beyaz zemin üzerindeki siyah çizgiyi) algılayarak belirli bir rotada gitmesini sağlayan bir algılama kartıdır. Görselde yer alan sensor, üzerinde Sol (L), Orta (C) ve Sağ (R) olmak üzere 3 adet bağımsız çizgi algılayıcı göz barındıran entegre bir modüldür.
Çizgi İzleyen Sensör Çeşitleri Var mıdır?
Evet, robotun hızına, hassasiyetine ve kullanılacağı pistin karmaşıklığına göre çizgi izleyen sensörler çeşitlilik gösterir:
-
Sensör Sayısına Göre: Tekli, 2’li, 3’lü (görseldeki modül gibi), 4’lü, 5’li veya profesyonel yarışmalarda kullanılan 8’li/16’lı sensör barları mevcuttur. Sensör sayısı arttıkça robotun viraj algılama kabiliyeti ve hassasiyeti artar.
-
Çıkış Tipine Göre: Dijital çıkış verenler (sadece 0 veya 1 sinyali üretenler) ve Analog çıkış verenler (zeminin koyuluk derecesine göre 0-1023 arası değer üretenler) olarak ikiye ayrılırlar.
Çizgi İzleyen Sensör Nasıl Çalışır?
Bu modüllerin çalışma mantığı tamamen ışığın yansıması ve zıtlık (kontrast) prensibine dayanır. Sensörün üzerinde yan yana duran iki minik LED bulunur: Bunlardan biri dışarıya insan gözünün göremediği bir kızılötesi (IR) ışık salar (Verici), diğeri ise zeminden yansıyıp gelen ışığı toplar (Alıcı).
-
Beyaz Zemin: Kızılötesi ışığı maksimum düzeyde geri yansıtır. Alıcı sensör bu yüksek yansımayı algılar.
-
Siyah Zemin: Kızılötesi ışığı yutar (emer) ve yansıtmaz. Alıcı sensör ışık alamadığı için siyahı ayırt etmiş olur. Modül üzerindeki kırmızı LED’ler, hangi sensörün o an çizgiyi algıladığını görmenizi sağlayarak hata ayıklamayı kolaylaştırır.
Devreye Nasıl Bağlanır?
3’lü Tracker Sensor modülü, mikrodenetleyicilere (örneğin Arduino Uno) bağlanırken oldukça az pin işgal eder ve montajı çok pratiktir. Modül üzerinde genellikle 5 adet pin bulunur:
-
VCC: Arduino’nun 5V çıkışına bağlanır.
-
GND: Arduino’nun GND (Toprak) hattına bağlanır.
-
L (Left / Sol Çıkış): Sol sensörün verisini aktarır. Arduino’nun A0 veya herhangi bir dijital pinine bağlanabilir.
-
C (Center / Orta Çıkış): Orta sensörün verisini aktarır. Arduino’nun A1 veya herhangi bir dijital pinine bağlanabilir.
-
R (Right / Sağ Çıkış): Sağ sensörün verisini aktarır. Arduino’nun A2 veya herhangi bir dijital pinine bağlanabilir.
Bağlantıda ve Çalışırken Dikkat Edilmesi Gereken Hususlar
-
Zeminden Yükseklik Ayarı (Çok Kritik): Bu sensörler zemine sıfıra sıfır dayandığında veya çok yukarıda durduğunda odaklama yapamaz ve kör kalır. İdeal çalışma yüksekliği zemin ile sensör arasında 0.5 cm ile 1 cm arası bir mesafe olmasıdır. Sensör üzerinde yer alan minik ayarlı trimpot ile hassaslık ayarı yapabilirsiniz.
-
Dış Işık ve Yansıma Faktörü: Güneş ışığı veya tepeden vuran çok parlak spot ışıklar kızılötesi algılamayı olumsuz etkileyebilir. Test alanınızın aşırı parlak olmamasına dikkat etmelisiniz.
-
Çizgi Kalınlığı Dengesi: Kullandığınız sensörlerin birbirine olan uzaklığı ile pistteki çizgi kalınlığı orantılı olmalıdır. Standart yarışmalarda çizgi kalınlığı 2 cm civarındadır; sensör yerleşimini de buna göre hizalamak yalpalamayı önler.
Nerelerde Kullanılır?
-
Eğitim robotlarında (mBlock ve Arduino tabanlı başlangıç projelerinde),
-
MEB Robot, TEKNOFEST ve üniversite düzeyindeki robotik yarışmalarında,
-
Endüstriyel alanlarda, fabrikalarda veya depolarda yerdeki çizgileri ve şeritleri takip ederek parça taşıyan otonom AGV (Otomatik Yönlendirmeli Araç) sistemlerinde sıklıkla kullanılır.
MOBİL ARAÇ KİTİ 2WD İLE ÇİZGİ İZLEYEN ROBOT YAPIMI:
DEVRE BAĞLANTI ŞEMASI:
DEVRE KURULUMU:
Malzemeler:
MEBKİT Mobil Araç Platform Kiti
Malzemeler ve mobil araç kitinin kurulum videosu aşağıdaki linkte verilmiştir. O videoyu izleyerek araç kitinin montajını yapabilirsiniz.
https://egitim.ahmetcandemir.com.tr/2-mebkit-cok-amacli-mobil-robot-platform-kiti/
MBLOCK İLE ÇİZGİ İZLEYEN ROBOT DEVRESİ (BEYAZ ZEMİN – SİYAH ÇİZGİ)
MBLOCK PROGRAMI BLOK DİYAGRAMI:
mBlock programında üstteki blok diyagramını kullanarak devremizin blok kısmını tasarlayabiliriz. (Bu devre beyaz zemin, siyah çizgi platformuna uygun olarak tasarlanmıştır.)
DEVRENİN ÇALIŞMASI:
Mobil araç kiti üzerindeki güç kartına enerji verildiğinde robot siyah çizgiyi takip edecek ve çizginin dışına çıkmayacaktır. Devreyi denemek için aşağıdaki gibi bir platform kurabilir ve üzerinde test edebilirsiniz.
mBlock yerine Arduino kodlarını kullanmak isteyenler, aşağıdaki kod bloklarını mobil araç kartına gönderebilirler.
ARDUINO KOD BÖLÜMÜ: (BEYAZ ZEMİN – SİYAH ÇİZGİ İÇİN KODLAMA)
NOT: Kod bölümü içerisinde yer alan ve // işareti ile başlayan satırlar açıklama satırlarıdır. O satırda, kod bloğunun ne anlama geldiği ve nasıl çalıştığı ile ilgili bilgi verir. Arduino // işaretli alanı çalıştırmaz. İsterseniz kod satırından // işaret ile başlayan açıklama satırlarını silebilirsiniz.
/* Zekatek - Çizgi İzleyen Robot */
// BEYAZ ZEMİN - SİYAH ÇİZGİ İÇİN KODLAMA
void setup() {
// --- Giriş ve Çıkış Pinlerinin Tanımlanması ---
pinMode(A0, INPUT_PULLUP); // Sol çizgi sensörü analog pini giriş yapıldı
pinMode(A1, INPUT_PULLUP); // Orta çizgi sensörü analog pini giriş yapıldı
pinMode(A2, INPUT_PULLUP); // Sağ çizgi sensörü analog pini giriş yapıldı
// --- Motor PWM Frekans Ayarları (İşlemci Kayıtçıları) ---
// Bu satırlar motorların daha sessiz ve yüksek frekansta (parazitsiz) çalışmasını sağlar.
TCCR1B = TCCR1B & B11111000 | B00000010; // D9 ve D10 pinlerinin PWM frekansını ayarlar
TCCR0B = TCCR0B & B11111000 | B00000010; // D5 ve D6 pinlerinin PWM frekansını ayarlar
// --- Motor Sürücü Bağlantıları ---
// Hız ve yön kontrolü için motor sürücüye giden sinyal pinleri çıkış olarak tanımlandı.
pinMode(5, OUTPUT); // Sol Motor PWM Yön 1
pinMode(6, OUTPUT); // Sol Motor PWM Yön 2 (Hız sinyali buradan veriliyor)
pinMode(9, OUTPUT); // Sağ Motor PWM Yön 1 (Hız sinyali buradan veriliyor)
pinMode(10, OUTPUT); // Sağ Motor PWM Yön 2
}
void loop() {
// --- 1. DURUM: DÜZ GİTME UYGULAMASI ---
// Sadece ORTA sensör siyah çizgide (HIGH), SOL ve SAĞ sensörler beyaz zeminde (LOW) ise:
if (digitalRead(A0) == LOW && digitalRead(A1) == HIGH && digitalRead(A2) == LOW) {
analogWrite(6, 150); // Sol motora 150 hızında ileri sinyali ver
analogWrite(5, 0); // Sol motorun ters yönünü kapat
analogWrite(9, 150); // Sağ motora 150 hızında ileri sinyali ver
analogWrite(10, 0); // Sağ motorun ters yönünü kapat
}
// --- 2. DURUM: SOLA YAVAŞ DÖNÜŞ (HAFİF SAPMA) ---
// Çizgi sola doğru kıvrılıyor; SOL ve ORTA sensör siyahı (HIGH), SAĞ sensör beyazı (LOW) görüyor:
else if (digitalRead(A0) == HIGH && digitalRead(A1) == HIGH && digitalRead(A2) == LOW) {
analogWrite(6, 120); // Sol motorun hızını 120'ye düşür (içte kalan motor yavaşlar)
analogWrite(5, 0);
analogWrite(9, 150); // Sağ motoru 150 hızında tut (dışta kalan motor hızlı döner)
analogWrite(10, 0);
}
// --- 3. DURUM: SAĞA YAVAŞ DÖNÜŞ (HAFİF SAPMA) ---
// Çizgi sağa doğru kıvrılıyor; SAĞ ve ORTA sensör siyahı (HIGH), SOL sensör beyazı (LOW) görüyor:
else if (digitalRead(A0) == LOW && digitalRead(A1) == HIGH && digitalRead(A2) == HIGH) {
analogWrite(6, 150); // Sol motoru 150 hızında tut (dışta kalan motor hızlı döner)
analogWrite(5, 0);
analogWrite(9, 120); // Sağ motorun hızını 120'ye düşür (içte kalan motor yavaşlar)
analogWrite(10, 0);
}
// --- 4. DURUM: KESKİN SOLA DÖNÜŞ ---
// Robot çizgiden çok sapmış; Sadece SOL sensör siyahı (HIGH) yakalıyor, diğerleri beyazda (LOW):
else if (digitalRead(A0) == HIGH && digitalRead(A1) == LOW && digitalRead(A2) == LOW) {
analogWrite(6, 0); // Sol motoru tamamen durdur (robotun sol tekeri sabit eksen olur)
analogWrite(5, 0);
analogWrite(9, 150); // Sağ motoru 150 hızında döndürerek robotu sola doğru savur
analogWrite(10, 0);
}
// --- 5. DURUM: KESKİN SAĞA DÖNÜŞ ---
// Robot çizgiden çok sapmış; Sadece SAĞ sensör siyahı (HIGH) yakalıyor, diğerleri beyazda (LOW):
else if (digitalRead(A0) == LOW && digitalRead(A1) == LOW && digitalRead(A2) == HIGH) {
analogWrite(6, 150); // Sol motoru 150 hızında döndürerek robotu sağa doğru savur
analogWrite(5, 0);
analogWrite(9, 0); // Sağ motoru tamamen durdur (robotun sağ tekeri sabit eksen olur)
analogWrite(10, 0);
}
}
Eğer zemin siyah, çizgi beyaz olsun istiyorsanız aşağıdaki kodlamayı kullanabilirsiniz.
ARDUINO KOD BÖLÜMÜ: (SİYAH ZEMİN – BEYAZ ÇİZGİ İÇİN KODLAMA)
NOT: Kod bölümü içerisinde yer alan ve // işareti ile başlayan satırlar açıklama satırlarıdır. O satırda, kod bloğunun ne anlama geldiği ve nasıl çalıştığı ile ilgili bilgi verir. Arduino // işaretli alanı çalıştırmaz. İsterseniz kod satırından // işaret ile başlayan açıklama satırlarını silebilirsiniz.
/* Zekatek - Çizgi İzleyen Robot */
// SİYAH ZEMİN - BEYAZ ÇİZGİ ALGORİTMASI
void setup() {
// --- Sensör Pinlerinin Tanımlanması ---
// A0, A1 ve A2 analog pinleri INPUT_PULLUP olarak ayarlanarak dijital giriş moduna alındı.
// Girişler pull-up yapıldığı için sensörler boşta kaldığında lojik HIGH (1) sinyali üretir.
pinMode(A0, INPUT_PULLUP); // Sol çizgi sensörü
pinMode(A1, INPUT_PULLUP); // Orta çizgi sensörü
pinMode(A2, INPUT_PULLUP); // Sağ çizgi sensörü
// --- PWM Frekans Ayarları ---
// Arduino Uno'nun varsayılan PWM frekansı motorlarda uğultu ve parazit yapabilir.
// Bu register (kayıtçı) komutları ile D5, D6, D9 ve D10 pinlerinin PWM frekansı yükseltilir.
// Böylece motor sürücü ve motorlar çok daha sessiz, stabil ve yüksek verimle çalışır.
TCCR1B = TCCR1B & B11111000 | B00000010; // D9 ve D10 pinlerinin PWM frekansını düzenler
TCCR0B = TCCR0B & B11111000 | B00000010; // D5 ve D6 pinlerinin PWM frekansını düzenler
// --- Motor Sürücü Çıkış Pinleri ---
// Motorların yön ve hız yönetimini üstlenen motor sürücü sinyal pinleri çıkış olarak tanımlandı.
pinMode(5, OUTPUT); // Sol Motor PWM Yön 1
pinMode(6, OUTPUT); // Sol Motor PWM Yön 2 (Hız sinyali bu pinden veriliyor)
pinMode(9, OUTPUT); // Sağ Motor PWM Yön 1 (Hız sinyali bu pinden veriliyor)
pinMode(10, OUTPUT); // Sağ Motor PWM Yön 2
}
void loop() {
// --- 1. DURUM: DÜZ GİTME UYGULAMASI ---
// Orta sensör beyaz çizgide (LOW), sol ve sağ sensörler siyah zeminde (HIGH) ise:
if (digitalRead(A0) == HIGH && digitalRead(A1) == LOW && digitalRead(A2) == HIGH) {
analogWrite(6, 150); // Sol motor 150 hızında ileri döner
analogWrite(5, 0); // Sol motorun ters yönü kapalı
analogWrite(9, 150); // Sağ motor 150 hızında ileri döner
analogWrite(10, 0); // Sağ motorun ters yönü kapalı
}
// --- 2. DURUM: SOL-ORTA DURUMU (SOLA YAVAŞ DÖNÜŞ) ---
// Çizgi sola doğru hafifçe kaçıyor; Sol ve Orta sensör beyazı (LOW), Sağ sensör siyahı (HIGH) görüyor:
else if (digitalRead(A0) == LOW && digitalRead(A1) == LOW && digitalRead(A2) == HIGH) {
analogWrite(6, 120); // İçte kalan sol motorun hızı 120'ye düşürülür
analogWrite(5, 0);
analogWrite(9, 150); // Dışta kalan sağ motor 150 hızında dönmeye devam eder (Robot sola kavis alır)
analogWrite(10, 0);
}
// --- 3. DURUM: SAĞ-ORTA DURUMU (SAĞA YAVAŞ DÖNÜŞ) ---
// Çizgi sağa doğru hafifçe kaçıyor; Sağ ve Orta sensör beyazı (LOW), Sol sensör siyahı (HIGH) görüyor:
else if (digitalRead(A0) == HIGH && digitalRead(A1) == LOW && digitalRead(A2) == LOW) {
analogWrite(6, 150); // Dışta kalan sol motor 150 hızında dönmeye devam eder
analogWrite(5, 0);
analogWrite(9, 120); // İçte kalan sağ motorun hızı 120'ye düşürülür (Robot sağa kavis alır)
analogWrite(10, 0);
}
// --- 4. DURUM: KESKİN SOLA DÖNÜŞ ---
// Çizgi sert bir şekilde sola kırılmış; Sadece Sol sensör beyazı (LOW) yakalıyor, diğerleri siyahta (HIGH):
else if (digitalRead(A0) == LOW && digitalRead(A1) == HIGH && digitalRead(A2) == HIGH) {
analogWrite(6, 0); // İçteki sol motor tamamen durdurulur ve dönüş ekseni yapılır
analogWrite(5, 0);
analogWrite(9, 150); // Dıştaki sağ motor 150 hızında dönerek robotu keskin bir şekilde sola savurur
analogWrite(10, 0);
}
// --- 5. DURUM: KESKİN SAĞA DÖNÜŞ ---
// Çizgi sert bir şekilde sağa kırılmış; Sadece Sağ sensör beyazı (LOW) yakalıyor, diğerleri siyahta (HIGH):
else if (digitalRead(A0) == HIGH && digitalRead(A1) == HIGH && digitalRead(A2) == LOW) {
analogWrite(6, 150); // Dıştaki sol motor 150 hızında dönerek robotu keskin bir şekilde sağa savurur
analogWrite(5, 0);
analogWrite(9, 0); // İçteki sağ motor tamamen durdurulur ve dönüş ekseni yapılır
analogWrite(10, 0);
}
}
MEBKİT-Mobil Araç Kiti-Çizgi İzleyen Robot
Devre hakkında yorumlarınızı aşağıdaki yorum kısmına yazabilirsiniz. Youtube kanalımızda da mBlock ve Arduino ile ilgili ders videoları bulabileceksiniz. Youtube kanalıma abone olmayı da unutmayınız.
https://www.youtube.com/@candemirahmet








Yorum Yap