Robotik
OKUDUĞUNUZ KONU
Arduino Hızlı Çizgi İzleyen Robot
62

Arduino Hızlı Çizgi İzleyen Robot

Yazar : Murat Duran2 Ağustos 2015

Tasarım ve ağırlık açısından diğer örneklerinden ayrılan bu çizgi izleyen robot kendi klasmanında rakipsiz sayılabilir.Piyasada hazır satın alabileceğiniz çizgi izleyenler hem tasarım olarak sizi yansıtmayacak hemde bazı rakiplerinizle aynı koşullarda yarışıyor olacaksınız.Ama bu çizgi izleyen robot ile rakiplerinizden bir adım öndesiniz.Ayrıca kontrol kartını da kendiniz hazırlayacağınız için yerden de tasarruf sağlamış oluyorsunuz.

Projemizde motor sürücü olarak tb752a1 kartı kullanılmış.Ayrıca atmega328 işlemcisi ile hızınıza hız katacak.Robotta güç kaynağı olarak 3.7volt lipo kullanılmış , hem küçük hemde hafif olması ayrı bir avantaj.Ama 3.7 volt gerilimi robot için yetersiz olduğundan voltajı yükseltmek için DC-DC dönüştürücü kullanılmış.

Malzemelerimiz

1- Baby Orangutan B-328
2- Pololu 10:1 Redüktörlü Motor x2
3-QTR-8A çizgi izleyen sensörü
4- Pololu 32×7 mm tekerlek
5- 3/8″ sarhoş tekerlek
6-  2.5-9.5 V konventör
7- 3.7 volt lipo batarya

Devre elemanları : C1 ve C2 = 22uF kondansatör , R1 R2 ve R4 = 470 Ohms direnç, R10 R7 ve R8 = 330 Ohms direnç, R3 R5 ve R6 = 15K direnç, Robotun kaynak kodları C alt yapısı ile programlanmış projenin kodlarını ve robot çizimlerini konu sonundaki linkten indirebilirsiniz.Robotun ortalama ağırlığı 108 gr civarında bu size extra bir avantaj sağlıyor.

Bileşenler smd olduğundan çok hafifler.Robot programlanırken PID kullanılmış bu sayede çizgi üzerinde herhangi bir yalpalama yapmamakta.PID nedir diyorsanız.Projenin çizimlerini ve kaynak kodlarını bu linkten indirebilirsiniz.

Projenin Dosyasını İndir

//Robot Zero 
#define F_CPU 20000000UL	// Baby Orangutan frequency (20MHz)
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

//Leds. Salidas.
#define	LEDR PORTB1
#define	LEDV PORTB2

//Interruptores. Entradas.
#define PULSADOR PORTB0
//Sensores. Entradas y salidas.
#define	D3 PORTD7
#define D2 PORTC5
#define D1 PORTC4
#define D0 PORTC3
#define I0 PORTC2
#define I1 PORTC1
#define I2 PORTC0
#define I3 PORTD4
#define LED_ON PORTD2


void inicializar_puertos(void);
void reset(void);
void M1_forward(unsigned char pwm);
void M1_reverse(unsigned char pwm);
void M2_forward(unsigned char pwm);
void M2_reverse(unsigned char pwm);
void motors_init(void);
int obtener_errorp(void);
void inicializar_timer1(void);
int obtener_errord(void);

/*********** Ajuste comportamiento robot *********/
//Constantes Regulador PD. 
int Kp = 50;  //  
int Kd = 2500; //
volatile int velocidad = 160;     
/*************************************************/

int main( void ) 
{

	char pulsador = 1;

	inicializar_puertos();
	motors_init();
	reset();

	while(pulsador != 0 )
	{
		pulsador = PINB & (1<<PULSADOR);
	}

	_delay_ms(500);

	inicializar_timer1();

	PORTD |= (1<<LED_ON); //Encendemos Sensores.
	
	M1_forward(0);		//Motor derecho. 
	M2_forward(0);	    //Motor izquierdo. 


				
	while ( 1 ) 
	{	
	}
	return 0;
}

