Translate

Rabu, 11 Juni 2014

Robot 3 Roda berbasis android menggunakan metode logika Fuzzy


Kali ini saya di beri tugas membuat robot 3 roda yang di kontrol android agar lebih cerdas, saya menggunakan metode logika Fuzzy. idenya saya dapat dari web 
http://randomnerdtutorials.com/arduino-control-2-dc-motors-via-bluetooth/ lalu saya tambahkan metode saja.

langsung aja masuk ke tahap perancangan, saya menggunakan:
1. Smartphone android OS ICS 
2. 2 buah motor DC dan gear box nya
 


3. Arduino uno
4. Modul Bluetooth HC05
 

5. Driver motor IC L293D

6. Sensor Ultrasonik

7. software IDE Arduino

8. Software Android BlueArd yang saya ambil dari web http://randomnerdtutorials.com/arduino-control-2-dc-motors-via-bluetooth/



9. LCD 16 x 2 sebagai tambahan



cara kerjanya :
Pertama lakukan pairing dari Smartphone ke module Bluetooth HC05 sehingga smarthphone dan HC05 berantarmuka. Lalu user memberikan perintah ke Smartphone untuk  mengirimkan perintah ke Arduino, perintah tersebut di olah menggunakan logica Fuzzy  dan di teruskan ke IC L29D untuk mengerakan motor DC kanan dan kiri. Jika di depan mobil terdapat halangan, maka mobil akan berhenti sesuai dengan logica Fuzzy yang di masukan.

berikut adalah diagram blok sistem dari robot ini :


rancang analisa logika fuzzy, tentunya kalian sudah paham tentang logika fuzzy ya. biar ga muter muter....

Ns = dekat = 15 // jarak dekat 15cm
Ns1= mundur = -225 // PWM mundur
Ns2 = mundur = -240 // PWM mundur
Az = sedang = 20 // jarak dekat 20cm
Az1 = 0
Az2 = 0
Ps = jauh = 25// jarak dekat 25cm
Ps1 = maju =  240 // PWM maju
Ps2 = maju = 255 // PWM maju
  
Input 1 ( ultrasonik depan )

Output 1 ( motor kanan )

Output 2 ( motor Kiri )


Maka deffuzzyfikasinya
1.      Input 1 = ns
If (input 1 < 15 )
{ uns =  1 ; out1 = (uns +ns1)/ uns; out2 = (uns + ns2)/uns; }
2.      Input 1 = ns - az
If (input 1 >= 15 && input 1 < 20 )
{ uns =  (19,99 – input)/(19,99 – 15) ; uaz = 1 – uns ; out1 = (uns +ns1)/ uns; out2 = (uns + ns2)/uns; }
3.      Input 1 = az
If (input 1 = 20 )
{ uns =  1 ; out1 = (uaz +az1)/ uaz; out2 = (uaz + az2)/uaz; }
4.      Input 1 = az - ps
If (input 1 >= 20 && input 1 < 25 )
{ uaz =  (24,99 – input)/(24,99 – 20) ; ups = 1 – uaz ; out1 = (uns *ns1)+ (ups *ps1)/ uaz +ups; out2 = (uns *ns2)+ (ups *ps2)/ uaz +ups ; }
5.      Input 1 = ps
If (input 1 < 25 )
{ uns =  1 ; out1 = (ups +ps1)/ ups; out2 = (ups + ps2)/ups; }



setelah itu masuk ke tahap pembuatan:
1. pertama, wiring komponen sesuai web 













untuk pin sensor ultrasonik, dimasukan ke arduino. untuk nomer pin nya terserah tetapi harus sinkron dengan kodingannya. ditugas ini echo ke pin A2 dan triger ke A3


 

2. buat mekaniknya biar bagus dan mudah berjalan. ini mekanik saya






3. jangan lupa catu daya, gunakan baterai yang mAH besar biar bisa dimainkan lama, saya menggunakan 8 buah baterai 2500mAH
 





4. langkah terakhir ngoding, ini saya kasih source nya. saya mbil dari web yang td disebutkan dan saya modif lagi
//inisialisasi LCD
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 2, 10, 11, 12, 13);

//inisialisasi Ultrasonik
int pingPind = A3;  //trig Sensor
int inPind = A2;    //echo Sensor

