TUNING KONTROLER PID Pada Robot Line Follower


TUNING KONTROLER PID LINE FOLLOWER

Tunning kontrol PID ini bertujuan untuk menentukan paramater aksi kontrol Proportional, Integratif, Derivatif pada robot line follower. 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 konstanta P-I-D pada formula PID hingga di peroleh hasil yang di inginkan, dengan mengacu pada karakteristik masing-masing kontrol P-I-D.

Nach kalo kita menggunakan kendali PID artinya kita 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 line follower berikut ini:

Dari blok diagram diatas dapat q jelasin sebagai berikut

  1. SP = Set point, secara simple maksudnya ialah suatu prameter nilai acuan atau nilai yang kita inginkan.
  2. 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).
  3. Error = nilai kesalahan, nach kalo yang ini pengertiannya ialah Deviasi atau simpangan antar variabel terukur atau bobot sensor (PV) dengan nilai acuan (SP)

Setelah memahami alur pengendalian PID nach berikut ilustrasi pemberian bobot sensor (nilai kesalahan pembacaan sensor) pada robot line follower:

Dari blok iliustrasi tersebut dapat q jelasin sebagai berikut:

Proses pemberian bobot sensor dapat dilakukan dengan proses pemetaan (mapping) pembacaan sensor terhadap garis, berikut salah satu sample proses mapping sensor:

11111110 (PV=-7)

11111000 (PV=-6)

11111100 (PV=-6)

11111101 (PV=-5)

11110001 (PV=-4)

11111001 (PV=-4)

11111011 (PV=-3)

11100011 (PV=-2)

11110011 (PV=-2)

11110111 (PV=-1)

11100111 (PV=0)

11101111 (PV=1)

11000111 (PV=2)

11001111 (PV=2)

11011111 (PV=3)

10001111 (PV=4)

10011111 (PV=4)

10111111 (PV=5)

00011111 (PV=6)

00111111 (PV=6)

01111111 (PV=7)

11111111 (PV=8 / -8)

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 line follower. Jika PV tidak sama dengan 0 berarti robot tidak berada pada kondisi ideal dan artinya ada sinyal kesalahan (error). Pada kondisi error inilah formula PID akan menentukan hasil sinyal kendalinya. Nach berikut ini penjelasan tentang penerapan PID pada robot line follower:

Proporsional kontrol

Kondisi ideal pada robot adalah bergerak maju lurus mengikuti garis, dengan kata lain PV = 0 (nilai sensor = 11100111). Dari sini dapat diasumsikan bahwa Set Point (SP) / kondisi ideal adalah saat SP = 0. Nilai sensor yang dibaca oleh sensor disebut Process Variable (PV) / nilai aktual pembacaan. Menyimpangnya posisi robot dari garis disebut sebagai error (e), yang didapat dari e = SP – PV. Dengan mengetahui besar error, mikrokontroler dapat memberikan nilai PWM motor kiri dan kanan yang sesuai agar dapat menuju ke posisi ideal (SP = 0). Besarnaya nilai PWM ini dapat diperoleh dengan menggunakan kontrol Proporsional (P), dimana P = e  Kp (Kp adalah konstanta proporsional yang nilainya di set sendiri dari hasil tuning).

Saat Sensor = 11111111 nilai PV dapat ditentukan dengan cara membandingkan kondisi PV sebelumnya, jika PV lebih besar dari 0, maka nilai PV dapat diasumsikan 30 dan jika PV kurang dari 0, maka nilai PV dapat diasumsikan -30 atau dengan cara menyimpan nilai error yang lalu.

Dalam pemrograman robot line follower ini kodenya  ditulis secara sederhana seperti berikut:

If Sensor = &B11111111 Then

If Pv < 0 Then : Pv = -30

End If

If Pv > 0 Then : Pv = 30

End If

End If

Perhitungan Kontroler Proporsional

Sp_sensor = 0                             ‘setpoint sensor

Error = Sp_sensor – Pv           ‘nilai error

P = Kp * Error                              ‘proporsional kontrol

Aplikasi kontrol proporsional pada PWM ialah sebagai berikut:

Pwm = Sp_kecepatan + P       ‘motor kiri

Pwm = Sp_kecepatan – P       ‘motor kanan

Derivatif kontrol

Jika pergerakan robot masih terlihat bergelombang, bisa ditambahkan kontrol Derivatif (D). Kontrol D digunakan untuk mengukur seberapa cepat robot bergerak dari kiri ke kanan atau dari kanan ke kiri. Semakin cepat bergerak dari satu sisi ke sisi lainnya, maka semakin besar nilai D. Konstanta D (Kd) digunakan untuk menambah atau mengurangi imbas dari derivatif. Dengan mendapatkan nilai Kd yang tepat pergerakan sisi ke sisi yang bergelombang akibat dari kontrol proporsional bisa diminimalisasi. Nilai D didapat dari D = Kd/Ts * rate, dimana Ts ialah time sampling atau waktu cuplik dan rate = e(n) – e(n-1). Dalam program nilai error (SP – PV) saat itu menjadi nilai last_error, sehingga rate didapat dari error – last_error. Untuk menambahkan kontrol D, program dimodifikasi menjadi:

Perhitungan Kontroler Proporsional + Derivatif

Sp_sensor = 0                             ‘setpoint sensor

Error = Sp_sensor – Pv           ‘nilai error

P = Kp * Error                              ‘proporsional kontrol

D1 = Kd * 10                                 ‘derivatif kontrol

D2 = D1 / Ts

D3 = Error – Last_error           ‘rate

D = D2 * D3

Last_error = Error                   ‘error lampau

Pd = P + D                                     ‘proporsional-derivatif kontrol

Aplikasi kontrol proporsional dan drivatif pada PWM ialah sebagai berikut:

Pwm = Sp_kecepatan + Pd     ‘motor kiri

Pwm = Sp_kecepatan – Pd     ‘motor kanan

Integratif kontrol

Jika dengan P + D sudah membuat pergerakan robot cukup smooth, maka penambahan Integratif menjadi opsional. Jika ingin mencoba-coba bisa ditambahakan Integratif (I). I digunakan untuk mengakumulasi error dan mengetahui durasi error. Dengan menjumlahkan error disetiap pembacaan PV akan memberikan akumulasi offset yang harus diperbaiki sebelumnya. Saat robot bergerak menjauhi garis, maka nilai error akan bertambah. Semakin lama tidak mendapatkan SP, maka semakin besar nilai I. Degan mendapatkan nilai Ki yang tepat, imbas dari Integratif bisa dikurangi. Nilai akumulasi error didapat dari: error + last_error. Untuk menambahkan kontrol I, maka program di modifikasi menjadi:

Perhitungan Kontroler Proporsional + Integratif + Derivatif

Sp_sensor = 0                             ‘setpoint sensor

Error = Sp_sensor – Pv           ‘nilai error

P = Kp * Error                              ‘proporsional kontrol

D1 = Kd * 10                                  ‘derivatif kontrol

D2 = D1 / Ts

D3 = Error – Last_error           ‘rate

D = D2 * D3

I1 = Ki / 10                                    ‘integratif kontrol

I2 = Error + Last_error           ‘akumulasi error

I3 = I1 * I2

I = I3 * Ts

Last_error = Error                   ‘error lampau

Pd = P + D                                     ‘proporsional-derivatif kontrol

Pid = Pd+I                                    ‘proporsional-integratif-derivatif

Aplikasi kontrol proporsional, integratif dan drivatif pada PWM ialah sebagai berikut:

Pwm = Sp_kecepatan + Pid    ‘motor kiri

Pwm = Sp_kecepatan – Pid    ‘motor kanan

Parameter Nilai Konstanta Kontroler P I D

