Line Tracer dengan Sistem Kontrol PD (Proportional Derivative)
Misalkan kita mempunyai susunan sensor, tampak atas, seperti berikut:
(4) ------ (3) - (2) -(1) ------ (0)
Dimana angka menunjukkan pin uC, katakanlah pada PORT C. Jadi kita menggunakan pin PORTC.0 untuk sensor paling kanan, PORTC.1 untuk sensor tengah kanan, dst hingga PORTC.4 untuk sensor paling kiri. Untuk mempermudah, saya biasanya menggunakan data mapping. Jadi kondisi sensor akan di mapping dengan data PWM motor. Katakanlah sensor line tracer itu aktif low, jadi pin uC akan membaca logika 0 saat mengenai garis. Oke, karena ada 5 sensor maka akan ada 2^5 = 32 kemungkinan kondisi sensor. Saya hanya akan membuat kedua robot bergerak maju, sehingga bisa di buat kontroler motor untuk bergerak satu arah saja. Saya akan membuat beberapa nilai sensor (dalam hexa) saja sebagai contoh, sisanya bisa diimpementasikan sendiri. Berikut tabelnya:
| Nilai sensor | PWM motor kiri | PWM motor kanan |
| 0×11 | 0xEF | 0xFF |
| 0×17 | 0xA0 | 0xFF |
| 0×1D | 0xEF | 0×9F |
| 0×0F | 0×20 | 0xFF |
| 0×1E | 0xEF | 0×2F |
| dst… | dst… | dst… |
Saya mengimplementasikan PWM dengan menggunakan interrupt timer pada uC, dimana nilai 0xff adalah PWM full speed (100%) dan motor akan berhenti dengan nilai 0. Pada kasus saya, motor kanan dan kiri akan mempunyai nilai PWM yang berbeda untuk kecepatan aktual yang terlihat sama, jika dilihat pada tabel untuk membuat motor maju lurus nilai PWM kanan dan kiri berbeda 15 desimal. Jika merujuk ke sunsunan sensor, nilai 0×11 menunjukkan tiga sensor tengah mengenai garis, sehingga PWM motor diberi hampir full agar bergerak maju lurus. Kondisi 0×17 mengharuskan robot bergerak serong kiri dan kondisi 0×1E mengharuskan robot banting kanan. Dengan cara mapping nilai sensor dari PINC dengan data PWM kita sudah mengimplementasikan sistem kontrol proportional, dimana gain motor akan mempunyai proporsi sesuai nilai sensor yg diinput ke PINC. Untuk menulisnya dengan bahasa C, saya akan menggunakan array untuk menampung data PWM, berikut potongan programnya:
/**
* isikan data PWM motor kiri dan kanan
* sesuai dengan 32 kondisi sensor
*/
unsigned char PWMKiri[32] = { 0x00, 0x00, ... }
unsigned char PWMKanan[32] = { 0x00, 0x00, ... }
unsigned char state;
void scan() {
state = PINC & 0x1F; //baca PINC.0 - PINC.4
/**
* beri nilai PWM motor kiri dengan
* data PWMKiri dan PWMkanan
* dimana indexnya adalah kondisi sensor
*/
PWMKiriVal = PWMKiri[state];
PWMKananVal = PWMKanan[state];
}
Untuk menambahkan kontrol derivative, kita perlu menggunakan delta PWM. Kita perlu mencatat data PWM sebelumnya. Kita bisa mengubah fungsi scan menjadi:
//variabel untuk menampung nilai PWM sebelumnya
unsigned char last_state, d;
//jika dipanggil tanpa argumen, fungsi scan hanya sistem kontrol proportional
void scan(d = false) {
state = PINC & 0x1F;
//jika dipanggil dengan scan(1), aktifkan fungsi proportioal-derivative
if (d) {
PWMKiriVal = PWMKiri[state] + (PWMKiri[state] - PWMKiri[last_state]);
PWMKananVal = PWMKanan[state] + (PWMKanan[state] - PWMKanan[last_state]);
} else { //sistem proportional saja
/* beri nilai PWM motor kiri dan kanan
* dimana indexnya adalah kondisi sensor
*/
PWMKiriVal = PWMKiri[state];
PWMKananVal = PWMKanan[state];
}
last_state = state;
}
Sistem derivative di atas hanya gambaran bagaimana menerapkan sistem kontrol PD, dan agak redundant jika digunakan dalam robot sederhana dengan 5 sensor. Dalam mendesain sistem derivative perlu diperhatikan apakah penyimpangan error dalam kondisi sistem itu cukup signifikan untuk membuat sistem bergerak stabil jika ditambahkan ke dalam sistem kontrol. Jika masih bingung apa itu sistem PID, coba di googling. Sebagai pendahuluan coba baca artikel PID di Wikipedia.
What is She Afraid of? PWM dengan Interrupt Timer
Back to top
6 zam, 28 Oct 2009 at 12:05 pm
PUSING………………
5 ilman, 11 Oct 2009 at 7:58 am
kaak gmn klo linetricer di padukan dengan tangn robot????
jadi lok diatas garis ada benda yang menghalangi motor berhenti….
dan tangan robot memindahkan benda yang menghalangi tsbt!!!!!
4 nuri, 27 Jan 2009 at 5:40 am
saya kebetulan sedang riset tentang pemakaian kontroler PD buat pengaturan kongesti.
yang saya bingung bagaimana ya kak menentukan kp dan kd nya biar stabil selain tebak2 manual?ada ide gak kak???makasih banyak yah jawabannya.
oiya kak saya minta tolong yah dijawab kalo bisa secepatnya.hehehe.lewat email saja kalo bisa: soli_gendhut@yahoo.com
makasih banyaaaaak kak atas bantuannya
3 gedex, 17 Jun 2008 at 2:52 am
#dani
ni tulisan msh ngaco, sebetulnya mo gw revisi di posting selanjutnya
harusnya nilai
P = Kp * error
dan
D = (error - last_error) * Kd
Nah error = SP - (pembacaan_sensor)
Nilai PWM didapat dari manipulasi P + D.
Klo utk model sensor yg hanya memiliki nilai biner (0 atau 1)
berarti cukup menggunakan pseudo program kyk di atas,
tapi klo datanya berupa hasil konversi ADC (umumnya 0 - 255)
enaknya sih dilinearisasi dulu, biar dapetin nilai PWMnya
mudah. Tapi semakin banyak range data sensor semakin bagus diterapkan dgn sistem PID
note:
Kp = konstanta proportional (ini bs berapa aja, nilai idealnya didapat dari tuning / coba2 manual)
Kd = konstanta derivative
SP = Set Point (kondisi saat bergerak maju, idealnya sensor tengah mengenai garis)
2 dani, 17 Jun 2008 at 12:01 am
makasih ya materinya,… ini akan brmanfaat bgt,.. bwt ank KI ni materi dah gw ambil jd loe cari yang laen aj ok….!
1 anam, 28 Apr 2008 at 9:53 pm
terima kasih mas