Çizgi izleyen robot

“Çizgi İzleyen Robot” beyaz zemine çizilmiş siyah çizgiyi veya siyah zemine çizilmiş beyaz çizgiyi takip edebilmektedir. Bu uygulamada beyaz zemin üzerine çizilmiş siyah çizgiyi takip eden bir robot yaptık. Çizgi renklerinin siyah ya da beyaz olması çok önemli değildir, Arduino programında yapılacak değişikle aynı robot iki zeminde de çalıştırılabilir.Robotun çizgiyi takip etmesinin yanı sıra çizgiyi takip ederken önüne bir engel çıkarsa engeli algılayıp durmasını sağladık. Engel algılayabilmesi için 1 tane MZ80 Mesafe Sensörü kullandık.
mz80 1
Robotun beyaz zemin üzerine çizilmiş siyah çizgiyi algılayabilmesi için 5 tane CNY70 Kızılötesi sensör kullandık. CNY70 içerisinde 2 tane eleman bulunur: Kızılötesi ışık yayan diyot ve foto transistör. Kızılötesi ışık yayan diyottan çıkan ışınlar beyaz bir yüzeye çarparsa geriye yansır ve foto transistör tarafından algılanır. Kızılötesi ışık yayan diyottan çıkan ışınlar siyah bir yüzeye çarparsa ışık soğurulur ve geri yansımaz foto transistör herhangi bir ışık algılayamaz.
cny70 1
CNY70 sensörü bulunduğu zemine göre bir çıkış sinyali üretir. Bizde bu çıkış sinyalini kullanarak Arduino ile çizgi izleyen robotun çizgiyi takip etmesini sağladık. Çizgi izleyen robotun bağlantılarının daha anlaşılır olabilmesi için tek bir devre şeması çizmek yerine parça parça devre şemaları çizdik.
CNY70 ile 74HC14 entegresi ve Arduino arasındaki bağlantılar:
cny70 74hc14
CNY70’in bağlantılarında herhangi bir karışıklık olmaması için “CNY70” yazılı olan tarafı referans alarak delikli plakete takarak lehimledik.
5cny alt
CNY70 bağlantıların daha anlaşılır olması için birde board üzerinde nasıl bağlanacağını açıkladık. CNY70′ lerin bağlantısını board üzerinde gösterirken yazılı kısma dikkat ederek taktık.
cny70
Motor sürücünün motorlarla ve Motor Beslemesi ile olan bağlantısı:
l298n motor surucu
Motor sürücünün üzerinde sarı renkli daire içine alınmış bölüm Arduino pinlerinin bağlandığı bölümdür. Bu kısım daha iyi anlaşılması için aşağıdaki resimde büyütülmüştür.
l298n enable input
Motor sürücünün ENA ve ENB etiketli pinlerinin üzerinde bu pinlere +5V gelmesini sağlayan soketler bulunur. Biz bu pinlere Arduinodan PWM sinyal göndereceğimiz için bu soketleri çıkardık. Ardunonun PWM sinyal gönderebilen 10 ve 11 nolu pinlerini EnableA ve EnableB etiketli pinlere bağladık. Motor sürücünün IN1,IN2,IN3 ve IN4 etiketli pinlerini Arduinonun 8,9,12,13 nolu pinlerine bağladık.
CNY70’in çıkışını 74HC14’e bağlamadan ölçüm yapılırsa siyah zeminde yaklaşık 1V, beyaz zeminde yaklaşık 5V değer görülür. Ama bu değerler değişkendir analog değerlerdir. 74HC14 entegresi bu analog değerleri düzenleyip dijitale çeviriyor ve tersliyor.
74HC14

  • Soldan sağa doğru birinci CNY70’in çıkışını 74HC14’ün 1 nolu bacağına bağlayıp 2 nolu bacağını Arduinonun 6 nolu pinine gönderdik.
  • İkinci CNY70’in çıkışını 74HC14’ün 3 nolu bacağına bağlayıp 4 nolu bacağını Arduinonun 5 nolu pinine gönderdik.
  • Üçüncü CNY70’in çıkışını 74HC14’ün 5 nolu bacağına bağlayıp 6 nolu bacağını Arduinonun 4 nolu pinine gönderdik.
  • Dördüncü CNY70’in çıkışını 74HC14’ün 13 nolu bacağına bağlayıp 12 nolu bacağını Arduinonun 3 nolu pinine gönderdik.
  • Beşinci CNY70’in çıkışını 74HC14’ün 11 nolu bacağına bağlayıp 10 nolu bacağını Arduinonun 2 nolu pinine gönderdik.

