Robot Line Follower merupakan robot yang dapat bergerak mengikuti garis secara otomatis. Robot Line Follower merupakan robot yang sederhana bahkan sekarang anak SMA dan SMP sudah bisa membuatnya selain dalam membuatnya tidak terlalu sulit atau dapat dikatakan mudah selain itu juga komponen yang dibutuhkan dalam membuatnya cukup mudah kita dapatkan serta buku ataupun tutorial yang ada di internet sudah banyak sekali yang membahas cara membuat line follower baik itu tanpa mikrokontroler ataupun dengan mikrokontroler.
Gambar Robot Line Follower
Untuk membaca garis, robot dilengkapi dengan sensor proximity yang dapat membedakan antara garis hitam dengan lantai putih. Sensor proximity ini dapat kalibrasi untuk menyesuaikan pembacaan sensor terhadap kondisi pencahayaan ruangan. Sehingga pembacaan sensor selalu akurat. Sensor proximity bisa kita buat sendiri. Prinsip kerjanya sederhana, hanya memanfaatkan sifat cahaya yang akan dipantulkan jika mengenai benda berwarna terang dan akan diserap jika mengenai benda berwarna gelap. Sebagai sumber cahaya kita gunakan LED (Light Emiting Diode)yang akan memancarkan cahaya merah. Dan untuk menangkap pantulan cahaya LED, kita gunakan photodiode. Jika sensor berada diatas garis hitam maka photodioda akan menerima sedikit sekali cahaya pantulan. Tetapi jika sensor berada diatas garis putih maka photodioda akan menerima banyak cahaya pantulan. Berikut adalah ilustrasinya :
Pada robot line follower, sensor robot yang dapat digunakan ada 3 jenis, yaitu LDR (Light Dependent Resistor), Photo Dioda atau Photo Transistor.
Berikut program robot line follower :
#include <mega8535.h> //Mikrokontroler yang dipakai ATmega 8535 #define s1 PINA.0 //Pendekalrasian sensor 1 di pinA.0
#define s2 PINA.1 //Pendekalrasian sensor 2 di pinA.1
#define s3 PINA.2 //Pendekalrasian sensor 3 di pinA.2
#define s4 PINA.3 //Pendekalrasian sensor 4 di pinA.3
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A 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
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=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0xFF;
// 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: 12000,000 kHz
// Mode: Fast PWM top=00FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA1;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// 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;
// Tambahkan kode program dibawah u/mengatur Kecepatan motor Dc(pwm=50)
OCR1AL=50;
OCR1BL=50;
while (1)
{
/*posisi sensor
s1 s2 s3 s4
kiri kanan
*/
if (s1==0&&s2==1&&s3==1&&s4==0) //Sensor 2 & 3 yang mendeteksi line(inp>=3 volt)
{
PORTC.0=1;
PORTC.1=0;
PORTC.2=1;
PORTC.3=0; //Motor maju semua
}
if(s1==1&&s2==1&&s3==0&&s4==0) //Sensor 1 & 2 yang mendeteksi line
{
PORTC.0=1;
PORTC.1=1;
PORTC.2=1;
PORTC.3=0; //Motor 1 stop motor 2 maju
}
if(s1==1&&s2==1&&s3==1&&s4==0) //Sensor 1, 2 & 3 yang mendeteksi line
{
PORTC.0=0;
PORTC.1=1;
PORTC.2=1;
PORTC.3=0; //Motor 1 Mundur motor 2 maju
}
if(s1==1&&s2==0&&s3==0&&s4==0) //Hanya Sensor 1 yang mendeteksi line
{
PORTC.0=1;
PORTC.1=1;
PORTC.2=1;
PORTC.3=0; //Motor 1 Stop motor 2 maju
}
if(s1==0&&s2==1&&s3==0&&s4==0) //Hanya Sensor 2 yang mendeteksi line
{
PORTC.0=1;
PORTC.1=1;
PORTC.2=1;
PORTC.3=0; //Motor 1 Stop motor 2 maju
}
if(s1==0&&s2==0&&s3==1&&s4==1) //Sensor 3 & 4 yang mendeteksi line
{
PORTC.0=1;
PORTC.1=0;
PORTC.2=1;
PORTC.3=1; //Motor 1 maju motor 2 stop
}
if(s1==0&&s2==1&&s3==1&&s4==1) //Sensor 2, 3 & 4 yang mendeteksi line
{
PORTC.0=1;
PORTC.1=0;
PORTC.2=0;
PORTC.3=1; //Motor 1 maju motor 2 mundur
}
if (s1==0&&s2==0&&s3==0&&s4==1) //Hanya Sensor 4 yang mendeteksi line
{
PORTC.0=1;
PORTC.1=0;
PORTC.2=1;
PORTC.3=1; //Motor 1 maju motor 2 stop
}
if (s1==0&&s2==0&&s3==1&&s4==0) //Hanya Sensor 3 yang mendeteksi line
{
PORTC.0=1;
PORTC.1=0;
PORTC.2=1;
PORTC.3=1; //Motor 1 maju motor 2 stop
}
if(s1==0&&s2==0&&s3==0&&s4==0) //Tidak ada sensor yang mendeteksi line
{
PORTC.0=1;
PORTC.1=0;
PORTC.2=1;
PORTC.3=0; //Motor 1 maju motor 2 maju
}
if (s1==1&&s2==1&&s3==1&&s4==1) //Semua sensor mendeteksi line
{
PORTC.0=1;
PORTC.1=0;
PORTC.2=1;
PORTC.3=0; //Motor 1 maju motor 2 maju
}
};
}