WHAT'S NEW?
Loading...

Robot Pengikut Garis

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.

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.

sekarang ane akan share coding’y pake bahasa C dengan compiler codevision AVR:
#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