OK., langsung aja…!!!
kita lihat diagram blok dibawah ini.
Gambar 1. Diagram Blok Robot Pengikut Garis
Diagram blok diatas merupakan gambaran secara umum
dari sistem robot pengikut garis. Dari inputan bisa dilihat terdapat 8 sensor
dengan inisial s1 – s8. Kemudian sensor tersebut masuk ke komparator, dari komparator
diolah oleh mikrokontroler untuk menghasilkan gerakan motor dc (roda) agar
robot dapat mengikuti garis dengan baik. Untuk penjelasan tentang sensor garis
degan komparator bisa lihat disini, kemudian untuk rangkaian minimum system avr
bisa baca disini juga, sedangkan rangkaian driver motor bisa lihat disana.
Berikut gambar atau foto robot pengikut garis yang pernah
ane & temen ane buat:
Gambar 2. Robot Banzay
Robot ini merupakan robot yang paling sederhana dengan
komponen seadanya., itu juga boleh minjem punya temen (hehe..) proses
pembuatanya hanya 2 hari. Tapi dengan usaha yang keras dan doa dari temen2
robot ini pernah menjadi juara 3 di Tybot LFC 2010, Alhamdulillah sesuatu..,!!
(syahrini :mode on). Hehehe..,
Nah.., sekarang kita main ke logika sederhana robot pengikut
garis ini. Sensor yang saya gunakan untuk membaca garis sebanyak 8 buah
(photodiode dipasangkan dengan led superbright). Sehingga didapat logika
pembacaan sensor seperti gambar dibawah ini.
Gambar 4. Logika Sensor Garis
Setelah mengetahui kemungkinan-kemungkinan posisi
sensor, maka selanjutnya harus didefinisikan aksi dari setiap kondisi tersebut.
Aksi pergerakan robot terhadap sensor garis dapat dilihat pada table dibawah
ini.
Posisi Sensor
|
Aksi Robot
|
Roda Kiri
|
Roda kanan
|
1.
|
Belok kanan tajam
|
Maju cepat
|
Berhenti
|
2.
|
Belok kanan sedang
|
Maju cepat
|
Maju sangat lambat
|
3.
|
Belok kanan ringan
|
Maju cepat
|
Maju lambat
|
4.
|
Maju kanan
|
Maju cepat
|
Maju sedang
|
5.
|
Maju Lurus
|
Maju cepat
|
Maju cepat
|
6.
|
Maju kiri
|
Maju sedang
|
Maju cepat
|
7.
|
Belok kiri ringan
|
Maju lambat
|
Maju cepat
|
8.
|
Belok kiri sedang
|
Maju sangat lambat
|
Maju cepat
|
9.
|
Belok kiri tajam
|
Berhenti.
|
Maju cepat
|
Agar
pergerakan robot menjadi lebih smooth / halus, maka kecepatan robot diatur
sesuai dengan pembacaan sensor garis.
Jika posisi robot menyimpang dari garis , maka robot akan melambat.
Namun jika robot berada tepat diatas garis maka robot akan bergerak cepat.
Robot juga dapat kembali ke garis pada saat robot terlepas sama sekali dari
garis. Hal ini bisa dilakukan karena robot selalu mengingat kondisi terakhir
pembacaan sensor. Jika terakhir kondisinya adalah disebelah kanan garis, maka
robot akan bergerak ke kanan, dan sebaliknya.
#include
<mega16.h>
#include
<delay.h>
#define
motka1 PORTD.0
#define
motka2 PORTD.1
#define
motki1 PORTD.2
#define
motki2 PORTD.3
#define lpwm
OCR1A
#define rpwm
OCR1B
#define
sensor PINA
// Declare
your global variables here
void maju()
{motki1=1; motki2=0;
motka1=1;
motka2=0;}
void stop()
{motki1=0; motki2=0;
motka1=0;
motka2=0;}
void
mundur()
{lpwm=150; rpwm=150;
motki1=0;
motki2=1;
motka1=0;
motki2=1;}
void bkir()
{lpwm=200; rpwm=250;
motki1=1;
motki2=0;
motka1=0;
motka2=1;}
void bkan()
{lpwm=250; rpwm=200;
motki1=0;
motki2=1;
motka1=1;
motka2=0;}
void
garishitam()
{
int PV;
sensor=PINA;
sensor&=0xFF;
switch(sensor)
{ //satu sensor
case 0b11111110: bkan(); PV=0;
break;
case 0b11111101: maju(); lpwm=250;
rpwm=0; PV=0; break;
case 0b11111011: maju(); lpwm=250; rpwm=150;
PV=0; break;
case 0b11110111: maju(); lpwm=250; rpwm=200;
PV=0; break;
case 0b11101111: maju(); lpwm=200; rpwm=250;
PV=1; break;
case 0b11011111: maju(); lpwm=150; rpwm=250;
PV=1; break;
case 0b10111111: maju(); lpwm=0;
rpwm=250; PV=1; break;
case 0b01111111: bkir(); PV=1; break;
//dua sensor
case 0b11111100: maju(); lpwm=250;
rpwm=50; PV=0; break;
case 0b11111001: maju(); lpwm=250;
rpwm=75; PV=0; break;
case 0b11110011: maju(); lpwm=250; rpwm=150;
PV=0; break;
case 0b11100111: maju(); lpwm=250;
rpwm=250; break;
case 0b11001111: maju(); lpwm=150; rpwm=250;
PV=1; break;
case 0b10011111: maju(); lpwm=75;
rpwm=250; PV=1; break;
case 0b00111111: maju(); lpwm=50;
rpwm=250; PV=1; break;
case 0b11111111:
if(PV==0)
{bkan(); break;}
else if(PV==1)
{bkir(); break;}
}
}
void
main(void)
{
//Sensor
Garis
PORTA=0x00;
DDRA=0x00;
//Motor
PORTB=0x60;
DDRB=0x6F;
// PWM menggunakan timer 1
TCCR1A=0xA1;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ACSR=0x80;
SFIOR=0x00;
while (1)
{
// Place your code here
garishitam();
};
}
Dari coding
diatas berikut video dari robot ane, cekidot :