請教各位大大,小弟我使用App Inventor透過HC-06藍芽模組來使Arduion切換避障與停止,請問我寫的程是是否哪裡出了些問題,無法使App Inventor來切換動作請各位大大提點我
#include <Servo.h>
#include <SoftwareSerial.h> // 引用''軟體序列埠''程式庫
SoftwareSerial BT(3,2); // 設定軟體序列埠(接收腳,傳送腳)
char command; // 接收序列埠的變數
const byte speed = 255; // 馬達的 PWM 輸出值
const byte ENA = 5; // 馬達 A 的致能接腳
const byte ENB = 6; // 馬達 B 的致能接腳
int pinLB=10; // 定義10腳位 左後
int pinLF=9; // 定義9腳位 左前
int pinRB=8; // 定義8腳位 右後
int pinRF=7; // 定義7腳位 右前
int inputPin = A0; // 定義超音波信號接收腳位
int outputPin =A1; // 定義超音波信號發射腳位
int Fspeedd = 0; // 前速
int Rspeedd = 0; // 右速
int Lspeedd = 0; // 左速
int directionn = 0; // 前=8 後=2 左=4 右=6
Servo myservo; // 設 myservo
int delay_time = 255; // 伺服馬達轉向後的穩定時間
int Fgo = 8; // 前進
int Rgo = 6; // 右轉
int Lgo = 4; // 左轉
int Bgo = 2; // 倒車
void setup()
{
Serial.begin(9600); // 定義馬達輸出腳位
pinMode(pinLB,OUTPUT); // 腳位 7 (PWM)
pinMode(pinLF,OUTPUT); // 腳位 8 (PWM)
pinMode(pinRB,OUTPUT); // 腳位 9 (PWM)
pinMode(pinRF,OUTPUT); // 腳位 10 (PWM)
pinMode(inputPin, INPUT); // 定義超音波輸入腳位
pinMode(outputPin, OUTPUT); // 定義超音波輸出腳位
myservo.attach(4); // 定義伺服馬達輸出第4腳位(PWM)
pinMode(pinLB,OUTPUT); // 馬達驅動模組的接腳全都設定成''輸出''
pinMode(pinLF,OUTPUT); // 馬達驅動模組的接腳全都設定成''輸出''
pinMode(pinRB,OUTPUT); // 馬達驅動模組的接腳全都設定成''輸出''
pinMode(pinRF,OUTPUT); // 馬達驅動模組的接腳全都設定成''輸出''
stop(); // 先停止馬達
}
//-------------------------------------------
void stop() // 馬達停止
{
analogWrite(ENA,0); // 馬達 A 的 PWM 輸出
analogWrite(ENB,0); // 馬達 B 的 PWM 輸出
}
//-------------------------------------------
void advance(int a) // 前進
{
analogWrite(ENA,speed);
digitalWrite(pinRB,LOW);
digitalWrite(pinRF,HIGH);
analogWrite(ENB,speed);
digitalWrite(pinLB,LOW);
digitalWrite(pinLF,HIGH);
delay(a * 100);
}
void right(int b) //右轉(單輪)
{
analogWrite(ENA,speed);
digitalWrite(pinRB,LOW);
digitalWrite(pinRF,HIGH);
analogWrite(ENB,speed);
digitalWrite(pinLB,HIGH);
digitalWrite(pinLF,HIGH);
delay(b * 100);
}
void left(int c) //左轉(單輪)
{
analogWrite(ENA,speed);
digitalWrite(pinRB,HIGH);
digitalWrite(pinRF,HIGH);
analogWrite(ENB,speed);
digitalWrite(pinLB,LOW);
digitalWrite(pinLF,HIGH);
delay(c * 100);
}
void turnR(int d) //右轉(雙輪)
{
analogWrite(ENA,speed);
digitalWrite(pinRB,LOW);
digitalWrite(pinRF,HIGH);
analogWrite(ENB,speed);
digitalWrite(pinLB,HIGH);
digitalWrite(pinLF,LOW);
delay(d * 100);
}
void turnL(int e) //左轉(雙輪)
{
analogWrite(ENA,speed);
digitalWrite(pinRB,HIGH);
digitalWrite(pinRF,LOW);
analogWrite(ENB,speed);
digitalWrite(pinLB,LOW);
digitalWrite(pinLF,HIGH);
delay(e * 100);
}
void stopp(int f) //停止
{
analogWrite(ENA,speed);
digitalWrite(pinRB,HIGH);
digitalWrite(pinRF,HIGH);
analogWrite(ENB,speed);
digitalWrite(pinLB,HIGH);
digitalWrite(pinLF,HIGH);
delay(f * 100);
}
void back(int g) //後退
{
analogWrite(ENA,speed);
digitalWrite(pinRB,HIGH);
digitalWrite(pinRF,LOW);
analogWrite(ENB,speed);
digitalWrite(pinLB,HIGH);
digitalWrite(pinLF,LOW);
delay(g * 100);
}
void detection()
{
int delay_time = 255;
ask_pin_F();
if(Fspeedd < 4)
{
stopp(1);
back(2);
}
if(Fspeedd < 20)
{
stopp(1);
ask_pin_L();
delay(delay_time);
ask_pin_R();
delay(delay_time);
if(Lspeedd > Rspeedd)
{
directionn = Lgo;
}
if(Lspeedd <= Rspeedd)
{
directionn = Rgo;
}
if (Lspeedd < 3 && Rspeedd < 3)
{
directionn = Bgo;
}
}
else
{
directionn = Fgo;
}
}
void ask_pin_F()
{
myservo.write(90);
digitalWrite(outputPin, LOW);
delayMicroseconds(2);
digitalWrite(outputPin, HIGH);
delayMicroseconds(10);
digitalWrite(outputPin, LOW);
float Fdistance = pulseIn(inputPin, HIGH);
Fdistance= Fdistance/5.8/10;
Serial.print("F distance:");
Serial.println(Fdistance);
Fspeedd = Fdistance;
}
void ask_pin_L()
{
myservo.write(10);
delay(delay_time);
digitalWrite(outputPin, LOW);
delayMicroseconds(2);
digitalWrite(outputPin, HIGH);
delayMicroseconds(10);
digitalWrite(outputPin, LOW);
float Ldistance = pulseIn(inputPin, HIGH);
Ldistance= Ldistance/5.8/10;
Serial.print("L distance:");
Serial.println(Ldistance);
Lspeedd = Ldistance;
}
void ask_pin_R()
{
myservo.write(177);
delay(delay_time);
digitalWrite(outputPin, LOW);
delayMicroseconds(2);
digitalWrite(outputPin, HIGH);
delayMicroseconds(10);
digitalWrite(outputPin, LOW);
float Rdistance = pulseIn(inputPin, HIGH);
Rdistance= Rdistance/5.8/10;
Serial.print("R distance:");
Serial.println(Rdistance);
Rspeedd = Rdistance;
}
void car()
{
myservo.write(90);
detection();
Serial.print("direction:");
Serial.println(directionn);
if(directionn == 2) //假如directionn(方向) = 2
{
back(8);
turnL(2);
Serial.print(" Reverse ");
}
if(directionn == 6)
{
back(1);
turnR(6);
Serial.print(" Right ");
}
if(directionn == 4)
{
back(1);
turnL(6);
Serial.print(" Left ");
}
if(directionn == 8)
{
advance(1);
Serial.print(" Advance ");
Serial.print(" ");
}
}
//------------------------------------------
void loop()
{
if (BT.available() > 0)
{
command = BT.read();
switch (command)
{
case 's' : // 接收 's',停止
stop();
break;
case 'x' : // 接收 'x',避障
car();
break;
}
}
}
/***********************************************************************/ |