Nilai konstanta perhitungan PID di tuning secara trial and error, proses ini dilakukan dengan metode mencoba-coba (eksperimental) nilai proporsional, derivatif dan integratif pada formula PID hingga ditemukan hasil sistem yag stabil, adapun cara yang dilakukan untuk mentuning PID pada robot line follower ialah sebagai berikut:

  1. Langkah awal gunakan kontrol proporsional terlebih dahulu, abaikan konstanta integratif dan derivatifnya dengan memberikan nilai nol pada integratif dan derivatif.
  2. Tambahkan terus konstanta proporsional maksimum hingga keadaan stabil namun robot masih berosilasi.
  3. Untuk meredam osilasi, tambahkan konstanta derivatif dengan membagi dua nilai proporsional, amati keadaan sistem robot hingga stabil dan lebih responsif.
  4. Jika sistem robot telah stabil, kontrol integratif dapat menjadi opsional, dalam artian jika ingin mencoba-coba tambahkan kontrol integratif tersebut, namun pemberian nilai integratif yang tidak tepat dapat membuat sistem robot menjadi tidak stabil.
  5. Nilai set point kecepatan dan nilai batas bawah/atas memberikan patokan kecepatan robot.
  6. Nilai time sampling (waktu cuplik) juga mempengaruhi perhitungan PID, tentunnya saat penggunaan kontrol integratif dan derivatif.
  7. Periksa kembali perfoma sistem hingga mendapatkan hasil yang memuaskan.

Acuan penentuan parameter Kp, Ki dan Kd  dapat diadopsi dari watak dari kontroler itu masing seperti yang dijelaskan pada tabel berikut ini:

Simulasi PID Parameter :  klik here

Dan berikut ini sample coding PID line followerku dengan pemrograman BASCOM AVR :

$regfile = “m8535.dat”
$crystal = 12000000
$eeprom

‘—————————inisialisasi pwm————————————
Config Timer1 = Pwm , Pwm = 10 , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down       ‘pwm dengan settingan fast pwm 10 bit

‘—————————inisialisasi adc————————————
Config Adc = Single , Prescaler = Auto

‘—————————inisialisasi lcd————————————
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.0
Config Lcd = 16 * 2 : Cursor Off

‘——————————————————————————-
‘PENDEFINISIAN PIN MIKRO
‘——————————————————————————-
Config Portd = Output

alias logika motor
M1a Alias Portd.0
M1b Alias Portd.1
M2a Alias Portd.2
M2b Alias Portd.3

Config Portb = Input
Portb = 255
alias tombol
Sw_ok Alias Pinb.3
Sw_cancel Alias Pinb.2
Sw_down Alias Pinb.1
Sw_up Alias Pinb.0

Config Portc.3 = Output

‘——————————————————————————-
‘DEKLARASI VARIABEL
‘——————————————————————————-
Dim B1 As Bit , B2 As Bit , B3 As Bit , B4 As Bit , B5 As Bit , B6 As Bit , B7 As Bit , B8 As Bit,
Dim S1 As Byte , S2 As Byte , S3 As Byte , S4 As Byte , S5 As Byte , S6 As Byte , S7 As Byte , S8 As Byte
Dim Adc1 As Integer , Adc2 As Integer , Adc3 As Integer , Adc4 As Integer , Adc5 As Integer , Adc6 As Integer , Adc7 As Integer , Adc8 As Integer,
Dim S12 As Byte , S123 As Byte , S1234 As Byte , S12345 As Byte , S123456 As Byte , S1234567 As Byte , S12345678 As Byte
Dim C As Byte
Dim B As Byte
Dim Sensor As Byte
Dim Konversi_sensor As Byte
Dim Data1 As Byte
Dim Menu As Byte

‘——————————-declarasi variabel——————————
variabel eeprom
Dim Kp_eprom As Eram Integer
Dim Ki_eprom As Eram Integer
Dim Kd_eprom As Eram Integer
Dim Ts_eprom As Eram Integer
Dim Sp_kecepatan_eprom As Eram Integer
Dim Up_eprom As Eram Integer
Dim Lp_eprom As Eram Integer
Dim Nos_eprom As Eram Integer
Dim Hold_eprom As Eram Integer

Dim Kp As Integer
Dim Ki As Integer
Dim Kd As Integer
Dim Ts As Integer
Dim Sp_sensor As Integer
Dim Sp_kecepatan As Integer
Dim Up As Integer
Dim Lp As Integer
Dim Nos As Integer
Dim Hold As Integer

Dim Error As Integer
Dim Last_error As Integer
Dim Pv As Integer
Dim P As Integer
Dim Pd As Integer
Dim Pid As Integer
Dim Pwm As Integer

Dim I1 As Integer
Dim I2 As Integer
Dim I3 As Integer
Dim I As Integer

Dim D1 As Integer
Dim D2 As Integer
Dim D3 As Integer
Dim D As Integer

Dim N1 As Integer
Dim N2 As Integer

‘——————————————————————————-
‘DEKLARASI SUBRUTIN
‘——————————————————————————-

Declare Sub Baca_sensor()
Declare Sub Kiri_maju()
Declare Sub Kanan_maju()
Declare Sub Kiri_mundur()
Declare Sub Kanan_mundur()
Declare Sub Bantingkanan()
Declare Sub Bantingkiri()

Portc.3 = 0                                                 ‘lcd on

Cls : Home
Lcd “ADC LINEfollower”
Waitms 500
Lowerline
Lcd “Fahmizal_dte2006”
Waitms 1500

Portc.3 = 1                                                 ‘lcd off

Menu_utama:
Cls
Home : Lcd “‘menu'<<<<^>>>>>”
Lowerline
Lcd “Please choice…”
Do
If Sw_up = 0 Then : Waitms 250 : Menu = 1
End If
If Sw_down = 0 Then : Waitms 250 : Menu = 2
End If

If Menu = 1 Then : Locate 2 , 1 : Lcd “Setting ROBOT…”
If Sw_ok = 0 Then : Waitms 250 : Gosub Setting_pid : End If
End If

If Menu = 2 Then : Locate 2 , 1 : Lcd “Go……..Ready?”
If Sw_ok = 0 Then : Waitms 250 : Gosub Go : End If
End If
Loop

‘——————————-menu Konstanta PID——————————
Setting_pid:
Cls
Menu_kp:
Do

Kp = Kp_eprom
If Sw_up = 0 Then : Incr Kp : Waitms 10
End If
If Sw_down = 0 Then : Decr Kp : Waitms 10
End If

If Sw_ok = 0 Then : Waitms 250 : Gosub Menu_ki
End If
If Sw_cancel = 0 Then : Waitms 250 : Gosub Menu_utama
End If

If Kp > 50 Then : Kp = 0 : Waitms 10
End If
If Kp < 0 Then : Kp = 50 : Waitms 10
End If

Home : Lcd “Tuning PID ^–^ “ : Locate 2 , 1 : Lcd “KP:” : Locate 2 , 4 : Lcd ”           “ : Locate 2 , 4 : Lcd Kp : Waitms 100

Kp_eprom = Kp
Loop

‘———————————————

Menu_ki:
Do

Ki = Ki_eprom
If Sw_up = 0 Then : Incr Ki : Waitms 10
End If
If Sw_down = 0 Then : Decr Ki : Waitms 10
End If

If Sw_ok = 0 Then : Waitms 250 : Gosub Menu_kd
End If
If Sw_cancel = 0 Then : Waitms 250 : Gosub Menu_kp
End If

If Ki > 20 Then : Ki = 0 : Waitms 10
End If
If Ki < 0 Then : Ki = 20 : Waitms 10
End If

Home : Lcd “Tuning PID ^–^ “ : Locate 2 , 1 : Lcd “KI:” : Locate 2 , 4 : Lcd ”           “ : Locate 2 , 4 : Lcd Ki : Waitms 100

Ki_eprom = Ki
Loop

‘———————————————

Menu_kd:
Do

Kd = Kd_eprom
If Sw_up = 0 Then : Kd = Kd + 5 : Waitms 10
End If
If Sw_down = 0 Then : Kd = Kd – 5 : Waitms 10
End If

If Sw_ok = 0 Then : Waitms 250 : Gosub Menu_ts
End If
If Sw_cancel = 0 Then : Waitms 250 : Gosub Menu_ki
End If

If Kd > 150 Then : Kd = 0 : Waitms 10
End If
If Kd < 0 Then : Kd = 150 : Waitms 10
End If

Home : Lcd “Tuning PID ^–^ “ : Locate 2 , 1 : Lcd “KD:” : Locate 2 , 4 : Lcd ”           “ : Locate 2 , 4 : Lcd Kd : Waitms 100

Kd_eprom = Kd

Loop

‘———————————————