Böylece CNY70’ler beyaz zeminde iken lojik0(LOW), siyah zeminde iken lojik1(HIGH) bilgisi Arduinoya gönderilmiş olur.
Arduino Programı:

/* "beş zemin, bir mesafe sensörlü siyah çizgiyi takip eden robot" 
    Arduino ile 1 tane MZ80 sensör, 5 tane CNY70 sensörü ve
    L298N motor sürücü entegresi kartı kullanılarak yapılan 
    "Çizgi İzleyen Robot" programı. diyot.net */

const int ensag_sensor=2; //ensağ sensörden gelen veriyi okuyan pin
const int sag_sensor=3; //sağ sensörden gelen veriyi okuyan pin
const int orta_sensor=4; //orta sensörden gelen veriyi okuyan pin
const int sol_sensor=5; //sol sensörden gelen veriyi okuyan pin
const int ensol_sensor=6; //ensol sensörden gelen veriyi okuyan pin
const int mesafe_sensor=7; //sol sensörden gelen veriyi okuyan pin
int ensagDurum,sagDurum,ortaDurum,solDurum,ensolDurum,engelDurum;

const int sag_ileri=8; //sağ motorun ileri gitmesini sağlayan pin
const int sag_geri=9; //sağ motorun geri gitmesini sağlayan pin
const int sol_ileri=12; //sol motorun ileri gitmesini sağlayan pin
const int sol_geri=13; //sol motorun geri gitmesini sağlayan pin

const int Enable1=10; //sağ motorun hızını ayarlamak için kullan
const int Enable2=11; //sol motorun hızını ayarlamak için kullan
//bu pinlerden PWM sinyal gönderilecek

void ileri()
{
   digitalWrite(Enable1,HIGH); //sağ motor aktif
   digitalWrite(Enable2,HIGH); //sol motor aktif
   digitalWrite(sag_ileri,HIGH); //sağ motor ileri git
   digitalWrite(sag_geri,LOW);
   digitalWrite(sol_ileri,HIGH); //sol motor ileri git
   digitalWrite(sol_geri,LOW);    
 }
void hafifsaga()
{
   digitalWrite(Enable1,HIGH); //sağ motor aktif
   analogWrite (Enable2,170); //sol motor yavaş
   digitalWrite(sag_ileri,LOW); //sağ motor dur
   digitalWrite(sag_geri,LOW);
   digitalWrite(sol_ileri,HIGH); //sol motor ileri 
   digitalWrite(sol_geri,LOW);    
 }
void hizlisaga()
{
   digitalWrite(Enable1,HIGH); //sağ motor aktif
   analogWrite (Enable2,220); //sol motor daha hızlı
   digitalWrite(sag_ileri,LOW); //sağ motor dur
   digitalWrite(sag_geri,LOW);
   digitalWrite(sol_ileri,HIGH); //sol motor ileri 
   digitalWrite(sol_geri,LOW);    
 }
void dahahizlisaga()
{
   digitalWrite(Enable1,HIGH); //sağ motor aktif
   analogWrite (Enable2,255); //sol motor tam güç
   digitalWrite(sag_ileri,LOW); //sağ motor dur
   digitalWrite(sag_geri,LOW);
   digitalWrite(sol_ileri,HIGH); //sol motor ileri 
   digitalWrite(sol_geri,LOW);    
 }
