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