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; |