B. Teori Dasar
Logika Fuzzy pertama kali dikembangkan oleh Lotfi A. Zadeh pada
tahun 1965. Teori ini banyak diterapkan diberbagai bidang, antara lain
representasu pikiran manusia kedalam suatu sistm. Banyak alasan mengapa
penggunaan logika fuzzy ini sering dipergunakan antra lain ,konsep logika
fuzzy yang mirip dengan konsep berpikir manusia. Sistem fuzzy dapat
merepresentasikan pengetahuan manusia ke dalam bentuk matematis
dengan lebih menyerupai cara berpikir manusia. Pengontrolan dengan
logika fuzzy mempunyai kelebihan yaitu dapat mengontrol sistem yang
kompleks, non-linier, atau sistem yang sulit direpresentasikan kedalam
bentuk matematis. Selain itu, informasi berupa pengetahuan dan
pengalaman mempunyai peranan penting dalam mengenali perilaku sistem
di dunia nyata.
Logika Fuzzy adalah suatu cara yang tepat untuk memetakan suatu
ruang input ke dalam ruang output. Untuk sistem yang sangat rumit,
penggunaan logika fuzzy ( fuzzy logic ) adalah salah satu pemecahnya.
Sistem tradsional dirancang untuk mengontrol keluaran tunggal yang
berasal dari beberapa masukan yang tidak saling berhubungan. Karena
ketidak tergantungan ini, penambahan masukan yang baru akan
memperumit proses kontrol dan membutuhkan proses perhitungan kembali
dari semua fungsi. Kebalikannya, penambahan masukan baru pada sistem
fuzzy, yaitu sistem yang bekerja berdasarkan prinsip-prinsip logika fuzzy,
hanya membutuhkan penambahan fungsi keanggotaan yang baru dan
aturan-aturan yang berhubungan dengannya.
Logika fuzzy juga memiliki himpunan fuzzy yang mana pada dasarnya,
teori himpunan fuzzy emerupakan perulasan dari teori himpunan klasik.
Dimana dengan logika fuzzy, hasil yang keluar tidak akan selalu konstan
dengan input yang ada. Cara kerja logika fuzzy secara garis besar terdiri
dari input, proses dan output. Logika fuzzy merupakan suatu teori
himpunan logika yang dikembangkan untuk mengatasi konsep nilai yang
terdapat diantara kebenaran ( truth ) dan kesalahan ( false ). Dengan
menggunakan fuzzy logic nilai yang dihasilkan bukan hanya ya ( 1 ) atau
tidak ( 0 ) tetapi seluruh kemungkinan diantara 0 dan 1.
Proteus adalah sebuah software untuk mendisain PCB yang juga
dilengkapi dengan simulasi Pspice pada level skematik sebelum rangkaian
skematik di-upgrade ke PCB sehingga sebelum PCBnya di cetak kita akan
tahu apakah PCB yang akan kita cetak apakah sudah benar atau tidak.
Proteus mampu mengkombinasikan program ISIS untuk membuat
skematik desain rangkaian dengan program ARES untuk membuat layout
PCB dari skematik yang kita buat. Software Proteus ini bagus digunakan
untuk desain rangkaian mikrokontroller.
Proteus juga bagus untuk belajar elektronika seperti dasar-dasar
elektronika sampai pada aplikasi pada mikrokontroller. Software Proteus
ini menyediakan banyak contoh aplikasi desain yang disertakan pada
instalasinya. Sehingga memungkinkan kita bisa belajar dari contoh-contoh
yang sudah ada. Proteus lebih memiliki kelebihan pada desainnya yang
sederhana, sangat mudah dan bagus digunakan untuk perancangan
rangkaian mikrokontroller yang akan sangat membantu digunakan oleh
mahasiswa yang mengambil mata kuliah berhubungan dengan
mikrokontroller. Kelebihannya yang lain adalah sebelum PCB dicetak
skematiknya bisa disimulasikan dulu. Desain-desainnya bisa digabungkan
dan masih banyak lagi kelebihan yang dimiliki Proteus.
D. Keselamatan Kerja
1. Awali praktikum dengan berdoa.
2. Gunakan pakain praktik pada saat praktikum.
3. Jauhkan peralatan yang tidak diperlukan dari meja kerja.
4. Bekerjalah dengan keadaan tanpa tegangan pada saat membuat dan
mengubah rangkaian.
5. Tanyakan kepada dosen pengampu atau staff pengajar ketika ada hal-
hal yang masih kurang paham.
E. Skema
F. Langkah Kerja
1. Instal dahulu komponen Arduino Nano pada software ISIS Proteus
anda. Library bisa di download di http://unyku.ga/o8CQm cari file
“Library Arduino in Proteus.rar” kemudian klik download.
2. Ekstrak dan buka folder “Library Arduino in Proteus”, Copy ke-enam
file library tersebut dan masukkan ke dalam folder LIBRARY pada
instalasi folder Proteus yaitu “C:\Program Files\Labcenter
Electronics\Proteus 7 Professional\LIBRARY\”
3. Untuk melihat hasilnya, re-open atau tutup dan buka kembali aplikasi
ISIS Proteus.
4. Lihat dikomponen Library atau tekan P, lalu cari dengan keyword
Arduino, Setelah library Arduino Nano terinstal kemudian siapkan alat
dan bahan yang dibutuhkan.
5. Buatlah rangkaian pada software ISIS Proteus sesuai pada gambar 20 di
atas.
6. Setelah selesai membuat rangkaian kemudian buka software Arduino
IDE dan ketikkan program berikut ini pada software Arduino IDE.
//motor kanan
#define IN1 2
#define IN2 3
#define pwm_kanan 6
//motor kanan
//motor kiri
#define IN3 4
#define IN4 7
#define pwm_kiri 5
//motor kiri
//lcd
#include <LiquidCrystal.h>
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
/*
* The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
*/
//lcd
//variabel global
int a,b,i,j,speed_left,speed_right,sensorA,sensorB;
float x, y, error, d_error, z1=60,z2=80,a1=-145.5556,a2=-
80,a3=0,a4=80,a5=145.5556;//z = luas dan a = COA out;
float u_error[3],u_d_error[3],u[3][3], errorneg, errorzero, errorpos,
d_errorneg, d_errorzero,d_errorpos;
float nilai_awal,beda_pwm, validasi, pembilang, penyebut;
//variabel global
void setup() {
lcd.begin(20, 4);
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(pwm_kanan, OUTPUT);
pinMode(pwm_kiri, OUTPUT);
pinMode(16, INPUT_PULLUP);
pinMode(17, INPUT_PULLUP);
pinMode(18, INPUT_PULLUP);
}
void loop() {
nilai_awal = 100;
baca_sensor(); //membaca nilai error dan d_error
fuzzyfikasi();
rule();
defuzzyfikasi();
kendali_motor(speed_left,speed_right);
int tombol_fuzzyfikasi = digitalRead(16);
int tombol_rule = digitalRead(17);
int tombol_defuzzyfikasi = digitalRead(18);
if(a>=241) {error=8;}
else if(a>=227) {error=7;}
else if(a>=213) {error=6;}
else if(a>=199) {error=5;}
else if(a>=185) {error=4;}
else if(a>=171) {error=3;}
else if(a>=157) {error=2;}
else if(a>=143) {error=1;}
else if(a>=129) {error=0;}
else if(a>=115) {error=
-1;}
else if(a>=101) {error=
-2;}
else if(a>=87) {error=
-3;}
else if(a>=73) {error=
-4;}
else if(a>=59) {error=
-5;}
else if(a>=45) {error=
-6;}
else if(a>=31) {error=
-7;}
else if((a<31)&&(a>=0)) {error=
-8;}
if(b>=248) {d_error=16;}
else if(b>=241) {d_error=15;}
else if(b>=234) {d_error=14;}
else if(b>=227) {d_error=13;}
else if(b>=220) {d_error=12;}
else if(b>=213) {d_error=11;}
else if(b>=206) {d_error=10;}
else if(b>=199) {d_error=9;}
else if(b>=192) {d_error=8;}
else if(b>=185) {d_error=7;}
else if(b>=178) {d_error=6;}
else if(b>=171) {d_error=5;}
else if(b>=164) {d_error=4;}
else if(b>=157) {d_error=3;}
else if(b>=150) {d_error=2;}
else if(b>=143) {d_error=1;}
else if(b>=136) {d_error=0;}
else if(b>=129) {d_error=
-1;}
else if(b>=122) {d_error=
-2;}
else if(b>=115) {d_error=
-3;}
else if(b>=108) {d_error=
-4;}
else if(b>=101) {d_error=
-5;}
else if(b>= 94) {d_error=
-6;}
else if(b>= 87) {d_error=
-7;}
else if(b>= 80) {d_error=
-8;}
else if(b>= 73) {d_error=
-9;}
else if(b>= 66) {d_error=
-10;}
else if(b>= 59) {d_error=
-11;}
else if(b>= 52) {d_error=
-12;}
else if(b>= 45) {d_error=
-13;}
else if(b>= 38) {d_error=
-14;}
else if(b>= 31) {d_error=
-15;}
else if((b<31)&&(b>= 0)) {d_error=
-16;}
}
void fuzzyfikasi_error() {
x = error;
//u_error[0] = Negatif 1
//u_error[1] = Zero 1
//u_error[2] = Positif 1
if(x >= 5)
{
u_error[0]=0;
u_error[1]=0;
u_error[2]=1;
errorneg = u_error[0]
;
errorzero = u_error[1];
errorpos = u_error[2]; }
void fuzzyfikasi_perubahan_error() {
y = d_error;
// u_d_error[0]=Negatif 2
// u_d_error[1]=Zero 2,
//u_d_error[2]=Positif 2
if(y >= 8)
{
u_d_error[0]=0;
u_d_error[1]=0;
u_d_error[2]=1;
}
else if(y >= -8)
{
u_d_error[0]=(0-y)/8;
u_d_error[1]=(y+8)/8;
u_d_error[2]=0;
}
else if(y < -8)
{
u_d_error[0]=1;
u_d_error[1]=0;
u_d_error[2]=0;
}
d_errorneg = u_d_error[0];
d_errorzero = u_d_error[1];
d_errorpos = u_d_error[2];
}
void fuzzyfikasi()
{
fuzzyfikasi_error();
fuzzyfikasi_perubahan_error();
}
void rule() // basis aturan
{
for(i=0;i<=2;i++)
{
for(j=0;j<=2;j++)
{
if(u_error[i]<u_d_error[j])
{
u[i][j]=u_error[i]; // menggunakan operator AND
}
else
{
u[i][j]=u_d_error[j];
}
}
}
}
void defuzzyfikasi()
{
//menggunakan metode mamdani dan defuzzyfikasi meggunakan metode centroid
of area
pembilang
=(u[0][0]*a5*z1)+(u[0][1]*a4*z2)+(u[0][2]*a3*z2)+(u[1][0]*a4*z2)+(u[1][1]*a
3*z2)+(u[1][2]*a2*z2)+(u[2][0]*a3*z2)+(u[2][1]*a2*z2)+(u[2][2]*a1*z1);
penyebut
=(u[0][0]*z1)+(u[0][1]*z2)+(u[0][2]*z2)+(u[1][0]*z2)+(u[1][1]*z2)+(u[1][2]*
z2)+(u[2][0]*z2)+(u[2][1]*z2)+(u[2][2]*z1);
else if(pwm_ki<0)
{
analogWrite(pwm_kiri, -pwm_ki);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
//IN3 = 1;
//IN4 = 0;
}
if(pwm_ka>=0) //motor kanan maju
{
analogWrite(pwm_kanan, pwm_ka);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
//IN1 = 0;
//IN2 = 1;
}
lcd.setCursor(0, 1);lcd.print("neg=");
lcd.setCursor(4, 1);lcd.print(errorneg);
lcd.setCursor(9, 1);lcd.print("neg=");
lcd.setCursor(14, 1);lcd.print(d_errorneg);
lcd.setCursor(0, 2);lcd.print("zer=");
lcd.setCursor(4, 2);lcd.print(errorzero);
lcd.setCursor(9, 2);lcd.print("zer=");
lcd.setCursor(14, 2);lcd.print(d_errorzero);
lcd.setCursor(0, 3);lcd.print("pos=");
lcd.setCursor(4, 3);lcd.print(errorpos);
lcd.setCursor(9, 3);lcd.print("pos=");
lcd.setCursor(14, 3);lcd.print(d_errorpos);
}
void display_rule()
{
lcd.setCursor(0, 0);lcd.print("er=");
lcd.setCursor(3, 0);lcd.print(error);
lcd.setCursor(9, 0);lcd.print("d_er=");
lcd.setCursor(14, 0);lcd.print(d_error);
lcd.setCursor(0, 1);lcd.print("1=");
lcd.setCursor(2, 1);lcd.print(u[0][0]);
lcd.setCursor(7, 1);lcd.print("2=");
lcd.setCursor(9, 1);lcd.print(u[0][1]);
lcd.setCursor(14, 1);lcd.print("3=");
lcd.setCursor(16, 1);lcd.print(u[0][2]);
lcd.setCursor(0, 2);lcd.print("4=");
lcd.setCursor(2, 2);lcd.print(u[1][0]);
lcd.setCursor(7, 2);lcd.print("5=");
lcd.setCursor(9, 2);lcd.print(u[1][1]);
lcd.setCursor(14, 2);lcd.print("6=");
lcd.setCursor(16, 2);lcd.print(u[1][2]);
lcd.setCursor(0, 3);lcd.print("7=");
lcd.setCursor(2, 3);lcd.print(u[2][0]);
lcd.setCursor(7, 3);lcd.print("8=");
lcd.setCursor(9, 3);lcd.print(u[2][1]);
lcd.setCursor(14, 3);lcd.print("9=");
lcd.setCursor(16, 3);lcd.print(u[2][2]);
}
void display_defuzzyfikasi()
{
lcd.setCursor(0, 0);lcd.print("er=");
lcd.setCursor(3, 0);lcd.print(error);
lcd.setCursor(9, 0);lcd.print("d_er=");
lcd.setCursor(14, 0);lcd.print(d_error);
7. Setelah program ditulis dan pastikan tidak ada program yang salah
kemudian lakukan proses compile program.
8. Setelah program selesai di compile, periksa dimana direktori file hex di
bagian bawah Arduino, lihat gambar di bawah ini.
9. Buka ISIS Protus Klik dua kali komponen Arduino Nano, pada bagian
program file klik icon folder kemudian bukalah direktori berikut sebagai
contoh
"C:\Users\USER~1.USE\AppData\Local\Temp\buildef30c71794278a0
4d1962dea16 3641ef.tmp/Job_8.ino.hex" Catatan: letak direktori file
tersebut bisa berbeda-beda pastikan dahulu anda cek di bagian bawah
software Arduino IDE.
10. Setelah itu klik OK kemudian jalankan simulasi proteus.
11. Setelah program telah di kirim ke Arduino nano dengan baik maka LCD
20x4 akan menampilkan tulisan seperti gambar di bawah ini:
-8 1 0.00 0.00
-7 1 0.00 0.00
-6 1 0.00 0.00
-5 1 0.00 0.00
0 0.00 1 0.00
5 0.00 0.00 1
6 0.00 0.00 1
7 0.00 0.00 1
8 0.00 0.00 1
19.Ulangi langkah kerja 15 s.d. 18 untuk nilai error dan D_error sesuai tabel
7 kemudian catat hasilnya seperti pada tabel 6.
G. Metode
a. Metode Fuzzy Mamdani dan Defuzyfikasi centroid
Metode Fuzzy Mamdani merupakan salah satu bagian dari Fuzzy
Inference System yang berguna untuk penarikan kesimpulan atau
keputusan terbaik dalam permasalahan yang tidak pasti. Proses
pengambilan keputusan dengan menggunakan Metode Fuzzy
Mamdani untuk memperoleh keputusan yang terbaik, dilakukan
dengan melalui beberapa tahapan, yaitu pembentukan himpunan
fuzzy; aplikasi fungsi implikasi; komposisi aturan; defuzzifikasi.
Kelebihan pada Metode Fuzzy Mamdani adalah lebih spesifik,
artinya dalam prosesnya Metode Fuzzy Mamdani lebih
memperhatikan kondisi yang akan terjadi untuk setiap daerah
fuzzynya, sehingga menghasilkan hasil keputusan yang lebih akurat.
Prosedur Metode Fuzzy Mamdani Seperti telah dikemukakan pada
subbab sebelumnya bahwa proses pengambilan kesimpulan atau
keputusan dengan menggunakan Metode Fuzzy Mamdani dilakukan
melalui beberapa tahapan, yaitu pembentukan himpunan fuzzy;
aplikasi fungsi implikasi; komposisi aturan; defuzzifikasi. Pada
Metode Fuzzy Mamdani ini fungsi keanggotaan yang digunakan
adalah fungsi keanggotaan trapesium, fungsi keanggotaan segitiga
dan fungsi keanggotaan bahu kiri atau kanan. Hal ini dikarenakan
pada fungsi keanggotaan trapesium terdapat dua titik dari himpunan
fuzzy yang memiliki nilai keanggotaan satu. Apabila hanya terdapat
satu titik dari himpunan fuzzy yang memiliki nilai keanggotaan satu,
maka digunakan fungsi keanggotaan segitiga. Fungsi keanggotaan
bahu kiri atau kanan digunakan untuk mengawali dan mengakhiri
variabel suatu daerah fuzzy.
H. Program
LiquidCrystal lcd(13, 12, 11, 10, 9, 8); // Pin yang disambungkan antara
arduino dengan LCD
LCD RS pin to digital pin 12 // Pin dihubungkan ke digital pin 12
LCD Enable pin to digital pin 11 // Pin dihubungkan ke digital pin 11
LCD D4 pin to digital pin 5 // Pin dihubungkan ke digital pin 5
LCD D5 pin to digital pin 4 // Pin dihubungkan ke digital pin 4
LCD D6 pin to digital pin 3 // Pin dihubungkan ke digital pin 4
LCD D7 pin to digital pin 2 // Pin dihubungkan ke digital pin 2