Tutorial Pemrograman Fuzzy Logic (1)

Fuzzy logic banyak diaplikasikan dalam berbagai bidang, salah satunya adalah sebagai alat bantu pengambil keputusan. Dalam artikel ini diberikan contoh proses pembuatan program fuzzy logic dalam bahasa pemrograman C# yang diaplikasikan untuk menentukan kecepatan konveyor berdasarkan tinggi dan berat benda. Implementasi bahasa C# ini untuk pembentukan fungsi keanggotaan, proses penalaran fuzzy metode Sugeno, proses fuzzifikasi dan defuzzifikasi akan dibahas. Program diuji terhadap suatu kondisi berat benda dan tinggi benda tertentu untuk mengetahui hasilnya.

Artikel ini bersumber dari salah satu tugas mata kuliah mekatronika di kampus yang berjudul “Pengaturan Kecepatan Konveyor berdasarkan Tinggi dan Berat Barang Menggunakan Metode Fuzzy Logic”. Metode penalaran yang digunakan adalah metode MAMDANI atau metode MIN-MAX. Program yang telah dibuat kemudian di-download ke mikrokontroler ATmega16 yang berfungsi sebagai kontroller utamanya untuk mengatur kecepatan konveyor. Compiler yang digunakan adalah Codevision AVR.

Seperti sudah dijelaskan sebelumnya pada artikel “Apa itu Fuzzy Logic?” ada tiga tahapan yaitu fuzzifikasi, evaluasi rule, dan defuzzifikasi.

diagram fuzzy logic
Gambar 1 Diagram Fuzzy Logic

Pemrograman Fuzzification (Fuzzifikasi)

Yang pertama kali dilakukan dalam pemrograman fuzzy logic adalah menentukan fungsi keanggotaan (membership function) dari setiap input.

berat benda
Gambar 2 Fungsi dan derajat keanggotaan beban benda (ons)

tinggi benda
Gambar 3 Fungsi dan derajat keanggotaan ketinggian benda (cm)

Selanjutnya adalah menentukan perhitungan untuk setiap nilai tinggi dan berat benda yang sudah ditentukan fungsi dan derajat keanggotaanya. Prinsipnya adalah matematika, yaitu untuk menghitung tinggi segitiga jika diketahui lebarnya. Gambar berikut adalah prinsip perhitungan derajat keanggotaan jika bentuk grafiknya berbentuk segitiga dan trapesium.

segitiga fuzzy logic
Gambar 4 Perhitungan Grafik Segitiga

naik turun fuzzy logic

Gambar 5 Perhitungan Grafik Trapesium

Selanjutnya bagian yang paling penting yaitu implemetasi perhitungan di atas ke bahasa C# di Codevision AVR. Yang pertama dilakukan adalah membuat sub program untuk perhitungan derajat keanggotaannya dan tentu saja jangan lupa untuk membuat variabel untuk perhitungannya.

Sebagai contoh, berikut syntax untuk fuzzifikasi beban ringan. Lihat nilai-nilai yang ada di gambar 2 di atas. Perhitungan menggunakan perhitungan trapesium pada gambar 5.

float berat; // input berat benda
float beban_ringan; // derajat keanggotaan beban ringan

unsigned char fuzzifikasi_beban_ringan()
{
 beban_ringan=0;
 if (berat<=5 && berat>0)  // berat di antara 0 - 5
  { beban_ringan=1; }
 else if (berat5)  // berat di antara 5 - 10
  { beban_ringan=(10-berat)/5; }
 else if (berat>=10)  // berat lebih dari 10
  { beban_ringan=0; };
 return beban_ringan;
};

Contoh yang lain, berikut syntax untuk menghitung derajat keanggotaan ketinggian sedang. Perhatikan gambar 3 dan gambar 4 untuk melakukan perhitungan berikut.

float ketinggian; // input berat benda
float ketinggian_sedang; // derajat keanggotaan ketinggian sedang

unsigned char fuzzifikasi_ketinggian_sedang()
{
 ketinggian_sedang=0;
 if (ketinggian<=2 || ketinggian>=10) // ketinggian kurang dr 2 atau lebih dr 10
  { ketinggian_sedang=0; }
 else if (ketinggian>2 && ketinggian<6) // ketinggian diantara 2 - 6   
  { ketinggian_sedang=(ketinggian-2)/4; }  
  else if (ketinggian>6 && ketinggian<10) // ketinggian diantara 6 - 10
  { ketinggian_sedang=(10-ketinggian)/4; }
 else if (ketinggian==6) // ketinggian = 6
  { ketinggian_sedang=1; };
 return ketinggian_sedang;
};

Nah sekarang buat sub program untuk masing- masing derajat keanggotaan yang akan dihitung. Berikut adalah source code lengkap fuzzifikasi dengan Codevision AVR. Data-data hasil fuzzifikasi akan ditampilkan pada kayar LCD alphanumeric.

/*****************************************************
FUZZIFICATION
by Amar
https://amarnotes.wordpress.com
*****************************************************/
#include
#include
// Alphanumeric LCD Module functions
#include

// Inisialisasi atau identifikasi sub program yang dipakai
void fuzzifikasi();
unsigned char fuzzifikasi_beban_ringan();
unsigned char fuzzifikasi_beban_sedang();
unsigned char fuzzifikasi_beban_berat();
unsigned char fuzzifikasi_ketinggian_rendah();
unsigned char fuzzifikasi_ketinggian_sedang();
unsigned char fuzzifikasi_ketinggian_tinggi();