void inicializar_puertos(void)
{
   DDRD=0x6C;     //0110 1100  
   PORTD=0x00;   
   DDRB=0x26;     //0010 0110  
   PORTB=0x00;
   DDRC=0x00;     //0000 0000
   PORTC=0x00;  
}

void reset(void)
{
	

	PORTB &= ~(1<<LEDV);
	PORTB &= ~(1<<LEDR);
	_delay_ms(300);


	PORTB |= (1<<LEDV);
	PORTB |= (1<<LEDR);
	_delay_ms(300);



	PORTB &= ~(1<<LEDV);
	PORTB &= ~(1<<LEDR); 
	_delay_ms(300);


	PORTB |= (1<<LEDV);
	PORTB |= (1<<LEDR);
	_delay_ms(300);



	PORTB &= ~(1<<LEDV);
	PORTB &= ~(1<<LEDR); 
	_delay_ms(300);


	PORTB |= (1<<LEDV);
	PORTB |= (1<<LEDR);
}

//Funciones para controlar la velocidad y dirección de los 
//motores. PWM controla la velocidad, valor entre 0-255.
void M1_reverse(unsigned char pwm)
{
	OCR0A = 0;
	OCR0B = pwm;
}
void M1_forward(unsigned char pwm)
{
	OCR0B = 0;
	OCR0A = pwm;
}
void M2_forward(unsigned char pwm)
{
	OCR2A = pwm;
	OCR2B = 0;
}
void M2_reverse(unsigned char pwm)
{
	OCR2B = pwm;
	OCR2A = 0;
}

//Configuración del hardware del micro que controla los motores.
void motors_init(void)
{
	// configure for inverted PWM output on motor control pins:
	// set OCxx on compare match, clear on timer overflow
	// Timer0 and Timer2 count up from 0 to 255
	TCCR0A = TCCR2A = 0xF3;
	// use the system clock/8 (=2.5 MHz) as the timer clock
	TCCR0B = TCCR2B = 0x02;
	// initialize all PWMs to 0% duty cycle (braking)
	OCR0A = OCR0B = OCR2A = OCR2B = 0;
	// set PWM pins as digital outputs (the PWM signals will not
	// appear on the lines if they are digital inputs)
	DDRD |= (1 << PORTD3) | (1 << PORTD5) | (1 << PORTD6);
	DDRB |= (1 << PORTB3);
}

void inicializar_timer1(void) //Configura el timer y la interrupción.
{
    OCR1A= 0x0138; // 1 ms. 0C35 10ms, 0x0271 2ms.
    TCCR1B |=((1<<WGM12)|(1<<CS11)|(1<<CS10));    //Los bits que no se tocan a 0 por defecto
    TIMSK1 |= (1<<OCIE1A);
    sei();
}

int obtener_errorp(void)
{
	char errorp=0;
	static char ultimo_errorp=0;
	char contador_sensor=0;

	if(((PINC & 0x04) != 0) && ((PINC & 0x08) != 0))
	{
		errorp=0;
		return(0);
	 }

	if((PIND & 0x10) != 0) //I3 PD4 -7
	{
		errorp = errorp - 0x07;
		contador_sensor++;
	}

	if((PINC & 0x01) != 0) //I2 PC0 -5
	{
		errorp = errorp - 0x05;
		contador_sensor++;
	}

	if((PINC & 0x02) != 0) //I1 PC1 -3
	{
		errorp = errorp - 0x03;
		contador_sensor++;
	}

	if((PINC & 0x04) != 0) //I0 PC2 -1
	{
		errorp = errorp - 0x01;
		contador_sensor++;
	}

	if((PINC & 0x08) != 0) //D0 PC3 +1
	{
		errorp = errorp + 0x01;
		contador_sensor++;
	}

	if((PINC & 0x10) != 0) //D1 PC4 +3
	{
		errorp = errorp + 0x03;
		contador_sensor++;
	}

	if((PINC & 0x20) != 0) //D2 PC5 +5
	{
		errorp = errorp + 0x05;
		contador_sensor++;
	}

	if((PIND & 0x80) != 0) //D3 PD7 +7
	{
		errorp = errorp + 0x07;
		contador_sensor++;
	}

	if(contador_sensor != 0)
	{
		errorp = errorp / contador_sensor;
		ultimo_errorp = errorp;
		return(Kp * (int)errorp);
	}
	else
	{
		if(ultimo_errorp < 0)
			errorp = -0x09;
		else
			errorp = 0x09;

		ultimo_errorp = errorp;
		return((int)errorp * Kp);
	}		
}

