Implementasi Fuzzy Logic Controller untuk Kontrol Kecepatan Motor DC pada Prototype Kipas Angin
Artikel ini membahas perancangan sebuah aplikasi dengan menggunakan mikrokontroler Arduino yang dapat berguna sebagai alat untuk mengaktifkan atau menonaktifkan kipas angin pada suatu ruangan. Perancangan sistem ini dilengkapi dengan beberapa perangkat keras yaitu sebuah motor DC 1000 rpm, baling-baling, sensor ultrasonic, sensor suhu LM35, Arduino Uno, rangkaian driver motor dan baterai 10 Volt. Rancangan dari sistem ini digunakan untuk mengatur putaran kipas angin yang disesuaikan dengan temperatur dan jarak dari suatu objek. Adapun diagram hardware nya sebagai berikut :
Gambar 1. Diagram Blok Sistem
Tujuan dari percobaan ini mengatur kecepatan putaran motor. Sistem pengontrolan kecepatan tersebut dilakukan dengan cara membaca nilai sensor yang kemudian diubah menjadi nilai tegangan yang mewakili keadaan sistem. Bagian-bagian dari hardware:
- Mikrokontroler berfungsi sebagai otak dari sistem. Sebagai otak dari sistem, mikrokontroller ini akan berfungsi membaca nilai sensor LM35 dan ultrasonic yang kemudian akan diproses menjadi sebuah nilai RPM yang nilainya akan diberikan kepada driver motor.
- Data dari sensor LM35 dan ultrasonic kemudian akan di proses oleh mikrokontroler. Data tersebut berupa tegangan yang menjadi nilai input yang kemudian diolah menggunakan fuzzy logic controller.
- Motor driver DC berfungsi sebagai pengatur kecepatan motor dengan input yang diberikan oleh mikrokontroler menuju motor.
- Baterai merupakan sumber tegangan untuk masing-masing hardware yang membutuhkan.
Berikut ini adalah tabel koneksi pin Arduino dan IC L293d yang digunakan :
Tabel 1. Koneksi Pin Arduino
Masing-masing penggunaan pin yang terdapat pada Tabel 1. akan diinsialisasikan pada program Arduino sebagai langkah awal pembacaan data. SedangkanTabel 2. menunjukkan koneksi yang terdapat pada rangkaian tersebut berfungsi untuk mengatur PWM motor yang dalam hal ini bernilai 0 – 255. Nilai tersebut akan diatur melalui sebuah formula di kode program Arduino.
Tabel 2. Koneksi Pin L293D
Perancangan Fuzzy Logic Controller
Tahapan perancangan software terdiri dari perancangan fuzzy logic controller yang menggunakan software Arduino. Digunakan Serial Monitor software Arduino untuk menampilkan hasil pembacaan sistem. Dari data tersebut akan diamati respon dari kontrol yang digunakan. Sistem dikendalikan menggunakan metode Fuzzy Logic Controller. Pada percobaan ini, input yang digunakan berjumlah 2 buah yaitu sensor suhu LM35 dan sensor ultrasonik PIR. Nilai tersebut akan berpengaruh pada kecepatan motor DC yang pada percobaan ini diatur melalui penetapan nilai PWM. Terdapat 3 buah nilai PWM yaitu 100 untuk kecepatan motor lambat, 200 untuk kecepatan motor sedang dan 250 untuk kecepatan motor cepat.
Proses Fuzzy Logic Controller ini akan diterapkan melalui coding Arduino Uno. Langkah awal dalam proses algoritma software ini adalah inisialisasi variable yang digunakan sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//Sensor Ultrasonic #include <NewPing.h> #define TRIGGER_PIN 4 // Arduino pin tied to trigger pin on the ultrasonic sensor. #define ECHO_PIN 6 // Arduino pin tied to echo pin on the ultrasonic sensor. #define MAX_DISTANCE 50 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm. NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance. float sensorUS; int enablePin = 11; int in1Pin = 10; int in2Pin = 9; int switchPin = 7; float defuz, pwm; //Sensor Suhu float PinSuhu = A2; int vin; int PinUS = A1; float sensorSuhu; float temp; //Rule Base float suhu [3]; float jarak [3]; float rule [3][3]; float rule00, rule01, rule02; float rule10, rule11, rule12; float rule20, rule21, rule22; |
Adapun source code pembacaan sensor dan driver motor sebagai berikut :
1 2 3 4 5 6 7 8 9 10 11 12 |
//suhu vin = analogRead(PinSuhu); sensorSuhu = (500*vin)/1024; // ultrasonic unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS). sensorUS = (sonar.convert_cm(uS)); // Convert ping time to distance and print result (0 = outside set distance range, no ping echo) void setMotor(int speed, boolean reverse) { analogWrite(enablePin, speed); digitalWrite(in1Pin, ! reverse); digitalWrite(in2Pin, reverse); } |
Setelah inisialisasi variable dan pembacaan sensor, langkah selanjutnya merancang Fuzzy Logic Controller. Fuzzy Logic Controller tersebut dibagi menjadi 3 tahap yaitu :
1. Kode Program Fuzzifikasi
Pada percobaan ini, masing-masing sensor memiliki fungsi keanggotaan yang terdiri dari 3 keanggotaan. Fungsi keanggotaan sensor suhu (LM35) terdiri dari Dingin, Hangat dan Panas. Hal ini ditunjukkan pada Gambar 3 di bawah ini.
Gambar 3. Fungsi Keanggotaan Suhu
Berikut ini merupakan source code dari fuzzifikasi sensor suhu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
void FuzzySuhu(){ // untuk suhu dingin if (sensorSuhu <= 22.5) { suhu [0] = 1;} else if (sensorSuhu > 22.5 && sensorSuhu <= 25) { suhu [0] = (25 - sensorSuhu)/(25 - 22.5); } else { suhu [0] = 0;} // untuk suhu hangat if (sensorSuhu <= 22.5) { suhu [1] = 0;} else if (sensorSuhu > 22.5 && sensorSuhu <= 25) { suhu [1] = (sensorSuhu-22.5)/(25-22.5);} else if (sensorSuhu > 25 && sensorSuhu <= 27.5) { suhu [1] = (27.5-sensorSuhu)/(27.5 - 25);} else { suhu [1] = 0;} // untuk suhu panas if (sensorSuhu <= 25) { suhu [2] = 0;} else if (sensorSuhu > 25 && sensorSuhu <= 27.5) { suhu [2] = (sensorSuhu-25)/(27.5-25);} else { suhu [2] = 1;} } |
Untuk sensor ultrasonic juga memiliki 3 fungsi keanggotaan yaitu Dekat, Sedang, dan Jauh seperti yang ditunjukkan pada Gambar 4. Adapun fungsi dari sensor ini untuk mengukur jarak dari suatu objek yang terdeteksi.
Gambar 4. Fungsi Keanggotaan Jarak
Berikut ini merupakan source code dari fuzzifikasi sensor ultrasonic
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
void FuzzyJarak(){ // untuk kondisi dekat if (sensorUS <= 10) { jarak [0] = 1;} else if (sensorUS > 10 && sensorUS <= 20) { jarak [0] = (20 - sensorUS)/(20 - 10); } else { jarak [0] = 0;} // untuk kondisi sedang if (sensorUS <= 10) { jarak [1] = 0;} else if (sensorUS > 10 && sensorUS <= 20) { jarak [1] = (sensorUS -10)/(20-10);} else if (sensorUS > 20 && sensorUS <= 40) { jarak [1] = (40-sensorUS)/(40 - 20);} else { jarak [1] = 0;} // untuk kondisi jauh if (sensorSuhu <= 20) { jarak [2] = 0;} else if (sensorUS > 20 && sensorUS <= 30) { jarak [2] = (sensorUS-20)/(30-20);} else if (sensorUS > 30) { jarak [2] = 1;} } |
Untuk nilai PWM motor akan diatur sebagai berikut
Gambar 5. Fungsi Keanggotaan Kecepatan Motor
Bersambung ke artikel berikutnya disini.