Penerapan Logika Fuzzy untuk Program di Arduino IDE

Indobot Update

Penerapan Logika Fuzzy di Program Arduino
Cara Penerapan Logika Fuzzy untuk Program di Arduino IDE

Halo Fanbot.

Kalian sudah pernah mendengar Logika Fuzzy?

Logika Fuzzy merupakan suatu logika yang memiliki nilai kesamaran (Fuzzyness) antara nilai benar dan nilai salah. Mungkin lebih jelasnya, Logika Fuzzy merupakan logika yang dapat memperjelas nilai antara benar atau salah.

Logika Fuzzy biasa berfungsi untuk teori kontrol,  pengambilan keputusan, dan beberapa bagian dalam sains. Kelebihan dari adanya logika Fuzzy adalah adanya penalaran secara bahasa (linguistic reasoning), sehingga tidak perlu menggunakan persamaan matematik dari obyek yang dikendalikan. Misalnya saja ketika kita ingin membahasakan suatu nilai dari jarak apakah jauh atau dekat, maka dengan logika fuzzy, aturannya bisa menjadi Jauh, sedang, dan dekat. Kemudian kualifikasi range mana yang jauh, sedang, ataupun dekat.

Nah pada bahasan kali ini, kita tidak akan membahas panjang lebar terkait Logika Fuzzy secara teori, namun kita akan membahas terkait penerapan Logika Fuzzy untuk project mikrokontroler, khususnya bagi kalian yang menggunakan Arduino IDE sebagai software pembuatan program.

Belajar Elektronika, Arduino, dan IoT step by step dengan bantuan tangga belajar? Daftar sekarang dan dapatkan PROMO

Metode Logika Fuzzy yang berfungsi untuk program kali ini adalah Mamdani atau Metode Max-Min. Ebrahim Mamdani yang memperkenalkan metode ini pada tahun 1975. Ada beberapa hal yang perlu untuk menentukan hasil dengan metode Mamdani, yaitu:

Pembentukan variabel Input, Output, dan Himpunan

Input merupakan nilai masukan untuk fuzzy, misalnya kita bisa memasukkan nilai jarak, suhu, atau yang lainnya (biasanya yang dapat terbaca oleh sensor analog). Output merupakan nilai keluaran, contohnya seperti servo, kecerahan LED, atau lainnya (biasanya bentuk aktuator analog). Sedangkan untuk himpunan adalah pembagian dari input atau output secara bahasa. contohnya tinggi, sedang, rendah, atau jauh, sedang, dekat.

Fungsi Keanggotaan

Fungsi keanggotaan atau sering kita sebut juga dengan derajat keanggotaan adalah kurva yang menunjukkan pemetaan titik input data ke dalam nilai keanggotaannya.

Aplikasi Operasi Fuzzy

Operasi fuzzy bertugas untuk mengaplikasikan nilai input ke masing-masing pembagian keanggotaan.

Penegasan (defuzzy)

Proses defuzzy adalah proses dari hasil operasi Fuzzy yang kemudian digunakan untuk menentukan output.

4 Hal di atas dapat di terapkan dalam program berikut ini.

 

#include <Fuzzy.h>

Fuzzy *fuzzy = new Fuzzy(); //inisialisasi untuk nama fuzzy

void setup()
{
  Serial.begin(9600); //mengaktifkan serial 9600
  randomSeed(analogRead(0)); //setting randomSeed

  FuzzyInput *distance = new FuzzyInput(1); //input fuzzy (pertama)
  FuzzySet *small = new FuzzySet(0, 20, 20, 40); //nilai FuzzySet input 1
  distance->addFuzzySet(small); //memasukkan nilai small
  FuzzySet *safe = new FuzzySet(30, 50, 50, 70); //nilai FuzzySet input 2
  distance->addFuzzySet(safe); //memasukkan nilai safe
  FuzzySet *big = new FuzzySet(60, 80, 80, 80); //nilai FuzzySet input 3
  distance->addFuzzySet(big); //memasukkan nilai big
  fuzzy->addFuzzyInput(distance); //memasukkan Fuzzy input ke Fuzzy


  FuzzyOutput *speed = new FuzzyOutput(1); //output fuzzy (pertama)
  FuzzySet *slow = new FuzzySet(0, 10, 10, 20); //nilai FuzzySet output 1
  speed->addFuzzySet(slow); //memasukkan nilai slow
  FuzzySet *average = new FuzzySet(10, 20, 30, 40); //nilai FuzzySet output 2
  speed->addFuzzySet(average); //memasukkan nilai average
  FuzzySet *fast = new FuzzySet(30, 40, 40, 50);  //nilai FuzzySet output 3
  speed->addFuzzySet(fast); //memasukkan nilai fast
  fuzzy->addFuzzyOutput(speed);  //memasukkan Fuzzy output ke Fuzzy

  // membuat FuzzyRule "JIKA distance = small MAKA speed = slow"
  FuzzyRuleAntecedent *ifDistanceSmall = new FuzzyRuleAntecedent();
  ifDistanceSmall->joinSingle(small);
  FuzzyRuleConsequent *thenSpeedSlow = new FuzzyRuleConsequent();
  thenSpeedSlow->addOutput(slow);
  FuzzyRule *fuzzyRule01 = new FuzzyRule(1, ifDistanceSmall, thenSpeedSlow);
  fuzzy->addFuzzyRule(fuzzyRule01);

  // membuat FuzzyRule "JIKA distance = safe MAKA speed = average"
  FuzzyRuleAntecedent *ifDistanceSafe = new FuzzyRuleAntecedent();
  ifDistanceSafe->joinSingle(safe);
  FuzzyRuleConsequent *thenSpeedAverage = new FuzzyRuleConsequent();
  thenSpeedAverage->addOutput(average);
  FuzzyRule *fuzzyRule02 = new FuzzyRule(2, ifDistanceSafe, thenSpeedAverage);
  fuzzy->addFuzzyRule(fuzzyRule02);

  // membuat FuzzyRule "JIKA distance = big MAKA speed = high"
  FuzzyRuleAntecedent *ifDistanceBig = new FuzzyRuleAntecedent();
  ifDistanceBig->joinSingle(big);
  FuzzyRuleConsequent *thenSpeedFast = new FuzzyRuleConsequent();
  thenSpeedFast->addOutput(fast);
  FuzzyRule *fuzzyRule03 = new FuzzyRule(3, ifDistanceBig, thenSpeedFast);
  fuzzy->addFuzzyRule(fuzzyRule03);
}

