Welcome to my live

Join The Community

Premium WordPress Themes

Minggu, 12 Februari 2012

Membuat Sebuah Robot Line Follower

Robot line follower merupakan robot yang paling sederhana cara pengerjaan dan komponen yang diperlukan. Line follower merupakan robot yang dapat bekerja, berjalan mengikuti garis hitam dan terus mengikuti garis hitam tanpa ada pembatas jalur.
Robot line follower ada dua kategori, yaitu robot line follower yang menggunakan program dan robot line follower yang tidak menggunakan program atau sering disebut robot analog. Robot analog paling sering digunakan untuk keperluan praktek sederhana karena biaya yang dikeluarkan tidak terlalu banyak.
Anda bisa memesan kit Robot Line Follower pada admin blog ini. Kit seharga Rp.200.000 untuk robot line follower analog ini sudah dilengkapi dengan gear box, sensor, battery holder, roda, dan body sehingga dalam perakitan yang sudah disertakan skema anda tidak usah bingung untuk merakitnya dari nol hingga jadi.
Dibawah ini merupakan robot line follower yang menggunakan program buatan admin aput.
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. 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 :
dalam robot line follower yang saya rancang memakai 6 pasang sensor infra merah, itu sudah cukup untuk membaca garis antara pertigaan maupun perempatan. Selanjutnya untuk dapat mengubah nilai keluaran sensor yang masih analog ke digital diperlukan op amp LM324 yang berisi 4 buah built in op amp yang lansung masuk ke microkontroler sebagai input sensor.
dengan menggunakan PCB fiber hasilnya pun cukup baik dan cukup mudah untuk memotongnya walaupun sedikit dalam merogoh kocek. untuk kontruksi robot yang saya gunakan berupa acrylic 3mm dengan bentuk silinder berdiameter 14cm yang dipotong menggunakan sistem laser sehingga hasilnya cukup mengesankan. motor dc yang dipakai menggunakan motor DC gearbox 12v dengan perbandingan 1:45 185rpm dengan torsi 4 kg, dipasang sejajar terhadap tumpuan terluar dari body acrylic untuk mendapatkan keseimbangan yang baik.
karena banyaknya permintaan schematic lengkap dari robot line follower ini maka penulis mencoba untuk mengupdate artikel ini dengan menambahkan beberapa rangkain yang mendukung pembuatan robot ini. berikut ii merupakan gambar schematic sensor dari line follower dan dan penguat op-amp 324.
  • Schematic Sensor dan Penguat
gambar di atas merupakan schematic sensor array yang berjumlah 6 pasang sensor (photodiode dan infra red) dimana pada tiap kaki mendapat resitor bernilai 330 ohm. pada kaki photodiode dari sensor yang mendapatkan resitor adalah kaki katoda (-) dalam gambar diberi tanda RD1 sampai RD6 sedangkan pada kaki infrared juga diberikan tahanan sebesar 330 ohm pada kaki anoda (+) yang dimulai dari R1 sampai R6. selanjutnya kita akan membahas penguat sensor (LM324) gambar scematiknya ditunjukkan seperti gambar di bawah ini :

gambar diatas merupakan konfigurasi dari sensor. Agar dapat dibaca oleh mikrokontroler, maka tegangan sensor harus disesuaikan  dengan level tegangan TTL yaitu 0 – 1 volt untuk logika 0 dan 3 – 5 volt untuk logika 1. Hal ini bisa dilakukan dengan  memasang  operational   amplifier  yang   difungsikan  sebagai   komparator.   Output  dari photodiode yang masuk ke input inverting op-amp akan dibandingkan dengan tegangan tertentu dari variable  resistor  VR.  Tegangan  dari  VR   inilah   yang  kita  atur  agar  sensor  proximity  dapat menyesuaikan dengan kondisi cahaya ruangan. dan berikut ini merupakan gamabr penguat (op-amp) dari sensor yang sudah menjadi scematicnya.
karena ic op-amp L324 memilki 4 buah opm-amp maka kita membutuhkan 2 buah ic L324 karena jumlah sensor adalah 6 buah. tampak seperti gambar diatas bagaimana konfigurasi penguat L324 saling berhubungan. selanjutnya gambar berikut ini merupakan gambar lay-out dari konfigurasi sensor :

  • Driver Motor
Untuk menggerakkan dua buah motor dc, digunakan IC H-Bridge Motor Driver L298,  yang mampu memberikan arus maksimum sebesar 1A ke tiap motor. Input L298 ada 6 jalur,  terdiri dari input data arah pergerakan motor dan input untuk PWM (Pulse Width Modulation). Untuk mengatur kecepatan  motor,  pada  input  PWM  inilah  akan  diberikan  lebar  pulsa   yang  bervariasi  dari mikrokontroler.
  • Minimum System
