Çizgi İzleyen Robot Yapımı (Line Follower Robot)

Çizgi İzleyen Robot  Nedir?

Çizgi izleyen robotlar önceden belirlenen bir parkurdaki veya pistteki çizgiyi algılayıcılarıyla takip eden otomatik çalışan gezgin robotlardır.
En basitleri, algılayıcılardan gelen bilgileri lojik kapılarla yorumlayabilir, kendi kendine karar verip hareket edebilirler. Biraz daha gelişmiş tipleri ise programlanan bir mikrodenetleyici ile sensörlerden gelen bilgileri yorumlar ve hareket organlarına sonuç komutları ileterek robotu yönetir.

Çizgi İzleyen Robot  Nasıl Çalışır?

Çizgi izleyen robotun çalışma prensibini aşağıdaki şekil ile kısaca anlatacak olursak ;

 

Şekil-a da çizgiyi soldaki algılayıcı görmektedir bu durumda denetleyici (pic) soldaki algılayıcıdan gelen bilgiyi alır ve motor sürücüye sağdaki tekeri hızlandırmak için gerekli bilgiyi gönderir. (pwm işaretini gönderir.) Bu sayede araç çizgiyi ortalamış olur.

Şekil-b de sağdaki algılayıcı çizgiyi görmektedir. Bu seferde yukarıdaki anlatılan işlemin tersi gerçekleşir.

Şekil-c deki durumda ise ortadaki algılayıcı çizgiyi görmektedir. Bu durumda denetleyici motor sürücü devresine her iki motoru da eşit ve yeterli hızda sürecek bilgileri gönderir.

Çizgi izleyen robotlar dört ana kısımdan meydana gelir diyebiliriz. Bu kısımlar ;

-Algılama Devresi (Algılayıcı)

-Denetleyici (pic16f877a)

-Motor Sürücü Devresi (L298N)

-Güç Birimi

1-Algılama Devresi  

Algılayıcı olarak QRD1114 optokuplor kullanıldı. Bağlantı şekli aşağıdaki gibidir.

QRD1114 optokuplor çalışma prensibi:

QRD1114 optokuplor gönderilen ışığın yansıma derecesine bağlı olarak Out çıkışında 0-(V+) arasında değer üretmektedir. V+(5V)  besleme gerilimi sayesinde direnç üzerinden akan akım 3-4 numaralı led in yanmasını sağlar. Işık zemine çarparak yansır ve 1-2 ile gösterilen foto-transistörünün iletime gemesini sağlar. Bu sayede Out çıkışında ışığın şiddetine bağlı olarak bir gerilim oluşur. Tam olarak V+ oluşur diyemeyiz çünkü transistörün akıtacağı akım ışığın siddetine göre değişmektedir. Işık yansımaz ve foto-transistör üzerine düşmez ise foto-transistör iletime geçemez ve Out=0V olur. Çizgi izleyenlerin parkurları genelde beyaz zemin üzerine siyah çizgi veya tam tersi yapılmaktadırlar.  Bu sayede  algılayıcının Out çıkışından  tam net olmamakla birlikte 0 a veya V+(5V) ya yakın değerler alabiliyoruz. Peki bu değerleri denetleyicimizin daha net algılayabileceği biçime yani mantık 0 veya mantık  1 yapmak istediğimizde ne yapabiliriz?  İşte burada 74HC14 entegresi devreye giriyor. Bu sayede entegrenin eşik değerine göre Out hangi tarafa daha yakınsa o değeri alıyor. Yani V+(5V)-mantık 1 veya 0V-mantık 0 oluyor. Aşağıda daha ayrıntılı olarak anlatılmıştır.

20130314_200907

2-Denetleyici (PIC16F877A)

Denetleyici olarak PIC ailesinden PIC16F877A kullanılmıştır. Programlama  işlemi için CCS C PIC C Compiler  programı kullanılmıştır. Yazılan program yazının sonundadır. Pic kit benzeri bir programlayıcı ile mikroişlemciye yüklenmiştir. Ayrıca  Pic programlama ile uğraşacak iseniz Serdar Çiçek’in CCS C ile PIC programlama kitabını tavsiye ederim.

3-Motor Sürücü Devresi (L298N)

Motor sürücü devresi  denetleyiciden gelen bilgiye göre motorları sürer. Motor sürücü devresi basit olarak motor sürücü entegresi l298n den oluşur.

14sürücü.bmp

L298N Devre Şeması

 L298N’nin çalışma prensibi:

L298N iki motoru sürecek şekilde tasarlanmıştır. Sadece bir motor için anlatacak olursak; ENA yetkilendirme ucu olarak adlandırılır. Mikrodenetleyicideki PWM çıkışından gelen PWM işaretinin genliğine göre ENA 0-5V arasında değer alır. 0V dan farklı bir değer aldığında  IN1 ve IN2 girişlerinin durumuna göre OUT1-OUT2  çıkışında besleme gerilimine ve PWM işaretinin genliğine bağlı olarak gerilim farklı oluşur. Bu sayede motor farklı devirlerde kontrol edilmiş olur. Motorun çalışabilmesi için IN1 ile IN2 nin farklı değerlerde olması gerekir. Örneğin IN1 e mikrodenetleyicinin çıkışları yardımıyla mantık 1 IN2 ye ise mantık 0 atanmalıdır. Yada tam tersi yapılmalıdır. Bu sayede motorumuz saat yönünde veya saatin tersi yönünde dönmektedir. Daha ayrıntılı bilgi öğrenmek istiyorsanız entegrenin Datasheet’ine bakabilirsiniz.

7414.bmp

74HC14 Devre Şeması

74HC14 entegresi girişindeki  analog değeri belirli bir eşik değerine göre mantık 0 veya mantık 1 olarak  algılayarak çıkışına bunun tersini gönderir. Örnek verecek olursak; 1 nolu bacağa algılayıcımızdan 4V ‘luk bir değer geldiğinde entegremiz bunu mantık 1 e çevirir ve çıkışımızdan yani 2 nolu bacaktan mantık 0 olarak  verir. Bu entegre de çıkışın tersinin alınması sağlanmıştır.

resimmm.bmp

Çizgi izleyen robot devre şeması

4-Güç Birimi 

Gerçeklenen çizgi izleyen robotta  entegrelerin,algılayıcıların ve motorların güçlerinin sağlıklı bir biçimde karşılanması gerekir.

Resim16

Turnigy 2200 mah lipo pil

Bu  projede tüm sistemin enerji ihtiyacını karşılayabilecek bir Lipo pil kullanabilirsiniz. Lipo piller gösterdikleri üstün performanslar sayesinde ön plana çıkmaktadırlar. Küçük boyutlarına rağmen yüksek akımlar verebilmektedirler. Aynı zamanda dikkatli kullanılmaları gerekmektedir. Kısa devre durumunda veya tam boşalmaları durumunda yangın çıkarabilmektedirler.  Ayrıca bu tarz pillerin dolumu için özel şarj aletleri kullanılmaktadır.

Bizim kuracağımız devrede hem 12V hemde 5V luk besleme gerilime ihtiyacımız olacaktır.Peki bu ihtiyacımızı nasıl karşılayacağız.? Regülatör devresi tasarlayarak hem 5V üretmiş olacağız hemde 12V u direkt olarak kullanabileceğiz. Lipo pilde kalın kırmızı-siyah kablo bize yaklaşık 12V vermektedir. İnce sarı-siyah=yaklaşık 4V, mavi-siyah=yaklaşık 8V ve kırmızı-siyah=yaklaşık 12V vermektedir. Aslında entegrelerin ve algılayıcıların beslemesi için  sarı-siyah=yaklaşık 4V olan kablo çiftini kullanabiliriz ama bu tarz bir kullanımın pile zarar verebileceğini düşünüyorum. O yüzden en sağlıklı yöntem bir regülatör devresi kurarak 12V’luk çıkışı kullanarak 5V’u üretmektir. İnternet ortamında birçok regülatör devresi mevcuttur. Ayrıca anlatmayacağım.

Kullanılan diğer parçalar:

2 adet motor,2 adet tekerlek, Robot Gövdesi ve 1 adet Sarhoş tekerlek

resim_tam

Not:Devre kurulumunda tüm  toprakların ortak bağlandığına ve beslemelerin doğru bir biçimde bağlı olduğuna dikkat ediniz. Devrenizi benim yapmış olduğum gibi delikli plaket üzerine kurmayın. Baskılı devren yapın. Devre üzerindeki denemelerinizde Lipo pil KULLANMAYINIZ! kısa devre durumunda pili yakarsınız. Tüm sistemin çalıştığından emin olduktan sonra pil bağlantısını yapınız.

Yanlış aktardığım bilgiler olabilir. İyi çalışmalar..

/******************************************************

Çizgi izleyen robot

 

Barış AYCİN

 

5 sensörlü çizgi izleyen için tasarlanmıştır.

siyah çizgi= mantık 0(sizde değişebilir 1 de olabilir bakıp programınızı ona göre yazın.)

11011 = düz git

10011= hafif sola dön

10111= hızlı sola dön

00111= daha hızlı sola dönüş

01111= tam hız sola dön

11001= hafif sağa dön

11101= hızlı sağa dön

11100= daha hızlı sağa dön

11110= tam hız sağa dön

11111= geri gel

 

bunları kafanıza göre değiştirebilirsiniz.

 

*******************************************************/

#include <16f877a.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(b) //Port yönlendirme komutları A portu için geçerli

#use fast_io(c) //Port yönlendirme komutları C portu için geçerl

#use fast_io(a)

#define sensor pin_a0

/********* ANA PROGRAM FONKSİYONU********/

void main ( )

{

setup_psp(PSP_DISABLED);        // PSP 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_b(0x1F);   // bunlar sensörün sayısına göre değişir 1=giriş 0= çıkış demek

set_tris_c(0x00);

set_tris_a(0x01);//

//output_c(0xA0);

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_16,170,1); // Timer2 ayarları yapılıyor

 

