17 December 2015

Kontrol PID Pada Arduino: Rangkaian Orde 1


Tutorial ini dilakukan dengan tujuan mempelajari dan memahami karakteristik kontrol PID. Sistem yang digunakan adalah rangkaian listrik orde satu. Tegangan masukan (Vin) pada sistem akan diatur oleh kontrol PID sehingga tegangan keluaran (Vout) dapat selalu sesuai dengan nilai referensi yang diberikan.

Permasalahan dan Signifikansi
Penggunaan kontrol PID sangat populer pada dunia industri karena dianggap mampu mereduksi error serta memiliki solusi yang optimal dalam menghasilkan respon. Konsep PID adalah menghitung nilai error yang merupakan selisih antara nilai keluaran dan nilai referensi, kemudian PID akan memperbaiki nilai masukan sedemikian rupa sehingga nilai error tersebut menjadi tereduksi. 

Pada Kontrol PID dikenal adanya konstanta KP, KI, dan KD. Konstanta tersebut akan sangat menentukan bentuk respon sistem terhadap suatu referensi yang diberikan. Tidak ada nilai konstanta yang dapat dikatakan benar, akurat maupun sempurna, sebab konstanta tersebut akan sangat bergantung terhadap sistem yang dikontrol serta bagaimana seorang owner/user menginginkan respon sistemnya terhadap suatu referensi, maka dari itu nilai KP, KI, dan KD akan sangat bervariasi. Dalam percobaan ini penentuan nilai KP, KI, dan KD akan ditentukan dengan menggunakan perangkat PIDTOOL pada Matlab 2013a.

Teknik Dan Algoritma
Percobaan kontrol PID ini dilakukan pada rangkaian listrik orde satu menggunakan dua resistor 220 Ohm serta satu kapasitor 2200uF seperti terlihat pada gambar 1. Adapun sebab dipilih rangkaian orde satu adalah tidak lain karena rangkaian ini memiliki sifat yang dinamis serta mudah untuk diimplementasikan. 
Gambar 1. Rangkaian orde 1


Rangkaian pada gambar 1 memiliki fungsi transfer sesuai persamaan (1) berikut,

Skema rangkaian percobaan terlihat seperti pada gambar 2, dengan konfigurasi sebagai berikut:
1. Tegangan masukan (Vin) diatur oleh Arduino melalui pin 3 (DAC) dengan metode PWM.
2. Tegangan Keluaran (Vout) dibaca oleh ADC Arduino pada pin A1.
3. Sinyal referensi kerja (untuk mengatur besar Vout) diatur menggunakan potensiometer dan dipasang pada pin ADC A0.

(a)

(b)

Gambar 2. Skema rangkaian percobaan (a) pada eksperimen (b) skematik rangkaian 

Langkah kerja yang yang dilakukan pada percobaan ini adalah sebagai berikut:
  • Menentukan nilai KP, KI, dan KD sesuai respon yang diinginkan dengan menggunakan perangkat PIDTOOL pada Matlab (ada pada Matlab 2013a)
  • Memasukkan nilai KP, KI, dan KD yang didapat dari PIDTOOL ke dalam program Arduino
1. Menentukan Nilai KP, KI, dan KD
Pada langkah pertama ini fungsi transfer sistem sesuai persamaan (1) dituliskan pada command Window Matlab seperti terlihat gambar 3, kemudian dilanjutkan dengan perintah PIDTOOL.

Gambar 3. Penulisan fungsi transfer sistem orde satu pada Matlab

Jendela PIDTOOL akan muncul seperti gambar 4. Jika diinginkan respon sistem seperti gambar, maka konstanta KP, KI, dan KD yang tertulis pada kanan atas dapat digunakan. Terlihat nilai konstanta yang didapat adalah KP= 0.89 KI= 1.83 dan KD=0.077.
 Gambar 4. Jendela pengaturan PID menggunakan PIDTOOL

2. Memasukkan nilai KP, KI, dan KD ke vdalam program Arduino
Arduino memiliki library khusus untuk kontrol PID, Library ini harus diunduh terlebih dahulu pada: https://github.com/br3ttb/Arduino-PID-Library/zipball/master, setelah diunduh masukkan library tersebut ke program Arduino anda. Setelah itu tuliskan program berikut pada IDE:

#include <PID_v1.h>
#include <SoftwareSerial.h>
//Define Variables we'll be connecting to
double Setpoint, Input, Output,Input1;
//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint,0.89,1.83,0.077, DIRECT);
void setup()
{
  //initialize the variables we're linked to
  Input = analogRead(0);
  Serial.begin(4800);
  myPID.SetMode(AUTOMATIC);
}
void loop()
{
  Input1 = analogRead(1); // membaca referensi
  Setpoint = Input1;
  Input = analogRead(0); // membaca tegangan keluaran
  myPID.Compute();
  analogWrite(3,Output);
  Serial.println(Input); // untuk membaca tegangan keluar dalam angka digital 
  delay(100);
}

Nilai Kp, Ki, dan Kd yang didapatkan menggunakan PIDTOOL kemudian dimasukkan pada baris 6 (warna merah), lakukan proses upload, kemudian pembacaan arduino akan tampak seperti gambar 5. Apabila diperhatikan, respon sinyal yang diberikan gambar 5 identik dengan respon pada gambar 4. 


Gambar 5.Respon sinyal Vout terhadap perubahan referensi pada Arduino
dengan KP= 0.89 Ki= 1.83 Kd=0.077



Dalam percobaan ini juga dilakukan tiga kali percobaan dengan nilai konstanta PID dan respon yang berbeda-beda.

Percobaan 1: KP=0, KI=4.456 dan KD=0
Tujuan: Respon stabil dalam 5 detik dengan menghasilkan overshoot
 
Gambar 6. Respon pada PIDTOOL dengan KP=0, KI=4.456 dan KD=0


Gambar 7. Respon pada Arduino dengan KP=0, KI=4.456 dan KD=0

Percobaan 2: KP=0 KI=0.818 dan KD=0
Tujuan: Respon stabil dalam 9 detik tanpa menghasilkan overshoot





Gambar 8. Respon pada PIDTOOL dengan KP=0 KI=0.818 dan KD=0

Gambar 9. Respon pada Arduino dengan KP=0 KI=0.818 dan KD=0

Percobaan 3: KP= 6.175 KI=17.221 KD=0.0475 (tidak Stabil)
Tujuan: Respon stabil kurang dari 1 detik tanpa menghasilkan overshoot

Gambar 10. Respon pada PIDTOOL dengan KP= 6.175 KI=17.221 dan KD=0.0475



Gambar 10. Respon pada Arduino dengan KP= 6.175 KI=17.221 dan KD=0.0475



Kesimpulan dan Saran
Dalam percobaan ini terlihat jelas bahwa konstanta KI, KP dan KD sangat mempengaruhi bentuk respon tegangan keluaran (Vout) pada rangkaian orde satu. Dengan menggunakan PIDTOOL ketiga konstanta tersebut dapat ditemukan dengan mudah, selain itu arduino juga mempermudah implementasi PID pada sistem kontrol. 

Percobaan 1 dan 2 menunjukkan hasil yang identik antara metode simulasi menggunakan PIDTOOL dan hasil eksperimen menggunakan Arduino. Namun pada percobaan 3 terlihat adanya perbedaan yang signifikan, Arduino tidak dapat menghasilkan respon yang stabil. Salah satu sebab yang memungkinkan hal ini untuk terjadi adalah keterbatasan kemampuan prosesor dalam memproses program, selain itu dengan adanya instruksi delay dan Serial.Print, kecepatan proses PID juga dapat terganggu.
Pengembangan Aplikasi
Kontrol PID sangat cocok digunakan pada
  • Pengisian bak air
  • Kontrol motor quadchopter
  • Sistem berbasis sensor dan respon
  • Penstabil tegangan catu daya
  • dll

Referensi
    1. Industrial Applications of PID Control Gregory K. McMillan
    2. http://en.wikipedia.org/wiki/PID_controller
    3. http://playground.arduino.cc/Code/PIDLibrary
    4. Modern control engineering, Katsuhito Ogata

      13 comments:

      1. Keterlambatan sistem menggunakan arduino ini apa tidak beresiko bila digunakan untuk kendali quadcopter!

        ReplyDelete
        Replies
        1. beresiko sih mas, cuma mau gimana lagi ya namanya juga low cost, hehehe....

          Delete
      2. Gan, kalo saya mau ngasih input PIDnya itu dari sensor (dht) bagaimana ya?

        ReplyDelete
        Replies
        1. sensor memberikan nilai PID? maksudnya gimana ya Gan?

          Delete
      3. Itu matlab sama arduino nya pisah ataw saling komunikasi untuk tuning pidnya?

        ReplyDelete
        Replies
        1. tuning PIDnya terpisah Ryan, itu hanya menampilkan pembacaan arduino ke layar cpu via matlab. Kalau mau dibuat saling komunikasi saya yakin bisa, cuma saya pun belum pernah buat, hehe....

          Delete
      4. This comment has been removed by the author.

        ReplyDelete
      5. mohon maaf sebelumnya pada kodingan arduino di atas, membaca referensi bukannya pada pin analog 0 dan membaca tegangan output pada pin analog 1 ya? tetapi mengapa saat d kodingan terbalik?

        ...analogRead (1) //membaca referensi

        ReplyDelete
        Replies
        1. Eh iya benar Mba Tuti, terima kasih ya koreksinya, iya betul saya yang terbalik tulis komnetar pada baris program itu, InsyaAllah saya perbaiki.
          jadi yang benar seperti yang mba Tuti sebutkan:

          Input1 = analogRead(1); // membaca tegangan keluaran
          Setpoint = Input1;
          Input = analogRead(0); // membaca refernsi

          padahal di gambar skema rangkaian sudah saya buat seperti itu ya, hehe...,
          Sekali lagi terima kasih

          Delete
      6. Om, fungsi transfer itu darimana ya om?

        ReplyDelete
      7. Cara mndptkn transfer fungsi bgamna ya ? Koo tdk di jelaskan .. tiba2 muncul tranfer fungsinya

        ReplyDelete