Setelah ane posting tentang rangkaian minimum system AVR, sensor garis
dengan komparator, dan driver motor. Saatnya ane mencoba menggabungkan
rangkaian tersebut menjadi sebuah robot yang dapat mengikuti garis.
Mungkin disini saya akan share hanya garis besar’y saja, tetapi
jangan khawatir saya juga akan kasih coding’y dalam bahasa C
dengan compiler Codevision AVR.
sekarang ane akan share coding’y pake bahasa C dengan compiler codevision AVR:
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 lihatdisini, 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 :
0 comments:
Post a Comment
Jangan membuat kata-kata yang tidak baik, karena dapat menimbulkan Spam