Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 4967|回復: 8
打印 上一主題 下一主題

伺服馬達抽蓄

[複製鏈接]
跳轉到指定樓層
1#
發表於 2016-10-5 17:33:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最後由 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);
}
2#
發表於 2016-10-5 22:48:09 | 只看該作者
我沒有使用過這個系統所以只能建議把 轉向 或 速度 先註解掉一個測試看看~ 可能有衝突
3#
發表於 2016-10-6 09:07:09 | 只看該作者
有外接電源嗎?
可以先把伺服馬達拿掉, 看看還會不會斷線
如果會, 不是電源不夠力, 就伺服馬達壞掉
可以寫程式單獨測伺服馬達看看有有問題
4#
 樓主| 發表於 2016-10-6 14:12:25 | 只看該作者
croma 大
註解掉的方式有試過!!所以應該不是衝突的問題!
當時只留下轉向的語法!其餘都註解!還是抽蓄!所以應該可以釐清

超新手大
電源的部分也釐清過了!!OK的
只有單獨的伺服馬達語法也試過了 運行OK

有人說是PWM 輸出和 serial 共用 timer 中斷,而 serial 比較優先,所以接收到資料就會影響 PWM 的輸出。

有解決的辦法ㄇ??
5#
發表於 2016-10-6 17:42:31 | 只看該作者
回覆 4# w72321

1. 檢查接腳 是不是不小心共用了同一個腳位
2. 檢查是否共用了同一個計時器~ 有的話錯開
3. 調整中斷優先權
4. 檢查是否在接收的中斷做了發送的動作(我幹過這種蠢事)
6#
發表於 2016-10-8 11:36:59 | 只看該作者
如果我沒有記錯的話.....
void setup()
{
  pinMode(STBY, OUTPUT);

  pinMode(PWMA, OUTPUT); <~拿掉這行
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);

  Serial.begin(19200);//設定與藍芽通訊的鮑率

  LR_Servo.attach(LR_PWM);//伺服馬達 第9腳位
  LR_Servo.write(90);//伺服馬達 起始角度
}
好像是這行衝突到吧
7#
 樓主| 發表於 2016-10-10 20:46:05 | 只看該作者
抱歉樓上的大大!!

我貼上去的語法好像有寫錯~現在已更正了~
只是註解部分寫錯~實際上繳為沒有衝突~

LR_Servo.attach(LR_PWM);//伺服馬達 第9腳位 <==應該是註解第6腳位

pinMode(PWMA, OUTPUT); <==注視速度部分使用的腳位!應該是沒有問題的~~AC馬達正常驅動!

所以我找不出原因!! ><

謝謝熱心幫我找問題!!可能我真的太笨了!
8#
發表於 2016-10-11 11:44:04 | 只看該作者
我有照你的方式接並測試,
並不會宥伺服馬達抽蓄的問題
基本上, 程式再有什麼問題
並不至於會造成"藍芽斷線"
(我所認知的斷線, 應該是藍芽模組的led是常亮, 後來變閃爍)
如果不是 app 自己斷線, 就是硬體有問題
所以我才會建議先拔掉一些東西來測, 看看是那出問題
9#
 樓主| 發表於 2016-10-13 12:13:21 | 只看該作者
OK~~謝謝超新手!!
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-11-27 11:22 , Processed in 0.206554 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表