void loop()
{
  // nilai random
  int input = random(0, 80);
  // menuliskan nilai
  Serial.println("\n\n\nEntrance: ");
  Serial.print("\t\t\tDistance: ");
  Serial.println(input);
  // setting nilai random menjadi input
  fuzzy->setInput(1, input);
  // menjalankan fuzzifikasi
  fuzzy->fuzzify();
  // menjadikan nilai output dari hasil defuzzyfikasi
  float output = fuzzy->defuzzify(1);
  // menampilkan pada serial monitor
  Serial.println("Result: ");
  Serial.print("\t\t\tSpeed: ");
  Serial.println(output);
  // update setiap 12 detik
  delay(12000);
}

baca juga: Platform Keren dan Userfriendly untuk Project IoT. Apalagi Kalau Bukan Blynk

Kita coba jelaskan urutannya ya.

Pembentukan variabel Input, Output, dan Himpunan

Perhatikan program berikut ini.

 

  FuzzyInput *distance = new FuzzyInput(1); //input fuzzy (pertama)
  FuzzySet *small = new FuzzySet(0, 20, 20, 40); //nilai FuzzySet input 1
  distance->addFuzzySet(small); //memasukkan nilai small
  FuzzySet *safe = new FuzzySet(30, 50, 50, 70); //nilai FuzzySet input 2
  distance->addFuzzySet(safe); //memasukkan nilai safe
  FuzzySet *big = new FuzzySet(60, 80, 80, 80); //nilai FuzzySet input 3
  distance->addFuzzySet(big); //memasukkan nilai big
  fuzzy->addFuzzyInput(distance); //memasukkan Fuzzy input ke Fuzzy

Program di atas adalah program yang digunakan untuk menentukan input serta himpunannya. Di mana tertulis FuzzyInput(1) sebagai penentuan input pertama. Himpunannya adalah small, safe, dan big. Sedangkan untuk output, perhatikan program di bawah

 FuzzyOutput *speed = new FuzzyOutput(1); //output fuzzy (pertama)

Program ini digunakan untuk penentuan output, di bawah program ini juga merupakan himpunan dari output, yaitu slow, average, speed.

Fungsi Keanggotaan

Fungsi keanggotaan dari program di atas ditentukan pada tiap-tiap himpunan yang kemudian menjadi suatu kurva. Perhatikan program berikut.

FuzzySet *small = new FuzzySet(0, 20, 20, 40); //nilai FuzzySet input 1

Nilai [0, 20, 20, 40] merupakan nilai untuk membentuk kurva small. Begitu juga dengan nilai lainnya dari tiap himpunan.

Aplikasi Operasi Fuzzy

Sebelum masuk ke operasi fuzzy, tentunya perlu adanya aturan fuzzy terlebih dahulu. Program untuk mengaturnya adalah bagian ini.

FuzzyRuleAntecedent *ifDistanceSmall = new FuzzyRuleAntecedent();

  ifDistanceSmall->joinSingle(small);

  FuzzyRuleConsequent *thenSpeedSlow = new FuzzyRuleConsequent();

  thenSpeedSlow->addOutput(slow);

  FuzzyRule *fuzzyRule01 = new FuzzyRule(1, ifDistanceSmall, thenSpeedSlow);

  fuzzy->addFuzzyRule(fuzzyRule01);

Yang dapat diartikan secara garis besar adalah “Jika small, maka slow”, dan beberapa aturan di bawahnya. Kemudian pengeksekusian dilakukan pada void loop dengan menggunakan function fuzzy fuzzy->fuzzify().

Penegasan (defuzzy)

Defuzzifikasi dilakukan pada saat terakhir dengan program  float output = fuzzy->defuzzify(1).

Nilai hasil akhir akan ditampilkan ke serial monitor dalam bentuk angka dari input hingga output hasil logika fuzzy. 

baca juga: Ide Project IoT Menggunakan Aplikasi Blynk yang Bisa Kamu Coba

Program di atas menggunakan 1 input dan satu output. Selain itu, nilai input juga masih berdasarkan nilai random. Jika teman-teman ingin mengaplikasikan ke project yang sebenarnya, silakan tentukan nilai input, output, dan lainnya.

Mau belajar elektronika dasar? Arduino? atau Internet of Things? Ikuti kursus online Indobot Academy!

Ingin Tahu Program Kami Lebih Lanjut?

Silahkan isi Formulir Dibawah Ini untuk Diskusi dengan Tim Indobot Academy.

Baca Juga

Bagikan:

Tags

Tinggalkan komentar

whatsapp whatsapp