3、蓝牙通信原理:蓝牙模块(HC-05/HC-06)的AT指令、配对、主从模式、串口透传机制
在STM32机器人控制系统中,蓝牙模块是打通“手机端指令”与“单片机执行”之间的无线桥梁。HC-05与HC-06作为最常见的低成本蓝牙串口模块,其核心价值在于将复杂的蓝牙协议栈封装为简单的串口透传通道。理解AT指令集、主从模式配对逻辑以及串口透传机制,是确保机器人稳定接收控制指令、回传状态数据的前提。本章将从模块选型差异出发,深入剖析蓝牙通信的底层原理与工程配置方法。
3.1 核心原理:蓝牙串口模块的透明传输本质
蓝牙串口模块(Bluetooth Serial Port Profile, SPP)的设计初衷是替代物理串口线。HC-05与HC-06内部集成了蓝牙射频收发器、基带控制器以及Flash存储器,对外仅暴露UART接口(TXD/RXD)。当手机与模块完成配对后,手机发送的蓝牙数据包会被模块接收并转换为串口字节流,通过TXD引脚发送给STM32;反之,STM32通过RXD引脚写入的字节流会被模块封装为蓝牙数据包发送至手机。这种“透明传输”意味着单片机开发者无需理解蓝牙协议栈的复杂分层,只需像操作有线串口一样读写数据即可。
HC-05与HC-06的核心差异在于角色能力:HC-06仅支持从机模式,只能被动等待连接,适合作为机器人端接收手机指令;HC-05支持主从双模式,可通过AT指令切换,既能被手机连接,也能主动连接其他蓝牙设备(如另一台HC-05),适用于双机通信或中继场景。此外,HC-05的AT指令集更丰富,支持查询地址、设置配对码、修改串口波特率等高级功能,而HC-06的AT指令仅支持修改名称、密码和波特率。在机器人项目中,若仅需手机直控,HC-06性价比更高;若需实现两个MCU之间的无线通信,则必须选用HC-05。
3.2 判断方法与操作流程:AT指令配置与配对实战
AT指令是蓝牙模块的“控制语言”,通过串口发送特定ASCII字符串即可修改模块参数。配置HC-05进入AT模式的标准方法是:按住模块上的按键(或拉高EN引脚)再上电,此时模块以38400bps(部分版本为9600bps)的波特率工作,LED指示灯慢闪(约2秒一次)。HC-06则无需按键,直接上电即为AT模式,但仅支持从机配置。
以下为HC-05常用AT指令配置流程(通过USB转TTL连接电脑串口助手):
// 1. 设置模块名称为"RobotCar"
AT+NAME=RobotCar
// 返回: OK
// 2. 设置配对密码为"1234"
AT+PSWD=1234
// 返回: OK
// 3. 设置串口波特率为115200,停止位1位
AT+UART=115200,0,0
// 返回: OK
// 4. 设置角色:1=主模式,0=从模式
AT+ROLE=0
// 返回: OK
// 5. 查询模块地址(用于主模式主动连接)
AT+ADDR?
// 返回: +ADDR:98d3:31:123456
配对操作分为两种场景:手机连接模块时,手机作为主设备搜索周围蓝牙设备,输入配对码(默认1234或0000)即可完成绑定;两个HC-05模块互连时,需将A模块设为主模式(AT+ROLE=1),B模块设为从模式(AT+ROLE=0),主模块发送AT+CMODE=0(固定地址连接)或AT+CMODE=1(任意地址连接),然后执行AT+BIND=从模块地址,重新上电后主模块会自动发起配对。
3.3 案例拆解:基于HC-05的STM32机器人双模控制
某轮式机器人项目需要同时支持“手机APP遥控”和“双机编队通信”两种模式。硬件选型为STM32F103C8T6主控,HC-05蓝牙模块(支持主从切换),手机端使用第三方蓝牙串口APP。项目约束:机器人主控串口资源有限,仅USART1可用;蓝牙模块需兼顾与手机的从机通信和与另一台机器人的主机通信。
初始方案与问题:最初直接使用HC-06从机模块,手机遥控功能正常,但无法实现双机通信。改为HC-05后,发现每次切换主从模式都需要重新进入AT模式修改参数,操作繁琐且容易出错。
优化设计:利用STM32的GPIO模拟按键操作,将HC-05的EN引脚连接至PB0,KEY引脚连接至PB1。通过程序控制PB0拉高并复位模块电源,即可在运行时动态进入AT模式。具体实现逻辑如下:
// 动态切换主从模式
void Bluetooth_SetRole(uint8_t role) {
// 进入AT模式:EN拉高 + 模块断电重启
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); // EN=1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // 模拟断电
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // 重新上电
HAL_Delay(500);
// 发送AT指令
char cmd[20];
sprintf(cmd, "AT+ROLE=%d\r\n", role);
HAL_UART_Transmit(&huart1, (uint8_t*)cmd, strlen(cmd), 100);
HAL_Delay(200);
// 退出AT模式:EN拉低
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
HAL_Delay(100);
}
结果与复盘:该方案实现了手机遥控(从模式)与双机通信(主模式)的软件切换,切换时间约1.2秒。但发现一个问题:频繁切换主从模式会导致手机端需要重新配对,影响用户体验。最终采用“双模块方案”——保留HC-06专门用于手机通信,另加一个HC-05用于编队通信,彻底避免模式切换冲突。此案例说明,在复杂通信需求下,硬件冗余比软件切换更可靠。
3.4 常见误区与总结复盘
在蓝牙模块使用中,工程师常陷入以下误区:
- 误区一:忽视电平匹配。HC-05/06的TXD/RXD引脚为3.3V电平,若直接连接5V单片机的串口引脚,可能损坏模块。STM32的USART引脚兼容3.3V,但若使用Arduino(5V)需加电平转换电路。
- 误区二:AT指令波特率混淆。HC-05在AT模式下默认波特率为38400,而数据透传模式默认9600。若用9600发送AT指令,模块无响应;反之亦然。建议统一设置为115200以匹配STM32的常用配置。
- 误区三:配对码不匹配。部分手机蓝牙协议要求配对码为0000,而HC-05默认1234。若手机无法连接,先尝试修改模块密码为0000。
- 误区四:忽略天线布局。蓝牙模块的天线区域(PCB板载天线)应远离金属外壳和电机驱动线,否则信号衰减严重,导致控制距离缩短至1-2米。
风险提示:蓝牙模块的供电电压范围通常为3.6V-6V,但电流峰值可达50mA。若使用STM32的3.3V LDO供电,当蓝牙发射时可能拉低系统电压,导致MCU复位。建议使用独立的5V电源或加装100μF电解电容进行储能缓冲。
总结复盘:蓝牙通信的核心在于理解“串口透传”这一抽象层——无论底层蓝牙协议如何复杂,对STM32而言只是多了一根“无线串口线”。工程实践中,优先确定主从角色和波特率,再配置AT指令,最后进行配对测试。对于需要长期稳定运行的机器人项目,建议在固件中加入通信超时检测(如500ms未收到指令则自动停车),防止蓝牙断连后机器人失控。此外,利用蓝牙模块的STATE引脚(HC-05有该引脚)可实时检测连接状态,当手机断开时STATE输出低电平,可作为MCU的中断源实现自动安全保护。