Sistem kontrol PID dengan Arduino

Sistem kontrol adalah suatu sistem untuk mengendalikan keadaan sehingga diperoleh hasil bersesuaian dengan nilai yang diinginkan se-efektif mungkin.

diagram diatas merupakan sistem kontrol terbuka (open loop), dalam sistem ini tidak ada pemberitahuan (klarifikasi).

Dalam suatu sistem pasti terdapat gangguan dan variabel didalam dan dari luar sistem yang mengakibatkan ketidaksesuaian antara hasil yang diperoleh dan nilai yang diinginkan.

diagram diatas merupakan sistem kontrol tertutup (close loop), dengan adanya umpan balik maka sistem bisa melakukan koreksi.

Untuk menjadikan sistem se-efektif mungkin, perlu dilakukan pemodelan terhadap sistem yang dibangun yakni:

    1. Pemodelan masukan (input)
    2. Pemodelan sistem kontrol
      • hidup mati (on/off)
      • proporsional (P)
      • integral (I)
      • proporsional + integral (PI)
      • proporsional + derivative (PD)
      • proporsional + integral + derivative (PID)
    3. Pemodelan gangguan baik baik dari dalam maupun dari luar, dari dalam lebih kepada keandalan pelaksana/actuator (contohnya motor, pemanas, dll) dan gangguan dari luar adalah kondisi-kondisi yang dapat mempengaruhi kinerja pelaksana (contohnya penambahan beban pada motor, sumber panas lain pada pemanas)
    4. pemodelan pelaksana/actuator adalah karakteristik respon dari pelaksana terhadap perintah/sinyal yang diberikan (contohnya perubahan kecepatan motor terhadap setiap level sinyal yang diberikan)
    5. pemodelan objek/plant menyangkut sifat dan variasi perubahan yang akan terjadi pada objek.
    6. pemodelan sensor juga mencakup karakteristik pembacaan sensor terhadap perubahan dari perangkat pelaksana yang diukur.

Adanya model dari sistem yang dibangun akhirnya dapat diperoleh hasil akhir berikut ini:

Keluaran (objek) = Sistem kontrol x masukan

penyederhanaan ini bisa dilakukan dengan metode laplace. persamaan diatas adalah bagaimana hubungan antara masukan dan keluaran sehingga tergambar perilaku dinamik dari sistem kontrol.

apabila variabel-variabel sistem kontrol tidak memberikan respon yang efektif seperti yang diinginkan, maka dilakukan penyesuaian (tuning)

Sistem kontrol PID (Proportional–Integral–Derivative)

PID merupakan mekanisme pengambil keputusan dalam merespon adanya nilai kesalahan. Mekanisme ini memiliki 3 variabel (Kp, Ki, Kd) yang bisa disesuaikan guna memperoleh respon yang efektif.
Sistem kontrol itu berbasis dengan waktu, untuk memperoleh nilai kesalahan berbasis waktu digunakan :

 	kesalahan = input - sensor;
 	integralKesalahan += kesalahan;
 	derivatifKesalahan = kesalahan - kesalahanLalu;
 	kesalahanLalu = kesalahan;
  1. Proporsional adalah faktor kali dari nilai kesalahan saat ini (berbanding lurus), nilai ini berpengaruh langsung terhadap sensitifitas dan responsifitas suatu sistem. Jika nilai Kp dibuat lebih tinggi maka sistem menjadi lebih responsif terhadap nilai kesalahan, tetapi apabila nilai kesalahan terlalu tinggi maka sistem akan terlalu sensitif.
     	Respon = Kp * kesalahan;
    
  2. Integral adalah faktor kali dari nilai kesalahan sebelumnya, nilai Ki merupakan penjumlahan dari nilai-nilai kesalahan yang berfungsi untuk mempercepat sistem menuju nilai yang diinginkan. Jika nilai Ki terlalu tinggi maka dikhawatirkan sistem akan menjadi tidak stabil (overshoot)
     	Respon += Ki * integralKesalahan;
    
  3. Derivatif adalah faktor kali dari kemungkinan nilai kesalahan yang akan datang, nilai Kd berfungsi untuk memprediksi nilai kesalahan beikutnya disebut juga faktor redam karena nilai Kd akan memperlambat tercapainya nilai yang diinginkan namun membuat sistem lebih stabil
     	Respon += Kd * derivatifKesalahan;
    

sketch/program lengkapnya seperti berikut

float kesalahan;
float integralKesalahan;
float derivatifKesalahan;
float kesalahanLalu = 0;
float Kp, Ki, Kd;
float input;

//Pin
byte sensorPin = A0;
byte Pemanas = 2;

//konstanta
#define Ksensor 0.2 //faktor koreksi sensor panas

void setup() {
  pinMode(Pemanas, OUTPUT);
  Serial.begin(9600);
  Serial.println("Sistem kendali PID dengan Arduino");
  Serial.println("https://www.project.semesin.com");
  
  input = 100;
  Kp = 1;
  Ki = 0.5;
  Kd = -0.2;
}

void loop() {
  float sensor = 1.0 * analogRead(sensorPin) * Ksensor;
  
  float respon = hitungPID(input, sensor);
  analogWrite(Pemanas, respon);
  Serial.print(input);
  Serial.print(",");
  Serial.println(sensor);
}

float hitungPID(float input, float sensor)
{
  kesalahan = input - sensor;
  integralKesalahan += kesalahan;
  derivatifKesalahan = kesalahan - kesalahanLalu;
  kesalahanLalu = kesalahan;
  
  return (Kp * kesalahan) + (Ki * integralKesalahan) + (Kd * derivatifKesalahan);
}