Membuat robot line follower atau line tracer adalah pengalaman yang
sangat berharga ketika saya membuat robot line follower untuk yang
pertama kalinya, tentunya karena newbie atau pemula jadi saya mencari
bahan atau tutorial yang tanpa LCD.
Mengapa tanpa LCD?
Dulu sekitar tahun 2010 saya memulai proyek ini proyek yang besar bagi
saya karena saya masih belum punya pengalaman yang cukup terutama
pemrograman dengan LCD 2X16 Character, pada waktu itu LCD seperti barang
yg mewah saja karena harganya lumayan nyarinya pun cukup sulit harus ke
glodok dulu baru dapet, tidak seperti sekarang serba online banyak yang
menawarkan di grup facebook dengan harga murah serta model yang
beragam.
Belajar pemrogramannya pun awalnya asembler dan untungnya sudah populer
bahasa c itupun baru sedikit banget hanya bisa ngidupin led, ADC aja
masih bingung, untungnya banyak bermunculan referensi tentang rangkaian
maupun pemrograman dalam membuat robot line follower microcontroller di
internet jadi pengembangannya pun bisa segera diwujudkan.
Dalam proses pembuatanya desain PCB-nya saya buat beberapa bagian
misalnya bagian sensor saya buat sendiri dan masih menggunakan IC
komparator LM324, kalo sekarang kita tinggal pake ADC ya nggak perlu
repot nambah IC, tapi disini kita sebagai pemula mesti mencoba supaya
kita tahu sistemnya, jika menggunakan IC LM324 keluarannya sudah digital
jadi tinggal disambungkan ke port microcontroller saja, tetapi jika
tidak menggunakan IC maka kita harus menggunakan ADC pada port A
tentunya dengan program yang lumayan banyak.
Dalam gambar skema sensor masih menggunakan sensor IR dan LED, tapi
jangan khawatir bisa juga diganti dengan photodioda dan Led super bright
soalnya yang umum dipakai sekarang komponen itu, tapi jangan salah lho
jika kita menggunakan sensor IR atau infrared maka sensor pada robot
kita tidak tergantung dengan sinar UV yang ada pada lampu dan sinar
matahari jadi robot kita akan tetap stabil walaupun diluar ruangan, jika
kita menggunakan photodioda tanpa rangkaian filter maka robot kita akan
rentan oleh gangguan cahaya, biasanya kita akali dengan menambahkan
penutup atau busa tipis yang menutupi sensor agar cahaya dari luar dapat
dihindari.
Untuk minimum sistem saya masih menggunakan minimum sistem standar yang
penting ada tombol resetnya bila perlu ditambah tombol untuk start, tapi
kalo anda ingin membuatnya sekaligus dalam satu pcb tentunya lebih
bagus kan sekarang mudah banget gambar layout pcb bisa dengan software
diptrace, eagle, dan lainya, selanjutnya untuk driver motor saya
menggunkan IC Driver L298 cukup lumayan untuk motor yang agak besar
rpm-nya.
Untuk rangkaian sensornya bisa dilihat dalam gambar dibawah ini, jangan
lupa untuk membuat 8 sensor, cukup banget kalo kita gunakan 2 buah IC
LM324.
Rangkaian Sensor LF |
Berikut gambar skemanya minimum sistem menggunakan Atmega16 dan driver L298 :
Rangkaian Minimum Sistem dan Driver |
Ini sekalian saya kasih source kode atau program robot line follower
microcontroller dengan software AVR Studio bisa juga Code Vision AVR,
tentunya akan lebih bagus dan mantap jika sedikit dipoles atau ditambah
dengan LCD serta tombol supaya bisa jalan digaris atau arena yang
berbeda-beda tapi ini juga sudah lumayan dan work di robot.
Source Code : Robot Line Follower Microcontroller Tanpa LCD
/*****************************************************
Project : Robot Line Follower Microcontroller Tanpa LCD
*****************************************************/
#include
#include
#ifdef debug
#include
#endif
#define FWD 0xAA
#define REV 0x55
#define R 0x22
#define L 0x88
#define CW 0x99
#define CCW 0x66
#define STOP 0x00
#define B 0xFF
#define RSPEED OCR1AL
#define LSPEED OCR1BL
#define SPEED0 255
#define SPEED1 0
#define SPEED2 0
#define SPEED3 0
#define MAX 3
#define HMAX 1
void move (unsigned char dir,unsigned char delay,unsigned char power);
unsigned char i,rdev,ldev,ip,delay,dir,power,dirl,history[MAX],hcount=0,rotpow;
#ifdef debug
unsigned char rep=0,prev=0;
#endif
void main(void)
{
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
Line Follower
Page 12 of 17
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0xFF;
// Port D initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x30;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 921.600 kHz
// Mode: Fast PWM top=00FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0xA1;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0xFF;
OCR1BH=0x00;
OCR1BL=0xFF;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
Line Follower
Page 13 of 17
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
#ifdef debug
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 57600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x07;
#endif
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
while (1){
#ifdef debug
if(rep<255 p="">rep++;
if(prev!=PINA) {
prev=PINA;
printf("%u\r",rep);
for(i=0;i<8 i="" p="">printf("%u\t",(prev>>i)&0x01);
rep=0;
}
#endif
if(PINA!=255){
rotpow=255;
ldev=rdev=0;
if(PINA.3==0)
rdev=1;
if(PINA.2==0)
rdev=2;
if(PINA.1==0)
rdev=3;
Line Follower
Page 14 of 17
if(PINA.0==0)
rdev=4;
if(PINA.4==0)
ldev=1;
if(PINA.5==0)
ldev=2;
if(PINA.6==0)
ldev=3;
if(PINA.7==0)
ldev=4;
if(rdev>ldev)
move(R,0,195+12*rdev);
if(rdevmove(L,0,195+12*ldev);
if(rdev==ldev)
move(FWD,0,200);
}
else {
for(i=0,dirl=0;iif(history[i]==L)
{dirl++;}
}
if(rotpow<160 rotpow="160;}</p">if(rotpow<255 p="" rotpow="">if(dirl>HMAX)
{move(CW,0,rotpow);}
else
{move(CCW,0,rotpow);}
}
};
}
void move (unsigned char dir,unsigned char delay,unsigned char power) {
PORTC=dir;
if(dir==L || dir==R) {
hcount=(hcount+1)%MAX;
history[hcount]=dir;
}
LSPEED=RSPEED=255;//power;
//delay_ms(delay);
}
Sumber: http://www.robot-id.com/2014/02/cara-membuat-robot-line-follower.html
Tidak ada komentar:
Posting Komentar