BAB IV HASIL DAN PEMBAHASAN 4.1
Hasil Dari hasil penelitian penulis yang telah lakukan bahwa pembuatan blok
diagram rangkaian robot akan mempermudah dalam identifikasi masalah dan perbaikanya, serta memungkinkan untuk pengembangan pada bagian input maupun pada bagian outputnya. 4.1.1
Desain rangkaian Dalam tahap ini penulis membagi desain bentuk robot menjadi beberapa
bagian yang berguna untuk memudahkan dalam perbaikan juga aplikasi fungsi robot, diantaranya adalah. A.
Desain hardware robot Keterangan : 1. 8x Foto dioda 2. SRF04 3. LM35 4. Fan 5. H-Bridge 6. Minimum sistem 7. 2 buah Switch on/off 8. LCD 9. 2 buah Motor DC 10. 2 buah Roda
2,3 4
1
kompa rator
7
Cancel
5 9
OK
7
8 UP
Down
9
6 10
10
Gambar 4.1. Kerangka robot OPTIMUS
33
Cara operasional robot, dengan cara robot diletakkan diatas jalur hitam dengan warna dasar putih dengan ukuran jalur 2 centimeter, hidupkan saklar 1 (no.7) ke on pada sisi kiri robot untuk menghidupkan rangkaian mikrokontroler yang kemudian robot dalam kondisi stanby, hidupkan pula saklar 2 (no.7) pada sisi kanan robot untuk menghidupkan rangkaian H-bridge atau motor dc. Apabila di tekan tombol OK yang berada di atas sisi kanan depan maka program robot akan berjalan mengikuti jalur, dan apabila di tekan tombol cancel yang berada diatas sisi kiri depan maka LCD akan menmpilkan menu yang memungkinkan dapat merubah program sederhana pada robot dengan bantuan dua switch yang berada di sebelah tombol cancel untuk pilihan turun (down) dan disebelah tombol OK untuk pilihan naik (up). Perlu diperhatikan robot menggunakan catu baterai 7 hingga 12 volt dc, agar baterai lebih hemat maka saat melakukan seting pada menu robot sebaiknya saklar 2 pada sisi kanan robot dimatikan, setelah selesai dari menu seting hidupkan saklar 2 lagi sebelum menekan tombol OK. B.
Desain rangkaian robot Dalam pembuatan robot penulis membagi dalam tiga kelompok yaitu
input, proses dan output sesuai dengan blok diagram berikut: Input
Proses Port C D.7 A.0-7 Mikrokontroler ATMega8535
Foto diode 8x LM35 Keypad SRF04
Komparator
D.3-6
B.3 B.4-7 B.1, 2
B.0
Regulator 7805
Output LCD Motor dc Driver FET IRF540
Motor dc Driver BD139 Relay
ACCU 12V
Gambar 4.2 Diagram blok rangkaian
34
Fan
C.
Penjelasan rangkaian
1.
Sensor foto dioda, SRF04, LM35
Gambar 4.3. Rangkaian sensor foto dioda
Bagian sensor foto dioda, bagian ini terdiri dari foto dioda sebagai sensor cahaya, LED sebagai sumber cahaya untuk sensor foto dioda, cahaya yang dipancarkan mengenai warna hitam yang berarti akan redup, karena warna hitam bersifat menyerap cahaya dan apabila terkena benda warna putih maka cahaya akan dipantulkan yang berarti cahaya sangat kuat dengan adanya dua kondisi tersebut maka akan dikonversi oleh foto dioda dan mikrokontroler menjadi keadaan nilai 0 dan 1. Diperlukannya LED adalah karena dibutuhkannya sumber cahaya yang stabil. Rangkaian ini dilengkapi dengan resistor yang digunakan sebagai pembatas maupun pembagi tegangan untuk pengaman LED serta foto dioda. Bagian Sensor SRF04, sensor memancarkan sinyal ultrasonic dari trigger yang dipicu dari mikrokontroler kemudian dipancarkan dan bila terkena benda sinyal dipantulkan kembali kemudian diterima SRF04 lagi, diolah oleh mikro berapa lama waktu tempuh sinyal tadi yang kemudian dikonversi menjadi jarak.
35
Bagian sensor LM35, sensor ini sensitive terhadap perubahan suhu sehingga mampu mendeteksi suhu kamar, dan mengeluarkan tegangan output 0 hingga 5 volt yang kemudian dikonversi menjadi nilai suhu 0-100 derajar celciun (0C) 2.
Keypad /Switch Terdiri dari empat buah switch yang dikombinasikan menjadi keypad, yang
berfungsi sebagai keypad yang akan digunakan sebagai tombol satu untuk tombol OK (start) menjalankan robot atau menjalankan program, tobol dua sebagai tombol menu (cancel) untuk mengubah program robot secara sederhana yang telah disajikan pada menu utama robot, tombol tiga dan empat sebagai tombol (down, up) sebagai tombol pilihan menggeser ke bawah atau ke atas saat mensetting menu program yang telah di simpan pada IC ATMega8535 pada mikrokontroler. Diantaranya adalah kecepatan motor, setting PID, cek motor, cek sensor, melihat nilai ADC pembacaan sensor foto dioda dan lainya yang tertera pada program menu.
Gambar 4.4 Rangkaian keypad
3.
Minimum system mikrokontroler ATMega8535 Dalam blok ini, penulis membuat desain rangkaian minimum yang terdiri
dari IC ATMega8535 dan beberapa komponen dengan fungsi dan kegunaan:
36
Gambar 4.5. Rangkaian minimum system mikrokontroler
a)
IC ATMega8535 untuk menyimpan program robot,
b)
X-tal 12 M.Hz dan 2 buah kapasitor keramik sebagai pembangkit frekuwensi clock
c)
Resistor, sebagai pengaman LED
d)
LED sebagai indicator catu daya robot
e)
IC 7805, dioda, kapasitor elektrolit sebagi penstabil tegangan 5 volt DC sebagai sumber catu daya microprosesor,
37
f)
Switch digital sebagai tombo reset
g)
2 buah switch untuk on-off
vcc mikrokontroler dan switch H-
bridge sebagai actuator robot, dan dilengkapi dengan socket I/O yang nantinya akan dihubungkan ke bagian yang lain. 4.
LCD Bagian ini terdiri dari LCD 16x2 yang akan digunakan untuk memonitor
program, dan dilengkapi dengan empat (4) buah tombol digital (OK, Cancel, up, Down), serta variable resistor sebagai pengatur pencahayaan latar pada LCD terang atau gelap, karena LCD tidak akan bisa terbaca kalau cahaya backligth-nya terlalu terang atau sebaliknya terlalu redup. Maka harus disesuaikan pencahanyaannya.
Gambar 4.6. Rangkaian LCD
5.
Motor (driver H-brigde) Pada bagian ini terdiri dari rangkaian driver sebagai penguat daya.
Rangkaian ini terdiri dari FET dan transistor sebagai penguat dayanya agar dapat memutar motor dengan daya besar namun menghemat baterai atau arus baterai tidak cepat habis dan tetap bisa menggunakan baterai dibawah 12 volt DC dengan kecepatan tinggi.
38
Gambar 4.7. Rangkaian H-Bridge
Rangkaian H-bridge berfungsi untuk driver motor dc yang terdiri dari dua buah motor dc, gear, dan roda untuk menjalankan robot sebagai mesin penggeraknya.
Gambar 4.8. Motor DC penggerak robot 39
4.1.2
Pemrograman Setelah penulis buat rangka fisik robot maka langkah yang selanjutnya
adalah pembuatan program. Dalam pemrograman merupakan bagian inti dari pembuatan tugas akhir ini, yang akan penulis bahas tahap demi tahap A.
Langkah-langkah pemrograman Perangkat lunak yang digunakan pada tugas akhir ini ditulis pada teks
editor dalam bahasa C dan software yang digunakan adalah Code Vision Avr. setelah program selesai dibuat, kemuadian program disimpan dengan nama file yang berekstensi *.c. Selanjutnya program yang telah selesai dibuat tadi dilakukan kompilasi dari *.c ke dalam kode-kode instruksi mesin yang sesuai dengan upcode mikrokontroler Intel dengan ekstensi *.hex, yang kemudian di flash ke chip mikrokontroler. Dalam pembuataan tugas akhir ini pemrograman merupakan salah satu langkah yang sangat penting sebab bekerja atau tidaknya robot bergantung dari bagaimana memrogram robot, tanpa program robot tidak akan berfungsi sesuai yang direncanakan. Langkah-langkah pembuatan program tersebut yang penulis sajikan adalah sebagai berikut : 1.
Pembuatan diagram alir Dalam menyusun diagram alir diusahakan dapat membagi proses yang
kompleks menjadi sub program yang lebih kecil, sehingga pencarian kesalahan akan lebih mudah. Selain itu akan memudahkan orang lain dalam membaca alir program yang dibuat.
40
Start / ON Tidak Tidak
Sw OK = 0
YA SW Cancel = 0
Menu Utama
YA
Start Timer
Sensor garis Tidak PID OK
YA
Sensor jarak YA
Jarak < 10 cm
Motor berhenti
Tidak
Sensor Suhu Motor jalan
Suhu >400 C
Tidak
FAN mati
Tidak
FAN mati
YA
Sensor cahaya Kondisi 1 YA
FAN hidup Finish
Gambar 4.9. Diagram alir robot pemadam api dan pencari jejak 2.
Pembuatan program Penulisan program dilaksanakan setelah diagram alir selesai dirancang.
Pemilihan editor teks disesuaikan dengan kebiasaan dan kesenangan. Agar teks
41
yang telah dibuat nantinya dapat dimengerti oleh program AVR prog maka hasil penulisan program harus dibuat dengan ekstension *.c dan dirubah menjadi bahasa mesin dengan ekstensi *.hex. 3.
Kompilasi program Program yang ditulis menggunakan editor teks kemudian dikompilasi
dengan menggunakan program Code vision AVR. Bila tidak ada peringatan error atau kesalahan, proses kompilasi telah berhasil. Bila ada pesan kesalahan, dapat dicari kesalahan yang terjadi berdasarkan informasi pesan kesalahan tersebut. 4.
Pengisian program Perlengkapan yang dibutuhkan dalam pengisian flash ATMega8535,
diantaranya : a)
Catu Daya
b)
Kabel isp kanda STK 500 using paralel progaming
c)
PC dengan Sistem Operasi MS Windows 9X/me/NT/2000/XP/7/8
d)
Perangkat lunak pemrograman ( Code Vision AVR )
e)
Pengisian
program
yang
telah
dikompilasi
dalam
format
heksadesimal (hex), diisikan ke dalam Flash EPROM ATMega8535 dengan menjalankan perangkat lunak pemrograman. Sedangkan urutan cara pengisian program ke dalam Flash EPROM ATMega8535 adalah sebagai berikut : a)
Pastikan kabel telah terhubung antara PC dengan rangkaian programmer ATMega8535 telah terpasang.
b)
IC ATMega8535 telah terpasang pada soket yang telah ditentukan pada rangkaian yang siap untuk pengisi Flash EPROM Programmer ATMega8535.
c)
Berikan catu tegangan DC 5 V ke rangkaian pengisi Flash EPROM Programmer ATMega8535, yang di catu oleh komputer atau dengan catu tersendiri.
d)
Jalankan perangkat lunak pemrograman Code Vision AVR
e)
Pastikan
settingan
komunikasi
42
portnya
telah
sesuai
(jika
menggunakan paralel port, program AVR prog telah terinstal dan bila menggunakan serial port tentukan antara com 1-6 dan pastikan sama com port nya antara settingan komputer dan code vision AVR) f)
Code program yang telah dibuat di kompilasi kemudian di isi atau flash ke chip mikrokontroler ATMega8535.
g)
Cabut kabel komunikasinya dan pasang baterai robot untuk menjalankan robot hasil pemrograman.
B.
Code Vision AVR Setiap akan membuat program baru pada Code Vision AVR, kita akan
diarahkan untuk membuat project terlebih dahulu. Pada menu File pilih New lalu klik ceklist Project dan klik OK.
Gambar 4.10. Tipe project
Maka akan tampilah jendela konfirmasi setelah dipilih ok, dan apabila kita memilih source maka akan ditampilkan arah untuk membuka program yang sudah pernah dibuat. Code Vision AVR akan menanyakan apakah anda akan menggunakan fasilitas Code Wizard AVR ataukah tidak untuk suatu program baru dan memudahkan nantinya dalam pembuatan program maupun saat program setelah jadi dan akan digunakan agar tidak terjadi kekeliruan. Fasilitas ini sangatlah berguna jika anda tidak ingin bersusah payah melakukan settingan dengan mengetik code-code tertentu yang banyak dan 43
kompleks. Intinya terdapat tab-tab yang tinggal klik dan anda akan langsung disajikan contoh kodenya. Contohnya jika pembaca ingin membuat program yang memakai eksternal interrupt maka tinggal pilih tab External IRQ, pada tampilan Code Wizard. Klik pada INT 0 Enabled untuk memilih external interrupt 0 dan pilih mode pembangkitan interrupt yang ingin digunakan. Mode pembangkitan eksternal interrupt terdiri dari rising edge atau falling edge atau any change. Untuk melihat code yang akan dihasilkan klik pada menu File dan pilih Program Preview.
Gambar 4.11 Jendela konfirmasi code wizard
Gambar 4.12.Seting pada tab chip
44
Gambar 4.13 Seting pada tab timers
Pada tab chip pilih ATMega8535 dan clock sesuai dengan clock yang terpasang 12 MHz atau 16 MHz, dan pada gambar 4.13. atau tab timers pilih timer1 Clock source pilih System Clock, kemudian pada Clock Value pilih 187.500 kHz, pilihan pada mode adalah Fast PWM top=00FFh, sedangkan pada output baik out A maupun Out B pilih Inverted. Kemudian yang berikutnya adalah tab LCD, pada LCD Port pilih PORTC sebagai tampilan LCD sesuai dengan gambar 4.14, dan pada Chars/Line pilih 16 karena menggunakan LCD 2x16. setelah port LCD dipilih maka akan langsung ditampilkan pin-pin LCD yang akan digunakan atau terhubung dengan port pada mikrokontroler seperti pada gambar 4.15
45
Gambar 4.14. Seting pada tab LCD
Gambar 4.15 Port yang dipakai LCD
Gambar 4.16. Seting pada tab ADC
46
Setingan pada tab ADC adalah seperti pada gambar 4.16. ADC enable di ceklis dan bila menggunakan 8 bit maka use 8 bit diceklis, pada volt ref pilih AVCC pin, clock pilih 750.000 kHz. Kemudian jika menggunakan analog comparator pada tab Analog Comparator di enabled. Terlihat pada gambar 4.17
Gambar 4.17. Seting pada tab analog comparator
Setelah semua telah dilakukan seting sesuai yang diinginkan klik File < Generate, Save and Exit seperti gambar 4.18
Gambar 4.18. Generate program
47
Kemudian lakukan penyimpanan seperti biasa sebanyak tiga kali dengan nama file sama namun berbeda extensi. Ketik nama project yang akan dibuat dan klik save.
Gambar 4.19. Menyimpan file code
Gambar 4.20. Tampilan penulisan code vision AVR 48
File code yang memiliki ekstensi *.c yang akan dibuat nantinya disave pada suatu tempat dan di masukkan ke dalam project dengan mengklik Add pada tab File seperti diatas. Pada tab C Compiler akan ditemukan tab lagi didalamnya. Tab yang sering digunakan ialah tab Code Generation. Proses coding menggunakan bahasa C belum dapat dimulai setelah mengkonfigurasi project yang dibuat. Setelah selesai membuat code simpan file seperti pada gambar 4.21.
Gambar 4.21. Menyimpan code program Untuk memasukkan file *.c yang telah disave ke dalam project klik menu Project dan pilih Configure.
Gambar 4.22. Menu bar project
49
Kita akan dihadapkan kembali pada windows seperti pada Configure Project diatas. Klik tab after make dan ceklist Program the chip, kemudian OK. Yang kemudian klik compile dan perhatikan pastikan tidak ada yang error, seperti tampilan pada gambar 4.26. Namun jika terjadi error untuk mengetahui letak kesalahan pada code, tinggal klik pada tab navigator bagian Errors atau dapat mengklik pada tab Messages untuk mengetahui letak kesalahan pada code. Pada contoh berikut dapat dilihat sintaks #include <mega8535.h akan diblok dengan warna biru yang menunjukkan kesalahan terletak pada sintaks tersebut.
4.23. Hasil kompilasi program
Gambar 4.24. Merubah program .hex
50
Setelah klik make maka ikuti prosesnya selain melakukan compiling akan mengenerate beberapa file termasuk *.hex yang akan diburn ke mikrokontroler dan file *.coff yang dapat disimulasikan pada AVR studio.
Gambar 4.25 Memasukkan program kedalam chip IC
Gambar 4.26. Ketidaksesuaian port
51
Setelah proses compiling berhasil maka akan muncul proses pengisian ke mikrokontroler, dan apabila gagal seperti pada gambar 4.26 berarti komunikasi port nya tidak sesuai, maka sesuaikan dan ulangi untuk memasukkan lagi. 4.2
Pembahasan dan Pengujian Robot Setelah program dibuat dan di generate ke mikrokontroler maka tinggal
mencoba pada robot, apakah code program yang dibuat bekerja sesuai yang kita harapkan atau tidak, agar perbaikan dan penulisan ulang program dapat mudah dilakukan dengan cara pengujian satu persatu. A.
Pengujian I (LCD) Salah satu bagian penting dari robot ini adalah LCD, dengan keguanaan
untuk menampilkan progress kerja dari robot, agar LCD dapat berfungsi adalah cara pemrogramanya sebagi berikut: 1.
Bukalah aplikasi Code Vision AVR
2.
Pilih tab File > New
3.
Maka akan muncul tampilan pilihan tipe file, dan pilih project > OK
4.
Maka akan tampil pilihan apakah akan menggunakan fasilitas Codewizard maka klik Yes, karena dengan fasilitas ini akan memudahkan cara seting port-port mikrokontroler.
5.
Maka akan ditampilkanya jendela Codewizard AVR yang kemudian diseting sesuai dengan kebutuhan yang telah direncanakan fungsi dari masing-masing kaki IC ATMega8535 pilih chip dengan ATMega8535 dan clock 12.000.000
6.
Tab Port seting PortD.7 sebagai output (untuk menghidupkan lampu latar)
7.
LCD gunakanlah pada Port C
8.
Ketikkan header sebagai berikut:
#include <mega8535.h> //menggunakan IC ATMega8535 #include <delay.h> 9.
// nanti saat pembuatan program menggunakan delay
Ketikkan juga definisi untuk memudahkan
// Display #define led
PORTD.7
52
#define on
1
#define off
0
// menghidupkan lampu latar lcd
// menghidupkan lcd menggunakan bahasa asembler #asm .equ __lcd_port=0x15 ;PORTC #endasm #include
// Display #define led
PORTD.7
#define on
1
#define off
0
// LCD module initialization lcd_init(16); led=on; stop(); delay_ms(10); lcd_gotoxy(0,0); lcd_putsf("BISMILLAH......."); delay_ms(200); lcd_clear(); lcd_gotoxy(3,0); lcd_putsf("**TEKAN OK**");
B.
Pengujian 2 (sensor jalur atau garis) Pada pengujian sensor garis karena menggunakan sensor foto dioda dan
menggunakan delapan sensor dengan proses masukan berdasarkan cahaya yang masuk maka dipastikan led sebagai sumber cahaya mandiri dengan menutup semua sisi-sisinya agar cahaya dari luar baik matahari ataupun cahaya penerangan tidak mengganggu. Bekerja dengan pantulan dari jalur yang ada apabila mengenai warna hitam maka cahaya yang masuk ke sensor kecil dan apabila mengenai warna putih 53
maka akan dipantulkan cahaya tersebut sangat kuat. Dari perbedaan tersebut maka di umpankan ke mikrokontroler dengan nilai digital 0 dan 1. 1.
Bukalah aplikasi Code Vision AVR
2.
Pilih tab File > New
3.
Maka akan muncul tampilan pilihan tipe file, dan pilih project > OK
4.
Maka akan tampil pilihan apakah akan menggunakan fasilitas Codewizard maka klik Yes, karena dengan fasilitas ini akan memudahkan cara seting port-port mikrokontroler.
5.
Maka akan ditampilkanya jendela Codewizard AVR yang kemudian diseting sesuai dengan kebutuhan yang telah direncanakan fungsi dari masing-masing kaki IC ATMega8535 pilih chip dengan ATMega8535 dan clock 12.000.000
6.
Tab Port seting port A sebagai input, Port B sebagai input tetapi PortB.2 dan PortB.3 sebagai output, PortD.7 sebagai output
7.
LCD gunakanlah pada Port C
8.
ADC enable dan Volt Ref pilih AVCC pin
9.
Ketikkan header sebagai berikut:
#include <mega8535.h> #include <delay.h> 10.
Ketikkan juga definisi untuk memudahkan Berikut code program untuk mencoba ke delapan sensor yang berada pada
portA yang juga sebagai port ADC: #asm .equ __lcd_port=0x15 ;PORTC #endasm #include ///////////////////////////////////////////Ini siali sasi port////////////////////////////// // Display #define led
PORTD.7
#define on
1
#define off
0
#define ADC_VREF_TYPE 0x60
54
// Read the 8 most significant bits unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCH; } // eeprom & inisialisasi awal, ketulis lg saat ngisi chip eeprom unsigned char back[10]; unsigned char x,sendat; unsigned char buff[33],buff1[33]; unsigned char sensor[10],s[10]; unsigned char Msg1[16]; unsigned char Msg2[16]; char lcd_buffer[33]; ///////////////////////////////////////Progam untuk menampilkan nilai void view(unsigned char dat) { unsigned char data; data = dat / 100; data+=0x30; lcd_putchar(data); dat%=100; data = dat / 10; data+=0x30; lcd_putchar(data); dat%=10; data = dat + 0x30; 55
lcd_putchar(data); } ///////////////////////////////////////////Pemrintah pembacaan ADC void baca() { s[0]=read_adc(0); s[1]=read_adc(1); s[2]=read_adc(2); s[3]=read_adc(3); s[4]=read_adc(4); s[5]=read_adc(5); s[6]=read_adc(6); s[7]=read_adc(7); } //////////////////////Perintah pengambilan data ADC/////////////////////// void cekback() { lcd_clear(); for (x=0;x<=7;x++) { lcd_gotoxy(0,0); sprintf(buff,"%d",x); lcd_puts(buff); back[x]=read_adc(x); lcd_gotoxy(5,1); sprintf(buff1,"%d",back[x]); lcd_puts(buff1); led=on; delay_ms(100); led=off; delay_ms(100); lcd_clear(); } } 56
//////////////////// Perintah pembacaan sensor//////////////////////// void hitsen() { for(x=0;x<=7;x++) { s[x]=read_adc(x); {sensor[x]=0;}
if (s[x]>(back[x])+20){sensor[x]=1;}
else
} sendat=(sensor[0]*1)+(sensor[1]*2)+(sensor[2]*4)+(sensor[3]*8)+(sensor[4]*16) +(sensor[5]*32)+(sensor[6]*64)+(sensor [7]*128); } ////////////////////// perintah tampilan hasil pembacaan sensor//////////////////////// void displaySensorBit() { baca(); lcd_gotoxy(4,1); if (s[0]>(back[7])+30) lcd_putchar(0xff); else
lcd_putchar('_');
if (s[1]>(back[6])+30) lcd_putchar(0xff); else
lcd_putchar('_');
if (s[2]>(back[5])+30) lcd_putchar(0xff); else
lcd_putchar('_');
if (s[3]>(back[4])+30) lcd_putchar(0xff); else
lcd_putchar('_');
if (s[4]>(back[3])+30) lcd_putchar(0xff); else
lcd_putchar('_');
if (s[5]>(back[2])+30) lcd_putchar(0xff); else
lcd_putchar('_');
if (s[6]>(back[1])+30) lcd_putchar(0xff); else
lcd_putchar('_');
if (s[7]>(back[0])+30) lcd_putchar(0xff); else
lcd_putchar('_');
}
57
signed char error, error1; int var_Kp, var_Kd, nil_kan, nil_kir,ts; int maxpwm, minpwm; //////////////////////Progam kontrol PID////////////////////////// void kond_sensor() { hitsen();
//menghitung data sensor dr rutin diatas sudah dibahas
switch(sendat) { case 0b10000000: error=48; break;
//kondisi sensor pada garis
case 0b11100000: error=35; break; case 0b11000000: error=35; break; case 0b01000000: error=24; break; case 0b01110000: error=15; break; case 0b01100000: error=15; break; case 0b00100000: error=8; break; case 0b00111000: error=3; break;
// kondisi eror eror pada sensor
case 0b00110000: error=3; break; case 0b00010000: error=1; break; case 0b00011000: error=0; break; case 0b00001000: error=-1; break; case 0b00001100: error=-3; break; case 0b00000100: error=-8; break; case 0b00001110: error=-15; break; case 0b00000110: error=-15; break; case 0b00000010: error=-24; break; case 0b00000111: error=-35; break; case 0b00000011: error=-35; break; case 0b00000001: error=-48; break; case 0b00000000: if (error>24) { error=48; // bkan(); 58
delay_ms(20); } //program diatas apabila terjadi garis tak terbaca dan terakhir kondisi terbaca 24 sampai 48 maka harus belok kanan else if (error<-24) { error=-48; // bkir(); delay_ms(20); } //program diatas apabila terjadi garis tak terbaca dan terakhir kondisi terbaca -24 sampai -48 maka harus belok kiri else { error=0; //maju(); }
// namun jika kondisi terakhir ditengah atau error 0 maka lurus
}; } // Declare your global variables here void main(void) { PORTA=0x00; DDRA=0x00; PORTB=0xF0; DDRB=0x04; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0xFF; TCCR0=0x00; TCNT0=0x00; OCR0=0x00; TCCR1A=0xF1; TCCR1B=0x0B; TCNT1H=0x00;
59
TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; MCUCR=0x00; MCUCSR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; ACSR=0x80; SFIOR=0x00; ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x84; SFIOR&=0xEF; // LCD module initialization lcd_init(16); led=on; while (1) { displaySensorBit(); }; } Maka jika code diatas di masukkan kedalam chip ATMega8535 maka akan menampilkan delapan buah baris sebagai indikasi dari kedelapan sensor garis, apabila salah satu atau semua sensor tersebut menghadap garis putih maka tanda garis di LCD akan hilang dan bila terkena atau diarahkan ke warna hitam maka akan muncul garis, garis-garis tersebut adalah nilai 1 apabila terkena warna hitam dan nilai 0 saat terkena warna putih. 60
C.
Pengujian 3 (sensor jarak / ultrasonic) Pada pengujian ini penulis menggunakan sensor SRF04, yang dipasang
pada bagian depan robot sebagai alat navigasi robot yang akan memberitahukan bahwa didepan ada benda, sensor ini dapat mendeteksi jarak antara 3 cm sampai 400 cm, dan berikut cara membuat code program sensor ultrasonic sebagai sensor jarak: 1.
Bukalah aplikasi Codevision AVR
2.
Pilih tab File > New
3.
Maka akan muncul tampilan pilihan tipe file, dan pilih project > OK
4.
Maka akan tampil pilihan apakah akan menggunakan fasilitas Codewizard maka klik Yes, karena dengan fasilitas ini akan memudahkan cara seting port-port mikrokontroler.
5.
Maka akan ditampilkanya jendela Codewizard AVR yang kemudian diseting sesuai dengan kebutuhan yang telah direncanakan fungsi dari masing-masing kaki IC ATMega8535 pilih chip dengan ATMega8535 dan clock 12.000.000
6.
Tab Port seting Port B sebagai input tetapi PortB.2 sebagai output, PortD.7 sebagai output
7.
LCD gunakanlah pada Port C
8.
Ketikkan header sebagai berikut:
#include <mega8535.h> #include <delay.h> #include <stdio.h> 9.
Ketikkan juga definisi untuk memudahkan
#define ECHO PINB.1 //kabel merah penerima pantulan #define TRIGGER PORTB.2 //kabel hijau pemancar ultrasonik // Display #define led #define on #define off
PORTD.7 1 0
unsigned char jarak; unsigned int baca_jarak() {
61
jarak=0; TRIGGER=0; delay_us(10); TRIGGER=1; delay_us(20); TRIGGER=0; while (ECHO==0); while (ECHO==1){jarak++; delay_us(710);} delay_ms(40); return jarak; } // Declare your global variables here void main(void) { // Port A initialization dari sini sampai SFIOR=0x00 otomatis muncul sesuai saat menseting code wizard PORTA=0x00; DDRA=0x00; // Port B initialization PORTB=0x01; DDRB=0x01; // Port C initialization PORTC=0x00; DDRC=0x00; // Port D initialization PORTD=0x00; DDRD=0x00; // Timer/Counter 0 initialization TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization TCCR1A=0x00; TCCR1B=0x00;
62
TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization MCUCR=0x00; MCUCSR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // Analog Comparator initialization ACSR=0x80; SFIOR=0x00; // LCD module initialization lcd_init(16); led=on; lcd_clear(); while (1) { // Place your code here if (baca_jarak()<=1){lcd_gotoxy(0,0);lcd_putsf("jaraknya kira2 10 cm");} else if (baca_jarak()<=2){lcd_gotoxy(0,0);lcd_putsf("jaraknya kira2x 20 cm");} else if (baca_jarak()<=3){lcd_gotoxy(0,0);lcd_putsf("jaraknya kira2x 30 cm");} else if (baca_jarak()<=4){lcd_gotoxy(0,0);lcd_putsf("jaraknya kira2x 40 cm");} 63
else {lcd_gotoxy(0,0);lcd_putsf("lebih jauh dari 40 cm");} }; } Nilai 710 dapat diganti disesuaikan dengan jarak sebenarnya dengan cara meletakkan benda dari 10 cm kemudian mundur 20 cm pastikan pas dengan perubahan pada nilai LCD yang muncul jika belum maka dapat ditambah atau dikurangi nilai 710 tersebut hingga menemukan formula yang tepat. Penulis hanya membuat satuan lima macam ukuran kurang dari 10 cm, kurang dari 20 cm, kurang dari 30 cm, kurang dari 40 cm dan lebih jauh dari 40 cm, namun itu bisa dirubah parameternya maupun kelompoknya setiap 5 cm atau 25 cm sesuai keinginan, cuma di rubah angka 710 tersebut. Dengan asumsi 1 cm menggunakan delay atau waktu 710 us. D.
Pengujian 4 (sensor suhu) Pada pengujian sensor suhu penulis menggunakan IC LM35 sebagai
sensor suhunya dan menggunakan rangkaian kumparator sebagai penguat tegangan output IC 1.
Bukalah aplikasi Codevision AVR
2.
Pilih tab File > New
3.
Maka akan muncul tampilan pilihan tipe file, dan pilih project > OK
4.
Maka akan tampil pilihan apakah akan menggunakan fasilitas Codewizard maka klik Yes, karena dengan fasilitas ini akan memudahkan cara seting port-port mikrokontroler.
5.
Maka akan ditampilkanya jendela Codewizard AVR yang kemudian diseting sesuai dengan kebutuhan yang telah direncanakan fungsi dari masing-masing kaki IC ATMega8535 pilih chip dengan ATMega8535 dan clock 12.000.000
6.
Tab Port seting port A sebagai input, Port B sebagai input tetapi PortB.2 dan PortB.3 sebagai output, PortD.7 sebagai output
7.
LCD gunakanlah pada Port C
8.
ADC enable dan Volt Ref pilih AVCC pin
9.
Ketikkan header sebagai berikut:
64
#include <mega8535.h> #include <delay.h> #include <stdlib.h> #include 10.
Ketikkan juga definisi untuk memudahkan
// Display #define led #define on #define off
PORTD.7 1 0
// Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm #include int SUHU; char temp[8]; float suhu_celcius; #define ADC_VREF_TYPE 0x40 // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } void main(void) { // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC Clock frequency: 750.000 kHz // ADC Voltage Reference: AVCC pin // ADC Auto Trigger Source: None ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x84; // LCD module initialization 65
lcd_init(16); lcd_clear(); lcd_gotoxy(0,0); lcd_putsf(“MUHAMMAD ABDUROHMAN”); // tampilan lcd lcd_gotoxy(0,1); lcd_putsf(“SENSOR SUHU LM35”); // tampilan lcd delay_ms(1000); while (1) { lcd_clear( ); SUHU = read_adc(0); suhu_celcius = (float)SUHU*500/1023; //rumus untuk mengubah kedalam derajat celcius lcd_gotoxy(0,0); lcd_putsf(“MUHAMMAD ABDUROHMAN”); ftoa(suhu_celcius,1,temp); //float to array, mengubah tipe data float ke tipe data array yg akan ditampilkan di LCD lcd_gotoxy(0,1); lcd_puts(temp); lcd_gotoxy(5,1); lcd_putchar(0xdf);//menampilkan karakter derajat lcd_putsf(“C”); delay_ms(500); }; } E.
Pengujian 5 (motor dc) Dalam pengujian ini penulismenggunakan 2 buah motor dc dengan
penguat daya menggunakan komponen FET dengan seting PWM Pengaturan kecepatan dengan H-Bridge Kecepatan motor dapat dilakukan dengan penambahan komponen pada rangkaian H-Bridge dengan memberi komponen common FET sehingga dapat menghasilkan daya yang besar meskipun hanya dengan catu sumber 12 volt. Pada rangkaian ini sebagai kunci utama kecepatan motor dengan pengaturan kecepatan motor menggunakan system PWM yang telah dibahas pada BAB. III. Motor DC sebagai actuator robot sehingga robot bisa bergerak maju, mundur, belok kanan, atau belok kiri. Dalam penulisan codenya adalah sebagai berikut: 1.
Bukalah aplikasi Codevision AVR
2.
Pilih tab File > New 66
3.
Maka akan muncul tampilan pilihan tipe file, dan pilih project > OK
4.
Maka akan tampil pilihan apakah akan menggunakan fasilitas Codewizard maka klik Yes, karena dengan fasilitas ini akan memudahkan cara seting port-port mikrokontroler.
5.
Maka akan ditampilkanya jendela Codewizard AVR yang kemudian diseting sesuai dengan kebutuhan yang telah direncanakan fungsi dari masing-masing kaki IC ATMega8535 pilih chip dengan ATMega8535 dan clock 12.000.000
6.
Tab Port seting port A sebagai input, Port B sebagai input tetapi PortB.2 dan PortB.3 sebagai output, PortD.7 sebagai output
7.
LCD gunakanlah pada Port C
8.
ADC enable dan Volt Ref pilih AVCC pin
9.
Ketikkan header sebagai berikut:
#include <mega8535.h> #include <delay.h> 10.
Ketikkan juga definisi untuk memudahkan
#include <mega8535.h> #include <delay.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm #include // Motor #define moka PORTD.3 #define rpwm
OCR1A
#define lpwm
OCR1B
#define moki PORTD.6 ////////////////perintah motor/////////////////////// void maju() { moki=0; moka=0; } void mundur() { moki=1; moka=1; } 67
void bkan() { moki=0; moka=1; } void bkir() { moki=1; moka=0; } void stop() { moki=0; moka=0; lpwm=0; rpwm=0; } F.
Pengujian 6 (FAN) Dengan hanya menambahkah definisi fan untuk memudahkan penulisanya
yang berarti cukup PORTB.3 sebagai output fan sudah dapat hidup saat PORTB.3 di beri nilai 1, nilai 1 ini bisa didapatkan dari masukan sensor cahaya lilin atau api, maka sensor saat bernilai tinggi maka akan akan menhidupkan fan yang terlebih dahulu di beri transistor 2SC828 dan BD139 untuk menggerakkan relay. Berikut penambahan program fan: // Fan #define fan PORTB.3 #define on 1 #define off 0 G.
Pengujian menyeluruh Robot yang telah jadi lengkap dengan sensor jalur, jarak dan suhu di
program agar dapat bekerja komponen tersebut dengan tujuan robot dapat mematikan api yang di letakkan pada ujung perjalanan robot. Agar robot dapat berjalan dengan sempurna maka perlu penambahan program seperti kontrol PID, dan menu sederhana untuk memudahkan perubahan program pada robot dengan cepat, 1.
Kontrol PID Tunning kontrol PID ini bertujuan untuk menentukan paramater aksi
kontrol Proportional, Integratif, Derivatif pada robot pelacak garis. Proses ini dapat dilakukan dengan cara trial and error . Keunggulan cara ini kita gak perlu mengidentifikasi plant, membuat model matematis plant, menentukan parameter plant dengan grafis ataupun analitis cukup dengan cara coba-coba memberikan 68
konstanta P-I-D pada formula PID hingga di peroleh hasil yang di inginkan, dengan mengacu pada karakteristik masing-masing kontrol P-I-D. Kalau menggunakan kendali PID artinya nantinya bertujuan mengolah suatu sinyal kesalahan atau error, nilai error tersebut diolah dengan formula PID untuk dijadikan suatu sinyal kendali atau sinyal kontrol yang akan diteruskan ke aktuator. Gampangnya perhatikan saja blok diagram umpan balik loop tertutup pada perancangan kedali PID pada robot pelacak garis berikut ini:
Gambar 4.27. Diagram blok PID a)
SP = Set point, secara simple maksudnya ialah suatu prameter nilai acuan atau nilai yang kita inginkan.
b)
PV = Present Value, kalo yang ini maksudnya ialah nilai bobot pembacaan sensor saat itu atau variabel terukur yang di umpan balikan oleh sensor (sinyal feedback dari sensor).
c)
Error = nilai kesalahan, pengertiannya ialah Deviasi atau simpangan antar variabel terukur atau bobot sensor (PV) dengan nilai acuan (SP) Dengan kesimpulan Error = SP – PV1
Proses pemberian bobot sensor dapat dilakukan dengan proses pemetaan (mapping) pembacaan sensor terhadap garis. Kondisi ideal robot terjadi saat kondisi robot pada PV= 0 (misal kondisi nilai sensor = 11100111, nilai 0 merepresentasikan sensor mengenai garis). Atau SP = 0 ialah kondisi ideal dari robot pelacak garis. Jika PV tidak sama dengan 0 berarti robot tidak berada pada kondisi ideal dan artinya ada sinyal kesalahan (error). Pada kondisi error inilah
1
http://fahmizaleeits.wordpress.com
69
formula PID akan menentukan hasil sinyal kendalinya. berikut ini penjelasan tentang penerapan PID pada robot pelacak garis, 2.
Menu utama Selain program yang telah di bahas sebelumnya perlu dimasukkan juga
program menu utama ini sebagai program sederhana yang dapat di rubah langsung pada robot dengan menggunakan fasilitas keypad atau empat tombol OK, Cancel, Up dan Down. Penulisanya sebagai berikut: setting: led=on; lcd_clear(); while(1) { satu: stop(); led=on; delay_ms(200); lcd_gotoxy(0,0);lcd_putchar(0b01111110); lcd_gotoxy(2,0);lcd_putsf("A: set_speed "); lcd_gotoxy(0,1);lcd_putsf(" B: ambl_data "); while(down){if(!up){while(up==0){up=1;}goto
tujuh;}
if(!ok){while(ok==0){ok=1;}goto set_speed;};} while(down==0){down=1;} dua: stop(); led=on; delay_ms(200); lcd_gotoxy(0,0);lcd_putsf(" A: set_speed "); lcd_gotoxy(0,1);lcd_putchar(0b01111110); lcd_gotoxy(2,1);lcd_putsf("B: ambl_data "); while(down){if(!up){goto
satu;}
ambil_data;};}
70
if(!ok){while(ok==0){ok=1;}goto
while(down==0){down=1;} tiga: stop(); led=on; delay_ms(200); lcd_gotoxy(0,0);lcd_putchar(0b01111110); lcd_gotoxy(2,0);lcd_putsf("C: cek_sensor "); lcd_gotoxy(0,1);lcd_putsf(" D: lihat_ADC "); while(down){if(!up){goto dua;} if(!ok){while (ok==0){ok=1;};goto lihat;};} while(down==0){down=1;} empat: stop(); led=on; delay_ms(200); lcd_gotoxy(0,0);lcd_putsf(" C: cek_sensor "); lcd_gotoxy(0,1);lcd_putchar(0b01111110); lcd_gotoxy(2,1);lcd_putsf("D: lihat_ADC "); while(down){if(!up){goto
tiga;}
if(!ok){while(ok==0){ok=1;};
goto
data_adc;};} while(down==0){down=1;} lima: stop(); led=on; delay_ms(200); lcd_gotoxy(0,0);lcd_putchar(0b01111110); lcd_gotoxy(2,0);lcd_putsf("E: SET_PID
");
lcd_gotoxy(0,1);lcd_putsf(" F: Cek_Motor "); while(down){if(!up){goto empat;} if(!ok){while (ok==0){ok=1;}; set_PID;};} while(down==0){down=1;} enam: stop();
71
goto
led=on; delay_ms(200); lcd_gotoxy(0,0);lcd_putsf(" E: SET_PID
");
lcd_gotoxy(0,1);lcd_putchar(0b01111110); lcd_gotoxy(2,1);lcd_putsf("F: Cek_Motor "); while(down){if(!up){goto lima;} if(!ok){while (ok==0){ok=1;}; goto cek;;};} while(down==0){down=1;} tujuh: stop(); lcd_clear(); led=on; delay_ms(200); lcd_gotoxy(0,0);lcd_putchar(0b01111110); lcd_gotoxy(2,0);lcd_putsf("H: start
");
while(down){if(!up){goto
if(!ok){while
enam;}
jalan;};} while(down==0){down=1;} } ///////////////////Pengaturan kecepatan///////////////////////// set_speed: led=on; lcd_clear(); delay_ms(200); lcd_gotoxy(0,0); lcd_putsf(" MAX MIN TS "); lcd_gotoxy(1,0);lcd_putchar(0b01111110); while(1) { if(!up){MAXSpeed++;delay_ms(100);} if(!down){MAXSpeed--;delay_ms(100);} if(!ok){goto speed_min;} lcd_gotoxy(2,1);
72
(ok==0){ok=1;};
goto
view(MAXSpeed); lcd_gotoxy(7,1); view(MINSpeed); lcd_gotoxy(12,1); view(Topspeed); } speed_min: lcd_clear(); delay_ms(200); lcd_gotoxy(0,0); lcd_putsf(" MAX MIN TS "); lcd_gotoxy(6,0);lcd_putchar(0b01111110); while(1) { if(!up){MINSpeed++;delay_ms(100);} if(!down){MINSpeed--;delay_ms(100);} if(!ok){goto speeda;} if(!cancel){goto set_speed;} lcd_gotoxy(2,1); view(MAXSpeed); lcd_gotoxy(7,1); view(MINSpeed); lcd_gotoxy(12,1); view(Topspeed); } speeda: lcd_clear(); delay_ms(200); lcd_gotoxy(0,0); lcd_putsf(" MAX MIN TS "); lcd_gotoxy(11,0);lcd_putchar(0b01111110); while(1)
73
{ if(!up){Topspeed++;delay_ms(100);} if(!down){Topspeed--;delay_ms(100);} if(!ok){lcd_clear(); goto satu;} if(!cancel){goto speed_min;} lcd_gotoxy(2,1); view(MAXSpeed); lcd_gotoxy(7,1); view(MINSpeed); lcd_gotoxy(12,1); view(Topspeed); } ////////////////// Perintah pengambilan data//////////////////////////// ambil_data: led=on; lcd_clear(); lcd_gotoxy(0,0); lcd_putsf(" ambil data adc "); delay_ms(1000); cekback(); lihat: led=on; lcd_clear(); delay_ms(200); lcd_gotoxy(0,0); lcd_putsf("---cek sensor---"); while(1) { displaySensorBit(); if(Skib==1){lcd_gotoxy(0,0);lcd_putchar(0xff);} else {lcd_gotoxy(0,0);lcd_putsf("_");} //if(Skid==1){lcd_gotoxy(1,0);lcd_putchar(0xff);}
74
//else {lcd_gotoxy(1,0);lcd_putsf("_");} //if(Skab==1){lcd_gotoxy(15,0);lcd_putchar(0xff);} //else {lcd_gotoxy(15,0);lcd_putsf("_");} //if(Skad==1){lcd_gotoxy(14,0);lcd_putchar(0xff);} //else {lcd_gotoxy(14,0);lcd_putsf("_");} if(!cancel){lcd_clear();goto tiga;} if(!ok){goto jalan;} } ///////////////////////Perintah membaca data ADC//////////////////////// data_adc: led=on; lcd_clear(); delay_ms(200); while(1) { baca(); sprintf(Msg1,"%3d %3d %3d %3d",s[0],s[1],s[2],s[3]); sprintf(Msg2,"%3d %3d %3d %3d",s[4],s[5],s[6],s[7]); lcd_gotoxy(0,0);lcd_puts(Msg1); lcd_gotoxy(0,1);lcd_puts(Msg2); if(!ok){lcd_clear();goto empat;} } //////////////// Perintah seting PID///////////////////////////// set_PID: led=on; delay_ms(200); lcd_clear(); lcd_gotoxy(0,0); lcd_putsf(" KP KD
");
lcd_gotoxy(1,0);lcd_putchar(0b01111110); while(1) {
75
if(!up){VarKp++;delay_ms(100);} if(!down){VarKp--;delay_ms(100);} if(!ok){goto Kd;} lcd_gotoxy(2,1); view(VarKp); lcd_gotoxy(7,1); view(VarKd); } Kd: lcd_clear(); delay_ms(200); lcd_gotoxy(0,0); lcd_putsf(" KP KD
");
lcd_gotoxy(6,0);lcd_putchar(0b01111110); while(1) { if(!up){VarKd++;delay_ms(100);} if(!down){VarKd--;delay_ms(100);} if(!ok){goto lima;} if(!cancel){goto set_PID;} lcd_gotoxy(2,1); view(VarKp); lcd_gotoxy(7,1); view(VarKd); }
////////// Perintah pengecekan motor////////////// cek: led=off; lcd_clear(); lcd_gotoxy(0,0);lcd_putsf("-__Coba motor__-"); maju();lpwm=MAXSpeed;rpwm=MAXSpeed;
76
lcd_gotoxy(0,1);lcd_putsf("-__motor maju__-"); delay_ms(700); mundur();lpwm=MAXSpeed;rpwm=MAXSpeed; lcd_gotoxy(0,1);lcd_putsf("-_motor mundur_-"); delay_ms(700); bkan();lpwm=MAXSpeed;rpwm=MAXSpeed; lcd_gotoxy(0,1);lcd_putsf("-__motor Bkan__-"); delay_ms(700); bkir();lpwm=MAXSpeed;rpwm=MAXSpeed; lcd_gotoxy(0,1);lcd_putsf("-__motor Bkir__-"); delay_ms(700); lcd_clear(); stop(); delay_ms(100); goto enam;
77