Selamat datang di sonoku.com

Kendali Motor Pada Prototipe Overhead Crane Menggunakan Metode Fuzzy Logic Controller

Pada artikel ini dirancang kendali motor pada prototype overhead crane dengan Fuzzy Logic Controller (FLC). Kontrol motor menggunakan implementasi fuzzy logic dengan input berupa sensor ultrasonik dan potensiometer. Nilai dari kedua sensor ini yang akan mempengaruhi kecepatan motor pada plant. Sensor ultrasonik akan dipasang pada salah satu ujung crane dan sensor potensiometer akan dipasang pada tali crane untuk mengontrol motor guna mempertahankan sudut pergerakan tali.

Perancangan Sistem

Perancangan hardware dari crane yang digunakan beserta motor dan sensor yang digunakan dapat dilihat pada gambar di bawah ini

Gambar 1. Diagram Blok Crane Control

Motor diletakkan diujung lintasan crane. Saat mikrokontroler (arduino) diaktifkan, sensor jarak dan sensor sudut akan diaktifkan lalu motor DC juga diaktifkan untuk bergerak memindahkan barang. Motor DC yang menggerakkan body motor pada crane akan menyebabkan ayunan pada tali crane. Ayunan tersebut akan dideteksi oleh sensor sudut yang akan mengirimkan hasil pembacannya ke mikrokontroler bersamaan dengan hasil pembacaan sensor jarak/posisi. Sistem fuzzy logic controller akan memproses inputan tersebut kemudian menghasilkan sinyal keluaran ke driver motor DC. Driver motor DC akan menghasilkan tegangan yang sesuai untuk menggerakkan motor DC dengan kecepatan tertentu agar crane dapat sampai ke lintasan bagian depan.

Gambar 2. Perangkat Keras Prototype Overhead Crane

Perancangan Fuzzy Logic Controller

Perancangan sistem fuzzy logic controller ini akan menggunakan metode Sugeno. Proses dalam sistem fuzzy ini meliputi crisp input, fuzzifikasi, evaluasi aturan, defuzzifikasi dan crisp output.

a. Crisp Input

Sistem fuzzy menerima crisp input dari sensor sudut dan sensor jarak/posisi. Crisp input ini kemudian melalui proses fuzzifikasi dengan membership function dari masing-masing input, sehingga nilai crisp input berubah menjadi suatu derajat keanggotaan dengan nilai antara 1 dan 0. Penggunaan parameter sudut dan jarak/posisi sebagai nilai crisp input didasarkan atas tujuan dari pengontrolan sistem overhead crane, yaitu mencapai posisi yang diinginkan dengan ayunan seminimal mungkin pada beban.

b. Fuzzifikasi

Pada proses ini, crisp input yang telah diubah menjadi himpunan fuzzy dengan cara dipetakan menggunakan membership function untuk tiap-tiap input. Pemilihan bentuk-bentuk pada tiap parameter dari membership function dari setiap input dijelaskan dibawah ini.
1. Input Sudut
Membership function sensor sudut disusun oleh fungsi segitiga dan trapezium. Pada membership function ini terdapat beberapa kriteria di dalamya yaitu:

  1. Neg-Big
  2. Neg-Small
  3. Zero
  4. Pos-Small
  5. Pos-Big

Gambar 3. Pengaturan Membership Function Input Sudut

2. Input Jarak/Posisi

Membership function sensor jarak/posisi disusun oleh fungsi segitiga dan trapesium. Pada membership function ini terdapat beberapa kriteria di dalamya yaitu:

  1. Zero
  2. Close
  3. Medium
  4. Far

Gambar 4. Pengaturan Membership Function Input Jarak/Posisi

3. Output Tegangan

Membership function juga dibuat pada bagian output. Pada membership function ini terdapat beberapa kriteria di dalamya yaitu:

  1. Pos-High = 250 PWM
  2. Pos-Medium = 200 PWM
  3. Pos-Small = 150 PWM
  4. Zero = 90 PWM
  5. Neg-Medium = 50 PWM
c. Evaluasi Aturan

