Robofun 機器人論壇

標題: 藍芽遙控自走車加裝避障 [打印本頁]

作者: as09651    時間: 2017-12-16 15:53
標題: 藍芽遙控自走車加裝避障
本帖最後由 as09651 於 2017-12-17 14:26 編輯

大家好 小的第一次接觸arduino
這邊有幾組程式碼分別是1.原本藍芽遙控車的程式碼2.欲裝上的紅外線模組的程式碼3.結合過的程式碼

1.原本藍芽遙控車的程式碼
#include <AFMotor.h>
#include <SoftwareSerial.h>

#define MOTOR_GO_FORWARD { motor1.run(FORWARD);motor2.run(FORWARD);motor3.run(FORWARD);motor4.run(FORWARD); }
#define MOTOR_GO_BACK        { motor1.run(BACKWARD);motor2.run(BACKWARD);motor3.run(BACKWARD);motor4.run(BACKWARD); }
#define MOTOR_GO_LEFT        { motor1.run(FORWARD);motor2.run(FORWARD);motor3.run(BACKWARD);motor4.run(BACKWARD); }
#define MOTOR_GO_RIGHT { motor1.run(BACKWARD);motor2.run(BACKWARD);motor3.run(FORWARD);motor4.run(FORWARD); }
#define MOTOR_GO_STOP        { motor1.run(RELEASE);motor2.run(RELEASE);motor3.run(RELEASE);motor4.run(RELEASE); }

AF_DCMotor motor1(1, MOTOR12_64KHZ);
AF_DCMotor motor2(2, MOTOR12_64KHZ);
AF_DCMotor motor3(3, MOTOR12_64KHZ);
AF_DCMotor motor4(4, MOTOR12_64KHZ);
SoftwareSerial BTSerial(9, 10); //RX | TX 接 bt 的 RX

void setup()
{
    Serial.begin(9600); //串口波特率设置为9600 bps
    BTSerial.begin(9600);  //鮑率要對,不然不會動
   
    motor1.setSpeed(220);
    motor2.setSpeed(220);
    motor3.setSpeed(220);
    motor4.setSpeed(220);
        
    MOTOR_GO_STOP;
}

void loop() {
  if (BTSerial.available())
   {
      if (BTSerial.available())
      {
        char command = (char)BTSerial.read();

        Serial.println(command);
      
        if (command == 'F')
        {
          MOTOR_GO_FORWARD;
        }
        else if (command == 'B')
        {
          MOTOR_GO_BACK;
        }
        else if (command == 'S')
        {
          MOTOR_GO_STOP;
        }
        else if (command == 'L')
        {
          MOTOR_GO_LEFT;
        }
        else if (command == 'R')
        {
          MOTOR_GO_RIGHT;
        }
        else
        {
          MOTOR_GO_STOP;
        }
      }
   }
}

2.欲裝上的紅外線模組的程式碼
#include "math.h"

char GP2D12;

void setup()
{
   Serial.begin(19200);
}

void loop()
{
       GP2D12=read_gp2d12_range(0);
       if(GP2D12<80 && GP2D12>10)
         {
           Serial.print(GP2D12,DEC);
           Serial.println("cm");
         }
   
     delay(50);
}

float read_gp2d12_range(byte pin)
{
  int tmp;
  tmp = analogRead(pin);
  if (tmp < 3)return -1;
  return (6787.0 /((float)tmp - 3.0)) - 4.0;
}