Menu_ts:
Do

Ts = Ts_eprom
If Sw_up = 0 Then : Ts = Ts + 5 : Waitms 10
End If
If Sw_down = 0 Then : Ts = Ts – 5 : Waitms 10
End If

If Sw_ok = 0 Then : Waitms 250 : Gosub Menu_sp_kecepatan
End If
If Sw_cancel = 0 Then : Waitms 250 : Gosub Menu_kd
End If

If Ts > 20 Then : Ts = 0 : Waitms 10
End If
If Ts < 0 Then : Ts = 20 : Waitms 10
End If

Home : Lcd “TimeSampling(ms)” : Locate 2 , 1 : Lcd “TS:” : Locate 2 , 4 : Lcd ”           “ : Locate 2 , 4 : Lcd Ts : Waitms 100

Ts_eprom = Ts

Loop

‘———————————————

Menu_sp_kecepatan:
Do

Sp_kecepatan = Sp_kecepatan_eprom
If Sw_up = 0 Then : Sp_kecepatan = Sp_kecepatan + 50 : Waitms 10
End If
If Sw_down = 0 Then : Sp_kecepatan = Sp_kecepatan – 50 : Waitms 10
End If

If Sw_ok = 0 Then : Waitms 250 : Gosub Menu_up
End If
If Sw_cancel = 0 Then : Waitms 250 : Gosub Menu_ts
End If

If Sp_kecepatan > 600 Then : Sp_kecepatan = 400 : Waitms 5
End If
If Sp_kecepatan < 400 Then : Sp_kecepatan = 600 : Waitms 5
End If

Home : Lcd “Set Point  ^–^ “ : Locate 2 , 1 : Lcd “kecepatan:” : Locate 2 , 11 : Lcd ”        “ : Locate 2 , 11 : Lcd Sp_kecepatan : Waitms 100

Sp_kecepatan_eprom = Sp_kecepatan

Loop

‘———————————————
Menu_up:
Do

Up = Up_eprom
If Sw_up = 0 Then : Up = Up + 50 : Waitms 10
End If
If Sw_down = 0 Then : Up = Up – 50 : Waitms 10
End If

If Sw_ok = 0 Then : Waitms 250 : Gosub Menu_nos
End If
If Sw_cancel = 0 Then : Waitms 250 : Gosub Menu_sp_kecepatan
End If

If Up > 1000 Then : Up = 700 : Waitms 10
End If
If Up < 700 Then : Up = 1000 : Waitms 10
End If

Home : Lcd “TOP speed ROBOT “ : Locate 2 , 1 : Lcd “top:” : Locate 2 , 5 : Lcd ”           “ : Locate 2 , 5 : Lcd Up : Waitms 100

Up_eprom = Up

Loop

‘———————————————
Menu_nos:
Do

Nos = Nos_eprom
If Sw_up = 0 Then : Nos = Nos + 100 : Waitms 10
End If
If Sw_down = 0 Then : Nos = Nos -100 : Waitms 10
End If

If Sw_ok = 0 Then : Waitms 250 : Gosub Menu_hold:
End If
If Sw_cancel = 0 Then : Waitms 250 : Gosub Menu_up
End If

If Nos > 500 Then : Nos = 100 : Waitms 10
End If
If Nos < 100 Then : Nos = 500 : Waitms 10
End If

Home : Lcd “POWER ^–^ ROBOT” : Locate 2 , 1 : Lcd “start:” : Locate 2 , 7 : Lcd ”           “ : Locate 2 , 7 : Lcd Nos : Waitms 100

Nos_eprom = Nos

Loop
‘——————————————————————————-

Menu_hold:
Do

Hold = Hold_eprom
If Sw_up = 0 Then : Hold = Hold + 5 : Waitms 10
End If
If Sw_down = 0 Then : Hold = Hold – 5 : Waitms 10
End If

If Sw_ok = 0 Then : Waitms 250 : Gosub Rampung_setting:
End If
If Sw_cancel = 0 Then : Waitms 250 : Gosub Menu_nos
End If

If Hold > 75 Then : Hold = 25 : Waitms 10
End If
If Hold < 25 Then : Hold = 75 : Waitms 10
End If

Home : Lcd “TressHold^SENSOR” : Locate 2 , 1 : Lcd “hold:” : Locate 2 , 6 : Lcd ”           “ : Locate 2 , 6 : Lcd Hold : Waitms 100

Hold_eprom = Hold

Loop
‘——————————————————————————-

‘——————————-tampilansaveepprom——————————
Rampung_setting:

Cls
Locate 1 , 1 : Lcd “Write’_to_EEPROM”
Locate 2 , 1 : Lcd “=” : Waitms 200
Locate 2 , 2 : Lcd “=” : Waitms 180
Locate 2 , 3 : Lcd “=” : Waitms 155
Locate 2 , 4 : Lcd “=” : Waitms 125
Locate 2 , 5 : Lcd “=” : Waitms 90
Locate 2 , 6 : Lcd “=” : Waitms 70
Locate 2 , 7 : Lcd “=” : Waitms 50
Locate 2 , 8 : Lcd “=” : Waitms 35
Locate 2 , 9 : Lcd “=” : Waitms 20
Locate 2 , 10 : Lcd “=” : Waitms 15
Locate 2 , 11 : Lcd “=” : Waitms 13
Locate 2 , 12 : Lcd “=” : Waitms 11
Locate 2 , 13 : Lcd “=” : Waitms 9
Locate 2 , 14 : Lcd “=” : Waitms 7
Locate 2 , 15 : Lcd “=” : Waitms 5
Locate 2 , 16 : Lcd “=” : Waitms 300
Locate 2 , 1 : Lcd “writesucsesfully : Waitms 500 : Gosub Go:
‘——————————————————————————-

Go:

Kp = Kp_eprom
Ki = Ki_eprom
Kd = Kd_eprom
Ts = Ts_eprom
Sp_kecepatan = Sp_kecepatan_eprom
Up = Up_eprom
Nos = Nos_eprom
Hold = Hold_eprom

Portc.3 = 0                                                 ‘lcd      on
Cls
Locate 2 , 5 : Lcd “Ready..!!”
Locate 1 , 8 : Lcd “-“ : Waitms 150
Locate 1 , 8 : Lcd “3” : Waitms 150
Locate 1 , 8 : Lcd “2” : Waitms 150
Locate 1 , 8 : Lcd “1” : Waitms 150
Locate 1 , 8 : Lcd “-“ : Waitms 150
Cls : Locate 2 , 7 : Lcd “GO…” : Waitms 200 : Cls

Do

Portc.3 = 1                                                ‘lcd      off

Call Baca_sensor()

Sensor = Konversi_sensor

If Sensor = &B00000001 Then : Pv = 20 : End If
If Sensor = &B00000010 Then : Pv = 11 : End If
If Sensor = &B00000100 Then : Pv = 5 : End If
If Sensor = &B00001000 Then : Pv = 0 : End If
If Sensor = &B00010000 Then : Pv = 0 : End If
If Sensor = &B00100000 Then : Pv = -5 : End If
If Sensor = &B01000000 Then : Pv = -11 : End If
If Sensor = &B10000000 Then : Pv = -20 : End If

If Sensor = &B00000011 Then : Pv = 16 : End If
If Sensor = &B00000110 Then : Pv = 8 : End If
If Sensor = &B00001100 Then : Pv = 2 : End If
If Sensor = &B00011000 Then : Pv = 0 : End If
If Sensor = &B00110000 Then : Pv = -2 : End If
If Sensor = &B01100000 Then : Pv = -8 : End If
If Sensor = &B11000000 Then : Pv = -16 : End If

If Sensor = &B00000111 Then : Pv = 12 : End If
If Sensor = &B00001110 Then : Pv = 6 : End If
If Sensor = &B00011100 Then : Pv = 3 : End If
If Sensor = &B00111000 Then : Pv = -3 : End If
If Sensor = &B01110000 Then : Pv = -6 : End If
If Sensor = &B11100000 Then : Pv = -12 : End If

If Sensor = &B00001111 Then : Pv = 8 : End If
If Sensor = &B00011110 Then : Pv = 2 : End If
If Sensor = &B00111100 Then : Pv = 0 : End If
If Sensor = &B01111000 Then : Pv = -2 : End If
If Sensor = &B11110000 Then : Pv = -8 : End If

