别再只会用HC-05连手机了!手把手教你配置两个Arduino蓝牙模块实现无线通信

张开发
2026/5/16 15:14:04 15 分钟阅读
别再只会用HC-05连手机了!手把手教你配置两个Arduino蓝牙模块实现无线通信
双HC-05蓝牙模块互连实战指南从AT指令到机器人控制想象一下当你需要让两个Arduino设备在没有线缆束缚的情况下交换传感器数据或控制指令时蓝牙模块间的直接通信就成为了关键解决方案。市面上大多数教程都停留在蓝牙模块与手机的连接上却很少有人深入讲解如何让两个HC-05模块像老朋友一样自动握手交谈。这正是许多物联网原型和机器人项目真正需要的核心技术。1. 硬件准备与环境搭建在开始配置之前我们需要确保手头有正确的硬件组合。每个HC-05模块都有六个关键引脚VCC5V供电、GND接地、TXD发送端、RXD接收端、EN使能端和STATE状态指示。值得注意的是虽然模块供电可以是5V但信号电平是3.3V逻辑直接连接Arduino的5V引脚可能导致不稳定。推荐硬件清单2个Arduino开发板Uno或Nano均可2个HC-05蓝牙模块4个1kΩ电阻用于分压保护面包板和跳线若干电压转换电路至关重要这里给出一个简单的分压方案// Arduino TX - 1kΩ - HC-05 RX // | // 1kΩ - GND对于状态监测可以将模块的STATE引脚连接到Arduino的数字引脚通过以下代码检测连接状态const int statePin 2; // 连接HC-05的STATE引脚 void setup() { pinMode(statePin, INPUT); Serial.begin(9600); } void loop() { Serial.println(digitalRead(statePin) ? 已连接 : 未连接); delay(500); }2. AT指令深度解析与角色配置进入AT指令模式是配置的关键第一步。不同于常规使用我们需要让模块进入配置状态保持模块断电状态下按住板载按钮如果有或将KEY引脚接高电平然后上电。成功时LED会进入慢闪模式约2秒一次。主从模式选择策略主机(ROLE1)主动发起连接适合作为控制端从机(ROLE0)等待连接适合作为被控端回环模式(ROLE2)特殊调试用途配置一个模块为主机另一个为从机的完整AT指令序列如下ATORGL // 恢复出厂设置 ATROLE1 // 设置为主机 ATCMODE0 // 指定地址连接模式 ATPSWD8888 // 设置配对密码 ATUART38400,1,0 // 波特率38400,1位停止位,无校验 ATBIND98d3,31,f12a45 // 绑定从机地址注意地址中的冒号需要替换为逗号且从机必须使用相同的配对密码。建议先用ATADDR查询从机地址后再配置主机。3. 配对验证与状态诊断成功配对后两个模块的LED指示灯会呈现快速双闪模式约0.5秒两次。此时可以通过简单的串口通信测试验证连接质量// 主机端代码 #include SoftwareSerial.h SoftwareSerial BTSerial(10, 11); // RX, TX void setup() { Serial.begin(9600); BTSerial.begin(38400); } void loop() { if (BTSerial.available()) { Serial.write(BTSerial.read()); } if (Serial.available()) { BTSerial.write(Serial.read()); } }常见故障排除表现象可能原因解决方案LED不亮供电异常检查VCC和GND连接慢闪但不响应AT指令波特率不匹配尝试38400、9600等不同波特率无法建立连接密码不一致确认ATPSWD设置相同连接不稳定地址绑定错误重新检查ATBIND参数格式数据丢失电压不匹配添加分压电阻或电平转换器4. 高级应用机器人无线控制系统现在我们将这套通信系统应用到实际项目中。假设我们要构建一个通过蓝牙遥控的小车主机端连接摇杆模块从机端控制电机驱动。主机端摇杆数据处理// 主机端 - 发送控制指令 void loop() { int x analogRead(A0); // X轴 int y analogRead(A1); // Y轴 char cmd[10]; sprintf(cmd, X%dY%d, map(x,0,1023,-100,100), map(y,0,1023,-100,100)); BTSerial.println(cmd); delay(50); }从机端电机控制// 从机端 - 解析指令控制电机 void loop() { if(BTSerial.available()) { String cmd BTSerial.readStringUntil(\n); if(cmd.startsWith(X)) { int x cmd.substring(1, cmd.indexOf(Y)).toInt(); int y cmd.substring(cmd.indexOf(Y)1).toInt(); // 根据x,y值设置电机PWM setMotors(x, y); } } }为提高可靠性可以添加简单的通信协议每个数据包以$开头包含2字节校验和以\n结束 例如$X50Y75C125\n在最近的一个自动导引车项目中这种配置方式成功实现了20米范围内的稳定控制。关键发现是适当降低波特率从38400降到19200可以显著提高远距离通信的可靠性。

更多文章