3.結合過的程式碼
#include <AFMotor.h>
#include <SoftwareSerial.h>
#include <math.h>
#define MOTOR_GO_FORWARD { motor1.run(FORWARD);motor2.run(FORWARD);motor3.run(FORWARD);motor4.run(FORWARD); }
#define MOTOR_GO_BACK  { motor1.run(BACKWARD);motor2.run(BACKWARD);motor3.run(BACKWARD);motor4.run(BACKWARD); }
#define MOTOR_GO_LEFT { motor1.run(FORWARD);motor2.run(FORWARD);motor3.run(BACKWARD);motor4.run(BACKWARD); }
#define MOTOR_GO_RIGHT { motor1.run(BACKWARD);motor2.run(BACKWARD);motor3.run(FORWARD);motor4.run(FORWARD); }
#define MOTOR_GO_STOP { motor1.run(RELEASE);motor2.run(RELEASE);motor3.run(RELEASE);motor4.run(RELEASE); }
char GP2D12;
AF_DCMotor motor1(1, MOTOR12_64KHZ);
AF_DCMotor motor2(2, MOTOR12_64KHZ);
AF_DCMotor motor3(3, MOTOR12_64KHZ);
AF_DCMotor motor4(4, MOTOR12_64KHZ);
SoftwareSerial BTSerial(9, 10); //RX | TX 接 bt 的 RX
float read_gp2d12_range(byte pin)
{
  int tmp;
  tmp = analogRead(pin);
  if (tmp < 3)return -1;
  return (6787.0 /((float)tmp - 3.0)) - 4.0;
}
void setup()
{
    Serial.begin(9600); //串口波特率设置为9600 bps
    BTSerial.begin(9600);  //鮑率要對,不然不會動
    motor1.setSpeed(220);
    motor2.setSpeed(220);
    motor3.setSpeed(220);
    motor4.setSpeed(220);
    MOTOR_GO_STOP;
}
void loop() {
  if (BTSerial.available())
   {
      if (BTSerial.available())
      {
        char command = (char)BTSerial.read();
        GP2D12=read_gp2d12_range(0);
        if(GP2D12<80 && GP2D12>10)   //區間?
           {
            Serial.print(GP2D12,DEC);
            Serial.println("cm");
            return;
          }
        switch(command){
          case 'F':
            MOTOR_GO_FORWARD;
            break;
          case 'B':
            MOTOR_GO_BACK;
            break;
          case 'S':
            MOTOR_GO_STOP;
            break;
          case 'L':
            MOTOR_GO_LEFT;
            break;
          case 'R':
            MOTOR_GO_RIGHT;
            break;
          default:
            Serial.println("Invalid Command: "+command);
            MOTOR_GO_STOP ;
        }
      }
   }
}

現在遇到的問題就是,紅外線模組感測到東西後會切斷藍芽連線,導致遇到障礙物後車子反而會不受控制繼續執行前面的動作

而不是預期中的MOTOR_GO_STOP全部馬達停止的指令

請問是結合後的程式哪裡有問題呢? 望各位大俠指教
作者: 超新手    時間: 2017-12-17 06:33
你所謂”遇到障礙物會MOTOR_GO_STOP”的程式是寫在那一行?我完全找不到
作者: as09651    時間: 2017-12-17 14:28
哇 不好意思
最後一句的MOTOR_GO_STOP沒有被貼上來 我已經改好了
請再幫我看一下 感恩 :)
作者: 超新手    時間: 2017-12-17 17:18
本帖最後由 超新手 於 2017-12-18 10:53 編輯

有改嗎?我沒有看到相關的程式?
如果有
應該要寫在 if(GP2D12<80 && GP2D12>10) 那段吧?
我完全沒看到

作者: as09651    時間: 2017-12-18 11:48
喔喔 原來那邊漏掉了
晚點回家我把那段補齊試試看
謝謝大大
作者: 超新手    時間: 2017-12-18 12:22
本帖最後由 超新手 於 2017-12-18 13:59 編輯

不過...
1. 如果遇到障礙物停下來, 除非有人把障礙物拿掉
   否則也沒辦法遙控
2. 這樣的寫法, 一定要APP端下命令給車子
    否則它也不會自己偵測有無障礙物
3. if(BTSerial.available()) { 寫了兩次, 是多餘

以上的問題也不算有錯, 只是有點怪怪的

作者: as09651    時間: 2017-12-19 15:28
這樣的話我把藍芽遙控的功能拿掉好了
感覺遙控跟避障不太能放在一起
另外紅外線似乎不太方便 想改成超音波了

謝謝超新手大哥熱心回答:)






歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2