If Sensor = &B00000000 Then
Portc.3 = 0                                                ‘lcd      on
If Pv < -10 Then : Pv = -30 : Nos = Up / 2
End If
If Pv > 10 Then : Pv = 30 : Nos = Up / 2
End If
End If

If Pv < 0 Then
N1 = Up / 2
N2 = Nos / 3
Nos = N1 + N2
End If

If Pv > 0 Then
N1 = Up / 2
N2 = Nos / 3
Nos = N1 + N2
End If

setpoint sensor
Sp_sensor = 0
nilai error
Error = Sp_sensor – Pv
proportional control
P = Kp * Error

integrativ control

I1 = Error + Last_error
I2 = I1 / 2
I = Ki * I2

derivative control
D1 = Kd * 10
D2 = Error – Last_error
D = D1 * D2

error lampau
Last_error = Error

proportional-derivative control
Pd = P + D

proportionalintegrativ-derivative control
Pid = Pd + I

‘===== Hitung Kondisi Pertama=============’sebelah kiri
Pwm = Sp_kecepatan + Pid
If Pwm > 0 Then : Call Kiri_maju() : Locate 2 , 7 : Lcd “F” : End If
If Pwm > Up Then : Pwm = Up : End If
If Pwm < 0 Then : Call Kiri_mundur() : Pwm = 0 – Pwm : Locate 2 , 7 : Lcd “R” : End If
If Pv = 0 Then : Pwm = Nos : If Nos < Up Then : Nos = Nos + 25 : End If : End If
Pwm1a = Pwm

‘=====Hitung Kondisi Kedua===============’sebelah kanan
Pwm = Sp_kecepatan – Pid
If Pwm > 0 Then : Call Kanan_maju() : Locate 2 , 16 : Lcd “F” : End If
If Pwm > Up Then : Pwm = Up : End If
If Pwm < 0 Then : Call Kanan_mundur() : Pwm = 0 – Pwm : Locate 2 , 16 : Lcd “R” : End If
If Pv = 0 Then : Pwm = Nos : If Nos < Up Then : Nos = Nos + 25 : End If : End If
Pwm1b = Pwm

Locate 2 , 1 : Lcd “L:” : Locate 2 , 3 : Lcd ”    “ : Locate 2 , 3 : Lcd Pwm1a : Locate 2 , 10 : Lcd “R:” : Locate 2 , 12 : Lcd ”    “ : Locate 2 , 12 : Lcd Pwm1b
Locate 1 , 11 : Lcd “PV:” : Locate 1 , 14 : Lcd ”   “ : Locate 1 , 14 : Lcd Pv

selang waktu cuplik
Waitms Ts                                                   ‘time sampling
Loop
End

Sub Baca_sensor()
Start Adc
Adc1 = Getadc(0) : Adc1 = Adc1 / 5
Adc2 = Getadc(1) : Adc2 = Adc2 / 5
Adc3 = Getadc(2) : Adc3 = Adc3 / 5
Adc4 = Getadc(3) : Adc4 = Adc4 / 5
Adc5 = Getadc(4) : Adc5 = Adc5 / 5
Adc6 = Getadc(5) : Adc6 = Adc6 / 5
Adc7 = Getadc(6) : Adc7 = Adc7 / 5
Adc8 = Getadc(7) : Adc8 = Adc8 / 5
If Adc1 < Hold Then : S1 = &B00000000 : B1 = 0 : End If : If Adc1 > Hold Then : S1 = &B00000001 : B1 = 1 : End If
If Adc2 < Hold Then : S2 = &B00000000 : B2 = 0 : End If : If Adc2 > Hold Then : S2 = &B00000010 : B2 = 1 : End If
If Adc3 < Hold Then : S3 = &B00000000 : B3 = 0 : End If : If Adc3 > Hold Then : S3 = &B00000100 : B3 = 1 : End If
If Adc4 < Hold Then : S4 = &B00000000 : B4 = 0 : End If : If Adc4 > Hold Then : S4 = &B00001000 : B4 = 1 : End If
If Adc5 < Hold Then : S5 = &B00000000 : B5 = 0 : End If : If Adc5 > Hold Then : S5 = &B00010000 : B5 = 1 : End If
If Adc6 < Hold Then : S6 = &B00000000 : B6 = 0 : End If : If Adc6 > Hold Then : S6 = &B00100000 : B6 = 1 : End If
If Adc7 < Hold Then : S7 = &B00000000 : B7 = 0 : End If : If Adc7 > Hold Then : S7 = &B01000000 : B7 = 1 : End If
If Adc8 < 120 Then : S8 = &B00000000 : B8 = 0 : End If : If Adc8 > 120 Then : S8 = &B10000000 : B8 = 1 : End If
S12 = S1 Or S2 : S123 = S12 Or S3 : S1234 = S123 Or S4 : S12345 = S1234 Or S5 : S123456 = S12345 Or S6 : S1234567 = S123456 Or S7 : S12345678 = S1234567 Or S8
Konversi_sensor = S12345678 And &B11111111
Locate 1 , 1 : Lcd “s”
Locate 1 , 2 : Lcd B1
Locate 1 , 3 : Lcd B2
Locate 1 , 4 : Lcd B3
Locate 1 , 5 : Lcd B4
Locate 1 , 6 : Lcd B5
Locate 1 , 7 : Lcd B6
Locate 1 , 8 : Lcd B7
Locate 1 , 9 : Lcd B8
End Sub

Sub Kiri_maju()
Reset M2a
Set M2b
End Sub

Sub Kanan_maju()
Reset M1a
Set M1b
End Sub

Sub Kiri_mundur()
Set M2a
Reset M2b
End Sub

Sub Kanan_mundur()
Set M1a
Reset M1b
End Sub

===============================================================

Dan berikut ini sample coding PID line followerku dengan pemrograman CODEVISION AVR :

#include<mega8535.h>
#include <delay.h>
#define sensor PINB
//===pwm motor alias
#define motor_ki OCR1A  //sip
#define motor_ka OCR1B

#define m1a PORTD.0
#define m1b PORTD.1
#define m2a PORTD.2
#define m2b PORTD.3

void maju ()
{
m1a=1;m1b=0;
m2a=0;m2b=1;
}

void rem_kanan ()
{
m1a=0;m1b=1;
m2a=0;m2b=1;
}

void rem_kiri ()
{
m1a=1;m1b=0;
m2a=1;m2b=0;
}

//===Tombol Yang Digunakan======
#define sw_ok     PINC.3
#define sw_cancel PINC.2
#define sw_down   PINC.1
#define sw_up     PINC.0

#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>
#include <stdio.h>

//====Variabel di eeprom=====
eeprom int Kp = 0;
eeprom int Ki = 0;
eeprom int Kd = 0;
eeprom int Ts= 0;
eeprom int Upper= 0;
eeprom int Lower= 0;
eeprom int Set_point=0;
//====Nilai-nilai eror=======
eeprom int e0=  0;
eeprom int e1 = 0;
eeprom int e2 = 0;
eeprom int e3 = 0;
eeprom int e4 = 0;
eeprom int e5 = 0;
eeprom int e6 = 0;
eeprom int e7 = 0;

int error,error1,nil_pid,pwm,kode;
char lcd_buff[33];

