PRAKTIKUM III Robot Line Follower Sederhana A. Tujuan 1. Mahasiswa dapat mengkombinasikan antara pengontrolan motor dengan PWM, dengan sensor proximity dengan ADC. 2. Mahasiswa dapat membuat program robot line follower sederhana. 3. Mahasiswa dapat mensimulasikan pada program Proteus, antara pengontrolan motor dengan PWM, dengan sensor proximity dengan ADC. 4. Mahasiswa mampu merangkai robot line follower sederhana. B. Teori Dasar Robot Line Follower adalah robot yang dapat bergerak mengikuti garis secara otomatis tanpa ada remot yang mengaturnya. Prinsip dasarnya, sama seperti manusia, mata digunakan untuk melihat, kaki/roda digunakan untuk berjalan, dan otak digunakan untuk berpikir. 3 Komponen utama pada setiap robot : mata, kaki, dan otak. Pada percobaan sebelumnya kita telah membuat program kontrol motor dengan PWM, lalu pembacaan sensor proximity dengan ADC. Pada praktikum ini, akan dikombinasikan kedua metode tersebut sehingga dapat menghasilkan robot line follower sederhana. C. Peralatan yang Dibutuhkan 1. Alat dan Bahan a. Sistem minimum Atmega 8535 b. Downloader USBAsp c. Sensor proximity (8 buah) d. Modul LCD e. Motor DC (2 buah) f. Driver motor L293D g. Kabel jumper secukupnya h. Kabel USB i. Catu Daya 2. Software a. CodeVision AVR b. Proteus ISIS c. Progisp 1.72
D. Gambar Rangkaian RV2 RV3 RV4 RV5 RV6 RV7 RV8 RV9 LCD1 LM016L 1 2 3 4 5 6 7 8 U1 PB0/T0/XCK PB1/T1 PB2/AIN0/INT2 PB3/AIN1/OC0 PB4/SS PB5/MOSI PB6/MISO PB7/SCK PA0/ADC0 PA1/ADC1 PA2/ADC2 PA3/ADC3 PA4/ADC4 PA5/ADC5 PA6/ADC6 PA7/ADC7 40 39 38 37 36 35 34 33 RV1 1K VSS VDD VEE 1 2 3 RS RW E 4 5 6 D0 D1 D2 D3 D4 D5 D6 D7 7 8 9 10 11 12 13 14 IN1 IN2 IN3 IN4 EN2 EN1 14 15 16 17 18 19 20 21 PD0/RXD PD1/TXD PD2/INT0 PD3/INT1 PD4/OC1B PD5/OC1A PD6/ICP1 PD7/OC2 PC0/SCL PC1/SDA PC2 PC3 PC4 PC5 PC6/TOSC1 PC7/TOSC2 22 23 24 25 26 27 28 29 +5V +12V 13 12 9 XTAL1 XTAL2 RESET ATMEGA8535 AREF AVCC 32 30 IN1 IN2 EN1 2 7 1 IN1 IN2 EN1 16 VSS 8 U2 3 VS OUT1 6 OUT2 +88.8 EN2 IN3 IN4 9 10 15 EN2 IN3 IN4 GND OUT3 GND OUT4 11 14 D8 D7 D6 D5 D4 D3 D2 D1 L293D +88.8 R8 R7 R6 R5 R4 R3 R2 R1 Gambar 3.1 Rangkaian robot line follower sederhana E. Langkah Kerja Adapun langkah kerja pada praktikum ini adalah sebagai berikut: 1. Merangkai peralatan sesuai dengan rangkaian percobaan 2. Menjalankan program Codevision AVR 3. Pilih menu File -> New dan Buat Project baru Gambar 3.2. Window untuk membuat Project baru 4. Pilih tipe chip AVR AT90,Attiny,ATmega,FPSLIC karena mikrokontroler yang akan digunakan adalah ATmega8535.
Gambar 3.3. Window untuk memilih tipe Chip 5. Pada window yang muncul, pilih Tab Chip. Konfigurasi jenis chip yang akan digunakan yaitu ATmega8535, dan Clock 12Mhz. Gambar 3.4. Konfigurasi Chip pada CodevisionAVR 6. Pilih Tab Ports, lalu PORTD. Atur agar Data Direction menjadi output. Begitupun dengan PORTB diatur agar menjadi Output.
Gambar 3.5. Konfigurasi Port pada CodevisionAVR 7. Pilih Tab Timer. Lalu pilih Timer1. Atur seperti pada gambar beikut. Gambar 3.6. Konfigurasi Port pada CodevisionAVR 8. Pilih Tab Alphanumeric LCD, lalu ganti semua kode pada LCD Module AVR menjadi PORTC. Pada bagian Characters/line set menjadi 8. Gambar 3.7. Konfigurasi Port pada CodevisionAVR 9. Pilih Tab ADC, lalu centang ADC Enabled dan use 8 bit. Sesuiakan seperti gambar
Gambar 3.8. Konfigurasi Port pada CodevisionAVR 10. Klik tombol Generate program, save and exit untuk menghasilkan dan menyimpan konfigurasi program. Simpan dengan nama Percobaan 2. Gambar 3.9. Tombol untuk menyimpan project pada window CodeWizardAVR 11. Pada file Percobaan 3.c, ketikkan listing program berikut ini: #include <mega8535.h> #include <delay.h> #include <stdio.h> #include <stdlib.h> #include <alcd.h> #define IN1 PORTD.0 #define IN2 PORTD.1 #define IN3 PORTD.2 #define IN4 PORTD.3 #define EN1 OCR1A #define EN2 OCR1B #asm.equ lcd_port = 0x15; #endasm #define ADC_VREF_TYPE 0x20 unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input (ADC_VREF_TYPE & 0xff); delay_us(10); ADCSRA =0x40; while ((ADCSRA & 0x10)==0); ADCSRA =0x10; return ADCH; int P1,P2,P3,P4,P5,P6,P7,P8; unsigned char lcd[15]; void lcd_sensor(){
lcd_gotoxy(0,0); sprintf(lcd,"%x",p1); lcd_gotoxy(3,0); sprintf(lcd,"%x",p2); lcd_gotoxy(6,0); sprintf(lcd,"%x",p3); lcd_gotoxy(9,0); sprintf(lcd,"%x",p4); lcd_gotoxy(0,1); sprintf(lcd,"%x",p5); lcd_gotoxy(3,1); sprintf(lcd,"%x",p6); lcd_gotoxy(6,1); sprintf(lcd,"%x",p7); lcd_gotoxy(9,1); sprintf(lcd,"%x",p8); if (P1 >= 180){ PORTB.0 = 1; else{ PORTB.0 = 0; if (P2 >= 180){ PORTB.1 = 1; else{ PORTB.1 = 0; if (P3 >= 180){ PORTB.2 = 1; else{ PORTB.2 = 0; if (P4 >= 180){ PORTB.3 = 1; else{ PORTB.3 = 0; if (P5 >= 180){ PORTB.4 = 1; else{ PORTB.4 = 0; if (P6 >= 180){
PORTB.5 = 1; else{ PORTB.5 = 0; if (P7 >= 180){ PORTB.6 = 1; else{ PORTB.6 = 0; if (P8 >= 180){ PORTB.7 = 1; else{ PORTB.7 = 0; void maju(){ IN1 = 1;IN2=0;IN3=1;IN4=0; EN1 = 100; EN2 = 100; void manuver_kanan(){ IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 1; EN1 = 100; EN2 = 100; void manuver_kiri(){ IN1 = 0; IN2 = 1; IN3 = 1; IN4 = 0; EN1 = 100; EN2 = 100; void belok_kanan(){ IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 0; EN1 = 100; EN2 = 100; void belok_kiri(){ IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 0; EN1 = 100; EN2 = 100; void idle(){ IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 0; EN1 = 100; EN2 = 100; void main(void) { DDRB=0xFF; DDRD=0x3F; TCCR1A=0xA1; TCCR1B=0x0D; ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x84; SFIOR&=0xEF; lcd_init(16); while (1) { P1 = read_adc(0);p2 = read_adc(1);p3 = read_adc(2);p4 = read_adc(3); P5 = read_adc(4);p6 = read_adc(5);p7 = read_adc(6);p8 = read_adc(7); lcd_clear(); lcd_sensor(); delay_ms(50); if((portb == 0b00000001) (PORTB == 0b00000011)){ manuver_kanan(); EN1 = 200; EN2 = 200;
{ { { lcd_gotoxy(13,1); lcd_puts("->"); else if((portb == 0b00000100) (PORTB == 0b00000110) (PORTB == 0b00000111)) belok_kanan(); EN1 = 250; EN2 = 200; lcd_gotoxy(13,1); lcd_puts("->>"); else if((portb == 0b00011000) (PORTB == 0b00111000) (PORTB == 0b00011100)) maju(); EN1 = 250; EN2 = 250; lcd_gotoxy(13,1); lcd_puts("^"); else if((portb == 0b00100000) (PORTB == 0b01100000) (PORTB == 0b11100000)) belok_kiri(); EN1 = 200; EN2 = 250; lcd_gotoxy(13,1); lcd_puts("<<-"); else if((portb == 0b10000000) (PORTB == 0b11000000)){ manuver_kiri(); EN1 = 200; EN2 = 200; lcd_gotoxy(13,1); lcd_puts("<-"); else { idle(); EN1 = 0; EN2 = 0; lcd_gotoxy(13,1); lcd_puts("-"); 12. Setelah program selesai. Klik menu Project, lalu pilih Build All. Yang juga secara otomatis akan menghasilkan file hex dari program. File hex dapat ditemukan dalam folder hex
Gambar 3.10. Menu untuk meng-compile program pada CodevisionAVR 13. Untuk simulasi buka program Proteus, lalu rangkai sesuai petunjuk percobaan. Klik kanan pada Atmega8535 lalu pilih Edit Properties. Gambar 3.11. Mengubah properties pada Atmega8535 pada software Proteus 14. Pada bagian Program file ganti menjadi URL yang menunjuk file hex yang dihasilkan Codevision AVR. Klik Ok.
Gambar 3.12. Bagian program file tempat mengisi URL file HEX 15. Pilih menu Debug lalu klik Start/Restart Debugging Gambar 3.13. Memulai simulasi dengan menu Debug -> Start 16. Perhatikan hasil program pada rangkaian Proteus 17. Untuk rilnya, rangkai ATmega8535 dengan LCD, motor DC, Driver motor L293D, dan sensor proximity. 18. Buka program ProgISP. Lalu hubungkan USBASp ke komputer melalui kabel USB. Pada ProgISP, ikon PRG ISP menandakan bahwa USBAsp siap digunakan. Gambar 3.14. Notifikasi bahwa USBAsp siap dipakai 19. Atur value Fusebit menjadi 0xC9EF
Gambar 3.15. Pengaturan Fusebit pada ProgISP 20. Setelah mengatur Fusebit, pilih menu File -> Load Flash. Untuk meload file hex yang dihasilkan dari program CodeVisionAVR. Gambar 3.16. Menu untuk memuat file HEX pada ProgISP 21. Setelah file di load, maka tekan tombol Auto untuk mendownload program ke Sistem minimum. 22. Setelah didownload, hubungkan USBAsp ke Sistem minimum Atmega8535 dengan input tegangan dari catudaya. 23. Amati pergerakan motor yang harus sesuai program yang telah dibuat serta nilai pada LCD jika sensor proximity diarahkan ke keadaan gelap (hitam) maupun terang (putih).
F. Diagram Alir (Flowchart)
G. Hasil Praktikum a. Rangkaian pada Proteus Gambar 3.17. Flowchart program RV2 RV3 RV4 RV5 RV6 RV7 RV8 RV9 LCD1 LM016L 10 10 1 2 3 4 5 6 7 8 U1 PB0/T0/XCK PB1/T1 PB2/AIN0/INT2 PB3/AIN1/OC0 PB4/SS PB5/MOSI PB6/MISO PB7/SCK PA0/ADC0 PA1/ADC1 PA2/ADC2 PA3/ADC3 PA4/ADC4 PA5/ADC5 PA6/ADC6 PA7/ADC7 40 39 38 37 36 35 34 33 RV1 1K VSS VDD VEE 1 2 3 RS RW E 4 5 6 D0 D1 D2 D3 D4 D5 D6 D7 7 8 9 10 11 12 13 14 IN1 IN2 IN3 IN4 EN2 EN1 14 15 16 17 18 19 20 21 PD0/RXD PD1/TXD PD2/INT0 PD3/INT1 PD4/OC1B PD5/OC1A PD6/ICP1 PD7/OC2 PC0/SCL PC1/SDA PC2 PC3 PC4 PC5 PC6/TOSC1 PC7/TOSC2 22 23 24 25 26 27 28 29 +5V +12V 13 12 9 XTAL1 XTAL2 RESET ATMEGA8535 AREF AVCC 32 30 IN1 IN2 EN1 2 7 1 IN1 IN2 EN1 16 VSS 8 U2 3 VS OUT1 6 OUT2 +180 EN2 IN3 IN4 9 10 15 EN2 IN3 IN4 GND OUT3 GND OUT4 11 14 D8 D7 D6 D5 D4 D3 D2 D1 L293D +180 R8 R7 R6 R5 R4 R3 R2 R1 Gambar 3.18. Rangkaian hasil praktikum b. Fisik rangkaian Gambar 3.19. Fisik rangkaian percobaan H. Analisa Percobaan Berdasarkan percobaan yang telah dilakukan, ketika value hasil pembacaan pada PORTB yang mewakili kondisi sensor Proximity, robot dapat mengambil tindakan sesuai dengan instruksi program yang telah diberikan. Tanggapan yang diberikan kurang cepat, hal ini ditimbulkan oleh proses konversi sinyal dari sensor proximity, ke LCD, dan ke driver Motor L293D. I. Kesimpulan Dengan mengkombinasikan antara metode pengontrolan motor DC dengan PWM, dengan metode pembacaan sensor Proximity dengan ADC, maka dapat dibuat sebuah robot line follower sederhana yang memiliki kemampuan untuk mengikuti garis. Pembacaan garis dapat ditingkatkan dengan menggunakan metode PID, yang menghasilkan program robot line follower yang lebih baik dan efisien.