本帖最後由 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); 
} |