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....
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