Cara Menciptakan Robot Line Follower Microcontroller Tanpa Lcd
Robot-ID.Com, Salam robotika.. apa kabarnya nih robolovers semua semoga selalu sehat dan menjalani rutinitas serta kiprah kita dengan sebaik mungkin, kali ini aku +sudarmanto saputra mau share perihal Cara Membuat Robot Line Follower Microcontroller Tanpa LCD.
Membuat robot line follower atau line tracer ialah pengalaman yang sangat berharga saat aku menciptakan robot line follower untuk yang pertama kalinya, tentunya alasannya newbie atau pemula jadi aku mencari materi atau tutorial yang tanpa LCD.
Mengapa tanpa LCD?
Dulu sekitar tahun 2010 aku memulai proyek ini proyek yang besar bagi aku alasannya aku masih belum punya pengalaman yang cukup terutama pemrograman dengan LCD 2X16 Character, pada waktu itu LCD menyerupai barang yg glamor saja alasannya harganya tidak mengecewakan nyarinya pun cukup sulit harus ke glodok dulu gres dapet, tidak menyerupai kini serba online banyak yang memperlihatkan di grup facebook dengan harga murah serta model yang beragam.
Belajar pemrogramannya pun awalnya asembler dan untungnya sudah terkenal bahasa c itupun gres sedikit banget hanya sanggup ngidupin led, ADC aja masih bingung, untungnya banyak bermunculan acuan perihal rangkaian maupun pemrograman dalam menciptakan robot line follower microcontroller di internet jadi pengembangannya pun sanggup segera diwujudkan.
Dalam proses pembuatanya desain PCB-nya aku buat beberapa bab contohnya bab sensor aku buat sendiri dan masih memakai IC komparator LM324, kalo kini kita tinggal pake ADC ya nggak perlu repot nambah IC, tapi disini kita sebagai pemula mesti mencoba supaya kita tahu sistemnya, kalau memakai IC LM324 keluarannya sudah digital jadi tinggal disambungkan ke port microcontroller saja, tetapi kalau tidak memakai IC maka kita harus memakai ADC pada port A tentunya dengan jadwal yang tidak mengecewakan banyak.
Dalam gambar denah sensor masih memakai sensor IR dan LED, tapi jangan khawatir sanggup juga diganti dengan photodioda dan Led super bright soalnya yang umum digunakan kini komponen itu, tapi jangan salah lho kalau kita memakai 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, kalau kita memakai photodioda tanpa rangkaian filter maka robot kita akan rentan oleh gangguan cahaya, biasanya kita akali dengan menambahkan epilog atau busa tipis yang menutupi sensor semoga cahaya dari luar sanggup dihindari.
Untuk minimum sistem aku masih memakai 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 cantik kan kini gampang banget gambar layout pcb sanggup dengan software diptrace, eagle, dan lainya, selanjutnya untuk driver motor aku menggunkan IC Driver L298 cukup tidak mengecewakan untuk motor yang agak besar rpm-nya.
Untuk rangkaian sensornya sanggup dilihat dalam gambar dibawah ini, jangan lupa untuk menciptakan 8 sensor, cukup banget kalo kita gunakan 2 buah IC LM324.
Rangkaian Sensor LF |
Berikut gambar skemanya minimum sistem memakai Atmega16 dan driver L298 :
Rangkaian Minimum Sistem dan Driver |
Ini sekalian aku kasih source arahan atau jadwal robot line follower microcontroller dengan software AVR Studio sanggup juga Code Vision AVR, tentunya akan lebih cantik dan mantap kalau sedikit dipoles atau ditambah dengan LCD serta tombol supaya sanggup jalan digaris atau arena yang berbeda-beda tapi ini juga sudah tidak mengecewakan 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(rdev
if(rdev==ldev)
move(FWD,0,200);
}
else {
for(i=0,dirl=0;i
{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);
}255>160>