“Ç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.

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 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’in bağlantılarında herhangi bir karışıklık olmaması için “CNY70” yazılı olan tarafı referans alarak delikli plakete takarak lehimledik.

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.

Motor sürücünün motorlarla ve Motor Beslemesi ile olan bağlantısı:

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.

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.

- 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ı:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 |
/* "beş zemin, bir mesafe sensörlü siyah çizgiyi takip eden robot" L298N motor sürücü entegresi kartı kullanılarak yapılan "Çizgi İzleyen Robot" programı. <u>diyot.net</u> */ 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 digitalWrite(sag_ileri,LOW); //sağ motor dur digitalWrite(sag_geri,LOW); digitalWrite(sol_ileri,HIGH); //sol motor ileri digitalWrite(sol_geri,LOW); } void tamhizsaga() { 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() { 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() { 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() { } void loop() { //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(); } if (ensolDurum==LOW && solDurum==LOW && ortaDurum==HIGH && sagDurum==LOW && ensagDurum==LOW) ileri(); } else if (ensolDurum==LOW && solDurum==HIGH && ortaDurum==HIGH && sagDurum==LOW && ensagDurum==LOW) hafifsola(); } else if (ensolDurum==LOW && solDurum==HIGH && ortaDurum==LOW && sagDurum==LOW && ensagDurum==LOW) 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) 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) 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) 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) hizlisola(); } else if (ensolDurum==LOW && solDurum==LOW && ortaDurum==HIGH && sagDurum==HIGH && ensagDurum==HIGH) 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.

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.

Robotun ön kısmına sensörleri yerleştirdik ve 1 tane sarhoş tekerlek takarak robotun rahat dönmesini sağladık.
