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.
0 komentar:
Posting Komentar