unsigned char kata1[16],kata2[16]; // variabel untuk menampilkan data ke LCD

float berat,ketinggian; // data masukan berat dan tinggi
float beban_ringan,beban_sedang,beban_berat; // derajat keanggotaan berat
float ketinggian_rendah,ketinggian_sedang,ketinggian_tinggi; // derajat keanggotaan tinggi

unsigned char fuzzifikasi_beban_ringan()
{
 beban_ringan=0;
 if (berat<=5 && berat>0)
  { beban_ringan=1; }
 else if (berat5)
  { beban_ringan=(10-berat)/5; }
 else if (berat>=10)
  { beban_ringan=0; };
 return beban_ringan;
};

unsigned char fuzzifikasi_beban_sedang()
{
 beban_sedang=0;
 if (berat<=5 || berat>=15)
  { beban_sedang=0; }
 else if (berat>5 && berat<10)   
  { beban_sedang=(berat-5)/5; }  
 else if (berat>10 && berat<15)   
  { beban_sedang=(15-berat)/5; }  
 else if (berat==10)   
  { beban_sedang=1; };  
 return beban_sedang; 
};   

unsigned char fuzzifikasi_beban_berat() 
{  
 beban_berat=0;  
 if (berat>10 && berat<15)   
  { beban_berat=(berat-10)/5; }  
 else if (berat>=15)
  { beban_berat=1; }
 else if (berat<=10)
  { beban_berat=0; };
 return beban_berat;
};

unsigned char fuzzifikasi_ketinggian_rendah()
{
 ketinggian_rendah=0;
 if (ketinggian<=2 && ketinggian>0)
  { ketinggian_rendah=1; }
 else if (ketinggian2)
  { ketinggian_rendah=(6-ketinggian)/(4); }
 else if (ketinggian>=6)
  { ketinggian_rendah=0; };
 return ketinggian_rendah;
};

unsigned char fuzzifikasi_ketinggian_sedang()
{
 ketinggian_sedang=0;
 if (ketinggian<=2 || ketinggian>=10)
  { ketinggian_sedang=0; }
 else if (ketinggian>2 && ketinggian<6)   
  { ketinggian_sedang=(ketinggian-2)/4; }  
 else if (ketinggian>6 && ketinggian<10)   
  { ketinggian_sedang=(10-ketinggian)/4; }  
 else if (ketinggian==6)   
  { ketinggian_sedang=1; };  
 return ketinggian_sedang; 
};   

unsigned char fuzzifikasi_ketinggian_tinggi() 
{  
 ketinggian_tinggi=0;  
 if (ketinggian>6 && ketinggian<10)   
  { ketinggian_tinggi=(ketinggian-6)/4; }  
 else if (ketinggian>=10)
  { ketinggian_tinggi=1; }
 else if (ketinggian<=6)
  { ketinggian_tinggi=0; };
 return ketinggian_tinggi;
};

// Kumpulkan semua sub program fuzzifikasi menjadi satu buah sub program
void fuzzifikasi()
{
 fuzzifikasi_beban_ringan();
 fuzzifikasi_beban_sedang();
 fuzzifikasi_beban_berat();

 fuzzifikasi_ketinggian_rendah();
 fuzzifikasi_ketinggian_sedang();
 fuzzifikasi_ketinggian_tinggi();
};

void main(void)
{
PORTA=0x00; DDRA=0x00;
PORTB=0x00; DDRB=0x00;
PORTC=0x00; DDRC=0xFF;
PORTD=0x00; DDRD=0x00;

lcd_init(16);

while (1)
      {
       // masukkan input berat dan tinggi benda
       berat=13.2;
       ketinggian=5.8;

       fuzzifikasi(); // memanggil fungsi fuzzifikasi

       //menyusun karakter ke dalam satu baris dengan menggunakan fungsi sprintf
       sprintf(kata1, "%0.2f %0.2f %0.2f",ketinggian_rendah,ketinggian_sedang,ketinggian_tinggi);
       lcd_gotoxy(0,0); lcd_puts(kata1); // mengirim data ke LCD

       sprintf(kata2, "%0.2f %0.2f %0.2f",beban_ringan,beban_sedang,beban_berat);
       lcd_gotoxy(0,1); lcd_puts(kata2);
      }
}

Selesai bagian fuzzifikasi, selanjutnya adalah pemrograman bagian evaluasi rule dan defuzzifikasi. Akan dibahas pada bagian 2 nanti ya.
Semoga tutorial ini bermanfaat 🙂

Advertisements

Posted on November 9, 2013, in Electronics, Fuzzy Logic, Mikrokontroler, Pemrograman, Tutorial and tagged , , , , , , , , , , . Bookmark the permalink. 7 Comments.

  1. bagian 2 nya sudah keluar belum ?

  2. iya nih .. bagian 2 nya mana .. 🙂 … di tunggu yah … 🙂

  3. mas…bagian 2 nya udah keluar belum? ditunggu nih….butuh banget soalnya mas…

    ohiya coding diatas untuk C atau C#?? sepertinya C di CV AVR ya? CMIIW…
    makasih mas..ditunggu segera balasannya…

  4. Reblogged this on MUMIRO and commented:
    jancuk

  5. keren sam. pengen bljr bnyak 😀

  6. Keren mas, tp bagian 2 nya mana nih ?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: