Hey Im working on collision avoidance for quadcopter using sharp IR sensor. just kinda confuse why bluetooth cannot be use at the same time when im using the pin change interrupt ? i just wanna see how far the quadcopter from the object when flying. Any solution will be helpful for me.
this the error
libraries/SoftwareSerial/SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()':
(.text+0x0): multiple definition of `__vector_3'
sketch/sketch_jul24b.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
Multiple libraries were found for "SoftwareSerial.h"
Used: /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/libraries/SoftwareSerial
Not used: /Users/thrqbsyrh/Documents/Arduino/libraries/SoftwareSerial-master
exit status 1
Error compiling for board Arduino Uno.
Here's my code
#include<Servo.h>
#include <SharpIR.h>
#include <SoftwareSerial.h>
#define IRPin A0 //dist kiri
#define IR2 A1 //dist2 kanan
#define IR3 A4 //dist3 depan
#define IR4 A5 //dist4 belakang
#define model 20150
SoftwareSerial Blue(0, 1);//RX, TX
float outmaju,outmundur,outkanan, outkiri;
byte lastch1, lastch2;
unsigned long t2, t1;
int rc2, rc1; // d10, d9
//#define rc2 8 //dist4 belakang
//#define rc1 9 //dist4 belakang
Servo outch1; //d11 roll
Servo outch2;//d12 pitch
float dist ; //kiri
float dist2 ; //kanan
float cm ; // belakang
float dist4; // depan
SharpIR mySensor = SharpIR(IRPin, model);
SharpIR mySensor2 = SharpIR(IR2, model);
SharpIR mySensor3 = SharpIR(IR3, model);
SharpIR mySensor4 = SharpIR(IR4, model);
float dekat,lumayan,jauh;//dpn
float blkngdkt,blknglumayan,blkngjauh;//belakang
float dekatkiri,lumayankiri,jauhkiri;//kiri
float dekatkanan,lumayankanan,jauhkanan;//kanan
float rule1dpn, rule2adpn, rule2bdpn, rule3dpn;
float rule1blg, rule2ablg, rule2bblg, rule3blg;
float rule1kri, rule2akri, rule2bkri, rule3kri;
float rule1knn, rule2aknn, rule2bknn, rule3knn;
float Lambatmaju,Sedangmaju,Cepatmaju;
float Lambatmundur,Sedangmundur,Cepatmundur;
float Lambatkiri,Sedangkiri,Cepatkiri;
float Lambatkanan,Sedangkanan,Cepatkanan;
float hasilfuzzy;
///Fuzzy jarak Depan.................................................
unsigned char CmDekatdpn(){
if (dist4 <= 25){dekat =1;}
else if (dist4 >=25 && dist4 <=55){dekat=(55-dist4)/30;}
else if (dist4 >= 55){dekat =0;}
return dekat;
}
unsigned char CmLumayandpn(){
if (dist4 <= 25){lumayan =0;}
else if (dist4 >=25 && dist4 <=55){lumayan=(dist4-25)/30;}
else if (dist4 >=55 && dist4 <=85){lumayan=(85-dist4)/30;}
else if (dist4 >= 85){lumayan =0;}
return lumayan;
}
unsigned char CmJauhdpn(){
if (dist4 <=55 ){jauh =0;}
else if (dist4 >=55 && dist4 <=85){jauh=(dist4-55)/30;}
else if (dist4 >= 85){jauh =1;}
return jauh;
}
//Fuzzy jarak Belakang..............................................
unsigned char CmDekatblkng(){
if (cm <= 25){blkngdkt =1;}
else if (cm >=25 && cm <=55){blkngdkt=(55-cm)/30;}
else if (cm >= 55){blkngdkt =0;}
return blkngdkt;
}
unsigned char CmLumayanblkng(){
if (cm <= 25){blknglumayan =0;}
else if (cm >=25 && cm <=55){blknglumayan=(cm-25)/30;}
else if (cm >=55 && cm <=85){blknglumayan=(85-cm)/30;}
else if (cm >= 85){blknglumayan =0;}
return blknglumayan;
}
unsigned char CmJauhblkng(){
if (cm <=55 ){blkngjauh =0;}
else if (cm >=55 && cm <=85){blkngjauh=(cm-55)/30;}
else if (cm >= 85){blkngjauh =1;}
return blkngjauh;
}
///Fuzzy jarak kanan.................................................
unsigned char CmDekatkanan(){
if (dist2 <= 25){dekatkanan =1;}
else if (dist2 >=25 && dist2 <=55){dekatkanan=(55-dist2)/30;}
else if (dist2 >= 55){dekatkanan =0;}
return dekatkanan;
}
unsigned char CmLumayankanan(){
if (dist2 <= 25){lumayankanan =0;}
else if (dist2 >=25 && dist2 <=55){lumayankanan=(dist2-25)/30;}
else if (dist2 >=55 && dist2 <=85){lumayankanan=(85-dist2)/30;}
else if (dist2 >= 85){lumayankanan =0;}
return lumayankanan;
}
unsigned char CmJauhkanan(){
if (dist2 <=55 ){jauhkanan =0;}
else if (dist2 >=55 && dist2 <=85){jauhkanan=(dist2-55)/30;}
else if (dist2 >= 85){jauhkanan =1;}
return jauhkanan;
}
///Fuzzy jarak kiri.................................................
unsigned char CmDekatkiri(){
if (dist <= 25){dekatkiri =1;}
else if (dist >=25 && dist <=55){dekatkiri=(55-dist)/30;}
else if (dist >= 55){dekatkiri =0;}
return dekatkiri;
}
unsigned char CmLumayankiri(){
if (dist <= 25){lumayankiri =0;}
else if (dist >=25 && dist <=55){lumayankiri=(dist-25)/30;}
else if (dist >=55 && dist <=85){lumayankiri=(85-dist)/30;}
else if (dist >= 85){lumayankiri =0;}
return lumayankiri;
}
unsigned char CmJauhkiri(){
if (dist <=55 ){jauhkiri =0;}
else if (dist >=55 && dist <=85){jauhkiri=(dist-55)/30;}
else if (dist >= 85){jauhkiri =1;}
return jauhkiri;
}
//Fuzzyfikasi
void fuzzifikasi(){
CmDekatblkng();
CmLumayanblkng();
CmJauhblkng();
CmDekatdpn();
CmLumayandpn();
CmJauhdpn();
CmDekatkanan();
CmLumayankanan();
CmJauhkanan();
CmDekatkiri();
CmLumayankiri();
CmJauhkiri();
}
//output nilai 1500+
void fuzzy_rule(){
fuzzifikasi();
// jika jarak jauh maka motor pelan
rule1blg = 1750 - (jauh*250);
// jika jarak luamyan maka motor sedang
rule2ablg = 1500 + (lumayan*250);
rule2bblg = 2000 - (lumayan*250);
// jika jarak dekat maka motor cepat
rule3blg = 1750 + (dekat*250);
outmaju = ((rule1blg*jauh) + (rule2ablg*lumayan) + (rule2bblg*lumayan) + (rule3blg*dekat)) / (jauh+lumayan+lumayan+dekat);
//output nilai 1500-
// jika jar ak jauh maka motor pelan
rule1dpn = 1250 + (blkngjauh*250);
// jika jarak luamyan maka motor sedang
rule2adpn = 1000 - (blknglumayan*250);
rule2bdpn = 1500 + (blknglumayan*250);
// jika jarak dekat maka motor cepat
rule3dpn = 1250 - (blkngdkt*250);
outmundur = ((rule1dpn*blkngjauh) + (rule2adpn*blknglumayan) + (rule2bdpn*blknglumayan) + (rule3dpn*blkngdkt)) / (blkngjauh+blknglumayan+blknglumayan+blkngdkt);
// jika jarak jauh maka motor pelan
rule1kri = 1750 - (jauhkiri*250);
// jika jarak luamyan maka motor sedang
rule2akri = 1500 + (lumayankiri*250);
rule2bkri = 2000 - (lumayankiri*250);
// jika jarak dekat maka motor cepat
rule3kri = 1750 + (dekatkiri*250);
outkanan = ((rule1kri*jauhkiri) + (rule2akri*lumayankiri) + (rule2bkri*lumayankiri) + (rule3kri*dekatkiri)) / (jauhkiri+lumayankiri+lumayankiri+dekatkiri);
// jika jarak jauh maka motor pelan
rule1knn = 1250 + (jauhkanan*250);
// jika jarak luamyan maka motor sedang
rule2aknn = 1000 - (lumayankanan*250);
rule2bknn = 1500 + (lumayankanan*250);
// jika jarak dekat maka motor cepat
rule3knn = 1250 - (dekatkanan*250);
outkiri = ((rule1knn*jauhkanan) + (rule2aknn*lumayankanan) + (rule2bknn*lumayankanan) + (rule3knn*dekatkanan)) / (jauhkanan+lumayankanan+lumayankanan+dekatkanan);
}
//Fuzzy cepat maju..................................................
unsigned char pwmLambatMaju(){
if (outmaju <= 1500){Lambatmaju =1;}
else if (outmaju >=1500 && outmaju <=1750){Lambatmaju=(1750-outmaju)/250;}
else if (outmaju >= 1750){Lambatmaju =0;}
return Lambatmaju;
}
unsigned char pwmSedangMaju(){
if (outmaju <= 1500){Sedangmaju =0;}
else if (outmaju >=1500 && outmaju <=1750){Sedangmaju=(outmaju-1500)/250;}
else if (outmaju >=1750 && outmaju <=2000){Sedangmaju=(2000-outmaju)/250;}
else if (outmaju >= 2000){Sedangmaju =0;}
return Sedangmaju;
}
unsigned char pwmCepatMaju (){
if (outmaju <= 1500){Cepatmaju =0;}
else if (outmaju >=1750 && outmaju <=2000){Cepatmaju=(outmaju-1750)/250;}
else if (outmaju >= 2000){Cepatmaju =1;}
return Cepatmaju;
}
//Fuzzy cepat mundur..................................................
unsigned char pwmCepatMundur(){
if (outmundur <= 1000){Cepatmundur =1;}
else if (outmundur >=1000 && outmundur <=1250){Cepatmundur=(1250-outmundur)/250;}
else if (outmundur >= 1250){Cepatmundur =0;}
return Cepatmundur;
}
unsigned char pwmSedangMundur(){
if (outmundur <= 1000){Sedangmundur =0;}
else if (outmundur >=1000 && outmundur <=1250){Sedangmundur=(outmundur-1000)/250;}
else if (outmundur >=1250 && outmundur <=1500){Sedangmundur=(1500-outmundur)/250;}
else if (outmundur >= 1500){Sedangmundur =0;}
return Sedangmundur;
}
unsigned char pwmLambatMundur (){
if (outmundur <= 1000){Lambatmundur =0;}
else if (outmundur >=1250 && outmundur <=1500){Lambatmundur=(outmundur-1250)/250;}
else if (outmundur >= 1500){Lambatmundur =1;}
return Lambatmundur;
}
//Fuzzy cepat kanan..................................................
unsigned char pwmLambatKanan(){
if (outkanan <= 1500){Lambatkanan =1;}
else if (outkanan >=1500 && outkanan <=1750){Lambatkiri=(1750-outkanan)/250;}
else if (outkanan >= 1750){Lambatkanan =0;}
return Lambatkanan;
}
unsigned char pwmSedangKanan(){
if (outkanan <= 1500){Sedangkanan =0;}
else if (outkanan >=1500 && outkanan <=1750){Sedangkanan=(outkanan-1500)/250;}
else if (outkanan >=1750 && outkanan <=2000){Sedangkanan=(2000-outkanan)/250;}
else if (outkanan >= 2000){Sedangkanan =0;}
return Sedangkanan;
}
unsigned char pwmCepatKanan (){
if (outkanan <= 1500){Cepatkanan =0;}
else if (outkanan >=1750 && outkanan <=2000){Cepatkanan=(outkanan-1750)/250;}
else if (outkanan >= 2000){Cepatkanan =1;}
return Cepatkanan;
}
//Fuzzy cepat kiri.................................................
unsigned char pwmCepatKiri(){
if (outkiri <= 1000){Cepatkiri =1;}
else if (outkiri >=1000 && outkiri <=1250){Cepatkiri=(1250-outkiri)/250;}
else if (outkiri >= 1250){Cepatkiri =0;}
return Cepatkiri;
}
unsigned char pwmSedangKiri(){
if (outkiri <= 1000){Sedangkiri =0;}
else if (outkiri >=1000 && outkiri <=1250){Sedangkiri=(outkiri-1000)/250;}
else if (outkiri >=1250 && outkiri <=1500){Sedangkiri=(1500-outkiri)/250;}
else if (outkiri >= 1500){Sedangkiri =0;}
return Sedangkiri;
}
unsigned char pwmLambatKiri (){
if (outkiri <= 1000){Lambatkiri =0;}
else if (outkiri >=1250 && outkiri <=1500){Lambatkiri=(outkiri-1250)/250;}
else if (outkiri >= 1500){Lambatkiri =1;}
return Lambatkiri;
}
void fuzzifikasipwm(){
fuzzy_rule();
pwmLambatMaju();
pwmSedangMaju();
pwmCepatMaju();
pwmCepatMundur();
pwmSedangMundur();
pwmLambatMundur();
pwmLambatKiri();
pwmSedangKiri();
pwmCepatKiri();
pwmLambatKanan();
pwmSedangKanan();
pwmCepatKanan();
}
void setup(){
PCICR |= (1 << PCIE0);
PCMSK0 |= (1 << PCINT0);
PCMSK0 |= (1 << PCINT1);
PCMSK0 |= (1 << PCINT2);
outch2.attach(11); // roll
outch1.attach(6); //pitch
Serial.begin(9600);
Blue.begin(38400);
}
void loop(){
fuzzifikasipwm();
//send normal signal.......................................................
//send signal rc1
outch1.write(rc1);
//send signal rc2
outch2.write(rc2);
//sensor
dist = mySensor.distance();
dist2 = mySensor2.distance();
cm = mySensor3.distance();
dist4 = mySensor4.distance();
if (dist<86){
outch1.write(outkanan);
Serial.print("\n .........................Kiri..........................................\n");
Serial.print("dekat: ");
Serial.print(dekatkiri);
Serial.print(" ");
Serial.print("lumayan : ");
Serial.print(lumayankiri);
Serial.print(" ");
Serial.print("jauh : ");
Serial.println(jauhkiri);
Serial.print("lambat : ");
Serial.print(Lambatkiri);
Serial.print("\t");
Serial.print("sedang : ");
Serial.print(Sedangkiri);
Serial.print("\t");
Serial.print("cepat : ");
Serial.println(Cepatkiri);
Serial.print("Hasil DeFuzzy(move kanan): ");
Serial.println(outkanan);
Serial.print("jarak kiri ");
Serial.print(dist);
Serial.print("\n");
delay(200);
}
else {} //kiri
if (dist2<86){
outch1.write(outkiri);
Serial.print("\n .........................kanan..........................................\n");
Serial.print("dekat: ");
Serial.print(dekatkanan);
Serial.print(" ");
Serial.print("lumayan : ");
Serial.print(lumayankanan);
Serial.print(" ");
Serial.print("jauh : ");
Serial.println(jauhkanan);
Serial.print("lambat : ");
Serial.print(Lambatkanan);
Serial.print("\t");
Serial.print("sedang : ");
Serial.print(Sedangkanan);
Serial.print("\t");
Serial.print("cepat : ");
Serial.println(Cepatkanan);
Serial.print("Hasil DeFuzzy(move kiri): ");
Serial.println(outkiri);
Serial.print("jarak kanan ");
Serial.print(dist2);
Serial.print("\n");
delay(200);}
else {} //kanan
if (dist4<86){
outch2.write(outmaju);
Serial.print("\n .........................depan..........................................\n");
Serial.print("dekat: ");
Serial.print(dekat);
Serial.print(" ");
Serial.print("lumayan : ");
Serial.print(lumayan);
Serial.print(" ");
Serial.print("jauh : ");
Serial.println(jauh);
Serial.print("lambat : ");
Serial.print(Lambatmaju);
Serial.print("\t");
Serial.print("sedang : ");
Serial.print(Sedangmaju);
Serial.print("\t");
Serial.print("cepat : ");
Serial.println(Cepatmaju);
Serial.print("Hasil DeFuzzy(move mundur): ");
Serial.println(outmaju);
Serial.print("jarak depan ");
Serial.print(dist4);
Serial.print("\n");
delay(200);}
else {} //
if (cm<86){
outch2.write(outmundur);
Serial.print("...........................belakang..........................................\n");
Serial.print("dekat: ");
Serial.print(blkngdkt);
Serial.print(" ");
Serial.print("lumayan : ");
Serial.print(blknglumayan);
Serial.print(" ");
Serial.print("jauh : ");
Serial.println(blkngjauh);
Serial.print("lambat : ");
Serial.print(Lambatmundur);
Serial.print("\t");
Serial.print("sedang : ");
Serial.print(Sedangmundur);
Serial.print("\t");
Serial.print("cepat : ");
Serial.println(Cepatmundur);
Serial.print("Hasil DeFuzzy(move maju): ");
Serial.println(outmundur);
Serial.print("jarak blkng ");
Serial.print(cm);
Serial.print(" ");
Serial.print("\n");
delay(200);}
else {} //dpn
/*Serial.print("\n .........................depan..........................................\n");
Serial.print("dekat: ");
Serial.print(dekat);
Serial.print(" ");
Serial.print("lumayan : ");
Serial.print(lumayan);
Serial.print(" ");
Serial.print("jauh : ");
Serial.println(jauh);
Serial.print("lambat : ");
Serial.print(Lambatmaju);
Serial.print("\t");
Serial.print("sedang : ");
Serial.print(Sedangmaju);
Serial.print("\t");
Serial.print("cepat : ");
Serial.println(Cepatmaju);
Serial.print("Hasil DeFuzzy(move mundur): ");
Serial.println(outmundur);
Serial.print("jarak depan ");
Serial.print(dist4);
Serial.print("\n");
Serial.print("...........................belakang..........................................\n");
Serial.print("dekat: ");
Serial.print(blkngdkt);
Serial.print(" ");
Serial.print("lumayan : ");
Serial.print(blknglumayan);
Serial.print(" ");
Serial.print("jauh : ");
Serial.println(blkngjauh);
Serial.print("lambat : ");
Serial.print(Lambatmundur);
Serial.print("\t");
Serial.print("sedang : ");
Serial.print(Sedangmundur);
Serial.print("\t");
Serial.print("cepat : ");
Serial.println(Cepatmundur);
Serial.print("Hasil DeFuzzy(move mundur): ");
Serial.println(outmaju);
Serial.print("jarak blkng ");
Serial.print(cm);
Serial.print(" ");
Serial.print("\n");
Serial.print("\n .........................Kiri..........................................\n");
Serial.print("dekat: ");
Serial.print(dekatkiri);
Serial.print(" ");
Serial.print("lumayan : ");
Serial.print(lumayankiri);
Serial.print(" ");
Serial.print("jauh : ");
Serial.println(jauhkiri);
Serial.print("lambat : ");
Serial.print(Lambatkiri);
Serial.print("\t");
Serial.print("sedang : ");
Serial.print(Sedangkiri);
Serial.print("\t");
Serial.print("cepat : ");
Serial.println(Cepatkiri);
Serial.print("Hasil DeFuzzy(move kanan): ");
Serial.println(outkanan);
Serial.print("jarak kiri ");
Serial.print(dist);
Serial.print("\n");
Serial.print("\n .........................kanan..........................................\n");
Serial.print("dekat: ");
Serial.print(dekatkanan);
Serial.print(" ");
Serial.print("lumayan : ");
Serial.print(lumayankanan);
Serial.print(" ");
Serial.print("jauh : ");
Serial.println(jauhkanan);
Serial.print("lambat : ");
Serial.print(Lambatkanan);
Serial.print("\t");
Serial.print("sedang : ");
Serial.print(Sedangkanan);
Serial.print("\t");
Serial.print("cepat : ");
Serial.println(Cepatkanan);
Serial.print("Hasil DeFuzzy(move kiri): ");
Serial.println(outkiri);
Serial.print("jarak kanan ");
Serial.print(dist2);
Serial.print("\n"); */
}
// delay(2000);
/*/ Collision Avoidance jarak <50cm..................................
/// Collision Avoidance jarak <86cm..................................
/// ..............................PITCH..............................
// obs depan..........................................................
if(cm<86){outch2.write(outmundur);}//gerak mundur
// obs depan dan kanan............................................
else if (cm<86 && dist2<86){
outch2.write(outmundur);outch1.write(outkiri);} //gerak mundur dan kiri
// obs depan dan kiri.............................................
else if (cm<86 && dist<86){
outch2.write(outmundur);outch1.write(outkanan);} // gerak mundur dan kanan
// obs depan dan belakang.........................................
else if (cm<86 && dist4<86){
outch1.write(outkanan);} // gerak kanan
// no obs.............................................................
else {outch2.write(pitch);}
// obs belakang......................................................
if (dist4<86) {outch2.write(outmaju);}//gerak maju
// obs belakang dan kanan.............................................
else if (dist4<86 && dist2<86){
outch2.write(outmaju);outch1.write(outkiri);} //gerak maju dan kiri
//obs belakang dan kiri...............................................
else if (dist4<86 && dist<86){
outch2.write(outmaju);outch1.write(outkanan);} // gerak maju dan kanan
// no obstacle.......................................................
else {outch2.write(pitch);}
//.................................ROLL..............................
// kiri.............................................................
if (dist2<85){outch1.write(outkiri);}//gerak kiri
// obs kanan dan kiri...............................................
if (dist2<85 && dist<85){outch2.write(outmaju);} //gerak maju
// no obstacle......................................................
else {outch1.write(roll);}
// kanan.............................................................
if (dist<85){outch1.write(outkanan);}// gerak kanan
// no obstacle......................................................
else {outch1.write(roll);} */
/*// For Roll...................
if (dist2<85){outch1.write(outkiri);}//gerak kiri
else {outch1.write(roll);}
if (dist<85){outch1.write(outkanan);}// gerak kanan
else {outch1.write(roll);} */
//Reads the PWM value of Receiver...................................
ISR(PCINT0_vect){
//ch1
if(lastch1 == 0 && PINB & B0000010){
lastch1 = 1;
t1 = micros();
}
else if(lastch1 == 1 && ! (PINB & B0000010)){
lastch1 = 0;
rc1 = micros() - t1;
}
//ch2
if(lastch2 == 0 && PINB & B00000100){
lastch2 = 1;
t2 = micros();
}
else if(lastch2 == 1 && ! (PINB & B00000100)){
lastch2 = 0;
rc2 = micros() - t2;
/*ch2
if(lastch2 == 0 && PINB & B00000010){
lastch2 = 1;
t2 = micros();
}
else if(lastch1 == 1 && ! (PINB & B00000010)){
lastch2 = 0;
rc2 = micros() - t2;
}*/
}
}