Çizgi İzleyen Robot Tasarımı

04.08.2014
Teknoloji
Fakültesi
Çizgi İzleyen Robot Tasarımı
Hazırlayan: Araş. Gör. Okan UYAR
İçindekiler
1.
Uygulamanın İçeriği ......................................................................................................................... 1
2.
Uygulamanın Hedefi ........................................................................................................................ 1
3.
Ön Bilgi ............................................................................................................................................ 1
4.
3.1.
Çalışma Prensibi ...................................................................................................................... 1
3.2.
Motor Sürücü .......................................................................................................................... 2
3.3.
Sensör ...................................................................................................................................... 4
3.4.
Regülatör ................................................................................................................................. 5
3.5.
Mikrodenetleyici...................................................................................................................... 6
3.6.
Mekanik, Motor ve Tekerler .................................................................................................... 7
Devre Şemaları ve Baskı Devreleri ................................................................................................... 9
4.1.
Ana Devre ................................................................................................................................ 9
4.2.
Sensör Kiti .............................................................................................................................. 11
4.3.
Motor Sürücü ........................................................................................................................ 12
........................................................................................................................................................... 12
5.
Programlama ................................................................................................................................. 13
1. Uygulamanın İçeriği
Uygulama kapsamında birçok eleman kullanarak oluşturulan pistte çizgiyi takip edebilecek bir
Çizgi İzleyen Robot yapılacaktır. Uygulama kapsamında baskı devre tasarımı ve gerçekleştirilmesi,
devre elemanı lehimleme, mikrodenetleyici programlama, mekanik tasarım ve işleme, test ve
deneme aşamaları gerçekleştirilecektir.
2. Uygulamanın Hedefi
Uygulama sonunda öğrencilerin aşağıdaki konularda farkındalığı sağlanacaktır:




Elektronik devrenin çizimi, benzetimi ve baskı devre tasarımı
DC motor sürücü, kontrast algılama ve temel mikro denetleyici devreleri
Çizgi izleyen robotun mekanik tasarımı
Çizgi izleyen robot program algoritması
3. Ön Bilgi
Çizgi izleyen robot adından da anlaşılabileceği gibi bir zemin üzerinde oluşturulmuş çizgi
şeklindeki yolu otonom(öz denetimli) olarak izleyen robotlardır. Bu amaçla kullanılabilecek
sensörlerin kontrastı yani koyu ve açık renk ayrımı yapabilmesi nedeniyle siyah zemin üstünde beyaz
çizgi yada beyaz zemin üzerinde siyah çizgi bulunan yollar bu robotlar için tercih edilir.
3.1.
Çalışma Prensibi
4
Robotun çalışma prensibi, çizgiyi ortadaki algılayıcıda tutarak ilerlemesine dayanmaktadır.
Robot kısa aralıklarla algılayıcının durumunu kontrol ederek çizgiye göre konumunu belirler. Bunun
için tasarım fikrine bağlı olarak belli sayıda ve belli aralıklarla ve yerleşim şekli ile çizgi algılama
sensörleri kullanılır ve motorlar buradan gelen bilgilere göre kontrol edilir.
Robot ilerlerken, çizgi robotun sağ tarafına gelirse, 3 nolu algılayıcı çizgiyi görecektir. Böylece
robot çizginin sol tarafında olduğunu anlayacak ve programı içinde belirtilen sağa dönüşkomutunu
uygulayacaktır.
Dönme işlemi, ortadaki algılayıcının çizgiyi tekrar görmesine kadar devam eder. Bu algılayıcı
çizgiyi gördüğünde, robot tekrar düz hareket etmeye başlar.
Eğer, çizgi robotun sol tarafına gelirse, aynı işlemler bu taraf için tekrarlanır ve böylelikle çizgi
izleme işlemi yerine getirilir.
3.2.
Motor Sürücü
Robotlarımızda genellikle 6-12V’ luk elektrik motoru(DC motor) kullanıyoruz. Hız gerektiren
projelerde(çizgi izleyen robot) genelde yüksek devirli düşük torklu motor kullanılır, tork gerektiren
projelerde(sumo robot, mini sumo robot gibi) ise düşük devirli yüksek torklu motor kullanılır. Bu
motorlarda çekilen akım motorun boyutlarına ve özelliklerine göre değişir. Örnek verecek olursak bir
motor boşta dönerken 30mA akım çeker, yükte ise bu 700mA çekebilir veya daha fazla. Örneğin sumo
robotlarda kullanılan çoğu motor zorlanma anında 10 A kadar akım çekebilir. Motorları sürmek için
çok akım gerekir, ancak biz motorları kontrol etmek için PIC kullandığımız için, PIC çıkışlarına
maksimum 25mA ve 5V verebildiği için direkt PIC çıkışıyla motor süremeyiz. İşte bu yüzden PIC den
gelen düşük gerilim ve akımı kuvvetlendirmek için motor sürücü devreleri kullanıyoruz. Kullanım
amacına göre tek yönde ve sabit hızda sürme devreleri olduğu gibi çift yönde ve değişken hızda
motor sürmemizi sağlayan devre topolojileri de vardır.
PIC ile motor sürmek için, PICten gelen sinyali güçlendirip motorlara iletmemiz gerekir. Bunu
yapmak için de transistör ve türevleri(FET-JFET-MOSFET) ve motor sürücü entegreleri kullanıyoruz.
Eğer tek bir transistör kullanırsak, motoru sadece tek yönde çalıştırabiliyoruz. Motoru 2 yöne de
döndürmek istersek, 4 adet transistörleyukarıdaki resimde gösterilen “H köprüsü” kurup motorları
sürebiliriz. Motor sürücü entegrelerinin içinde genellikle 2 adet H köprüsü vardır ve böylece tek bir
motor sürücü entegresiyle 2 adet motoru birbirinden bağımsız ve iki yönlü sürebiliriz.
Aşağıda, robot projelerinde sıkça kullanılan entegrelerin resimleri ve önemli özellikleri
verilmiştir.
L298N
Çalışma Gerilimi: 7,5-46V
Kanal Başına Akım: 2A
Frekans: 40 KHz
Aşırı sıcaklıkta kapama
L293D
Çalışma Gerilimi: 4,5-36V
Kanal Başına Akım: 600mA
Frekans: ~10 KHz
Dahili Kenetleme Diyotu
Dahili ESD Koruma
Aşırı sıcaklıkta kapama
L6207N
Çalışma Gerilimi: 8-52V
Kanal Başına Akım: 2,8A
Frekans: 100 KHz
RDSon=0,3 Ohm
Dahili Serbest Geçiş Diyotu
Aşırı sıcaklıkta kapama
TB6612FNG
Çalışma kapsamında L298N sürücüsünü kullanacağız.
Çalışma Gerilimi: 15V
Kanal Başına Akım: 1,2A
Frekans: 100 KHz
RDSon=0,5Ohm
Aşırı sıcaklıkta kapama
Bu entegre de toplam 15 adet bacak bulunmaktadır. Bunlardan IN1, IN2, OUT1, OUT2, ENA,
SENSA A köprüsü için, IN3, IN4, OUT3, OUT4, ENB, SENSB B köprüsü içindir.
IN1,IN2(5,7): Bu bacaklar A köprüsü için olan girişlerdir. +5 volt ile çalışır.
Eğer IN1’e 5V, IN2’ye 0V verince motor ileri dönerse, tam tersini verdiğimizde geri
dönecektir. Her iki bacağa da aynı değeri verirsek (0V-0V veya 5V-5V) motor dönmez.
IN3,IN4(10,12): Bu bacaklar B köprüsü için olan girişlerdir. A köprüsüyle aynı şekilde çalışır.
OUT1,OUT2(2,3):A köprüsü için çıkış bacaklarıdır. Bu çıkışları motorun iki ucuna
bağlanacaktır. Motorların herhangi bir zorlanma durumunda oluşacak olan ters akımın entegreye
zarar vermemesi için çıkışlar ile motor arasına ikişer adet diyot bağlanmalıdır. Bu diyotların birisinin
yönü topraktan çıkışa doğru, diğeri de çıkıştan VS’ ye doğru olmalıdır.
OUT3,OUT4(13,14): B köprüsü için çıkış bacaklarıdır. A köprüsüyle aynı şekilde çalışır.
ENA,ENB(6,11): A ve B köprülerini etkinleştirmek için bu bacaklara +5 volt bağlamak
gerekmektedir. Eğer bu uçlara mikrodenetleyiciden PWM sinyali verilirse motorun hızı kontrol
edilebilir.
SENSA,SENSB(1,15): A ve B köprülerinin çalışması için bu bacaklar toprağa çekilmelidir. Bu
bacaklarla toprak arasına bağlayacağımız 0,47 Ohm/2 W değerinde direnç ile çıkış akımını kontrol
edebiliriz, fakat direnç bağlamadan da çalışır.
VS(4): Çıkışlardan kaç volt almak istiyorsak bu bacağı o voltaja bağlıyoruz. En fazla 46 volt
verebiliriz, biz genelde 12 volt kullanıyoruz. Ayrıca DC üzerindeki küçük salınımları yok etmek için bu
bacakla toprak arasına 100nF’ lık kondansatör bağlanmalıdır.
VSS(9): Bu bacak, L298’ in çalışması için +5 volta bağlanmalıdır. Yine küçük salınımları yok
etmek için VSS ile toprak arasına 100nF’lık kondansatör bağlanmalıdır.
GND(8): Bu bacak, L298’ in çalışması için toprağa bağlanmalıdır.
3.3.
Sensör
Çizgiyi algılamak için kızılötesi led ve optik olarak
iletime geçen bir transistör barındıran sensörler
kullanılmaktadır. Kızılötesi ledden yansıyan ışınlar
siyah zeminden az beyaz zeminden çok yansıdığı
için sensör içindeki elektronik anahtar(transistör)
yansıyan bu ışına göre iletime veya kesime giderek
bize çizgi hakkında bilgi vermektedir. Buradan
gelen bilgi mikrodenetleyici ile değerlendirilerek
motorların kontrolü sağlanmakta ve robot
yönlendirilmektedir.
Bahsedilen amaçla kullanılan bazı sensörler şunlardır: QRD1114, CNY70, SFH9241, QTR-8A
Çizgi izleyen robotta kullanılan sensörler genellikle 3mm lik bir yükseklikten çizgiyi
algılayabilmektedir. Robot mekaniği tasarlanırken bu konuya da dikkat edilmelidir. Buna ek olarak,
kullanılacak sensör sayısı, sensörler arasındaki mesafe ve sensörlerin yerleşim şekli de robotun
tasarımında önemli konulardır. Çizgi kalınlığı 2cm olduğu için sensörler arasında genelde 2cm aralık
bırakılır. Çok yakın şekilde yerleştirilmiş sensörlerin gönderdiği sinyaller birbirini etkileyecektir.
Sensör bağlantısı aşağıdaki gibi yapılmalıdır.
R1 direnci 100 – 220 ohm arasında bir değerde
olabilir. R2 direnci ise 10K seçilmelidir. R1 direncine göre
sensör içindeki kızılötesi ledin ışık şiddeti ayarlanabilir. Bu
ayarlama, sensörün yerden yüksekliğine göre yapılmalıdır.
Maksimum parlaklık için 50 mA değerini geçmeyecek bir
direnç bağlanmalıdır. R2 direnci ise yansıma olmadığı
zaman sensör çıkışının 5V da kalmasını, yansıma olduğunda
ise 0V çıkış vermesini sağlamaktadır. Işık şiddetine göre
Vout ucundan alınan gerilim sayısal bilgi oluşturacak kadar
düzgün çıkmadığı için sensörün çıkışına 74HC14 isimli
içinde 6 adet karşılaştırıcı bulunan bir entegre
kullanılmaktadır. Ayrıntıları devre şemalarında görülebilir.
3.4.
Regülatör
Robotumuzda motor sürmek için 7,4V veya 11,1V gibi bataryalara ihtiyaç duyulmaktadır. Aynı
besleme kaynağı ile elektronik kontrol devresini de sürmemiz gerektiğinden ve bu devrelerin 5V
ile çalışmasından dolayı bir gerilim düzenleyiciye ihtiyaç duyulmaktadır.
Yukarıda bahsedilen amaçla kullanılabilecek bazı regülatörler şöyledir: 7805, LM2576-5,
LM1117-5, LT123A, LT1076-5. Bunlardan en sık kullanılanları 7805 ve LM2576 dır. Bilgi
sayfalarında daha yüksek değerler yazılsa da 7805 girişine uygulanan 0-15 V u 5V seviyesine
düşürürken çıkışına 500mA akım çeken bir yük bağlanabilir. Bu sınırların dışında entegre aşırı
ısınmakta ve kararlı çalışmamaktadır. LM2576 entegresi ise 0-30 V giriş gerilimine ve 3A lik çıkış
yüküne uygun yapıdadır ancak 7805 e göre daha fazla ek devre elemanı gerektirmektedir.
Motordan dolayı ani olarak fazla akım çekme durumlarında PIC mikrodenetleyicisi
resetlenebilmektedir. LM2576 entegresinin yapısından dolayı bu problem daha az yaşandığı için
bu entegre kullanılacaktır. Devre şeması aşağıda verilmiştir.
3.5.
Mikrodenetleyici
Bir mikrodenetleyici (MCU ve µC olarak da adlandırılır), bir mikroişlemcinin, merkezi işlem
birimi(CPU), hafıza ve giriş - çıkışlar, kristal osilatör, zamanlayıcılar (timers), seri ve analog giriş
çıkışlar, programlanabilir hafıza (NOR Flash, OTP ROM) gibi bileşenlerle tek bir tümleşik devre
üzerinde üretilmiş halidir. Kısıtlı miktarda olmakla birlikte, yeterince hafıza birimlerine ve giriş – çıkış
uçlarına sahip olmaları sayesinde tek başlarına çalışabildikleri gibi, donanımı oluşturan diğer
elektronik devrelerle irtibat kurabilir, uygulamanın gerektirdiği fonksiyonları gerçekleştirebilirler.
Üzerlerinde analog-dijital çevirici gibi tümleşik devreler barındırmaları sayesinde algılayıcılardan her
türlü verinin toplanması ve işlenmesinde kullanılabilmektedirler. Ufak ve düşük maliyetli olmaları
gömülü uygulamalarda tercih edilmelerini sağlamaktadır.
Piyasada Microchip, Atmel, Motorola, Intel, Zilog, Infineon, ST gibi firmaların ürettiği
mikrodenetleyiciler vardır. Bu firmaların arasındaki Mikrochip’in üretmiş olduğu PIC
mikrodenetleyicileri, en çok kullanılan mikrodenetleyicilerdendir. Çok sayıda örnek uygulama ve
doküman bulunması, birçok derleyici seçeneğinin olması bunun temel sebepleridir.
PIC mikrodenetleyicinin çalışması için gereken temel şema Reset devresi ve Osilatör
devresinden oluşmaktadır. Osilatör devresinde Kristal ve seçilen frekansa göre 22pF – 68 pF arasında
bir değerde kondansatör seçilir. Rs direnci kullanımı zorunlu değildir.
3.6.
Mekanik, Motor ve Tekerler
Robotun gövdesi için birçok farklı tasarım yapılabilir. Hazır gövdeler de kullanabilirsiniz
(örneğin oyuncak araba gövdeleri), ya da pleksiglas, sert plastik malzemeler kullanarak da
robotunuzun gövdesini hazırlayabilirsiniz. Bu tip malzemeler kullanarak istediğiniz tasarımları daha
kolay gerçekleştirebilirsiniz. Gövde malzeme seçerken fazla ağır olmamasına ve işlenmesinin kolay
olmasına dikkat edilmelidir.
Çizgi izleyen robot projelerinde en çok tercih edilen sürüş sistemi diferansiyel sürüş
sistemidir. Bu sistemde robotun sağında ve solunda birbirinden bağımsız motorlar ve bunlara bağlı
tekerlekler bulunur. Genellikle maliyet açısından sağ ve solda birer motor ve birer tekerlek kullanılır.
Bu şekildeki kullanımlarda robotun daha rahat hareketi ve dönüşleri için robotta kullanılan gövdenin
durumuna göre önde ve/veya arkada sarhoş tekerlek ya da bilye tekerlek (roll-on tekerlek) kullanılır.
Diferansiyel sürüş sisteminde robotun dönüşü birbirinden bağımsız çalışan iki motorun
arasındaki hız farkıyla sağlanır. Aşağıdaki şemada diferansiyel sürüş sisteminin çalışması
gösterilmiştir.
Mekanik tasarlanırken tekerler aynı oranda ve yeterince yere basmalı. Robotun ağırlığı ve
tekerleklerin sürtünme oranı da hassas bir noktadır çünkü bu seçimler robotun patinaj atarak enerjizaman-kontrol kaybına ya da aşırı sürtünmeden hız kaybetmesine neden olabilir. Robotun üzerine
koyulan batarya ve diğer elemanların ağırlık merkezinin düzenli olması dengeli bir hareket
sağlayacaktır.
Robotun yere bastığı noktaların ve motorlar arasındaki mesafe de manevra kabiliyeti
açısından önemlidir. Yarışma pisti çok sık sinüzoidal dönüşler içeriyorsa robot boyunun çok uzun
olmaması gerekir. Eğer daha çok düz yollar var ise robot da uzun yapılabilir. Arka tekerler arasındaki
mesafe az olursa manevra kabiliyeti azalır, fazla olursa da çizgi sensörleri harekete
yetişemeyeceğinden robot çizgi etrafında yalpalayarak gider. En:1 / Boy: 1,15 oranı ideal olmaktadır.
Kullanacağımız motorların 1000 ila 1500 devir arasında olması robotumuzun saniyede 2
metreden daha fazla yol kat etmesi için yeterlidir. Bu hızla gidebilmek tekerlek seçimi şöyle
yapılmalıdır:
Tekerin çevresi 2 п r dir.
Motorların hızı devir/dakika (RPM) olarak birimlendirilir. Bu yüzden devir/saniyeye çevirmek
lazım. 1000 devir/dakika ise 1000/60=16,6 devir/saniye yapar.
Tekerimizin çapı 3cm ise 2 x п r D= X 2x3,14x1,5x16,6=156,372 cm
Eğer robotta hiçbir kayıp olmazsa saniyede 1 metre 56 cm gidebilir.
Tekerin çapı ile bu değeri değiştirebiliriz. Ancak unutulmamalıdır ki eğer motorunuzun torku
(santimetre başına düşen kaldırma kuvveti cm/kg) düşükse, tekerin çapı arttıkça torkunuz da
düşecektir. Robotunuzu daha rahat kontrol edebilmek için mümkün oldukça tekerin çapını küçük
tutun. Çünkü motorun hızını değiştirirken tekerin çapı 3 cm ise her 9.42 cm’de bir hızınızın değişimi
robot üzerinde fark edilecektir. 6 cm ise 18,84 cm’de bir hızınızın değişimi robot üzerinde fark
edilecektir. Tekerin genişliği ise çok ince olursa patinaj atacaktır ve kontrolü zorlaştıracaktır.
Gereğinden fazla olursa da sürtünme artacağından hız ve enerji kaybı olacağından piyasada bulunan
tekerlerden en uygun olanı denemeler sonrasında seçilmelidir.
4. Devre Şemaları ve Baskı Devreleri
4.1.
Ana Devre
4.2.
Sensör Kiti
4.3.
Motor Sürücü
5. Programlama
#include <18f252.h>
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,PUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=8000000)
#define s1 pin_b4 // ensag
#define s2 pin_b3 // sag
#define s3 pin_b0 // orta
#define s4 pin_b1 // sol
#define s5 pin_b2 // ensol
#define in1 pin_c0
#define in2 pin_c3
#define in3 pin_c4
#define in4 pin_c5
int hiz1=150; int hiz2=150; int portlar; int1 durum;
void saga()
void geri()
{
{
set_pwm1_duty(hiz1);
set_pwm1_duty(100);
set_pwm2_duty(hiz2);
set_pwm2_duty(100);
output_low(in1);
output_low(in1);
output_low(in2);
output_high(in2);
output_high(in3);
output_low(in3);
output_low(in4);
output_high(in4);
}
}
void sola()
void ileri()
{
{
set_pwm1_duty(hiz1); // PWM1 çıkışı görev
set_pwm1_duty(hiz1);
saykılı belirleniyor
set_pwm2_duty(hiz2);
set_pwm2_duty(hiz2);
output_high(in1);
output_high(in1);
output_low(in2);
output_low(in2);
output_high(in3);
output_low(in3);
output_low(in4);
output_low(in4);
}
}
void dur()
void sertsag()
{
{
set_pwm1_duty(0);
set_pwm1_duty(150);
set_pwm2_duty(0);
set_pwm2_duty(150);
output_low(in1);
output_high(in1);
output_low(in2);
output_low(in2);
output_low(in3);
output_low(in3);
output_low(in4);
output_high(in4);
}
}
void test()
void sertsol()
{
{
ileri();
set_pwm1_duty(150);
delay_ms(800);
set_pwm2_duty(150);
saga();
output_low(in1);
delay_ms(800);
output_high(in2);
sola();
output_high(in3);
delay_ms(800);
output_low(in4);
}
}
void main ( )
{
setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı
setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
setup_adc(ADC_OFF);
// ADC birimi devre dışı
set_tris_a(0xFF);
set_tris_B(0xFF);
set_tris_c(0x00);
setup_ccp1(CCP_PWM); // CCP1 birimi PWM çıkışı için ayarlandı
setup_ccp2(CCP_PWM); // CCP2 birimi PWM çıkışı için ayarlandı
setup_timer_2(T2_DIV_BY_4,170,1); // Timer2 ayarları yapılıyor
set_pwm1_duty(hiz1); // PWM1 çıkışı görev saykılı belirleniyor
set_pwm2_duty(hiz2); // PWM2 çıkışı görev saykılı belirleniyor
delay_ms(1000);
////s1 s2 s3 s4 s5//////
/// 0 0 1 0 0 = 01 (tersi=30)
/// 0 1 0 0 0 = 02 (tersi=29)
/// 1 0 0 0 0 = 04 (tersi=27)
/// 0 0 0 1 0 = 08 (tersi=23)
/// 0 0 0 0 1 = 16 (tersi=15)
/// 0 0 1 1 1 = 25 (tersi=06)
/// 1 1 1 0 0 = 07 (tersi=24)
////////////////////////
while(1)
{
//test();
portlar=input_b();
while ((portlar==1)||(portlar==30)){hiz1=160;hiz2=160;ileri();portlar=0;}//ileri
while ((portlar==2)||(portlar==29)){hiz1=140;hiz2=170;ileri();portlar=0;}//az saga
while ((portlar==8)||(portlar==23)){hiz1=170;hiz2=140;ileri();portlar=0;}//az sola
while ((portlar==25)||(portlar==6)){sertsag();portlar=0;}
while ((portlar==7)||(portlar==24)){sertsol();portlar=0;}
while ((portlar==16)||(portlar==15)){hiz1=165;hiz2=165;sola();portlar=0;} //tam sola
while ((portlar==4)||(portlar==27)){hiz1=165;hiz2=165;saga();portlar=0;} //tam saga
}
}