旧手机 + FireBeetle 2 ESP32-C6:打造自己的语音控制小车
2026-09-282
【项目背景】
不用买屏幕、不用摄像头、不用云主机——用一部闲置的旧手机当交互终端,一块 DFRobot FireBeetle 2 ESP32-C6 做主控,再接入硅基流动(SiliconFlow)大模型 API(语音识别 + 大模型对话 + 语音合成),就能做出一台会说、会听、会按指令移动的语音控制小车。
你只需对它说:"先前进,再左转,再右转",小车就会依次完成三个动作;问它"今天天气怎么样",它会用稳定的音色回答你。整个网页就托管在 C6 的 Flash 里,手机打开浏览器即可使用,完全不需要电脑中转、不需要第三方物联网平台。
本项目已在实机验证:语音识别、对话、连续动作执行、语音播报全部跑通。

一、项目架构
旧手机(浏览器) ──WiFi(2.4G)──▶ FireBeetle 2 ESP32-C6(自带 HTTPS 网页服务器)
│ │
│ 按住说话/自动听 │ L298N 双H桥
▼ ▼
录音 → 硅基流动 Qwen3-ASR-1.7B ──▶ 文字 ──▶ 硅基流动 Qwen3-8B/32B 对话
│
播放 MOSS-TTSD-v0.5 合成语音 ◀────────┘ 输出 actions:[FORWARD,LEFT,...]
│
┌───────────────┘
▼
C6 按顺序执行动作(前进2秒/转向1秒,自动停车)
为什么手机要配 C6,而不直接用手机控制电机?
- 浏览器受安全限制:不能直接驱动 GPIO、不能发原始 UDP,录音/摄像头还必须 HTTPS
- C6 做"大脑 + 关节":提供 HTTPS 网页、解析指令、驱动电机,手机只负责"声音交互"
二、材料清单
| 类别 | 名称 | 数量 | 说明 |
|---|---|---|---|
| 主控 | DFRobot FireBeetle 2 ESP32-C6(DFR1075) | 1 | 板载 LED(IO15)、支持 Wi-Fi 6 |
| 驱动 | L298N 双 H 桥电机驱动板 | 1 | 两路电机,PWM 调速 |
| 电机 | 直流减速电机(带轮小车底盘) | 2 | 左右轮各一 |
| 电源 | 3.7V 锂电池 | 1 | 进 L298N 12V 端子;C6 用 Type-C 或电池供电 |
| 交互 | 闲置旧手机(安卓/iOS 均可) | 1 | 与 C6 连同一路由器(2.4G) |
| 调试 | Type-C 数据线 | 1 | 烧录 + 串口监视 |
| 服务 | 硅基流动(SiliconFlow)API | — | 注册获得 API Key,使用赠送额度即可 |
手机必须是智能手机且内置浏览器即可,几年前的旧机型完全够用(页面已做老浏览器兼容)。
注册赠16元代金券:https://cloud.siliconflow.cn/i/KwyEBX3e
三、接线(L298N ↔ C6)
务必共地:L298N 的 GND 与 C6 的 GND 相连,否则信号不识别。
| C6 引脚 (GPIO) | → | L298N 端子 | 作用 |
|---|---|---|---|
| GPIO2 (M1_IN1) | → | IN1(A通道) | 左轮方向1 |
| GPIO3 (M1_IN2) | → | IN2(A通道) | 左轮方向2 |
| GPIO4 (M1_PWM) | → | ENA | 左轮速度 PWM |
| GPIO5 (M2_IN1) | → | IN3(B通道) | 右轮方向1 |
| GPIO6 (M2_IN2) | → | IN4(B通道) | 右轮方向2 |
| GPIO7 (M2_PWM) | → | ENB | 右轮速度 PWM |
| GND | ↔ | GND | 共地(必须) |
| 电池 3.7V | → | 12V/VCC | 电机电源 |

引脚定义在
firebeetle2_voice_robot.ino顶部,可按实际焊接修改;若转向相反,互换该轮两根 IN 线即可。
四、软件与模型
4.1 开发环境
- Arduino IDE(2.x 均可),安装 Espressif ESP32 板卡包(3.x)
- 开发板选择:DFRobot FireBeetle 2 ESP32-C6
- 工具 → USB CDC On Boot = Enabled(否则串口在程序运行后会断开)
4.2 硅基流动模型(本项目全部实测可用)
| 用途 | 模型 ID | 说明 |
|---|---|---|
| 语音识别 ASR | Qwen/Qwen3-ASR-1.7B |
支持 52 种语言/方言,识别准、返回快 |
| 对话/动作决策 | Qwen/Qwen3-8B(默认) |
快;可换 32B 更强 |
| 语音合成 TTS | fnlp/MOSS-TTSD-v0.5 |
音色 fnlp/MOSS-TTSD-v0.5:alex,稳定 |
- 语音识别接口:
POST https://api.siliconflow.cn/v1/audio/transcriptions(多部分上传 wav) - 对话接口:
POST https://api.siliconflow.cn/v1/chat/completions - 语音合成接口:
POST https://api.siliconflow.cn/v1/audio/speech - 浏览器直连可行(CORS 已放行),无需任何中转服务器
五、程序结构
firebeetle2_voice_robot/
├── firebeetle2_voice_robot.ino ← C6 主程序(HTTPS服务器+动作控制)
├── page.h ← 网页(HTML+JS 全内嵌,放头文件防注入)
└── certificates.h ← 自签名证书(DER 二进制)
5.1 C6 侧核心逻辑
void processCommand(String cmd) {
cmd.trim(); cmd.toUpperCase();
Serial.print("[收到指令] "); Serial.println(cmd);
if (cmd == "FORWARD") { startMotion("FORWARD", 2000); } // 前进2秒
else if (cmd == "LEFT" || cmd == "RIGHT") { startMotion(cmd, 1000); } // 转向1秒
else { stopMotionNow(); } // 其余立即停车
}
- 两个网页服务:HTTP :80 与 HTTPS :443(mbedtls 自签名)
- 接口:
/cmd?cmd=FORWARD、/speedl?v=、/speedr?v=、/info(返回 IP/信号/当前动作/左右轮速度) - 动作执行后自动停车,等待新指令
5.2 网页功能(全部在手机浏览器里)
| 功能 | 说明 |
|---|---|
| 🎤 按住说话 | 按住录音、松开识别(指针捕获,长按不选中文字) |
| 👂 持续听(人声唤醒) | 听到人声自动录音→识别→对话;1.5 秒 PCM 预卷不漏开头;播报自己声音自动忽略 |
| 🤖 AI 对话 | Qwen3-8B/32B,思考模式关闭,回复简短;可一次输出多个动作连续执行 |
| 📢 语音播报 | MOSS-TTSD 固定音色,失败自动重试一次保持音色;结尾杂音自动裁剪;纯控制指令不播报 |
| 🎚 左右轮调速 | 两个滑块独立调 PWM(默认左 240 / 右 255) |
| 🔍 测试连接 / JS 自检 | 打开页面一眼看到连接状态与浏览器能力 |