int obtener_errord(void)
{
	int error = 0;
	static int error_old = 0;
	static int errord=0;
	static int errord_old = 0;
	static int tic = 1;  // 1
	static int tic_old = 1; // 


	int diferencia = 0;

	if(((PINC & 0x04) != 0) && ((PINC & 0x08) != 0))
		error=0;

	else if((PINC & 0x08) != 0) //D0 PC3 +1
		error = 1;

	else if((PINC & 0x04) != 0) //I0 PC2 -1
		error = -1;

	else if((PINC & 0x10) != 0) //D1 PC4 +3
		error = 3;

	else if((PINC & 0x02) != 0) //I1 PC1 -3
		error = -3;

	else if((PINC & 0x20) != 0) //D2 PC5 +5
		error = 5;

	else if((PINC & 0x01) != 0) //I2 PC0 -5
		error = -5;

	else if((PIND & 0x80) != 0) //D3 PD7 +7
		error = 7; 

	else if((PIND & 0x10) != 0) //I3 PD4 -7
		error = -7;

	else
		{
			if (error_old < 0) error = -9; else if(error_old > 0)
				error = 9;
		}

	//Cálculo de la velocidad media del error.
	if (error == error_old)
	{
		tic = tic + 1;
		if(tic > 30000)
			tic = 30000;
		if(tic > tic_old)
			errord = errord_old/tic;
//		if(tic > tic_old)
//			errord = (errord_old*tic_old)/tic;

	}
	else
	{
		tic++;
		diferencia = error - error_old;
		errord = Kd*(diferencia)/tic; //error medio
		errord_old = errord;
		tic_old=tic;
		tic=0;
	}

	error_old = error;
	return(errord);
}

