基于Arduino的蓝牙通信
前言: 本文主要以Arduino小车中的蓝牙遥控作为案例来讲解蓝牙通信。了解相关编程和数据设计。
功能和结构上:一个舵机控制小车前排车轮转向(模拟阿克曼转向结构),另外两个舵机控制车前部两轴云台,云台上放置ESP32 CAM用来拍摄。超声波传感器用来自动避障、三路红外用来巡线。
本例中用到的硬件:
主控UNO或Nano,
扩展板1块(板载有源蜂鸣器和蓝牙接口),
TT马达4个,
舵机3个,
超声波传感器1个,
三路红外传感器1个,
ESP32 CAM1个,
电源等
1.了解蓝牙模块
1.1.介绍
BT05 低功耗4.0蓝牙
- 超低待机功耗 90uA~400uA
- 超远连接距离100英尺/60米
- 超快反应速度 0.4秒
- 兼容iOS等多平台
- 收发无字节限制,最高可达3K Bytes/秒
AT 指令只能在模块未连接状态下才能生效,一旦蓝牙模块与设备连接上,蓝牙模块即进入数据透传模式
1.2.引脚连接方式
- 准备TTL转USB模块和蓝牙模块:(用Arduino板CH340再通过软串口同样可以在串口调试器上调试,不需要转接器)

- 连接线路

2.串口调试助手(拓展,用于了解蓝牙AT命令)
2.1.打开即用串口助手
2.2.基础介绍
- 1.确认端口号正确,而且没有被占用(这很重要,否则打开串口失败,例如Arduino IDE选中了该COM号之后在这里选同一个就会报警告);
- 2.勾选“加回车换行”,这样在输入指令时就不需要加回车换行;
- 3.波特率设置与蓝牙默认的保持一致(一般默认9600);

更多获取蓝牙信息的操作请看上文AT指令集指南
3.蓝牙调试APP作为小车遥控器
3.1.安装APP(安卓)
3.2.APP使用介绍
4.蓝牙通信数据设计
从功能上考虑遥控时需要通信的数据结构,一种是布尔值,一种是字符值。什么情况下用布尔值,例如控制小车左转弯,当你按下按钮发送信息左转,松手就不左转,只有动作和不动作两种情况,所以用布尔值。当你遥控小车想要不同速度行驶,这时发送速度信息就是速度值,是一个过程变化的量,用一个字节-128~127作为通信。同理,舵机控制转向左右角度值也是过程变化的量,同样各占用一个字节
4.1.蓝牙助手端数据设计

云台和单点控制组成一字节,剩下运动模式继续排在下一字节。移动方向摇杆和速度滑杆使用单独一字节。
APP内的数据结构设置:

这里面的逻辑值设置先后排序与下一节中代码设计有对应关系,不能乱调换位置。关于数据传输、数据帧等更多相关详细内容欢迎查看之前博文串行通信
4.2.主控板端代码数据设计
数据位为5个字节,加上包头、校验和包尾共8个字节的蓝牙数据包。
byte RX_package[8] = {
0};
typedef struct //5字节分布:
{
byte ControlMode; //遥控八位:bit0~7:原地左转0x01、原地右转0x02、云台左转0x04、云台右转0x08、云台向上0x10、云台向下0x20、方向盘回正0x40、蜂鸣器打开0x80;
byte MoveMode; //运动模式四位:bit0~3:自由控制模式0x01、避障模式0x02、循迹模式0x04、跟随模式0x08
byte x_axis = 0; //摇杆X轴
byte y_axis = 0; //摇杆Y轴
byte speed = 0; //速度控制(App端控件范围默认-128~127,要想速度从0开始,就要加上128)
}rx_buffer;
为了更好的调试蓝牙数据,采用了软串口,避免频繁拔掉rx/tx。同时避免串口阻塞,增加Serialcount清阻。下面的小样例测试代码用Nano板测试的,蓝牙的TX连接Nano的D4,RX连接D3引脚,可以获取到调试APP发来的信息。
#include<SoftwareSerial.h>
/*
*SoftwareSerial(rxPin, txPin, inverse_logic)
*rxPin:接收串行数据的引脚。
*txPin:传输串行数据的引脚。
*inverse_logic:用于反转输入位的含义(默认为正常逻辑)。如果设置,
SoftwareSerial 将 RX 引脚上的低电平(引脚上通常为 0v)
视为 1 位(空闲状态),将高电平(引脚上通常为 5V)视为 0 位
。它还会影响写入 TX 引脚的方式。默认值为 false。
*/
int myvalue =0;
int Serialcount = 0;
SoftwareSerial softSerial(4<


9065

被折叠的 条评论
为什么被折叠?