//inisialisasi Motor-DC via L293D
int enable1Pin = 4; // arduino pin 4 ke L293D pin 1  (motor kanan)
int enable2Pin = 7; // arduino pin 7 ke L293D pin 9  (motor kiri)
const int motor1Pin1 = 9; // arduino pin 9 ke L293D pin 2  (motor kanan maju)   PWM
const int motor1Pin2 = 3; // arduino pin 3 ke L293D pin 7  (motor kanan mundur) PWM
const int motor2Pin2 = 6; // arduino pin 6 ke L293D pin 15 (motor kiri maju)    PWM
const int motor2Pin1 = 5; // arduino pin 5 ke L293D pin 10 (motor kiri mundur)  PWM

//inisialisasi antarmuka android via bluetooth
int state;
int flag=0;        //makes sure that the serial only prints once the state
int stateStop=0;

void setup()
  {
  pinMode(motor1Pin1, OUTPUT);    //set sebagai output
  pinMode(motor1Pin2, OUTPUT);    //set sebagai output
  pinMode(motor2Pin1, OUTPUT);    //set sebagai output
  pinMode(motor2Pin2, OUTPUT);    //set sebagai output
  pinMode(enable1Pin, OUTPUT);    //set sebagai output
  pinMode(enable2Pin, OUTPUT);    //set sebagai output
  digitalWrite(enable1Pin, HIGH); //untuk menghidupkan motor kanan
  digitalWrite(enable2Pin, HIGH); //untuk menghidupkan motor kiri
  Serial.begin(9600);             //inisialisasi komunikasi serial pada 9600bps
  }