void tamhizsaga()
{
   analogWrite (Enable1,127); //sağ motor yarım güç
   analogWrite (Enable2,255); //sol motor tam güç
   digitalWrite(sag_ileri,LOW); //sağ motor geri
   digitalWrite(sag_geri,HIGH);
   digitalWrite(sol_ileri,HIGH); //sol motor ileri 
   digitalWrite(sol_geri,LOW);    
 }
void hafifsola()
{
   analogWrite (Enable1,170); //sağ motor yavaş
   digitalWrite(Enable2,HIGH); //sol motor aktif
   digitalWrite(sag_ileri,HIGH); //sağ motor ileri 
   digitalWrite(sag_geri,LOW);
   digitalWrite(sol_ileri,LOW); //sol motor dur
   digitalWrite(sol_geri,LOW);    
 }
void hizlisola()
{
   analogWrite (Enable1,220); //sağ motor daha hızlı
   digitalWrite(Enable2,HIGH); //sol motor aktif
   digitalWrite(sag_ileri,HIGH); //sağ motor ileri 
   digitalWrite(sag_geri,LOW);
   digitalWrite(sol_ileri,LOW); //sol motor dur
   digitalWrite(sol_geri,LOW);    
 }
void dahahizlisola()
{
   analogWrite (Enable1,255); //sağ motor tam güç
   digitalWrite(Enable2,HIGH); //sol motor aktif
   digitalWrite(sag_ileri,HIGH); //sağ motor ileri 
   digitalWrite(sag_geri,LOW);
   digitalWrite(sol_ileri,LOW); //sol motor dur
   digitalWrite(sol_geri,LOW);    
 }
void tamhizsola()
{
   analogWrite (Enable1,255); //sağ motor tam güç
   analogWrite (Enable2,127); //sol motor yarım güç
   digitalWrite(sag_ileri,HIGH); //sağ motor ileri 
   digitalWrite(sag_geri,LOW);
   digitalWrite(sol_ileri,LOW); //sol motor geri
   digitalWrite(sol_geri,HIGH);    
 }
void dur()
{
   analogWrite (Enable1,255); //sağ motor aktif
   analogWrite (Enable2,255); //sol motor aktif
   digitalWrite(sag_ileri,LOW); //sağ motor DUR
   digitalWrite(sag_geri,LOW);
   digitalWrite(sol_ileri,LOW); //sol motor DUR
   digitalWrite(sol_geri,LOW);    
 }

void setup() 
{
  pinMode (ensag_sensor,INPUT); //sensör bağlı pinler giriş
  pinMode (sag_sensor,INPUT); 
  pinMode (orta_sensor,INPUT);
  pinMode (sol_sensor,INPUT);
  pinMode (ensol_sensor,INPUT);
  pinMode (mesafe_sensor,INPUT);
  pinMode (sag_ileri,OUTPUT); //motor bağlı pinler çıkış
  pinMode (sag_geri,OUTPUT);
  pinMode (sol_ileri,OUTPUT);
  pinMode (sol_geri,OUTPUT); 
  pinMode (Enable1,OUTPUT);
  pinMode (Enable2,OUTPUT); 
 }

