Motor DC merupakan salah satu penggerak yang banyak digunakan dalam teknologi kontrol, baik di rumah tangga maupun industri. Motor DC banyak digunakan di dunia industri, misalnya sebagai penggerak utama dari AGV (Automated Guided Vehicle), sedangkan di dunia kampus biasanya digunakan untuk lomba Kontes Robot Indonesia kategori robot yang menggunakan roda sebagai penggerak utamanya, misalnya divisi KRAI dan KRSBI beroda.
Untuk mendapatkan pergerakan robot yang halus, dengan kecepatan stabil, dibutuhkan suatu sistem kontrol (kendali) untuk menjaga kecepatan konstan ketika di sistem real. Ada banyak sekali metode kontrol yang dapat digunakan untuk kontrol kecepatan, misalnya PID (Proportional Integral Derivative), Fuzzy Logic, Fuzzy-PID, LQR (Linear Quadratic Regulator), multivariable dan sebagainya.
Pada tutorial kali ini, akan diambil contoh penggunaan kontrol PID untuk kontrol kecepatan motor DC. Jadi penjelasan secara sederhananya, kontrol PID akan membuat kecepatan motor DC menuju set point (kecepatan yang diinginkan) dengan memperkecil error kecepatan yang muncul berdasarkan feedback sensor encoder. Sensor encoder digunakan untuk menghitung kecepatan motor.
Simulasi Kontrol Kecepatan Motor DC menggunakan kontrol PID
Komponen-komponen yang dibutuhkan untuk simulasi kontrol kecepatan motor DC adalah Arduino, DC Motor with encoder, H-bridge Motor Driver L293D, Diode, Power Supply. Berikut merupakan langkah-langkah untuk membuatnya.
- Masuk ke https://www.tinkercad.com/dashboard, kemudian klik Circuits → Create new Circuit
- Ganti nama rangkaian simulasi dengan double click pada pojok kiri atas → ketikkan nama yang diinginkan. Misalnya : “Simulasi Kontrol Kecepatan Motor DC”. Kemudian pilih Components → All, kemudian susun modul Arduino, DC Motor with encoder, H-bridge Motor Driver L293D, Diode, Power Supply seperti pada rangkaian di bawah ini.
3. Klik Code → Blocks → Text → klik Continue untuk memasukkan code Arduino ke dalam rangkaian simulasi.
Arduino Code :
//motor directory #define CW 0 #define CCW 1 //motor control pin #define motorDirPin 7 #define motorPWMPin 9 #define enablePin 8 //encoder pin #define encoderPinA 2 #define encoderPinB 4 //encoder var int encoderPos = 0; //parameter PID float Kp = 0.0225; float Ki = 0.0005; float Kd = 0.001; float error; float last_error = 0; float targetrpm = -150; float pwm_ = 0; // tambahan int interval = 50; // dalam millisecond 60 //float Ts = interval/1000; int pulseperrotasi = 366; // jumlah pulsa dalam 1 kali rotasi encoder float rpm; unsigned int waktulama, waktusekarang; //external interrupt encoder void doEncoderA() { digitalRead(encoderPinB)?encoderPos--:encoderPos++; } float ambildataenco() { waktusekarang = millis(); float newposition = encoderPos; if(waktusekarang - waktulama >= interval) { rpm = (newposition/pulseperrotasi)/(float(interval)/60000); //Serial.println(rpm); waktulama = waktusekarang; encoderPos = 0; } return rpm; } void setup() { //setup interrupt pinMode(encoderPinA, INPUT_PULLUP); pinMode(encoderPinB, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(encoderPinA), doEncoderA,RISING); //setup motor driver pinMode(motorDirPin, OUTPUT); pinMode(enablePin, OUTPUT); digitalWrite(enablePin, HIGH); Serial.begin(9600); } // 336 pulse/rotation void loop() { float control; int velocity; float P_v, I_v, D_v, rate; float Ts = float(interval)/1000; float rpm_ = ambildataenco(); error = targetrpm - rpm_; //Serial.println(error); P_v = Kp*error; rate = error - last_error; D_v = (rate*Kd)/Ts; I_v = Ki*(error+last_error)*Ts; control = P_v + I_v + D_v; last_error = error; //Serial.println(Ts); pwm_ = pwm_ + control; //if (pwm_ > 255) {pwm_ = 255;} //if (pwm_ < 0) {pwm_ = 0;} Serial.println(rpm_); digitalWrite(motorDirPin, CCW); analogWrite(motorPWMPin, pwm_-255); }
4. Untuk memunculkan hasil print di serial monitor serta grafik. Klik serial monitor di bagian bawah code, serta klik icon grafik di pojok kanan bawah. Selanjutnya, jalankan simulasi dengan klik Start Simulation.
5. Tampilan simulasi ketika program dijalankan dapat dilihat pada gambar di bawah ini. Pada gambar terlihat bahwa motor mulai berputar, dimana hasil perhitungan nilai sensor tampil pada serial monitor, selain itu ada grafik juga yang dapat memudahkan kita melakukan analisis data. Pada grafik terlihat kalau nilai pembacaan sensor berhasil menuju set point (error kecepatannya mengecil).
6. Untuk menghentikan simulasi, silahkan klik Stop Simulation.
Beberapa catatan penting tentang PID:
Parameter PID (Kp, Ki, Kd) dapat dihitung menggunakan berbagai macam metode, seperti metode Ziegler-Nichols, Root Locus, Cohen-Coon, dan sebagainya. Baik tidaknya performa dari kontrol kecepatan dengan PID bergantung pada parameter Kp, Ki, dan Kd yang diterapkan pada sistem.
Sekian tutorial dari saya, terima kasih.