Jumlah maksimal rules yang ada adalah jumlah membership function dari input sudut dikalikan dengan jumlah membership function dari sensor posisi, yaitu 5 x 4 = 20. Untuk menyederhanakan tahapan rule evaluasi, maka hanya akan digunakan 10 rule sebagai aturan dalam kontrol fuzzy ini. Rule tersebut adalah sebagai berikut:

  1. IF posisi = far OR sudut = zero THEN output = pos_medium
  2. IF posisi = far OR sudut = neg_small THEN output = pos_high
  3. IF posisi = far OR sudut = neg_big THEN output = pos_high
  4. IF posisi = medium OR sudut = neg_small THEN output = pos_medium
  5. IF posisi = medium OR sudut = neg_big THEN output = pos_low
  6. IF posisi = medium OR sudut = pos_small THEN output = pos_medium
  7. IF posisi = close OR sudut = zero THEN output = pos_low
  8. IF posisi = close OR sudut =neg_small THEN output = neg_medium
  9. IF posisi = close OR sudut = pos_small THEN output = pos_low
  10. IF posisi = zero OR sudut = zero THEN output = zero
d. Defuzzifikasi

Input dari proses defuzzifikasi adalah nilai-nilai yang didapatkan setelah semua rule dievaluasi. Pada metode sugeno, nilai tersebut menggunakan metode Smallest of Maximum untuk mendapatkan nilai Output. Pada metode smallest of maximum solusi crisp diperoleh dengan cara mengambil nilai terkecil dari domain yang memiliki nilai keanggotaan maksimum.

 e. Crisp Output

Nilai crisp output didapatkan setelah melalui proses defuzzifikasi. Nilai output tersebut kemudian dikonversi menjadi sinyal PWM yang kemudian dikirim ke driver motor DC untuk menggerakkan motor DC tersebut sesuai dengan tegangan dari sinyal PWM yang diberikan.

Kode Program Arduino

a. Kode Program Inisialisasi

Untuk inisialisasi awal pada program arduino adalah sebagai berikut:

int PinSudut = A0;
float cranejarak, cranesudut, defuzzy, firing, temp;
float sudut [5];
float jarak [4];
float rules [4][4];
float rule0, rule1, rule2, rule3, rule4, rule5, rule6, rule7, rule8, rule9;
int enablePin = 11;
int in1Pin = 10;
int in2Pin = 9;
int switchPin = 7;

#include <NewPing.h>
#define TRIGGER_PIN 13
#define ECHO_PIN    6
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

void setup() {
  Serial.begin (9600);
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(enablePin, OUTPUT);
  pinMode(switchPin, INPUT_PULLUP);
} 
 b. Kode Program Fuzzifikasi

Untuk perancangan fuzzifikasi, dirancang dua buah fuzzifikasi yaitu untuk input pembacaan sudut dan pembacaan jarak. Adapun koding fuzzifikasi untuk pembacaan sudut yang dirancang adalah sebagai berikut:

void FuzzySudut(){
  // untuk NegBig
    if (cranesudut <= 10)
  { sudut [0] = 1;}
    else if (cranesudut > 10 && cranesudut <= 30)
  { sudut [0] = (30-cranesudut)/(30-10);}
    else
  { sudut [0] = 0;}
  // untuk NegSmall
    if (cranesudut <= 25)
  { sudut [1] = 0;}
    else if (cranesudut > 25 && cranesudut <= 34)
  { sudut [1] = (cranesudut-25)/(34-25);}
    else if (cranesudut > 34 && cranesudut <= 43)
  { sudut [1] = (43-cranesudut)/(43-34);}
    else
  { sudut [1] = 0;}
  // untuk ZeroSudut
    if (cranesudut <= 35)
  { sudut [2] = 0;}
    else if (cranesudut > 35 && cranesudut <= 40)
  { sudut [2] = (cranesudut-35)/(40-35);}
    else if (cranesudut > 40 && cranesudut <= 45)
  { sudut [2] = (45-cranesudut)/(45-40);}
    else
  { sudut [2] = 0;}

  // untuk PosSmall
    if (cranesudut <= 37)
  { sudut [3] = 0;}
    else if (cranesudut > 37 && cranesudut <= 46)
  { sudut [3] = (cranesudut-37)/(46-37);}
    else if (cranesudut > 46 && cranesudut <= 55)
  { sudut [3] = (55-cranesudut)/(55-46);}
    else
  { sudut [3] = 0;}
  // untuk PosBig
    if (cranesudut <= 45)
  { sudut [4] = 0;}
    else if (cranesudut > 45 && cranesudut <= 70)
  { sudut [4] = (cranesudut-45)/(70-45);}
    else
  { sudut [4] = 1;}
}

Adapun kode program fuzzifikasi untuk pembacaan jarak yang dirancang adalah sebagai berikut:

void FuzzyJarak(){
  // untuk ZeroJarak
    if (cranejarak <= 3)
  { jarak [0] = 1;}
    else
  { jarak [0] = 0;}
  
  // untuk close
    if (cranejarak <= 2)
  { jarak [1] = 0;}
    else if (cranejarak > 2 && cranejarak <= 5)
  { jarak [1] = (cranejarak-2)/(5-2);}
    else if (cranejarak > 5 && cranejarak <= 10)
  { jarak [1] = (10-cranejarak)/(10-5);}
    else
  { jarak [1] = 0;}
  
  // untuk med
    if (cranejarak <= 5)
  { jarak [2] = 0;}
    else if (cranejarak > 5 && cranejarak <= 20)
  { jarak [2] = (cranejarak-5)/(20-5);}
    else if (cranejarak > 20 && cranejarak <= 40)
  { jarak [2] = (40-cranejarak)/(40-20);}
    else
  { jarak [2] = 0;}
  
  // untuk far
    if (cranejarak <= 30)
  { jarak [3] = 0;}
    else if (cranejarak > 30 && cranejarak <= 50)
  { jarak [3] = (cranejarak-30)/(50-30);}
    else
  { jarak [3] = 1;}
}
 c. Kode Program Rule Evaluation

Selanjutnya untuk perancangan rule base, dirancang terlebih dahulu firing strength untuk masing masing masing rule. Untuk koding rule evaluation pada arduino dirancang sebagai berikut:

void RuleEvaluation(){
 int i, j;
 for ( i=0; i<=3; i=i+1)
 {
   for ( j=0; j<=3; j=j+1)
   { temp = max (jarak[i], sudut[j]);
     rules [i][j] = temp; } 
 } 
rule0 = rules [3][2]; //pos_med
 rule1 = rules [3][1]; //pos_high
 rule2 = rules [3][0]; //pos_high
 rule3 = rules [2][1]; //pos_med
 rule4 = rules [2][0]; //pos_low
 rule5 = rules [2][3]; //pos_med
 rule6 = rules [1][2]; //pos_low
 rule7 = rules [1][1]; //neg_medium
 rule8 = rules [1][3]; //pos_low
 rule9 = rules [0][2]; //zero
}
d. Kode Program Defuzzifikasi

Setelah merancang koding untuk fuzzifikasi suhu, kelembapan dan rule base pada arduino, selanjutnya adalah tahap defuzzifikasi. Pada tahap ini, digunakan metode weighted average dengan koding sebagai berikut:

void Defuzzifikasi(){
  RuleEvaluation();
  float pos_high = 250;
  float pos_med = 200;
  float pos_low = 150;
  float zero = 90; 
  float neg_med = 50;
  firing=0;
  defuzzy = (rule0 * pos_med) + (rule1 * pos_high) + (rule2 * pos_high) + (rule3 * pos_med) + (rule4 * pos_low) + (rule5 * pos_med) + (rule6 * pos_low) + (rule7 * neg_med) + (rule8 * pos_low) + (rule9 * zero);
  int i, j;
  for ( j=0; j<=3; j=j+1)
  {  for ( i=0; i<=3; i=i+1)
    {   firing = firing + rules [i][j];
    }  
  }
  defuzzy = defuzzy / firing;
}
 e. Kode Program Set Motor

Setelah mendapatkan hasil dari deffuzifikasi sesuai dengan yang diinginkan, maka gerakan motor kemudian dapat dikontrol.

void loop(){
  int speed = defuzzy;
  boolean reverse = digitalRead(switchPin);
  setMotor(speed, reverse);
}
void setMotor(int speed, boolean reverse)
{
  analogWrite(enablePin, speed);
  digitalWrite(in1Pin, ! reverse);
  digitalWrite(in2Pin, reverse);
}

 Pengujian dan Analisa Data

Pada pengujian sistem crane yang digunakan, diuji hasil perancangan dari metode fuzzy logic controller yang sudah ditanamkan untuk mengontrol kecepatan pada motor DC pada plan crane yang telah dirancang. Metode FLC ini ditanamkan pada microcontroller Arduino, yang kemudian mengatur output PWM ke driver motor yang selanjutnya digunakan untuk mengatur kecepatan rotasi motor. Kecepatan rotasi motor diatur sesuai dengan nilai yang diberikan dari sensor potensiometer saat mendeteksi kemiringan sudut dan sensor ultrasonic saat mendeteksi posisi barang yang diangkut. Inputan dari sensor tersebut diproses sebagai data sebagai parameter input untuk kontrol FLC.