void loop()
  { 
  long duration1, input1; //waktu kerja sensor, jarak benda dari sensor
  pinMode(pingPind, OUTPUT);  //Sensor depan
  digitalWrite(pingPind, LOW);  delayMicroseconds(2);
  digitalWrite(pingPind, HIGH); delayMicroseconds(10);
  digitalWrite(pingPind, LOW);
  pinMode(inPind, INPUT);
  duration1 = pulseIn(inPind, HIGH);
  input1 = microsecondsToCentimeters(duration1); //Mengubah waktu ke dalam jarak
  lcd.setCursor(8, 1); lcd.print("SENSOR");
  lcd.setCursor(0, 1); lcd.print("F:");
  lcd.setCursor(2, 1); lcd.print(input1); lcd.print("cm ");
   
  if(Serial.available() > 0) //if some date is sent, reads it and saves in state
    {    
    state = Serial.read();  
    flag=0;
    }  
  if (state == '1')// if the state is '1' the DC motor will go forward
    {
    if (input1 < 15) //program fuzzy 1
      {
      word uNs = 1;
      word Ns1 = 240;
      word Ns2 = 255;
      word out1 = (uNs*Ns1)/uNs;
      word out2 = (uNs*Ns2)/uNs;
      analogWrite(motor1Pin1, 0);    //motor kanan maju
      analogWrite(motor1Pin2, out1); //motor kanan mundur
      analogWrite(motor2Pin1, out2); //motor kiri mundur
      analogWrite(motor2Pin2, 0);    //motor kiri maju
      }
    else if (input1 >= 15 && input1 < 20) //program fuzzy 2
      {
      word uNs = (19.99-input1)/(19.99-15);
      word uAz = 1-uNs;
      word Ns1 = 240;
      word Ns2 = 255;
      word Az1 = 0;
      word Az2 = 0;
      word out1 = (uNs*Ns1+uAz*Az1)/(uNs+uAz);
      word out2 = (uNs*Ns2+uAz*Az2)/(uNs+uAz);
      analogWrite(motor1Pin1, 0);    //motor kanan maju
      analogWrite(motor1Pin2, out1); //motor kanan mundur
      analogWrite(motor2Pin1, out2); //motor kiri mundur
      analogWrite(motor2Pin2, 0);    //motor kiri maju
      }
    else if (input1 == 20)  //program fuzzy 3
      {
      word uAz = 1;
      word Az1 = 0;
      word Az2 = 0;
      word out1 = (uAz*Az1)/uAz;
      word out2 = (uAz*Az2)/uAz;
      analogWrite(motor1Pin1, 0);    //motor kanan maju
      analogWrite(motor1Pin2, out1); //motor kanan mundur
      analogWrite(motor2Pin1, out2); //motor kiri mundur
      analogWrite(motor2Pin2, 0);    //motor kiri maju
      }
    else if (input1 >= 20 && input1 < 25)  //program fuzzy 4
      {
      word uAz = (24.99-input1)/(24.99-20);
      word uPs = 1-uAz;
      word Az1 = 0;
      word Az2 = 0;
      word Ps1 = 240;
      word Ps2 = 255;
      word out1 = (uAz*Az1+uPs*Ps1)/(uAz+uPs);
      word out2 = (uAz*Az2+uPs*Ps2)/(uAz+uPs);
      analogWrite(motor1Pin1, out1);  //motor kanan maju
      analogWrite(motor1Pin2, 0);     //motor kanan mundur
      analogWrite(motor2Pin1, 0);     //motor kiri mundur
      analogWrite(motor2Pin2, out2);  //motor kiri maju
      }
    else if (input1 >= 25) //program fuzzy 5
      {
      word uPs = 1;
      word Ps1 = 240;
      word Ps2 = 255;
      word out1 = (uPs*Ps1)/uPs;
      word out2 = (uPs*Ps2)/uPs;
      analogWrite(motor1Pin1, out1);  //motor kanan maju
      analogWrite(motor1Pin2, 0);     //motor kanan mundur
      analogWrite(motor2Pin1, 0);     //motor kiri mundur
      analogWrite(motor2Pin2, out2);  //motor kiri maju
      }
    else if(flag == 0)
      {
      Serial.println("Go Forward!");
      flag=1;
      }
    }
  else if (state == '2') // if the state is '2' the motor will turn left
    {
    analogWrite(motor1Pin1, 240); //motor kanan maju
    analogWrite(motor1Pin2, 0);   //motor kanan mundur
    analogWrite(motor2Pin1, 255); //motor kiri mundur
    analogWrite(motor2Pin2, 0);   //motor kiri maju
    if(flag == 0)
      {
      Serial.println("Turn LEFT");
      flag=1;
      }
    }
  else if (state == '3' || stateStop == 1) // if the state is '3' the motor will Stop
    {
    analogWrite(motor1Pin1, 0); //motor kanan
    analogWrite(motor1Pin2, 0);
    analogWrite(motor2Pin1, 0); //motor kiri
    analogWrite(motor2Pin2, 0);
    if(flag == 0)
      {
      Serial.println("STOP!");
      flag=1;
      }
    stateStop=0;
    }
  else if (state == '4') // if the state is '4' the motor will turn right
    {
    analogWrite(motor1Pin1, 0);   //motor kanan
    analogWrite(motor1Pin2, 240);
    analogWrite(motor2Pin1, 0);   //motor kiri
    analogWrite(motor2Pin2, 255);
    if(flag == 0)
      {
      Serial.println("Turn RIGHT");
      flag=1;
      }
    }
  else if (state == '5') // if the state is '5' the motor will Reverse
    {
    analogWrite(motor1Pin1, 0);   //motor kanan
    analogWrite(motor1Pin2, 240);
    analogWrite(motor2Pin1, 255); //motor kiri
    analogWrite(motor2Pin2, 0);
    if(flag == 0)
      {
      Serial.println("Reverse!");
      flag=1;
      }
    }
  Serial.println(state); //For debugging purpose
  }

long microsecondsToCentimeters(long microseconds)
  {
  // kecepatan suara yaitu 340m/s atau 29cm/ms.
  // jadi jarak yang diambil setengah dari ultrasonik, karena mengirim dan mengembalikan gelombang suara.
  return microseconds / 29 / 2;
  }
setelah di upload kedalam arduino, kita tes... sebelumnya lakukan pairing android dengan modul bluetooth HC05.

kesimpulan :
robotnya tidak berjalan sempurna ketika algoritma fuzzy dengan kontrol motor digabungkan. modul bluetooth sering mati dan ketika di tes dikasih halangan robot langsung berhenti total.

maka untuk update berikutnya saya akan sempurnakan kodingannya dan saya akan sertakan video dokumentasinya

Credit to : 1. http://randomnerdtutorials.com/arduino-control-2-dc-motors-via-bluetooth/
                 2. Himawan Setiadi

coding kontrol motor 2 DC serta aplikasi android BlueArd dapat di download  Klik disini

terimakasih








Tidak ada komentar:

Posting Komentar