元器件 · 通信

HC-05 蓝牙模块

HC-05 为机器人加上一条蓝牙串口:与手机配对后就能遥控机器人或回传数据,用的还是和有线连接完全相同的 TX/RX 引脚。

它是什么

HC-05 是让机器人无线最简单的办法。它是表现得像没有线的串口线的蓝牙模块:单片机在 TX/RX 脚上读写字节,和走 USB 一模一样,只是另一头是蓝牙配对的手机或电脑。手机 App 发个 F 车就前进——不用 Wi-Fi,不用网络,不用账号。

HC-05 蓝牙模块标注图:蓝色转接板,带金属屏蔽罩的蓝牙射频、四角铆钉、蛇形 PCB 天线、状态 LED,底部是 6 针排针(EN、VCC、GND、TXD、RXD、STATE)用于串口连接。
模块把蓝牙链路变成普通串口——TX/RX 交叉接单片机,看起来和有线一样。 下载 SVG

工作原理

HC-05 实现蓝牙串口协议(SPP)。配对后,空中收到的东西出现在 TX 脚上,发给 RX 脚的东西飞到配对设备。代码只管串口——Serial.read() / Serial.print()——无线链路隐形。名字、波特率、主从角色用另一个命令模式的 AT 命令配置,大多数机器人默认就能直接用。

什么时候用它

想甩掉线指挥或监控机器人时拿 HC-05:

  • 手机遥控车——蓝牙 App 发驾驶指令,车经串口读到变成电机控制。
  • 实时遥测——车跑着把传感器值或里程计回传电脑。
  • 无线调参——在线改参数,不用反复烧录。

车上已经有 ESP32 就不需要 HC-05——ESP32 自带蓝牙和 Wi-Fi。HC-05 是给 Arduino Uno 加同样无线本事的外挂。

接线与坑

  • **串口线交叉:**模块 TX → 板子 RX,模块 RX → 板子 TX。接反是“连不上”第一大原因。
  • RX 脚分压到 3.3 V(Uno 5 V 的板子)。
  • 烧录时让出硬件串口,或用软串口脚——模块和 USB 烧录器共用不了 Uno 唯一的硬件 UART。
  • 先配对(PIN 一般 1234/0000);板载 LED 显示连接状态。

引脚

引脚 名 作用
1 EN / KEY 上电时拉 HIGH 进 AT 命令模式
2 VCC 3.6–6 V,转接板内部稳到 3.3 V
3 GND 地
4 TXD 模块发送,接单片机的 RX
5 RXD 模块接收。3.3 V 逻辑——5 V 信号要分压
6 STATE 有设备连接时 HIGH。真有用,常被无视

STATE 脚值得更好待遇。读它的车知道手机走出范围,这是安全停车和一头撞墙等永远等不到的指令的区别。

接到 Arduino

这里两个错误占了大多数“连不上”报告。

HC-05 Arduino Uno 说明
VCC 5 V 板载稳压搞定
GND GND
TXD 10 脚(软串口 RX) 模块 TX → 板子 RX,交叉
RXD 经分压接 11 脚(软串口 TX) 板子 TX → 模块 RX,经 2:1 分压
EN 悬空 只 AT 模式用
STATE 任一数字脚 可选,查连接

串口线交叉

TX 说,RX 听。两台设备在同一根线上各说各的等于什么都没说,而且没报错——模块配对正常,LED 常亮,数据永远不动。模块 TX 接板子 RX,模块 RX 接板子 TX。

RX 线分压

RXD 是 3.3 V 输入,Uno 输出 5 V。两个电阻:

Arduino TX ──── 1 kΩ ──┬── HC-05 RXD
                        │
                      2 kΩ
                        │
                       GND

反方向 TXD 不用分压——模块 3.3 V 输出过得了 Uno 3.0 V 的高阈值。

别用 0 和 1 脚

Uno 只有一个硬件 UART,USB 烧录器已经占了。模块接上去烧录失败,串口监视器输出跑到模块里,调试没法做。用另外两脚 SoftwareSerial。

能跑的最小代码

#include <SoftwareSerial.h>

SoftwareSerial bt(10, 11);      // RX (from module TX), TX (to module RX)
const int STATE_PIN = 8;

void setup() {
  Serial.begin(115200);         // USB, for debugging
  bt.begin(9600);               // HC-05 default in data mode
  pinMode(STATE_PIN, INPUT);
}

void loop() {
  // Lose the link, stop the robot. Do this before reading commands.
  if (digitalRead(STATE_PIN) == LOW) { stopMotors(); }

  if (bt.available()) {
    char c = bt.read();
    switch (c) {
      case 'F': driveForward();  break;
      case 'B': driveBackward(); break;
      case 'L': turnLeft();      break;
      case 'R': turnRight();     break;
      case 'S': stopMotors();    break;
    }
    Serial.print("cmd: "); Serial.println(c);   // echo to USB for debugging
  }
}

