3. 蓝牙通信原理

在STM32机器人控制系统中,蓝牙模块是打通“手机端指令”与“单片机执行”之间的无线桥梁。HC-05与HC-06作为最常见的低成本蓝牙串口模块,其核心价值在于将复杂的蓝牙协议栈封装为简单的串口透传通道。理解AT指令集、主从模式配对逻辑以及串口透传机制,是确保机器人稳定接收控制指令、回传状态数据的前提。本章将从模块选型差异出发,深入剖析蓝牙通信的底层原理与工程配置方法。

HC-05/HC-06 蓝牙模块通信链路与配置流程 手机APP 发送指令/接收状态 (SPP蓝牙串口) 蓝牙2.4GHz 配对/加密 HC-05 / HC-06 蓝牙转串口模块 RXD/TXD/VCC/GND AT指令配置模式 UART串口 (透传数据) STM32单片机 USART1/USART2 解析指令/控制电机 中断接收/状态回传 机器人执行器 电机/舵机/传感器 PWM/GPIO控制 控制信号 AT指令配置流程(上电前按住按键进入AT模式) ① 进入AT模式 按住按键上电 LED慢闪(2s) ② 设置参数 AT+NAME/AT+PSWD AT+UART/AT+ROLE ③ 验证配置 AT+ADDR? 查询地址 AT+STATE? 查询状态 ④ 退出AT模式 重新上电 LED快闪(1s) 主从模式对比 • 主模块(HC-05): 主动发起配对,可连接从机 • 从模块(HC-05/06): 被动等待连接,被手机搜索 • 手机APP通常作为“主设备”发起连接 串口透传机制 • 蓝牙收发的数据包与串口字节流一一对应 • 模块内部完成蓝牙协议栈封装/解封装 • STM32无需关心无线细节,只处理串口数据

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的中断源实现自动安全保护。