while(1) // Sonsuz döngü

{

if(input(sensor))

{

set_pwm1_duty(0); // PWM1 çıkışı görev saykılı belirleniyor. bu oranları değiştirebilir farklı hızlar  oluşturabilirsiniz.

set_pwm2_duty(0);

}

else if (input(pin_b4)==1&&input(pin_b3)==1&&input(pin_b2)==0&&input(pin_b1)==1&&input(pin_b0)==1) // pin b2 ortadaki sensöre bağlı onu görürse motorları 100/170 oranında sürüyor. 1,motor ileri 2,motor ileri

{

output_c(0xA0);

set_pwm1_duty(75); // PWM1 çıkışı görev saykılı belirleniyor. bu oranları değiştirebilir farklı hızlar  oluşturabilirsiniz.

set_pwm2_duty(75); // PWM2 çıkışı görev saykılı belirleniyor. örneğin 170 yaparsanız motorunuz max hız ile dönecektir.

}

else if (input(pin_b4)==1&&input(pin_b3)==0&&input(pin_b2)==0&&input(pin_b1)==1&&input(pin_b0)==1&&input(pin_a0)==1) //

{

output_c(0xA0);

set_pwm1_duty(70); // PWM1 çıkışı görev saykılı belirleniyor  1.motor geri

set_pwm2_duty(0); // PWM2 çıkışı görev saykılı belirleniyor  2.motor ileri

}

else if (input(pin_b4)==1&&input(pin_b3)==0&&input(pin_b2)==1&&input(pin_b1)==1&&input(pin_b0)==1)

{

output_c(0xA0);

set_pwm1_duty(80); // PWM1 çıkışı görev saykılı belirleniyor

set_pwm2_duty(0); // PWM2 çıkışı görev saykılı belirleniyor

}

else if (input(pin_b4)==0&&input(pin_b3)==0&&input(pin_b2)==1&&input(pin_b1)==1&&input(pin_b0)==1)

{

output_c(0xA0);

set_pwm1_duty(90); // PWM1 çıkışı görev saykılı belirleniyor

set_pwm2_duty(0); // PWM2 çıkışı görev saykılı belirleniyor

}

else if (input(pin_b4)==0&&input(pin_b3)==1&&input(pin_b2)==1&&input(pin_b1)==1&&input(pin_b0)==1)

{

output_c(0xA0);

set_pwm1_duty(100); // PWM1 çıkışı görev saykılı belirleniyor

set_pwm2_duty(0); // PWM2 çıkışı görev saykılı belirleniyor

}

else if (input(pin_b4)==1&&input(pin_b3)==1&&input(pin_b2)==0&&input(pin_b1)==0&&input(pin_b0)==1)

{

output_c(0xA0);  // 1.motor ileri 2,motor geri

set_pwm1_duty(0); // PWM1 çıkışı görev saykılı belirleniyor

set_pwm2_duty(70); // PWM2 çıkışı görev saykılı belirleniyor

}

else if (input(pin_b4)==1&&input(pin_b3)==1&&input(pin_b2)==1&&input(pin_b1)==0&&input(pin_b0)==1)

{

output_c(0xA0);

set_pwm1_duty(0); // PWM1 çıkışı görev saykılı belirleniyor

set_pwm2_duty(80); // PWM2 çıkışı görev saykılı belirleniyor

}

else if (input(pin_b4)==1&&input(pin_b3)==1&&input(pin_b2)==1&&input(pin_b1)==0&&input(pin_b0)==0)

{

output_c(0xA0);

set_pwm1_duty(0); // PWM1 çıkışı görev saykılı belirleniyor

set_pwm2_duty(90); // PWM2 çıkışı görev saykılı belirleniyor

}

else if (input(pin_b4)==1&&input(pin_b3)==1&&input(pin_b2)==1&&input(pin_b1)==1&&input(pin_b0)==0)

{

output_c(0xA0);

set_pwm1_duty(0); // PWM1 çıkışı görev saykılı belirleniyor

set_pwm2_duty(100); // PWM2 çıkışı görev saykılı belirleniyor

}

else if (input(pin_b4)==1&&input(pin_b3)==1&&input(pin_b2)==1&&input(pin_b1)==1&&input(pin_b0)==1)  //1.motor geri 2.motor geri

{

output_c(0x50);

set_pwm1_duty(50); // PWM1 çıkışı görev saykılı belirleniyor

set_pwm2_duty(50); // PWM2 çıkışı görev saykılı belirleniyor

}

}

}

There is 1 comment for this article
  1. Abdurrahman at 02:19

    iyi geceler
    pic16f628 ile ışık izleyen robot yapmam lazım
    bununla ilgili baskı devre, malzemeleri, ccs c kodu vb. lazım
    yardımcı olursanız çok sevinirim
    şimdiden teşekürler

Bir Cevap Yazın