旧手机 + FireBeetle 2 ESP32-C6:打造自己的语音控制小车

2026-09-282

【项目背景】

不用买屏幕、不用摄像头、不用云主机——用一部闲置的旧手机当交互终端,一块 DFRobot FireBeetle 2 ESP32-C6 做主控,再接入硅基流动(SiliconFlow)大模型 API(语音识别 + 大模型对话 + 语音合成),就能做出一台会说、会听、会按指令移动的语音控制小车。

你只需对它说:"先前进,再左转,再右转",小车就会依次完成三个动作;问它"今天天气怎么样",它会用稳定的音色回答你。整个网页就托管在 C6 的 Flash 里,手机打开浏览器即可使用,完全不需要电脑中转、不需要第三方物联网平台。

本项目已在实机验证:语音识别、对话、连续动作执行、语音播报全部跑通。


旧手机 + FireBeetle 2 ESP32-C6:打造自己的语音控制小车_image_1.webp


一、项目架构

旧手机(浏览器)  ──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 电机电源

旧手机 + FireBeetle 2 ESP32-C6:打造自己的语音控制小车_image_2.webp

引脚定义在 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 自检 打开页面一眼看到连接状态与浏览器能力

旧手机 + FireBeetle 2 ESP32-C6:打造自己的语音控制小车_image_3.webp

六、制作步骤

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

旧手机 + FireBeetle 2 ESP32-C6:打造自己的语音控制小车_image_4.webp
旧手机 + FireBeetle 2 ESP32-C6:打造自己的语音控制小车_image_5.webp

旧手机 + FireBeetle 2 ESP32-C6:打造自己的语音控制小车_image_6.webp

七、使用演示(建议拍成视频/GIF)

指令 小车动作
"前进" 前进 2 秒 → 自动停车
"先前进,再左转,再右转" 前进2秒 → 左转1秒 → 右转1秒 → 停(连续动作)
"加速" / 拖动左右轮滑块 按新 PWM 行驶
"你好"(闲聊) 语音播报回答(同一音色)

在 持续听 模式下,完全不用碰手机:对它说话它就执行,安静后自动待命。

演示视频


八、技术难点与解决(这篇的含金量)

  1. 浏览器不能裸发 UDP / 录音必须 HTTPS
    → C6 用 mbedtls 做自签名 HTTPS 服务器,证书以 DER 二进制内嵌,手机浏览器"高级→继续访问"即可;顺带解决了将来加摄像头实时预览的权限问题。
  2. Arduino 的"生成函数原型"会把 #line 注进 HTML,毁掉页面 JS
    → 把网页 HTML 移进 page.h 头文件(原型生成器只处理 .ino,不碰头文件)。这是"同一份代码,有时页面白屏"类问题的根源,务必用此结构。
  3. 老手机浏览器不支持现代 JS
    → 页面 JS 用 ES5 兼容写法 + 拆成两个 <script> 块:第一块做极简启动自检,一眼判断是"浏览器不支持"还是"页面问题"。
  4. 持续听漏掉开头几个字
    → 用 PCM 预卷环(始终保留最近 1.5 秒音频),检测到人声即把预卷拼回录音,开头一字不丢。
  5. TTS 音色忽男忽女 / 结尾有杂音
    → 固定音色 ...:alex,接口失败自动重试一次保持音色;(b) 播放前解码并按结尾静音裁剪,同时先停掉上次播放防重叠串音。
  6. 一次说多个动作
    → 对话里约定输出 {"reply":"...","actions":["FORWARD","LEFT","RIGHT"]},网页解析后逐个发送并等上一个动作完成再下一个。
  7. 踩坑记录:变量名 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

十、参考资料


本文由实际完成的项目整理而成,欢迎在评论区交流。如果你也想让旧手机"再就业",从一块 C6 开始吧!

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(0)
- 没有更多了 -