void loop() 
{
 ensagDurum = digitalRead(ensag_sensor);
 sagDurum = digitalRead(sag_sensor); 
 ortaDurum = digitalRead(orta_sensor);
 solDurum = digitalRead(sol_sensor);
 ensolDurum = digitalRead(ensol_sensor);
 engelDurum = digitalRead(mesafe_sensor);
 //sensörlerden gelen veriyi okuyup değişkenlere kaydet
 //sensörler siyah zeminde HIGH, beyaz zeminde LOW çıkış verir

while (engelDurum == LOW)
{ //robotun önüne bir engel çıkıp mesafe sensörünün çıkışı lojik0 olunca robot dursun.
  dur();
 engelDurum = digitalRead(mesafe_sensor);
 }
 
if (ensolDurum==LOW && solDurum==LOW && ortaDurum==HIGH && sagDurum==LOW && ensagDurum==LOW)
{ //orta sensör siyah çizgide,diğer sensörler beyaz zeminde ise robot ileri gitsin
  ileri();
 }

else if (ensolDurum==LOW && solDurum==HIGH && ortaDurum==HIGH && sagDurum==LOW && ensagDurum==LOW)
{ //orta ve sol sensör siyah çizgide,diğer sensörler beyaz zeminde ise robot hafif sola dönsün
  hafifsola();
 }

else if (ensolDurum==LOW && solDurum==HIGH && ortaDurum==LOW && sagDurum==LOW && ensagDurum==LOW)
{ //sol sensör siyah çizgide,diğer sensörler beyaz zeminde ise robot hızlı sola dönsün
  hizlisola();
 }

else if (ensolDurum==HIGH && solDurum==HIGH && ortaDurum==LOW && sagDurum==LOW && ensagDurum==LOW)
{ //sol ve ensol sensörler siyah çizgide,diğer sensörler beyaz zeminde ise robot daha hızlı sola dönsün
  dahahizlisola();
 }

else if (ensolDurum==HIGH && solDurum==LOW && ortaDurum==LOW && sagDurum==LOW && ensagDurum==LOW)
{ //ensol sensör siyah çizgide,diğer sensörler beyaz zeminde ise robot tam hız sola dönsün
  tamhizsola();
 }

else if (ensolDurum==LOW && solDurum==LOW && ortaDurum==HIGH && sagDurum==HIGH && ensagDurum==LOW)
{ //orta ve sağ sensörler siyah çizgide,diğer sensörler beyaz zeminde ise robot hafif sağa dönsün
  hafifsaga();
 }

else if (ensolDurum==LOW && solDurum==LOW && ortaDurum==LOW && sagDurum==HIGH && ensagDurum==LOW)
{ //sağ sensör siyah çizgide,diğer sensörler beyaz zeminde ise robot hızlı sağa dönsün
  hizlisaga();
 }

else if (ensolDurum==LOW && solDurum==LOW && ortaDurum==LOW && sagDurum==HIGH && ensagDurum==HIGH)
{ //sağ ve ensağ sensörler siyah çizgide,diğer sensörler beyaz zeminde ise robot daha hızlı sağa dönsün
  dahahizlisaga();
 }

else if (ensolDurum==LOW && solDurum==LOW && ortaDurum==LOW && sagDurum==LOW && ensagDurum==HIGH)
{ //ensağ sensör siyah çizgide,diğer sensörler beyaz zeminde ise robot tam hız sağa dönsün
  tamhizsaga();
 }

else if (ensolDurum==HIGH && solDurum==HIGH && ortaDurum==HIGH && sagDurum==HIGH && ensagDurum==HIGH)
{ //tüm sensörler siyah çizgide ise robot ileri gitsin
  ileri();
 }

else if (ensolDurum==LOW && solDurum==LOW && ortaDurum==LOW && sagDurum==LOW && ensagDurum==LOW)
{ //tüm sensörler beyaz zeminde ise robot ileri gitsin
  ileri();
 }
 
else if (ensolDurum==HIGH && solDurum==HIGH && ortaDurum==HIGH && sagDurum==LOW && ensagDurum==LOW)
{ //soldaki üç sensör siyah çizgideyse robot hızlı sola dönsün
  hizlisola();
 }

else if (ensolDurum==LOW && solDurum==LOW && ortaDurum==HIGH && sagDurum==HIGH && ensagDurum==HIGH)
{ //sağdaki üç sensör siyah çizgideyse robot hızlı sağa dönsün
  hizlisaga();
 }
}