ISR(TIMER1_COMPA_vect)
{
	int errort=0;
	int proporcional = obtener_errorp();
	int derivativo = obtener_errord();


	errort = proporcional + derivativo;


	if(errort > velocidad)
		errort = velocidad;
	else if(errort < - velocidad) errort = - velocidad; if(errort>0)
	{
    	M1_forward(velocidad - errort);     //Motor derecho.
        M2_forward(velocidad);              //Motor izquierdo.
	    PORTB |= (1<<LEDV);
		PORTB &= ~(1<<LEDR);
	}
	else if(errort<0)
	{
    	M1_forward(velocidad);              //Motor derecho.  
        M2_forward(velocidad + errort);     //Motor izquierdo. 
	    PORTB |= (1<<LEDR);
		PORTB &= ~(1<<LEDV);
	}

	else
	{
    	M2_forward(velocidad);       
        M1_forward(velocidad);
		PORTB &= ~(1<<LEDR);
	    PORTB &= ~ (1<<LEDV);
	}



    TIFR1 |= (1<<OCF1A);
}
SİZCE NASIL OLMUŞ?
Beğendim
66%
İlginç
10%
Eh İşte
7%
Anlamadım
11%
Kötü
1%
Berbat
5%
YAZAR HAKKINDA
Murat Duran
Murat Duran
Açık kaynak donanım ve yazılım geliştiricisiyim , mekanik ve robotik sistemler üzerinde çalışmalar yapmaktayım.Ayrıca bir start-up firması olan Proje Hocam 'ın kurucuyum.
62 YORUMLAR
1 2
  • melike
    2 Ağustos 2015 at 16:17

    tam aradığım robot,yarışmaya katılacağım acaba birinci olurmu?

  • Murat Duran
    2 Ağustos 2015 at 18:25

    bu tarz yarışmalarda birinci olmak bir hayli zordur, ama derece alma ihtimaliniz yüksek.

  • 24 Ağustos 2015 at 22:00

    merhaba siz. bu yaptiginiz. cizgi. izliyen. arduino. harika. elin. koluna saglik. sizden istedigim.
    drenc degerleri . yazarsaniz.cok sevinirim? hersey. icin tesekkurler. siteniz. harika. inanki.
    isvecten selamlar. allaha. emanet olun. umarim. cevap. verirsiniz.

    • Murat Duran
      24 Ağustos 2015 at 23:37

      Proje dosyasını indirin dosyada rz6.jpg dosyasında direnç bağlantıları mevcut, bağlantılarda R1 R2 ve R4 = 470 OHM , R10 R7 ve R8 = 330 OHM , R3 R5 ve R6 = 15 kOHM

  • 24 Ağustos 2015 at 22:22

    merehaba. motor surucunun. ismini yazarmisiniz. L7805 regule yanindaki.?
    bagli. sizden ricam. ismini. ve numarasini. mahzeme. listesini. yazmisiniz. bide .drenc. degeri. yazarsaniz. sevinirim.?

    motor. surucunun. ismini. yazarsaniz. size cok tesekkur. ederim. allaha emanet olun

    1- Baby Orangutan B-328
    2- Pololu 10:1 Redüktörlü Motor x2
    3-QTR-8A çizgi izleyen sensörü
    4- Pololu 32×7 mm tekerlek
    5- 3/8″ sarhoş tekerlek

    6- 2.5-9.5 V konventör
    7- 3.7 volt lipo batarya

  • 25 Ağustos 2015 at 17:48

    merhaba. verdiginiz bilgilerden. dolayi. size .cok cok. tesekkurler. ederim. islerinizden. basarilar. dilerim.
    inanki. cevap. verince. cok sevindim. sizin sayenizde. cizgi. izliyen. robotu. yapmak. ve bilgi. sahibi. olmak. tesekkur.
    allah sizleri. kazadan. beladan. esirgesin. . hersey. gonlunce.olsun. allaha. emanet. olun. isvecten selamlar.

  • 26 Ağustos 2015 at 12:03

    merhaba. hayirli. isler dilerim. size. sunu soracaktim. size. yazmis oldugunuz. arduino. programi. bende arduino uno. var. programi. senin yazdigin. yukledim. hata. vermedi,

    Baby Orangutan B-328. uzerinde. giriste. 6.pin var. bir soketli. kaployla. ARDUINO UNO. cikisina. yazili. ICSP: baglanacak. dogrumu?. bilgi sayarima. ARDUINO onu. bagli. usb.
    cikista. ICSP. yazan yere. Baby Orangutan. baglanacak. dogrumu. bunu ogrenmek. isterdim. sizden tesekkurler. Baby orangutan. baglanti. kaplosu. beraber geliyormu. cunku. baby. oranguta. ismarladim. bugun. yazdiklarim. hakinda. sizden cevap. bekliyorum. allaha. emanet . olun. iyi. calismalar. hersey. gonlunce. olsun.

  • 26 Ağustos 2015 at 12:06

    merhaba. hayirli isler dilerim size. sizden ricam. bu robotunuzun. tek. bir resmini. gondermen. mumkunmu. tesekkurler.
    allah. isinizi. rast getirsin. siteniz harika. inanki.

  • 15 Eylül 2015 at 15:07

    merhaba. hayirli isler dilerim size. Baby Orangutan B-328. geldi. dun. sizden ricam. bunun uzerindeki. 6 PIN. kaplolari?
    sirayla. izah ederseniz? ARDUINO. baglanti sekili, kaplolari. ayri ayri. izah. edreseniz. cok. sevinirim. yanlis. takmayim. arduino uno.
    ICSP 6 pin. Baby Orangutan B-328? baglanmasi. ve program yuklemek icin. 6 pin nasil baglanacak. tek tek cizerseniz. cok sevinirim. allah isinizi. rast getirsin. umarim. cevap. verirsiniz. allaha. emanet olun. sizin sayenizde. cizgi izliyeni. yapayim. tesekkurler,

  • Murat Duran
    15 Eylül 2015 at 16:39

    ICSP ile programlayacaksınız doğrudur.Baby Orangutan yanında bazen jumper kablo gönderiyorlar aldığınız yere göre değişiklik gösterebilir.Göndermeseler bile çok pahalı birşey değil

    • ibrahim karadağlı
      9 Şubat 2017 at 12:39

      murat bey ben bunu hızlı çizgi izleyen yapabilirmiyim bi şharp sensörü taka bilirmiyiz buna

  • 15 Eylül 2015 at 19:53

    merhaba. jumper kapla gelmedi. sizden istedigim. Baby Orangutan . cikisi 6 pin var. arduino. 6 bin cikisi var. bunlari.
    sirasiyla. baglanmak? yanlis baglamayim. diye. onun icin sizi rahatsiz etim. kaplolar. bahali. degildir. arduno disi olan. kaploda baglanir. paket olarak. arduino kaplolar. ucuz. sorun degil. tek istedigim. Baby Orangutan . arduino. pinlerine. dogru. baglamak. onun.icin sizden. yardim. istedim. tesekkurler. iyi aksamlar, hersey gonlunce olsun.

  • 16 Eylül 2015 at 15:26

    merhaba tesekkur ederim size. arduino. olmaz diyorsunuz?. AVR i. programi. yuklenecek. dogrumu.? bende. bu var.
    olurmu?Baby Orangutan B-328 + USB AVR Programmer Combo, gecensene almistim. fakat. pololu programi. AVR. hanki. Atmel Studio. hankisini. verisyonu.indirmem lazim.? https://www.pololu.com.

    anliyacagin. bu bende var. Baby Orangutan B-328 + USB AVR Programmer Combo. VAR.bende.hanki AVR program. kod yuklemek.icin
    Atmel. studio . hanki verisyonu. indirmek. dogrusu. hanki. bu konudan sizden. cevap bekliyorum. tesekkurler.
    allah.isinizi rast. getirsin. sizin sayenizde. cok bilgi sahibi. oldum. inanki. son ricam . bu cizgi kod yuklemek. icin Atmel stuio. hanki verisyonu. indirmek. icin. bu konudan. sizden yardim. istiyorum. robotu calistirmak. sag olun

  • 17 Eylül 2015 at 22:19

    merhaba. hersey.icin tesekkurler. senin gonderdigin. sitede. Baby Orangutan B-328 + USB AVR Programmer Combo
    indirdim. programi. polulo. usb. driveri buluyor. atmel stuio. 6,2 indirdim. cizgi izliyen. zero hexi. yukleyince. flas . hatsi. diyor?
    robot. suan modul baby. orgutan taktim. robot uzerindeki. 2 led yaniyor. tek sorun. hexi yuklemedim. sizden ricam. atmel. Stuio.
    hanki. verisiyon. Bu. Baby orgutani. calistirmak. senin yoladigin. atmel. stuio. anlatimi. ona . bakarak. yapamadim. sizden ricam.
    bu konudan. sizden. yardim. istiyorum. tesekkurler. allaha emanet. olun. iyi aksamlar. hersey. gonlunce olsun. size. karsi. mahcup. oldum.
    inanki.

  • 26 Eylül 2015 at 21:42

    merhaba. hayirli isler dilerim. size. hizli cizgi .izliyen. robot. Baby orgutani. calistirdim. atmel Sudio. 6.2 kodu yukledim. hersey icin. tesekkurler.
    allah. isinizi. rast getirsin. hayirli. bayramlar. dilerim. sizlere.

  • 28 Eylül 2015 at 21:46

    merhaba. bu robota . bende. lipo batarya. 7.4V 360 mh. var . 7.4 750. mah . var bunlarda. hankisi. uygun.
    hayirli isler. dilerim. size. robot . harika. calisiyor. eliin . koluna saglik

  • 29 Eylül 2015 at 21:00

    merhaba. hayirli isler. dilerim size. robot .harika calisiyor. sorun yok. sizin.sayenizde.
    sunu. soracaktim. size. QRT_8A sesörle. anolog.calisiyor. QRT_8RC digitala. calismasi. icin. ne yapmam. gerekli. bu robota olurmu?
    tesekkurler. allaha emanet olun.

  • 29 Eylül 2015 at 21:32

    merhaba. kusura bakma. sunuda soracaktim. S.1 Swic.002. özeligi, ne? bide. robotun. onkisminda. sessor yanida. 4 header. soketi, var.
    buraya. birsey. baglaniyormu? tesekkurler. allaha emanet olun.

    • Murat Duran
      30 Eylül 2015 at 15:01

      Swic.002 strateji için yapılmış , tam emin değilim ama hızı azaltıyor galiba

    • Adem aydın
      24 Mart 2017 at 12:57

      Merhaba biz yaptik kodu yükleyince sol motor sürekli donuyor siz çalistirmissiniz yardim edebilirmisiniz acaba yarismaya katilmak istiyoruz teşekkürler

  • 30 Eylül 2015 at 16:33

    merhaba. tesekkurler. hayirli islerdilerim. size. allaha.emanet olun.

  • oğulcan
    10 Ekim 2015 at 12:47

    merhaba bu devrenin üzerinde smd devre elemenları var ama degerleri söylenmemiş yada ben göremedim yardimcı olursaniz cok sevinirim

  • Şahin Bölükbaşı
    26 Ekim 2015 at 20:02

    S.a bunu ardino ile yapabilirmiyiz

  • Emirhan
    8 Kasım 2015 at 17:29

    Merhaba ben c dosyasını derleyemedim AVR studio da bi yardımcı olabilirmiş.

  • Emirhan
    8 Kasım 2015 at 17:31

    Merrhaba ben c dosyasını derleyemedim AVR studio da bi yardımcı olabilirmisiniz

  • Ahmet temur
    28 Ocak 2016 at 22:01

    Merhabalar robotun gövdesi hangi malzemeden yapılmış yardımcı olursanız çok sevinirim

  • serdar
    23 Şubat 2016 at 20:30

    öncelikle bu tür bilgileri bizimle paylaştığınız için çok tesekkür ederim malzemeleri sipariş edebileceğimiz bi yer tavsiye edebilirmiziniz bu projeyi yapmak istiyoruz.birde mikroişlemciye bu kodu nasıl yükleyelim çneriniz nedir saygılarımla..

  • mfatih
    27 Şubat 2016 at 08:50

    baby orangutan yerine arduino nano kullnırsam aynı performansı alabilir miyim? İkisinde de aynı atmel var. Açıkçası baby orangutan çok pahalı geldi bunun sebebi nedir

  • muhammed fatih
    27 Şubat 2016 at 11:31

    Ben motor surucu olarak l298n ve arduino kullaniyorum 1500rpm motorlar var. Arabami hizlandirinca yoldan cikiyor bunun sebebi nedir? Motor surucuden mi yoksa arduinodan mi kaynaklaniyor? Tesekkurler

  • Engin Çakır
    8 Mart 2016 at 22:05

    Zero Line follower kodunu atmel studio 7.0 ile nasıl yükleyebilirim

  • Alphan Karabat
    22 Mart 2016 at 17:45

    bu robotu nasıl hazır bir şekilde alabilirm ?

  • Vedat DOGAN
    6 Haziran 2016 at 23:53

    devreyi bord üzerinde kuruyorum olmuyor

  • Vedat DOGAN
    6 Haziran 2016 at 23:54

    yardım edebilir misiniz ?

  • oguzhan
    30 Ağustos 2016 at 18:03

    baby orangutan kartı programlamak için ne kullanmam gerekiyor ? üzerinde usb yok

    • abdulkadir ünver
      6 Eylül 2016 at 18:52

      bunun bağlantılarını bulamadım yardımcı ola bilirmisiniz lütfen

  • Baraj Çelik
    6 Ekim 2016 at 11:19

    SELÂMÜN ALEYKÜM BİRADER BASKI DEVRESİ VARMI

  • Onurtilki
    19 Ekim 2016 at 15:02

    Kod c de derlenmiyor nasıl yapabilirim

  • Yardımsever insan
    15 Aralık 2016 at 20:23

    Motorlar kaç rpm onu söylermisiniz degişik rpm lerde kodları değiştirmek gerekirde

  • bilal
    27 Ocak 2017 at 22:30

    merhabalar
    sws002 nedir ve SL5 normal jumperların gireceği header mıdır
    cevaplarsanız çok sevinirim
    teşekkürker

  • ibrahim karadağlı
    9 Şubat 2017 at 13:48

    kesikli çizgilerde veya beyaz zeminde gide biliyormu

YORUM YAP