六、制作步骤
- 烧录:用 Arduino IDE 打开
firebeetle2_voice_robot.ino,选板卡 "DFRobot FireBeetle 2 ESP32-C6",CDC On Boot = Enabled,上传 - 配置 WiFi:改
.ino顶部WIFI_SSID/WIFI_PASS(C6 仅支持 2.4GHz);默认静态 IP192.168.31.88,可按路由器网段修改 - 配 API Key:
page.h顶部API_KEY换成你的硅基流动 Key - 串口监视器(115200)看到:
WiFi已连接, IP: 192.168.31.88、HTTPS 已启动,板载 LED 闪两下 - 手机:连同一 WiFi,打开
https://192.168.31.88(自签名证书 → 高级 → 继续访问) - 先点「🔊 试听播报」验证链路,再按住说话或开启持续听



七、使用演示(建议拍成视频/GIF)
| 指令 | 小车动作 |
|---|---|
| "前进" | 前进 2 秒 → 自动停车 |
| "先前进,再左转,再右转" | 前进2秒 → 左转1秒 → 右转1秒 → 停(连续动作) |
| "加速" / 拖动左右轮滑块 | 按新 PWM 行驶 |
| "你好"(闲聊) | 语音播报回答(同一音色) |
在 持续听 模式下,完全不用碰手机:对它说话它就执行,安静后自动待命。
八、技术难点与解决(这篇的含金量)
- 浏览器不能裸发 UDP / 录音必须 HTTPS
→ C6 用 mbedtls 做自签名 HTTPS 服务器,证书以 DER 二进制内嵌,手机浏览器"高级→继续访问"即可;顺带解决了将来加摄像头实时预览的权限问题。 - Arduino 的"生成函数原型"会把
#line注进 HTML,毁掉页面 JS
→ 把网页 HTML 移进page.h头文件(原型生成器只处理.ino,不碰头文件)。这是"同一份代码,有时页面白屏"类问题的根源,务必用此结构。 - 老手机浏览器不支持现代 JS
→ 页面 JS 用 ES5 兼容写法 + 拆成两个<script>块:第一块做极简启动自检,一眼判断是"浏览器不支持"还是"页面问题"。 - 持续听漏掉开头几个字
→ 用 PCM 预卷环(始终保留最近 1.5 秒音频),检测到人声即把预卷拼回录音,开头一字不丢。 - TTS 音色忽男忽女 / 结尾有杂音
→ 固定音色...:alex,接口失败自动重试一次保持音色;(b) 播放前解码并按结尾静音裁剪,同时先停掉上次播放防重叠串音。 - 一次说多个动作
→ 对话里约定输出{"reply":"...","actions":["FORWARD","LEFT","RIGHT"]},网页解析后逐个发送并等上一个动作完成再下一个。 - 踩坑记录:变量名
history会撞浏览器内置 History 对象 → 改名chatHistory。
九、注意事项
- API Key 内嵌在网页里,仅限自家局域网使用,勿上传公开仓库;被其他人连到同一 WiFi 即可使用你的 Key,注意额度
- C6 只支持 2.4GHz WiFi;手机最好连 5G/2.4G 双频路由的 2.4G 段,信号更稳
- L298N 必须与 C6 共地;电机单独由电池供电,不要从 C6 引脚取电
- 首次调用 ASR/TTS 会偏慢(模型冷启动),之后正常;深夜/闲时更快
- 上传前确认草图文件夹只有
.ino+page.h+certificates.h
十、参考资料
- DFRobot FireBeetle 2 ESP32-C6 官方 wiki:https://wiki.dfrobot.com.cn/_SKU_DFR1075_FireBeetle_2_Board_ESP32_C6
- 硅基流动开放平台:https://siliconflow.cn
- 项目文件:
firebeetle2_voice_robot/(ino + page.h + certificates.h)附件压缩包
本文由实际完成的项目整理而成,欢迎在评论区交流。如果你也想让旧手机"再就业",从一块 C6 开始吧!