void seting_awal ()
{
set:
Kp=Kp;
if(sw_up==0){Kp++;delay_ms(10);}
if(sw_down==0){Kp=Kp-1;delay_ms(10);}
if(Kp>100){Kp=0;delay_ms(10);}
if(Kp<0){Kp=100;delay_ms(10);}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“***************”);
lcd_gotoxy(0,1);
sprintf(lcd_buff,”Nilai Kp:%i”,Kp);
lcd_puts(lcd_buff);
delay_ms(100);
if(sw_ok==0)
{
delay_ms(150);goto set1;
}
else goto set;
//====================================
set1:
Ki=Ki;
if(sw_up==0) {Ki++;delay_ms(10);}
if(sw_down==0) {Ki=Ki-1;delay_ms(10);}
if(Ki>100){Ki=0;delay_ms(10);}
if(Ki<0) {Ki=100;delay_ms(10);}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“***************”);
lcd_gotoxy(0,1);
sprintf(lcd_buff,”Nilai Ki:%i.%i”,Ki/10,Ki%10);
lcd_puts(lcd_buff);
delay_ms(100);
if(sw_ok==0) {delay_ms(150);goto set2;}
if(sw_cancel==0){delay_ms(150);goto set;}
else
goto set1;
//======================================
set2:
Kd=Kd;
if(sw_up==0) {Kd++;delay_ms(10);}
if(sw_down==0) {Kd=Kd-1;delay_ms(10);}
if(Kd>100){Kd=0;delay_ms(10);}
if(Kd<0) {Kd=100;delay_ms(10);}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“***************”);
lcd_gotoxy(0,1);
sprintf(lcd_buff,”Nilai Kd:%i”,Kd);
lcd_puts(lcd_buff);
delay_ms(100);
if(sw_ok==0) {delay_ms(150);goto set3;}
if(sw_cancel==0){delay_ms(150);goto set1;}
else
goto set2;
//========================================
set3:
Ts=Ts;
if(sw_up==0) {Ts++;delay_ms(10);}
if(sw_down==0) {Ts=Ts-1;delay_ms(10);}
if(Ts>100){Ts=0;delay_ms(10);}
if(Ts<0) {Ts=100;delay_ms(10);}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“Time Sampling”);
lcd_gotoxy(0,1);
sprintf(lcd_buff,”Delay:%ims”,Ts);
lcd_puts(lcd_buff);
delay_ms(100);
if(sw_ok==0) {delay_ms(150);goto set4;}
if(sw_cancel==0){delay_ms(150);goto set2;}
else
goto set3;
//=============================================
set4:
Ts=Ts;
if(sw_up==0) {Set_point++;delay_ms(10);}
if(sw_down==0) {Set_point=Set_point-1;delay_ms(10);}
if(Set_point>255){Set_point=0;delay_ms(10);}
if(Set_point<0) {Set_point=255;delay_ms(10);}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“Set Point”);
lcd_gotoxy(0,1);
sprintf(lcd_buff,”Kec:%i”,Set_point);
lcd_puts(lcd_buff);
delay_ms(100);
if(sw_ok==0) {delay_ms(150);goto set5;}
if(sw_cancel==0){delay_ms(150);goto set3;}
else
goto set4;
//=================================================
set5:
Upper=Upper;
if(sw_up==0) {Upper++;delay_ms(10);}
if(sw_down==0) {Upper=Upper-1;delay_ms(10);}
if(Upper>255){Upper=0;delay_ms(10);}
if(Upper<0) {Upper=255;delay_ms(10);}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“Limit Speed”);
lcd_gotoxy(0,1);
sprintf(lcd_buff,”Upper:%i”,Upper);
lcd_puts(lcd_buff);
delay_ms(100);
if(sw_ok==0) {delay_ms(150);goto set6;}
if(sw_cancel==0){delay_ms(150);goto set4;}
else
goto set5;
//====================================================
set6:
Lower=Lower;
if(sw_up==0) {Lower++;delay_ms(10);}
if(sw_down==0) {Lower=Lower-1;delay_ms(10);}
if(Lower>255){Lower=0;delay_ms(10);}
if(Lower<0) {Lower=255;delay_ms(10);}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“Limit Speed”);
lcd_gotoxy(0,1);
sprintf(lcd_buff,”Lower:%i”,Lower);
lcd_puts(lcd_buff);
delay_ms(100);
if(sw_ok==0) {delay_ms(150);goto set7;}
if(sw_cancel==0){delay_ms(150);goto set5;}
else
goto set6;

//========Menampilkan Eror-Eror===============
set7:
e0=e0;
if(sw_up==0) {e0++;delay_ms(10);}
if(sw_down==0) {e0=e0-1;delay_ms(10);}
if(e0>100){e0=0;delay_ms(10);}
if(e0<0) {e0=100;delay_ms(10);}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“Error 0”);
lcd_gotoxy(0,1);
sprintf(lcd_buff,”e0:%i”,e0);
lcd_puts(lcd_buff);
delay_ms(100);
if(sw_ok==0) {delay_ms(150);goto set8;}
if(sw_cancel==0){delay_ms(150);goto set6;}
else
goto set7;
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//========Menampilkan Eror-Eror===============
set8:
e1=e1;
if(sw_up==0) {e1++;delay_ms(10);}
if(sw_down==0) {e1=e1-1;delay_ms(10);}
if(e1>100){e1=0;delay_ms(10);}
if(e1<0) {e1=100;delay_ms(10);}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“Error 1”);
lcd_gotoxy(0,1);
sprintf(lcd_buff,”e1:%i”,e1);
lcd_puts(lcd_buff);
delay_ms(100);
if(sw_ok==0) {delay_ms(150);goto set9;}
if(sw_cancel==0){delay_ms(150);goto set7;}
else
goto set8;
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//========Menampilkan Eror-Eror===============
set9:
e2=e2;
if(sw_up==0) {e2++;delay_ms(10);}
if(sw_down==0) {e2=e2-1;delay_ms(10);}
if(e2>100){e2=0;delay_ms(10);}
if(e2<0) {e2=100;delay_ms(10);}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“Error 2”);
lcd_gotoxy(0,1);
sprintf(lcd_buff,”e2:%i”,e2);
lcd_puts(lcd_buff);
delay_ms(100);
if(sw_ok==0) {delay_ms(150);goto set10;}
if(sw_cancel==0){delay_ms(150);goto set8;}
else
goto set9;
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//========Menampilkan Eror-Eror===============
set10:
e3=e3;
if(sw_up==0) {e3++;delay_ms(10);}
if(sw_down==0) {e3=e3-1;delay_ms(10);}
if(e3>100){e3=0;delay_ms(10);}
if(e3<0) {e3=100;delay_ms(10);}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“Error 3”);
lcd_gotoxy(0,1);
sprintf(lcd_buff,”e3:%i”,e3);
lcd_puts(lcd_buff);
delay_ms(100);
if(sw_ok==0) {delay_ms(150);goto set11;}
if(sw_cancel==0){delay_ms(150);goto set9;}
else
goto set10;
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//========Menampilkan Eror-Eror===============
set11:
e4=e4;
if(sw_up==0) {e4++;delay_ms(10);}
if(sw_down==0) {e4=e4-1;delay_ms(10);}
if(e4>100){e4=0;delay_ms(10);}
if(e4<0) {e4=100;delay_ms(10);}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“Error 4”);
lcd_gotoxy(0,1);
sprintf(lcd_buff,”e4:%i”,e4);
lcd_puts(lcd_buff);
delay_ms(100);
if(sw_ok==0) {delay_ms(150);goto set12;}
if(sw_cancel==0){delay_ms(150);goto set10;}
else
goto set11;
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//========Menampilkan Eror-Eror===============
set12:
e5=e5;
if(sw_up==0) {e5++;delay_ms(10);}
if(sw_down==0) {e5=e5-1;delay_ms(10);}
if(e5>100){e5=0;delay_ms(10);}
if(e5<0) {e5=100;delay_ms(10);}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“Error 5”);
lcd_gotoxy(0,1);
sprintf(lcd_buff,”e5:%i”,e5);
lcd_puts(lcd_buff);
delay_ms(100);
if(sw_ok==0) {delay_ms(150);goto set13;}
if(sw_cancel==0){delay_ms(150);goto set11;}
else
goto set12;
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//========Menampilkan Eror-Eror===============
set13:
e6=e6;
if(sw_up==0) {e6++;delay_ms(10);}
if(sw_down==0) {e6=e6-1;delay_ms(10);}
if(e6>100){e6=0;delay_ms(10);}
if(e6<0) {e6=100;delay_ms(10);}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“Error 6”);
lcd_gotoxy(0,1);
sprintf(lcd_buff,”e6:%i”,e6);
lcd_puts(lcd_buff);
delay_ms(100);
if(sw_ok==0) {delay_ms(150);goto set14;}
if(sw_cancel==0){delay_ms(150);goto set12;}
else
goto set13;
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//========Menampilkan Eror-Eror===============
set14:
e7=e7;
if(sw_up==0) {e7++;delay_ms(10);}
if(sw_down==0) {e7=e7-1;delay_ms(10);}
if(e7>100){e7=0;delay_ms(10);}
if(e7<0) {e7=100;delay_ms(10);}
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“Error 7”);
lcd_gotoxy(0,1);
sprintf(lcd_buff,”e7:%i”,e7);
lcd_puts(lcd_buff);
delay_ms(100);
if(sw_ok==0) {delay_ms(150);goto Magelang;}
if(sw_cancel==0){delay_ms(150);goto set13;}
else
goto set14;
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Magelang:
lcd_clear();
lcd_gotoxy(1,0);
lcd_putsf(” Save To EEPROM”);
delay_ms(200);
Kp=Kp;Ki=Ki;Kd=Kd;Ts=Ts;Set_point=Set_point;Lower=Lower;Upper=Upper;
e0=e0;e1=e1;e2=e2;e3=e3;e4=e4;e5=e5;e6=e6;e7=e7;

}

