/*
Program : Percobaan Delta Rule W+B 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, B=0; // Input X, Bobot W dan Bias B
#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_B() // Proses utama dari sistem,
{ // hanya input output untuk observasi Plant
Y=X*W+B; // Output Y = Input X * Bobot W + Bias B
Error=D-Y; // Error = Selisih Yang diinginkan (D) dengan Y
W=W+0.02*Error*X; // Hitung Update Bobot W
B=B+0.05*Error; // Hitung Update Bias B
}
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(" B="); // Tampilkan Label Bias B
Serial.print(B);
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(B); // Tampilkan Sinyal Bias B
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;
case 'w': // 'w1.23' Nilai Bobot W
W=Serial.parseFloat();
break;
case 'b': // 'b1.23' Nilai Bias B
B=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_B(); // 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
}
}
mega:SCL
mega:SDA
mega:AREF
mega:GND.1
mega:13
mega:12
mega:11
mega:10
mega:9
mega:8
mega:7
mega:6
mega:5
mega:4
mega:3
mega:2
mega:1
mega:0
mega:14
mega:15
mega:16
mega:17
mega:18
mega:19
mega:20
mega:21
mega:5V.1
mega:5V.2
mega:22
mega:23
mega:24
mega:25
mega:26
mega:27
mega:28
mega:29
mega:30
mega:31
mega:32
mega:33
mega:34
mega:35
mega:36
mega:37
mega:38
mega:39
mega:40
mega:41
mega:42
mega:43
mega:44
mega:45
mega:46
mega:47
mega:48
mega:49
mega:50
mega:51
mega:52
mega:53
mega:GND.4
mega:GND.5
mega:IOREF
mega:RESET
mega:3.3V
mega:5V
mega:GND.2
mega:GND.3
mega:VIN
mega:A0
mega:A1
mega:A2
mega:A3
mega:A4
mega:A5
mega:A6
mega:A7
mega:A8
mega:A9
mega:A10
mega:A11
mega:A12
mega:A13
mega:A14
mega:A15