Telah dilakukan tiga kali pengujian dengan menggunakan beban yang sama, namun diberi gangguan yang berbeda-beda. Respon yang didapatkan dapat dilihat pada gambar-gambar di bawah ini:

Gambar 5. Hasil Pengujian

Pengujian pertama dilakukan dengan beban yang tidak diberikan noise. Pengujian kedua dilakukan dengan beban diberikan noise berupa dorongan ke belakang pada saat crane dijalankan (starting). Pengujian ketiga dilakukan dengan beban diberikan noise berupa dorongan ke depan pada saat crane dijalankan (starting).

Pada pengujian pertama, beban tidak diberi noise dan bergerak pada sudut sesuai dengan sudut referensi yang diharapkan, yaitu 40°. Respon sensor sudut yang dihasilkan menunjukkan benar bahwa sudut berada pada sudut referensi yang diharapkan, namun pada input sensor jarak, terdapat overshoot yang tidak linear dari input yang seharusnya. Dimana dengan perbandingan terhadap waktu, input sensor ini seharusnya menurun secara linear sehingga output PWM juga akan menurun secara linear, mengingat input sudut tidak berubah.

Pada pengujian kedua, beban diberi dorongan ke belakang pada saat starting crane dilakukan. Dorongan ini menjadi noise bagi input sensor itu sendiri, noise ini tidak terlalu berpengaruh pada input sudut sehingga respon yang diberikan mendekati respon pada pengujian pertama. Hal ini dapat terjadi karena beban dapat segera kembali ke posisi semula sesaat setelah diberi dorongan. Jika diperhatikan lebih baik, gambar respon dari input sudut ini tidak sehalus pada saat perngujian pertama. Namun, respon outputnya terlihat lebih stabil dibandingkan dengan pengujian pertama.

Pada pengujian ketiga, beban diberi dorongan ke depan pada saat starting crane dilakukan. Dorongan ini menjadi noise bagi input sensor sudut karenan ayunan pada beban yang mengakibatkan sudut berubah-ubah disekitar sudut normal (seperti berosilasi dalam waktu singkat). Dengan adanya gangguan berupa noise dari sudut ini, dapat dilihat bahwa respon PWM output tetap memberikan hasil yang baik dan mengalami sedikit peningkatan dan penurunan pada steady state dengan tujuan untuk mengurangi ayunan yang terjadi pada beban.

Dari ketiga pengujian yang dilakukan di atas, dapat dilihat bahwa input sensor jarak sedikit tidak stabil karena banyak terdapat overshoot dan bersifat tidak linear. Rise time pada sistem ini cukup cepat, karena dari ketiga pengujian yang dilakukan, semuanya menghasilkan output PWM sesuai dengan yang diharapkan tanpa ada waktu tunda yang lama untuk mencapai kecepatan motor yang diinginkan.

Kekurangan dari perancangan ini adalah tegangan yang masuk ke motor bersumber dari arduino yaitu 5 v, sehingga perputaran motor tidak maksimal. Namun dengan begitu, dengan menggunakan FLC, motor mampu bergerak dengan mempertimbangkan sudut dan jarak yang akan ditempuh. Semakin besar selisih sudut dari sudut yang diinginkan, maka motor akan bergerak lebih lambat dan semakin mendekati tujuan, pergerakan motor juga akan menjadi lebih pelan untuk tetap menjaga sudut dari bebannya.

 Penutup

Dari hasil pengujian dan analisa untuk kontrol motor pada plan crane menggunakan sensor potensiometer dan sensor ultrasonic diatas maka disimpulkan bahwa:

  1. Sistem Fuzzy Logic Controller yang diterapkan pada pengontrolan kecepatan motor pada plan crane dengan menggunakan mikrokontroller berupa arduino dapat bekerja dengan baik sesuai dengan desain yang telah dirancang sebelumnya.
  2. Saat beban diberi ayunan, pergerakan motor dapat menyesuaikan dengan posisi sudut barang dan menstabilkan ayunan yang diberikan menuju posisi sudut/set awal yang telah ditentukan.
  3. Kekurangan dari perancangan ini adalah tegangan yang masuk ke motor bersumber dari arduino yaitu 5 v, sehingga perputaran motor tidak maksimal. Selain itu, respon input masih banyak terdapat overshoot sehingga tidak linear.

 Referensi

Candra, Irwing Antonio T. dan Muliady. 2011. Sistem Crane dengan Pengontrol Fuzzy untuk Meredam Ayunan. Jurusan Teknik Elektro, Universitas Kristen Maranatha, Bandung

Leave a Reply