void tampilan_awal()
{
lcd_gotoxy(0,0);
lcd_putsf(” C_Tools__!     “);
delay_ms(1000);
lcd_gotoxy(6,1);
lcd_putsf(“Present         “);
delay_ms(1000);
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(“Fahmizal_DTE_UGM”);
delay_ms(500);
lcd_gotoxy(0,1);
lcd_putsf(” Line Follower  “);
delay_ms(1000);
lcd_clear();
}

//=====Perlihatkan Sensor=========
//#define sensor    PINA
#define s0   PINB.0
#define s1   PINB.1
#define s2   PINB.2
#define s3   PINB.3
#define s4   PINB.4
#define s5   PINB.5
#define s6   PINB.6
#define s7   PINB.7

void show_sensor()
{
lcd_gotoxy(2,1);
if (s7) lcd_putchar(‘1’);
else    lcd_putchar(‘0’);
if (s6) lcd_putchar(‘1’);
else    lcd_putchar(‘0’);
if (s5) lcd_putchar(‘1’);
else    lcd_putchar(‘0’);
if (s4) lcd_putchar(‘1’);
else    lcd_putchar(‘0’);
if (s3) lcd_putchar(‘1’);
else    lcd_putchar(‘0’);
if (s2) lcd_putchar(‘1’);
else    lcd_putchar(‘0’);
if (s1) lcd_putchar(‘1’);
else    lcd_putchar(‘0’);
if (s0) lcd_putchar(‘1’);
else    lcd_putchar(‘0’);
}
//=====Tutup Perlihatkan Sensor====

void PID ()
{
//***hitam=mati/0 &  putih=nyala/1

//=====sensor mengarah ke Kiri
if (sensor==0b11101110) {error=e0;}
else if (sensor==0b11001110) {error=-e1;}
else if (sensor==0b11011110) {error=-e2;}
else if (sensor==0b10011110) {error=-e3;}
else if (sensor==0b10111110) {error=-e4;}
else if (sensor==0b00111110) {error=-e5;}
else if (sensor==0b01111110) {error=-e6;kode=12;}

//=====sensor mengarah ke Kanan
else if (sensor==0b11101110) {error=e0;}
else if (sensor==0b11100110) {error=e1;}
else if (sensor==0b11110110) {error=e2;}
else if (sensor==0b11110010) {error=e3;}
else if (sensor==0b11111010) {error=e4;}
else if (sensor==0b11111000) {error=e5;}
else if (sensor==0b11111100) {error=e6;kode=24;}

else if (sensor==0b11111110)//di putih semua
{
if (kode==12)
{
error=-e7;
rem_kiri();
delay_ms(20);
}
else if (kode==24)
{
error=e7;
rem_kanan();
delay_ms(20);
}
}

maju();
nil_pid=((Kp*error)+((Ki/10)*(error+error1)*Ts)+((Kd/Ts)*(error-error1)));
error1=error;

//===== Hitung Kondisi Pertama=============
pwm=Set_point-(nil_pid);
if(pwm>Upper){pwm=Upper;}
if(pwm<Lower){pwm=Lower;}
motor_ka=pwm;
//=====Hitung Kondisi Kedua===============
pwm=Set_point+(nil_pid);
if(pwm>Upper){pwm=Upper;}
if(pwm<Lower){pwm=Lower;}
motor_ki=pwm;
//kode=0;
delay_ms(Ts);
}

void show_detail()
{
lcd_gotoxy(0,0);
sprintf(lcd_buff,”e:%i”,error);
lcd_puts(lcd_buff);
lcd_gotoxy(5,0);
sprintf(lcd_buff,”Ki%i”,motor_ki);
lcd_puts(lcd_buff);
lcd_gotoxy(11,0);
sprintf(lcd_buff,”Ka%i”,motor_ka);
lcd_puts(lcd_buff);
}
void inisialisasi_port()
{
//===Seting untuk sensor============
DDRB=0b00000000;
PORTB=0b11111111;
//===Seting untuk fungsi Tombol======
DDRC=0x00;
PORTC=0xff;
//===Seting motor====================
DDRD=0xff;
PORTD=0x00;
//——-inisialisasi PWM—–//
TCCR1A=0xA3;
TCCR1B=0x0B;
TCNT1=0x0000;//PWM 16 bit//
OCR1A=0x3FF;
OCR1B=0x3FF;
TIFR=0;

}
void main(void)
{
inisialisasi_port();
lcd_init(16);
lcd_clear();
tampilan_awal();
seting_awal();
while(1)
{
lcd_clear();
PID();
show_sensor();
kode=0;
show_detail();
delay_ms(Ts);
}
}

Nach ni dia hasil tunning pid pada robotku disini….dan disana

Dan berikut aplikasi kontroler PID pada Robot-Wall Follower ato yg lebih dikenal dengan robot telusur dinding:

