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 } }