本帖最後由 w72321 於 2016-10-10 20:43 編輯
請問一下各位大神!!
目前是設定當藍芽接通讀取後
伺服馬達角度會隨著發送過來的資訊改變角度
可是我收到資訊後伺服馬達會快速抽蓄
然後藍芽就斷線了!
等重新連接!當連接完成又開始抽蓄!然後又斷線了
一直重複
我是用HC-05
是否有什ㄇ要注意的呢?
我有確認馬達沒有問題!是正常的!
有問題的部分出現在 //轉向 之後的語法
希望大神們可以幫忙解惑
DC馬達部分沒有問題可驅動
以下是語法
--------------------------------------------------------------------------------------------
#include <Servo.h>
#include <SoftwareSerial.h>
#define LR_PWM 6 //伺服馬達 第6腳位
Servo LR_Servo; //定義伺服馬達 名稱為LR
//TB6612FNG Dual Motor Driver 電機驅動模組,後輪馬達
int STBY = 4; //standby
int PWMA = 9; //Speed control
int AIN1 = 7; //Direction
int AIN2 = 8; //Direction
int LED = 12;
void setup()
{
pinMode(STBY, OUTPUT);
pinMode(PWMA, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
Serial.begin(19200);//設定與藍芽通訊的鮑率
LR_Servo.attach(LR_PWM);//伺服馬達 第6腳位
LR_Servo.write(90);//伺服馬達 起始角度
}
bool ledToggle = false;
bool lastSerialn = false;
void loop() {
if (Serial.available() > 0) //判斷是否有接收到藍牙訊息
{
// read the data
char PosX;
char PosY;
bool Serialn = false;
// read X
while (Serial.available()) {
char c = Serial.read();
if (c == '@') {
break;
} else {
PosX = c;
}
}
// read Y
while (Serial.available()) {
char c = Serial.read();
if (c == '#') {
break;
} else {
PosY = c;
}
}
//Z Botton
while (Serial.available()) {
char c = Serial.read();
if (c == '$') {
break;
} else {
Serialn = c == '0'; // true
}
}
while (Serial.available()) {
char c = Serial.read();
if (c == '\n') {
break;
}
}
//LED控制-----沒問題
if (Serialn != lastSerialn) {
if (Serialn)
ledToggle = !ledToggle;
}
lastSerialn = Serialn;
if (ledToggle)
digitalWrite(LED, HIGH);
else
digitalWrite(LED, LOW);
//前後控制-------沒問題
char X = PosX ;
//前進
if (X == 'Q')//若接受到字元'Q'
{
move(1, 100, 1); //motor 1, 速度100, 正轉
} else if (X == 'W')//若接受到字元'W'
{
move(1, 180, 1); //motor 1, 速度180, 正轉
} else if (X == 'E')//若接受到字元'E'
{
move(1, 255, 1); //motor 1, 速度255, 正轉
}
//後退
else if (X == 'A')//若接受到字元'A'
{
move(1, 100, 0); //motor 1, 速度100, 反轉
} else if (X == 'S')//若接受到字元'S'
{
move(1, 180, 0); //motor 1, 速度180, 反轉
} else if (X == 'D')//若接受到字元'D'
{
move(1, 255, 0); //motor 1, 速度255, 反轉
} else {
stop();//車不動
}
//轉向
char Y = PosY ;
int angleY = 90;
if (Y == 'L') {
angleY = angleY - 15; //若接受到字元'L'時,車左轉
} else if (Y == 'R') {
angleY = angleY + 15; //若接受到字元'R'時,右轉
} else {
angleY = angleY ; //車置中
}
LR_Servo.write(angleY);//伺服馬達 起始角度
delay(30); //延遲0.1秒
}
}
void move(int motor, int speed, int direction) {
//以一個確定的速度和方向移動電機
//電機: 0代表B 1代表A
//速度: 0關閉電機, 255開啟最快速度
//方向: 0正轉, 1反轉
digitalWrite(STBY, HIGH); //關閉standby
boolean inPin1 = LOW;
boolean inPin2 = HIGH;
if (direction == 1) {
inPin1 = HIGH;
inPin2 = LOW;
}
if (direction == 0) {
inPin1 = LOW;
inPin2 = HIGH;
}
if (motor == 1) {
digitalWrite(AIN1, inPin1);
digitalWrite(AIN2, inPin2);
analogWrite(PWMA, speed);
}
}
void stop() {
//開啟standby
digitalWrite(STBY, LOW);
} |