[youtube http://www.youtube.com/watch?v=mSK4oDcMiYM&w=480&h=390%5D

Referensi:

===============================================================

bacaan terkait di blog ini:

1. robot-line-follower-dengankendalipid klik disini

2. robot line follower dengan multiplekser-ADC  klik disini

91 responses to this post.

  1. Posted by koera on Oktober 8, 2010 at 1:14 am

    Wah, keren abis robotnya.! Ngomong-ngomong itu pake PID aja ato pake alogaritma lain..?
    Bagus banget Blog nya..! Teruskan Nulisnya ya mas……!

    Balas

  2. Posted by tanto on Oktober 14, 2010 at 11:50 pm

    mantap mas. . . bisa tolong post contoh progrmnya gk mas k email saya. .

    terims

    Balas

  3. Salam kenal,
    Saya sedang mempelajari aplikasi PID untuk mikro AVR dalam bahasa C.
    Agak bingung dengan persamaan diatas.

    Pwm = Sp_kecepatan + Pid ‘motor kiri

    PWM nilainya 0 – 255
    Sedangkan SP_kecepatan dan output PID satuannya RPM dan nilainya bisa lebih dari 255 tergantung kecepatan maksimum motor DC yang digunakan.
    Mohon penjelasannya.

    Balas

  4. Posted by fadli on Januari 13, 2011 at 1:01 am

    penginspirasi tugas saya blog nya mas ini..
    saya masih bingung “Ts” pada bagian:

    D2 = D1 / Ts

    dan

    I = I3 * Ts

    Ts nya itu apa?

    Balas

  5. Posted by candra on Februari 21, 2011 at 8:26 am

    bagus banget mas blog nya,.
    saya mau tanya, TS tu berpengaruh pada apa ya?? trus kan kalau di referensi lain, saya liad pd oprsi PWMnya, ada intervalPWM segala. nah itu perlu nggak sih? ato cukup dengan menambahkan nilai setkecepatan dengan PID??
    trimakasih atas share ilmunya

    Balas

    • thanks atas kunjugannya mas candra, TS itu time sampling yaitu periode cuplik dari data sensor, untuk opsi pengaturan PWM kita bisa kreasikan, gk harus ada interval PWM dan itu tergantung si programmer 😀

      Balas

  6. Posted by ronald on Maret 7, 2011 at 1:40 pm

    mas boleh tau nggak bahan2 yang dgnakan untuk membuat rbot line follower ini…minta bantuannya….thanks…

    Balas

    • bahan yg mana ni…kalo hardware butuh gerbox buat roda, motor, rangkaian sisem minimum, rangka robot (mekanik robot) kalo software butuh compiler pemrograman buat dijadikan kedalam bentuk file.hex 😀

      Balas

  7. Posted by dankers on Maret 25, 2011 at 11:15 pm

    mau buat tapi masih bingung kalo cuma rangkaianya aja yang saya hubungkan trus g pake kode2 kaya di atas kira2 jalan apa g nya mas

    Balas

  8. salam kenal ms fahmi. saya masih bingung dengan potongn progrm diatas. kalau boleh tau program lengkapnya untuk line follower pakai PID, biar lebih jelas. tlong dilengkpin di postingnya yh.

    Balas

  9. Posted by nggez on Maret 30, 2011 at 1:54 pm

    mending pake codevision atau AvrStudio, mas?

    Balas

  10. Posted by darta on April 9, 2011 at 6:51 pm

    Mas lo ts tu kita yg nentuin sndri? brp nilai ts yg mas kasi?

    Balas

  11. Posted by tri on April 28, 2011 at 1:44 am

    mas numpang tanya. kalau P kan jelas Kp.e di programnya jd = Kp.error. tolong dong mas jelasin tentang Kd dan Ki
    I = I + error;
    I = I * Ki;
    rate = error – last_error;
    D = rate * Kd;
    last_error = error;
    dari rumus dasarnya, terima kasih.

    Balas

  12. Posted by indra on Mei 5, 2011 at 9:09 pm

    mz aku indra saya mau tanya…kalo implementasinya PID menggunakan bahasa assembly gmn?

    Balas

  13. Posted by fikar on Mei 17, 2011 at 5:17 pm

    gan,
    ane gak ngerti bedanya derivatif kontrol ama integratif kontrol,trus apa harus dipake semua???
    makasih sebelumnya

    Balas

    • tidak harus dipake semua, derivatif merupakan delta/selisih perubahan error sekarang dengan yg lalu, berfungsi untuk meredam error namun respon sedikit melambat dan mereduksi osilasi…sedangakan itegratif merupakan akumulasi nilai error sekarang dengan yg lalu, responya mempercepat steady state namun dapat meyebabkan osilasi. pada sistem non linier kontrol PD (proportional+derivatif lebih tepat) pada robot line follower ini pun sebenarnya hanya menggunakan PD kontroler 😀

      Balas

  14. Posted by irwan on Juni 3, 2011 at 11:50 pm

    malam mas, wah blognya keren nih…. salam knal mas…
    anu, saya mau tanya tentang masalah self tuning buat PID, bs ajari ga mas…. mau buat TA nih…. makasih mas….

    Balas

  15. Posted by yudi on Juni 17, 2011 at 9:29 pm

    Mass..bisa minta tolong di emailkan..contoh programnya…..agar bisa lebih paham……??
    tulisannya bagus mas….^^

    Balas

  16. Mas, kalau bisa programnya di posting dong, ditunggu ya, makasih

    Balas

  17. Posted by bloon on Juli 22, 2011 at 2:46 pm

    mas..mau share ni..berdasarkan rumus PID diskrit dari AVR..rumusnya begini:

    PID = KP*error+((KP*Ts)/ti)(error+error_last)+((KP*td)/Ts)(error-error_last)

    nah kira2 gmn mas jika dibandingkan dengan rumus yg mas tulis diatas..mohon dikoreksi ulang…soalnya ada perbedaan..kalo perlu dibandingkan dengan rumus yg mas tulis..

    Trims..

    Balas

    • iya itu benar juga…ti adalah time integral dan td adalah time diferensialnya…karena PID ditanam menggunakan bahasa pemrograman jadi supaya lebih sederhana dan mudahmaka dijadikan saja kedalam satu konstanta Kp, Ki dan Kd

      Balas

  18. Posted by bloon on Juli 22, 2011 at 3:01 pm

    Jadi bila dituliskan di BASCOM,kurang lebih seperti dibawah ini:
    ‘PID:
    ‘Error=SP-PV
    ‘P=Kp*Error
    ‘I1=Kp*Ts
    ‘I2=I1/ti
    ‘I3=Error+Error_last
    ‘I=I2*I3
    ‘D1=Kp*td
    ‘D2=D1/Ts
    ‘D3=Error-Error_last
    ‘D=D2*D3

    ‘PID=P+I+D

    Balas

  19. Posted by imron on Agustus 3, 2011 at 1:14 pm

    thanks mas,info2nya mantap…
    ne sya dkasih tahu mas sugeng laksono ank Lj elektro

    Balas

  20. Posted by imron on Agustus 3, 2011 at 1:29 pm

    oh ya mas,gimn cara mencari model matematis dari rotary encoder ?
    kan kalo pake simulink untuk mndaptkan hasil responnya kn hrus memasukkan fungsi transfer dri masing2 blok diagramnya?

    Balas

    • untuk model yang sulit diturunkan menggunakan matematis maka dapat dilakukan dengan cara pendekatan model menggunkanan ARX, ARMAX dan sebagainya… caranya tentukan input dan outputnya bis tu identifikasi menggunakan ARX ato ARMAX menggunakan MATLAB, setelah itu akan kita dapati pendekatan modelnya

      Balas

  21. Posted by tio on Agustus 24, 2011 at 1:34 pm

    makasih mas ilmu ny . .

    mau tanya ni. . pada bagian :

    D1 = Kd * 10 dan I1 = Ki / 10

    bisa tolong dijelaskan munculnya angka 10 darimana?

    Balas

    • angka 10 hanya suatu pembagi dan pangali saja, itu digunakan sebagai batasan nilai PWM yg berinterval pada 0-1023 (10 bit), dan bisa di ubah2 sesuai eksperimentmu 😀

      Balas

  22. mas saya mau nanya,, nilai Ts ( time sampling ) yg dimasukkan ke program satuannya apa ya ?? misalkan saya ingin time samplingnya 10 miliseconds,, nilai ts di program nantinya berapa ?? 10 kah atau 0,01 ?

    Balas

  23. wah,,,blognya keren mas…mas aq mau nanya,,,nilai Kp,Kd, dan Ki itu darimana kita menentukannya…terus kok dikali 10???

    pemrogramannya memakai Code vision AVR bisa nggak….

    terimakasih sebelumnya…

    Balas

  24. Posted by abhilash on Oktober 23, 2011 at 3:55 am

    first of all your robots are superb
    i want to know about wall following robot the sensors (ultrasonic)used in it and their detection of wall,also full specifications of the robot
    apart from that i want the advantages of using pid control
    thank you

    Balas

    • thank you for your visit to my blog
      for an explanation of wall follower robot using PID control because of the ease and reliability of the PID control itself, with the PID controller we do not need much mathematical calculations,
      so that the microcontroller can quickly execute the program.
      sensor in my robot using SRF05 from devantec
      prosesor using microcontroller ATmega32
      driver motor using H-bridge MOSFET

      Balas

  25. Posted by abhilash on Oktober 24, 2011 at 11:18 pm

    Sir,I am working on project to build a wall following robot.the robot has to follow the wall as fast as possible and avoid obstacles with accuracy.
    I started my work and selected these to build the robot:ping sensors(ultrasonic),arduino (micro controller),geared D.C motors.is my selection apt for the robot?Please,help me out in this.
    I dont have much knowledge about using PID controller but knew that it is used to reduce the error .please help me how to get accuracy with PID controller and how to use it with arduino.
    I felt that your wall follower is very fast and accurate,so please guide me with all the stuff that you have to build my bot which is fast and accurate.(even some useful sites)
    I look forward to hear from you

    Balas

  26. Posted by Catur on Januari 19, 2012 at 8:07 am

    mas..boleh minta contoh source codenya gak?? saya gak begitu paham tentang TS dan penulisannya pake CVAVR. tolong ya mas….

    Balas

  27. Posted by indra on Januari 29, 2012 at 10:02 am

    mas ,,contoh kode PID ygmas postkan ,,itu kn rumus2nya,,trus cara manggila ntu rumus untuk mendapatkan hasil yg smoot pada linefolower gmn kalo pake bascom,???apa cara manggilnya sama dengan source codenya assembly???

    Balas

  28. Posted by indra on Maret 15, 2012 at 4:58 pm

    mas ane tanya,,gunanya pake adc saat baca sensor buat apa c mas,,kan kalo sensor uda 4,9v jika kena hitam dan 0,..untuk kena putih,,???soalnya saya pernah pake adc tapi kog datanya kog 0,,saya pake tipe array trus saya geser kekanan 2 x eh nampil dilcd 0..aku binggung mas,,sebenernya ADC buat apa c mas,,>>>???itu ngefek gak mas kalo dibascom avr??

    Balas

  29. Posted by Wahyu on Maret 16, 2012 at 3:09 pm

    Mas mau tanya, cara hapus program yg dh trlanjur terdownload ke mikrokontroler gimana?
    Maklum pemula 😀

    Balas

  30. Posted by Umar on Maret 17, 2012 at 9:56 am

    Mas, minta skematik line follower yang kamu pakai seperti di video itu mas, terima kasih sebelumnya

    Balas

  31. Posted by Alfian on Maret 20, 2012 at 3:22 pm

    Mas, programnya saya compile di bascom kok error, saya masih bingung, bisa minta skematik dan source code bascom yang tinggal compile dan di downloadkan mas?soalnya saya otodidak bljar mikro
    terima kasih mas,

    Balas

  32. assalamualaikum….
    wah bagus bangat tu mas catatannya hehhe
    mas nilai holdnya tu semua sensor ya????bukannya nilai ADC antara satu sensor ke sensor lain tu beda-beda ya????

    Balas

  33. Posted by epong on April 5, 2012 at 5:14 pm

    mas maksudnya pwm 16 bit apa ya???

    Balas

  34. Posted by setyo on Mei 21, 2012 at 10:20 am

    assalamualaikum….
    minta rangkaian robotiknya nih..

    Balas

  35. boleh nanya gak..ini saya bikin lf dan semua sensor nyala cuman pas dicoba ke motor l293d mengeluarkan asap…kira2 ada pencerahan ? batere untuk l293d zippy 11.1 volt

    Balas

  36. Posted by Rizqi-ITS on Juli 28, 2012 at 10:54 pm

    aq masih bingung sama persamaan error=set_point-RPM (kalau di alatQ)
    itu kn setpoint misal aq pingin 100 rpm,sedangkan data yg dihasilkan decoder 250 rpm
    brarti error= -150 rpm,trus Kp aq pasang nilai 1
    kalau pakai kontroler P,brarti kn :
    PWM=set_point – outP
    PWM=100 – (1*(-150))
    PWM=250
    nah yg aq bingung itu,kok bisa PWM=250 dari hasil perhitungan,trus bs menghasilkan kecepatan yg udh dikontrol jadi 100 rpm
    Mhn penjelasannya
    Trims

    Balas

  37. Terimakasih mas, nanti saya pelajari kode nya ini…

    jazakalloh khoiron

    Balas

  38. Posted by Anggi R on Desember 25, 2012 at 12:21 pm

    assalamu’alaikum mas,, mas saya coba pake LF ku codingnya mas tp kok blum jalan ya?? semua data sudah saya cocokan,,

    Balas

  39. Posted by adi on Maret 26, 2013 at 9:31 pm

    Excelent 😀

    Balas

  40. […] PID dan sample coding (BASCOM AVR dan CODEVISION AVR) pada robot line follower ku dapat di lihat disini… dan pengen lihat video […]

    Balas

  41. mas, tuh pke brpa sensor? bisa gak klo gak pke komparator?? saya udh bwt lf, tp bingung program ne. saya bwt 8 sensor, gak pke komparator,, gmna program PIDnya mas ?? help me mas….

    Balas

  42. Posted by ferdian on Juni 22, 2013 at 2:54 pm

    wah postingnya bagus mas,
    Tapi aku mau tanya mas, klo program/algoritma untuk mengintegrasikan antara nilai ADC dengan nilai PWM melalui PID itu bagaimana mas?
    Terima kasih sebelumnya

    Balas

  43. Posted by azwar on Juli 5, 2013 at 9:39 pm

    Mas minta ijin copas boleh ya, pasti aku sertakan sumber nya Thanks …

    Balas

  44. Posted by hendra on Juli 18, 2013 at 1:44 pm

    Mas mau tanya, itu kan yg port c.1 sbgai output, itu masuk kmna ya mas output dari port c.1

    Balas

  45. Posted by elim on Juli 19, 2013 at 9:38 am

    mas mau tanya, PID pada library arduino setelah saya perhatikan memiliki rumus yang berbeda dengan yang mas jelaskan. rumusnya begini

    double input = *myInput;
    double error = *mySetpoint – input;
    ITerm+= (ki * error);
    if(ITerm > outMax) ITerm= outMax;
    else if(ITerm < outMin) ITerm= outMin;
    double dInput = (input – lastInput);

    /*Compute PID Output*/
    double output = kp * error + ITerm- kd * dInput;
    lastInput = input;

    dimana myInput adalah nilai PV. yang saya tidak paham, disini tidak ada last error, adanya lastInput. sebenarnya rumus PID dalam bahasa pemograman bagaimana ya mas? saya belum paham. terimakasih

    Balas

  46. Posted by Suparno on Agustus 11, 2013 at 12:23 am

    Mas minta skemanya ada tidak mas

    Balas

  47. Posted by Muh Dian on November 26, 2013 at 1:22 pm

    mas tolong dkrimkan listing program PIDnya yang lengkap.
    oh iya mas robotnya ng pakai komperatorkn?

    Balas

  48. mas Sp_kecepatan pada program bascom yang pertama itu sp di mana mas..saya mau buat untuk pengendali optocopler,,terimakasih sebelum nya..

    Balas

  49. Mas mau Tanya, kalau pake arduino inisialisasi pwmnya gimana ya?

    Mohon pencerahannnya

    Balas

  50. Waw keren , makin semanget belajar + mendalaminnya , hehe.
    Makasih ilmunya gan. 😀

    Balas

  51. wahh keren bgt . . makasih ilmunya .
    lanjutt deh corat-coretnya . .

    Balas

  52. Posted by MOH SHOLEHUDDIN on Juli 27, 2015 at 2:58 pm

    terimakasih mas atas tutornya…
    mohon maaf lahir dan batin

    Balas

  53. mas itu portc.3 sebagai output gmna mas maksudnya?

    Balas

  54. Posted by Engkuk on Mei 24, 2017 at 1:38 am

    misi mas, untuk konversi nilai adc jadi sensor=0b00000000 caranya gmana mas ? suwun

    Balas

  55. Posted by irfan on Februari 9, 2018 at 1:30 pm

    mas kok saya agak bingung dari perhitungan PID yang dijelaskan. Kenapa berbeda saay penulisan diprogram

    Balas

  56. Posted by Mrx on Februari 28, 2018 at 2:53 pm

    Mau tanya, mohon pnjelasan mengenI sp kecepatan hehe masih bingung, trys apakah sp kecepatan ini ditentukan sndiri untuk kecepatan default robot? Trus apakah sp kecepatan disimpan untuk menjadi sp kecepatan di loop selanjutnya? Terimakash

    Balas

  57. Bang Fahmi, apa fungsi upper sama lowwer itu bang

    Balas

  58. Posted by Agi yang clelaloe caiyang diach celamanya, cemungud ea. on Oktober 8, 2018 at 12:12 am

    maacih gan artikel u sangad membantu q yg lg bingung, pokokx maacih bet.

    ngomong-ngomong bahasanya alay bgst!!!

    Balas

  59. Posted by I Gede Ananda Bagus Saputra on Desember 17, 2018 at 10:00 am

    hallo mas, sangat menarik topiknya, saya mau minta bantuan, saya sedang menyusun Tugas Akhir, didalamnya, saya harus membuat algoritma Auto Tuning PID, yang digunakan untuk melakukan pengukuran sinyal.. itu langkah yang baik seperti apa ya? dimana saya harus memasukan nilai Ts, Tp, Tr, Mp nya dengan nilai yang saya inginkan..

    mohon diskusinya hehhe terimakasih

    Balas

  60. Ada lampiran jurnal yg mendukung ka? Atau judul buku yg menjelaskan rumus p,PD dan pid

    Balas

Tinggalkan Balasan ke Anggi R Batalkan balasan