循环顶的连接检查是大多数教程漏掉的部分,也是拦住失控车的部分。蓝牙距离约 10 m,墙一挡锐减;链路掉了还执行上一条指令的车会一直走到撞上东西。

AT 命令模式

改名字、波特率、PIN 要 AT 模式,进它的步骤模块上一个字不写。

  1. 模块断电。
  2. EN 拉 HIGH(板子有小按键就按住)。
  3. 按住 EN 上电。
  4. LED 慢闪——约两秒一次——而不是快闪。
  5. 38400 波特率对话,不是 9600,回车换行都要。
AT                    -> OK
AT+NAME=LineBot       -> OK      set the name shown when pairing
AT+PSWD="1234"        -> OK      set the pairing PIN (quotes on newer firmware)
AT+UART=115200,0,0    -> OK      data-mode baud rate
AT+ROLE=0             -> OK      0 = slave (normal), 1 = master
AT+ADDR?              -> +ADDR   the module's own address

两个坑:AT 模式永远 38400,和数据波特率无关;LED 闪法是唯一可靠标志。快闪是数据模式,AT 命令会直接发到空中给配对设备。

HC-05 还是 HC-06?

长得一样,混着卖,只有一个真区别。

HC-05 HC-06
角色 主机或从机 仅从机
能主动连接 能 不能
AT 模式 EN 脚进,38400 未配对时随时,数据波特率
价格 贵一点 便宜一点

模块只等人家手机连,HC-06 够了。两台车互聊,或车主动连模块而不是等人连,就要 HC-05 的主机角色。

故障排查

现象 可能原因 解决
配对上但数据不动 TX/RX 没交叉 模块 TX → 板子 RX,模块 RX → 板子 TX
乱码 波特率不一致 两端都 9600,或设成同一个
连着烧录失败 模块占了 0/1 脚 挪到 SoftwareSerial 脚
AT 命令没反应 根本没进 AT 模式 上电时按住 EN;看慢闪
AT 模式无应答 用了数据波特率 AT 模式永远 38400
配对不上 PIN 错 1234 再 0000 试
几米就掉 Class 2 距离加上墙体 正常;用 STATE 脚做故障安全处理
断连车还跑 无链路检查 读 STATE,LOW 就停
USB 供电好、电池跪 电源电压下垂 射频发射的尖峰需要稳定的 5 V

HC-05 还是 ESP32?

选零件而不是用存货时,这是真问题。

HC-05 + Arduino ESP32
无线 经典蓝牙 SPP 内置 Wi-Fi 和蓝牙
额外硬件 模块、分压、两脚 无
控制界面 串口字节流 车自己开的网页
距离 约 10 m Wi-Fi 约 50 m,有网多远都行
要手机 App 要——通用蓝牙终端 不要——浏览器就行
学习价值 串口协议,最素的链路 网络,大学问

手里有 Arduino、想最快无线,HC-05 是正解:真简单,进一字节出一字节,无网络概念。新作品硬性要无线,ESP32 花更少干更多还不加零件——自己开控制页的车,谁的手机都不用装 App。

探索关联图谱

用到它的搭建

包含 HC-05 蓝牙模块 的项目、学习路线和模拟器。

对比

替代方案

问题

HC-05 蓝牙模块 常见问题

HC-05 是什么?

HC-05 是一种蓝牙模块,它把无线连接变成普通的串口(UART)链路。在你的单片机看来,它和一根有线串口线一模一样——你在 TX/RX 上读写字节——只不过另一端是通过蓝牙连接的手机或电脑。这是无线控制机器人最简单的办法。

HC-05 怎么接到 Arduino?

先接好 VCC 和 GND,然后把串口线交叉连接——模块 TX 接 Arduino RX,模块 RX 接 Arduino TX。由于 HC-05 的 RX 引脚是 3.3 V 的,要用分压电路把 Arduino 5 V 的 TX 信号降下来。这样一来,你通过串口打印的任何内容都会无线发送到配对的手机上,反之亦然。

HC-05 的通信距离有多远?

视距约 10 米——它是 Class 2 蓝牙设备。墙体和干扰会让距离缩短。用手机遥控机器人在房间里跑,这个距离绰绰有余;但要远距离控制,就得改用 Wi-Fi 或专用的无线电。

HC-05 模块怎么配对?

与手机配对时,先给模块上电,打开手机的蓝牙设置,选择 HC-05,然后输入 PIN(通常是 1234 或 0000)。要让两个 HC-05 相互配对,需要用 AT 命令把一个设为主机、另一个设为从机,再按地址把它们绑定。

怎么给 HC-05 编程配置?

HC-05 有两种模式。在数据模式下,它只是把串口字节原样透传。要修改它的名称、波特率或主从角色,就得让它进入 AT 命令模式——上电时把 EN/KEY 引脚保持为高电平——然后通过串口发送 AT 命令。

延伸阅读

参考资料