Arduino programında ilk olarak kullandığımız pinleri isimlendirdik. Hangi sensörü Arduinonun hangi pinine bağladığımızı belirttik. Bu isimlendirmeyi yaptıktan sonra program yazarken pin numaralarını aklınızda tutmanıza gerek kalmaz, pinlere verdiğiniz isimleri yazmak yeterli olur. Sensör bağlı pinleri değiştirmeyi düşünmediğimiz için veri tipi olarak “const int” seçtik. Sensörlerden okunan verileri okuduktan sonra kaydetmek için “int” veri tipinde değişkenler tanımladık.
İki DC motoru Arduinonun 6 tane pinini kullanarak kontrol ettik. Bu pinlerden 2 tanesi ile sağdaki motorun ileri-geri hareket etmesini sağladık. Diğer 2 tanesi ile soldaki motorun ileri-geri hareket etmesini sağladık. Diğer iki tanesini ise Motorların hızlarını ayarlamak için kullandık.
void setup() kısmına geçmeden önce void loop() kısmında kullanmak amacıyla 10 tane fonksiyon tanımladık. ileri(), hafifsaga(), hizlisaga(), dahahizlisaga(), tamhizsaga(), hafifsola(), hizlisola(), dahahizlisola(), tamhizsola() ve dur(). void loop() kısmında bu fonksiyonlardan hangisi çağırılırsa o fonksiyonun içerisindeki işlemler yapılacaktır.
void setup() kısmında pinMode komutuyla sensör bağlı pinleri giriş olarak, motor bağlı pinleri çıkış olarak ayarladık.
void loop() kısmında sensörlerden gelen verileri digitalRead komutuyla okuyup değişkenlere kaydettik. CNY70 sensörlerinden siyah zeminde (lojik1)HIGH, beyaz zeminde (lojik0)LOW bilgileri okunup kaydedilir.
MZ80 mesafe sensörünün önünde bir cisim yokken lojik1(HIGH), önünde cisim varsa lojik0(LOW) bilgisini çıkışından verir. Biz bu bilgiyi robotun önünde engel olup olmadığını algılamak için digitalRead komutuyla okuyup “engelDurum” adlı değişkene kaydettik.
while döngüsü ile robotun önünde bir engel varsa (engelDurum = LOW) olduğu sürece dur() fonksiyonu çalıştırılır, motorlar durur, robot hareket etmez. (engelDurum = HIGH) olduğunda robot while döngüsünden çıkar ve void loop() döngüsündeki diğer komutları işlemeye devam eder.
if – else if komutlarıyla sensörlerden alınan bilgilere göre hangi if şartı sağlanıyorsa o şarta bağlı olarak robotun hareketini sağlayan motorları istenilen yönlerde ve hızlarda döndüren fonksiyonları çağırdık. Tablodaki 1’ler lojik1(HIGH), 0’lar lojik0(LOW) anlamına gelmektedir. Beyaz zemini gören CNY70’ten Arduinoya Lojik0(LOW) bilgisi giderken, siyah çizgiyi gören CNY70’ten Arduinoya Lojik1(HIGH) bilgisi gider.
cyn70 fonksiyon tablo
Robotun mekanik kısmında Engelden Kaçan Robotta olduğu gibi kablo kanalı kullandık. Motorlar fiziksel olarak biraz büyük olduğundan vidalarla ilave yaparak kablo kanalını biraz genişlettik.Motorların tekerleklerle olan bağlantısını yaptıktan sonra motorları robot şasesinin arka tarafına kablo bağı ve sıcak silikon ile sabitledik.
cizgi izleyen robot ici
Robotun ön kısmına sensörleri yerleştirdik ve 1 tane sarhoş tekerlek takarak robotun rahat dönmesini sağladık.
cizgi izleyen alt

Yorum bırakın

Scroll to Top