DAFTAR PUSTAKA
Abdul Kadir. 2013. Panduan Praktis Mempelajari Aplikasi Mikrokontroler dan Pemrogramannya Menggunakan Arduino. Yogyakarta: Penerbit ANDI Agus Naba. 2009. Belajar Cepat Fuzzy Logic Menggunakan MATLAB. Yogyakarta: Penerbit ANDI. Dwi Ana Ratna Wati. 2011. Sistem Kendali Cerdas. Yogyakarta: Graha Ilmu. http://arduino.cc/ http://innovativeelectronics.com/ http://instructables.com/ Muhammad Syahwil. 2013. Panduan Mudah Simulasi & Praktek Mikrokontroler Arduino. Yogyakarta: ANDI OFFSET Sri Kusumadewi dan Hari Purnomo. 2010. Aplikasi Logika Fuzzy Untuk Pendukung Keputusan Edisi 2. Yogyakarta: Graha Ilmu.
67 http://digilib.mercubuana.ac.id/
LAMPIRAN /***************************************************************** ZUL IRFAN 4412010029 PROGRAM FUZZY LOGIC TUGAS AKHIR ****************************************************************/ #include
#include #include #include #include #include #include #include #include #include #define TRIGGER_PIN 12 // pin Arduino dihubungkan ke pin trigger ultrasonic sensor. #define ECHO_PIN 11 // pin Arduino dihubungkan ke pin echo ultrasonic sensor. #define MAX_DISTANCE 380 // Jarak maksimum ping yang kita inginkan (dalam cm). NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); //motor int arahKi = 8; int arahKa = 9; int enaKi = 4; int enaKa = 7; int pwmKi = 5; int pwmKa = 6; int pwmR; int pwmL; //Fuzzy const int numOfReadings = 10; int readings[numOfReadings]; int arrayIndex = 0; int total = 0; int jarakNormal = 0; int echoPin = 10; int initPin = 13; unsigned long pulseTime = 0; unsigned long dist = 0;
http://digilib.mercubuana.ac.id/
Fuzzy* fuzzy = new Fuzzy(); int ledB = A0; int ledD = A1; void setup() { Serial.begin(115200); pinMode(initPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(arahKi, OUTPUT); pinMode(arahKa, OUTPUT); pinMode(pwmKi, OUTPUT); pinMode(pwmKa, OUTPUT); pinMode(enaKi, OUTPUT); pinMode(enaKa, OUTPUT); pinMode(ledD, OUTPUT); pinMode(ledB, OUTPUT); // Membuat array loop untuk iterate over setiap item dalam array for (int thisReading = 0; thisReading < numOfReadings; thisReading++) { readings[thisReading] = 0; } // membuat FuzzyInput jarak FuzzyInput* jarak = new FuzzyInput(1); // Membuat FuzzySet dari Jarak FuzzySet* sangatDekat = new FuzzySet(0, 0, 10, 10); // Jarak Sangat Dekat -> Motor DC Diam jarak->addFuzzySet(sangatDekat); FuzzySet* dekat = new FuzzySet(11, 11, 20, 40); // Jarak Dekat jarak->addFuzzySet(dekat); FuzzySet* aman = new FuzzySet(20, 45, 45, 70); // Jarak Aman jarak->addFuzzySet(aman); FuzzySet* jauh = new FuzzySet(50, 70, 130, 150); // Jarak jauh jarak->addFuzzySet(jauh); FuzzySet* sangatJauh = new FuzzySet(151, 170, 380, 380); // Jarak sangat jauh jarak->addFuzzySet(sangatJauh); fuzzy->addFuzzyInput(jarak); //menambahkan fuzzy input dalam kerangka Fuzzy // membuat FuzzyOutput kecepatan FuzzyOutput* velocity = new FuzzyOutput(1); // membuat FuzzySet dari kecepatan motor kanan FuzzySet* sangatLambat = new FuzzySet(0, 0, 5, 60); // Kecepatan sangat lambat
http://digilib.mercubuana.ac.id/
velocity->addFuzzySet(sangatLambat); FuzzySet* lambat = new FuzzySet(5, 60, 60, 115); // Kecepatan lambat velocity->addFuzzySet(lambat); FuzzySet* normal = new FuzzySet(60, 115, 115, 170); // Kecepatan normal velocity->addFuzzySet(normal); FuzzySet* cepat = new FuzzySet(115, 170, 255, 255); // Kecepatan Cepat velocity->addFuzzySet(cepat); // Adicionando o FuzzySet cepat em velocity fuzzy->addFuzzyOutput(velocity); // Menambahkan velocity sebagai fuzzy output //-------------------- Masuk ke aturan fuzzy // FuzzyRule "IF jarak = dekat THEN velocity = lambat" FuzzyRuleAntecedent* ifJarakDekat = new FuzzyRuleAntecedent(); ifJarakDekat->joinSingle(dekat); FuzzyRuleConsequent* thenVelocityCepat = new FuzzyRuleConsequent(); thenVelocityCepat->addOutput(cepat); // FuzzyRule FuzzyRule* fuzzyRule01 = new FuzzyRule(1, ifJarakDekat, thenVelocityCepat); fuzzy->addFuzzyRule(fuzzyRule01); // FuzzyRule "IF jarak = aman THEN velocity = normal" FuzzyRuleAntecedent* ifJarakAman = new FuzzyRuleAntecedent(); ifJarakAman->joinSingle(aman); FuzzyRuleConsequent* thenVelocityNormal = new FuzzyRuleConsequent(); thenVelocityNormal->addOutput(normal); // FuzzyRule FuzzyRule* fuzzyRule02 = new FuzzyRule(2, ifJarakAman, thenVelocityNormal); fuzzy->addFuzzyRule(fuzzyRule02); // FuzzyRule "IF jarak = jauh THEN velocity = cepat" FuzzyRuleAntecedent* ifJarakJauh = new FuzzyRuleAntecedent(); ifJarakJauh->joinSingle(jauh); FuzzyRuleConsequent* thenVelocityLambat = new FuzzyRuleConsequent(); thenVelocityLambat->addOutput(lambat); // FuzzyRule FuzzyRule* fuzzyRule03 = new FuzzyRule(3, ifJarakJauh, thenVelocityLambat); fuzzy->addFuzzyRule(fuzzyRule03); // FuzzyRule "IF jarak = sangatDekat THEN velocity = sangatLambat" FuzzyRuleAntecedent* ifJarakSangatDekat = new FuzzyRuleAntecedent(); ifJarakSangatDekat->joinSingle(sangatDekat); FuzzyRuleConsequent* thenVelocitySangatLambat = new FuzzyRuleConsequent(); thenVelocitySangatLambat->addOutput(sangatLambat); // FuzzyRule FuzzyRule* fuzzyRule04 = new FuzzyRule(4, ifJarakSangatDekat, thenVelocitySangatLambat);
http://digilib.mercubuana.ac.id/
fuzzy->addFuzzyRule(fuzzyRule04); // FuzzyRule "IF jarak = sangatDekat THEN velocity = sangatLambat" FuzzyRuleAntecedent* ifJarakSangatJauh = new FuzzyRuleAntecedent(); ifJarakSangatJauh->joinSingle(sangatJauh); // FuzzyRule FuzzyRule* fuzzyRule05 = new FuzzyRule(5, ifJarakSangatJauh, thenVelocitySangatLambat); fuzzy->addFuzzyRule(fuzzyRule05); } void utama() { // send 10 microsecond pulse digitalWrite(initPin, HIGH); // wait 10 microseconds before turning off delayMicroseconds(10); // stop sending the pulse digitalWrite(initPin, LOW); // Look for a return pulse, it should be high as the pulse goes low-high-low pulseTime = pulseIn(echoPin, HIGH); // jarak = pulse time / 58 to convert to cm. dist = pulseTime / 58;
// kurangi jarak terakhir total = total - readings[arrayIndex]; // tambahkan baca jarak to array readings[arrayIndex] = dist; // tambahkan pembacaan tersebut ke total total = total + readings[arrayIndex]; arrayIndex = arrayIndex + 1; // go to the next item in the array // At the end of the array (10 items) then start again if (arrayIndex >= numOfReadings) { arrayIndex = 0; } // calculate the jarak Normal jarakNormal = total / numOfReadings; fuzzy->setInput(1, jarakNormal); fuzzy->fuzzify();
http://digilib.mercubuana.ac.id/
int output = fuzzy->defuzzify(1); Serial.print(" Jarak: "); Serial.print(jarakNormal); Serial.print(" Velocity: "); Serial.print(output); /**/ if ((jarakNormal < 10) || (jarakNormal > 85)) { motor(0); pwmR = 0; pwmL = 0; analogWrite(pwmKa, pwmR); analogWrite(pwmKi, pwmL); digitalWrite(ledB, LOW); } else { motor(1); pwmR = output; pwmL = (output + 10); analogWrite(pwmKa, pwmR); analogWrite(pwmKi, pwmL); digitalWrite(ledB, HIGH); Serial.print(" kanan: "); Serial.print(pwmR); Serial.print(" kiri: "); Serial.print(pwmL); // wait 100 milli seconds before looping again //delay(100); } } void motor(bool ena) { if (ena) { digitalWrite(enaKa, 1); digitalWrite(enaKi, 1); digitalWrite(arahKa, 0); digitalWrite(arahKi, 1); } if (!ena) { digitalWrite(enaKa, 0); digitalWrite(enaKi, 0); digitalWrite(arahKa, 1); digitalWrite(arahKi, 0); }
http://digilib.mercubuana.ac.id/
} void loopl(){ motor(1); analogWrite(pwmKa, 100); delay(1000); motor(0); analogWrite(pwmKa, 100); delay(1000); } void loop() { delay(100); // menunggu 50ms antara ping (sekitar 20 pings/sec). //keterlambatan terpendek antara ping sekitar 29ms . unsigned int uS = sonar.ping(); // mengirim Ping dan mendapatkan nilai dalam uS. unsigned int usRCM = uS / US_ROUNDTRIP_CM; unsigned int jarakCM = usRCM - 1; Serial.print(" Ping: "); Serial.print(jarakCM); // Konversi waktu ping ke dalam cm Serial.println("cm"); //dan cetak hasil ke serial if (jarakCM > 40) { utama(); digitalWrite(ledD, HIGH); } else { motor(0); digitalWrite(ledD, LOW); } }
http://digilib.mercubuana.ac.id/