/*
Program : Percobaan Delta Rule W menggunakan Arduino Mega
DiBuat Oleh : EruP-RMK
Keluaran : v1.00 / v3.00
Tanggal : 13 Agustus 2020 - 5 Agustus 2023
Untuk : Praktikum Kontrol Cerdas 2 POLITEKNIK ELEKTRONIKA NEGERI SURABAYA (PENS)
Perangkat : Arduino Mega, Plant Emulasi, Koneksi ADC Emulasi dan Pin Port I/O
(sebagai PWM) Emulasi
*/
float Error; // perbedaan antara Y dan D
float Y=0, D=0; // Output Y dan yang diingninkan D
float X=1, W=0; // Input X, Bobot W
#define PeriodeSampling 20 // waktu sampling 20ms
unsigned long t_lalu; // waktu sampling sebelumnya
void setup() // Bagian yang pertama dikerjakan oleh Arduino,
{ // hanya satu kali
Serial.begin(115200); // sesuaikan dengan serial pada program Monitor
Serial.println(" "); // Cetak Label (Legenda) Kosong
t_lalu=millis(); // catat waktu mulai,
// untuk perhitungan Periode Sampling
}
void Adaptive_W() // Proses utama dari sistem,
{ // hanya input output untuk observasi Plant
Y=X*W; // Output Y = Input X * Bobot W
Error=D-Y; // Error = Selisih Yang diinginkan (D) dengan Y
W=W+0.018*Error*X; // Hitung Update Bobot W
}
void Tampilkan() // Untuk mengirimkan data-data sistem ke PC
{
Serial.print("X="); // Tampilkan Label Input X
Serial.print(X);
Serial.print(" W="); // Tampilkan Label Bobot W
Serial.print(W);
Serial.print(" Y="); // Tampilkan Label Output Y
Serial.print(Y);
Serial.print(" D="); // Tampilkan Label yang diinginkan D
Serial.print(D);
Serial.print(" Error="); // Tampilkan Label Error
Serial.println(Error);
Serial.print(X); // Tampilkan Sinyal Input X
Serial.write(' '); // tiap data dipisah dengan spasi " "
Serial.print(W); // Tampilkan Sinyal Bobot W
Serial.write(' ');
Serial.print(Y); // Tampilkan Sinyal Output Y
Serial.write(' ');
Serial.print(D); // Tampilkan Sinyal Yang diinginkan D
Serial.write(' ');
Serial.print(Error); // Tampilkan Sinyal Error
Serial.println(" -5 5"); // Batas plot min max
}
void BacaSerial() // Menerima data perintah dari PC
{ // melalui komunikasi serial
if(Serial.available()) // Apakah ada penerimaan data serial dari PC ?
{
switch(Serial.read()) // akhiri setiap perintah dengan ";" atau "<CR>"
{ // contoh "d2.5;" atau "d2.5<cr>"
case 'd': // Jika Ya, apakah dimulai huruf depan 'd' ?
D=Serial.parseFloat(); // Jika Ya, baca data float berikutnya
// dan simpan sebagai Setting Point
break;
case 'x': // 'x1.23' Nilai input X
X=Serial.parseFloat();
break;
} // Misal data yang diterima, "x12.34<CR>"
} // Set Carriage Return pada terminal,
} // agar saat enter, lansung dikirimkan CR
void loop() // Bagian yang dikerjakan secara
{ // terus-menerus oleh Arduino
BacaSerial(); // Baca perintah serial dari PC
unsigned long t=millis(); // Baca waktu saat ini, dalam ms
if(t-t_lalu>=PeriodeSampling) // Apakah dengan waktu sebelumnya
{ // sudah terpaut 1 periode sampling ?
Adaptive_W(); // Jika ya, lakukan operasi sampling
// untuk menjalankan kontrol
Tampilkan(); // Tampilkan data-data sistem ke PC
// melalui komunikasi serial
t_lalu=t; // dan catat waktu sekarang sebagai waktu lalu,
// untuk perhitungan 1 sampling berikutnya
}
}