Sebagai ”otak” robot digunakan mikrokontroler AVR jenis ATmega8535 yang akan membaca data dari sensor proximity, mengolahnya, kemudian memutuskan arah pergerakan robot. Pada robot line track ini, keluaran sensor proximity dihubungkan ke PortD.0 dan PortD.5 pada mikrokontroler. Sedangkan driver motor dihubungkan ke PortC.0 s/d PortC.5 seperti  terlihat pada gambar berikut :
  • Program

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
Chip type   : ATmega8535L
Program type    : Application
Clock frequency : 11,059200 MHz
Memory model    : Small
External SRAM size  : 0
Data Stack size : 128
*********************************************/
#define SkiXX   PIND.0
#define SkiX    PIND.1
#define Ski PIND.2
#define Ska PIND.3
#define SkaX    PIND.4
#define SkaXX   PIND.5
  
#define EnKi    PORTC.4
#define dirA_Ki PORTC.0
#define dirB_Ki PORTC.1
#define EnKa    PORTC.5
#define dirC_Ka PORTC.2
#define dirD_Ka PORTC.3
#include <mega8535.h>
#include <delay.h>
bit x;
unsigned char xcount,lpwm,rpwm;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here xcount++;
if(xcount<=lpwm)EnKi=1;
else EnKi=0; if(xcount<=rpwm)EnKa=1; else EnKa=0;
TCNT0=0xFF; // Timer0 Value Menentukan periode pulsa PWM
}
void maju()
{ dirA_Ki=1;dirB_Ki=0; dirC_Ka=1;dirD_Ka=0;
}
void belok_kiri()
{
unsigned int i;
lpwm=50;    rpwm=50;
delay_ms(60);   // dimajukan sedikit dirA_Ki=0;dirB_Ki=1;
dirC_Ka=1;dirD_Ka=0;
for(i=0;i<=1000;i++) while (!SkiXX ||!SkiX) {};
for(i=0;i<=1000;i++) while ( SkiXX || SkiX) {};
lpwm=0; rpwm=0;
}
void belok_kanan()
{
unsigned int i;
lpwm=50;    rpwm=50;
delay_ms(60);   // dimajukan sedikit dirA_Ki=1;dirB_Ki=0;
  
dirC_Ka=0;dirD_Ka=1;
for(i=0;i<=1000;i++) while (!SkaXX ||!SkaX) {};
for(i=0;i<=1000;i++) while ( SkaXX || SkaX) {};
lpwm=0; rpwm=0;
}
// Declare your global variables here
unsigned char sensor;
void scan_rule1()
{   maju(); sensor=PIND; sensor&=0b00111111; switch(sensor)
{   case 0b00111110:    rpwm=0; lpwm=200;   x=1;    break; case 0b00111100: rpwm=50;    lpwm=200;   x=1;    break; case 0b00111101: rpwm=75;    lpwm=200;   x=1;    break; case 0b00111001: rpwm=100;   lpwm=200;   x=1;    break; case 0b00111011: rpwm=150;   lpwm=200;   x=1;    break; case 0b00110011: rpwm=200;   lpwm=200;       break; case 0b00110111: rpwm=200;   lpwm=150;   x=0;    break; case 0b00100111: rpwm=200;   lpwm=100;   x=0;    break; case 0b00101111: rpwm=200;   lpwm=75;    x=0;    break; case 0b00001111: rpwm=200;   lpwm=50;    x=0;    break; case 0b00011111: rpwm=200;   lpwm=0; x=0;    break; case 0b00111111:             break;
if(x)   {lpwm=50;   rpwm=0; break;}
else    {lpwm=0;    rpwm=50;    break;}
}
}
void scan_count(unsigned char count)
{   unsigned int i;
unsigned char xx=0;
  
while(xx<count)
{   for(i=0;i<1000;i++) while((sensor & 0b00011110)!=0b00000000) scan_rule1(); for(i=0;i<1000;i++) while((sensor & 0b00011110)==0b00000000) scan_rule1(); xx++;
}
}
void main(void)
{
// Declare your local variables here
  
// Input/Output Ports initialization
// Port A initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTA=0x00;
DDRA=0x00;
  
// Port B initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTB=0x00;
DDRB=0x00;
  
// Port C initialization
// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out
// State0=0 State1=0 State2=0 State3=0 State4=0 State5=0 State6=0 State7=0
PORTC=0x00; DDRC=0xFF;
  
// Port D initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In
// State0=P State1=P State2=P State3=P State4=P State5=P State6=P State7=P PORTD=0xFF;
DDRD=0x00;
  
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 10,800 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x05; TCNT0=0x00; OCR0=0x00;
  
// Timer/Counter 1 initialization
  
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=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;


Tags : membuat robot, membuat robot sederhana, robot mudah, mempelajari robot.