旧手机-ESP32C6小智AI情绪小车
【项目背景】
不用自己写语音识别、不用云主机、不用加屏幕——给小车的"大脑"直接接上 小智手机版 App(连虾哥的 MCP 服务器),主控用 ESP32-C6-DevKitM-1 开发板 当"关节",一辆 L298N 驱动的四轮小车 就会**"看脸色行事"**:
- 你说「我今天有些情绪低落」——小车先左右摇摆,再慢悠悠驶到你面前停住,像在安慰你;
- 你说「我好高兴啊」——小车立刻前后快速窜动,比你还开心;
- 你说「气死我了」——小车开始快速冲撞式前进后退,替你"跺脚"。
整台车是一块 亚克力激光切割车身,车顶开好手机槽,小智 App 的手机直接放上去就能玩,完全不需要电脑中继、不需要树莓派。
本项目已在实机验证:小智 AI 语音对话、情绪识别、四轮动作执行全部跑通。
一、项目架构
你说话 ──▶ 小智手机版App(语音识别 + 大模型对话)
│ 情绪理解:高兴/难过/生气/疲惫...
▼
wss://api.xiaozhi.me/mcp/ (虾哥服务器,MCP 协议)
│ 调用小车注册的工具
▼
ESP32-C6 ◀── WiFi(2.4G)
│ L298N 双H桥(PWM 调速)
▼
四轮电机:左两轮并联 + 右两轮并联(差速转向)
为什么用"小智 App + MCP",而不是让 C6 自己接大模型?
- 语音识别 / 语义理解 / 情绪判断全在云端小智完成,C6 只负责"听懂工具调用、开电机",代码量小、功耗低、开发快
- 小智 App 的整个对话链路(ASR→LLM→TTS→声音播放)都是现成的,小车只是它的"手和脚"
- C6 通过 WebSocket MCP(Model Context Protocol) 把"能干什么"注册给 AI:前进、转向、调速、播放情绪动作……AI 自主决定何时调用哪个工具
二、材料清单
| 类别 | 名称 | 数量 | 说明 |
|---|---|---|---|
| 主控 | ESP32-C6-DevKitM-1 开发板 | 1 | 板载RGB LED(IO8)、WiFi 2.4G |
| 驱动 | L298N 双 H 桥电机驱动板 | 1 | 两路电机,PWM 调速,共地使用 |
| 电机 | 直流减速电机(带轮四驱小车底盘) | 4 | 左两轮并联、右两轮并联 |
| 电源 | 7.4V 2S 锂电池组(18650×2) | 1 | 进 L298N 电机电源;四轮并联电流大,电池需 2A 以上 |
| 车身 | 3mm 亚克力板(激光切割) | 若干 | 底板 + 各层支架,顶部留手机卡槽 |
| 交互 | 手机(安卓/iOS) | 1 | 安装小智 App,放在车顶槽内 |
| 网络 | 2.4G WiFi 路由器/热点 | 1 | C6 与小智 App 连同一网络 |
| 调试 | Type-C 数据线 | 1 | 烧录 + 串口监视 |
| 服务 | 小智 MCP(api.xiaozhi.me) | — | 注册小智账号,创建 MCP Agent 获得 token |
手机必须能上网且装得了小智 App,旧手机也完全够用——正好"旧手机再就业"。

三、接线(L298N ↔ C6)
务必共地:L298N 的 GND 与 C6 的 GND 相连,否则信号不识别。
四轮接法:左前、左后两个电机并联接到 L298N A 通道;右前、右后两个电机并联接到 B 通道。两路独立 PWM 调速,差速转向。
| C6 GPIO | L298N 端子 | 作用 |
|---|---|---|
| GPIO2 | IN1(A通道) | 左轮组方向1 |
| GPIO3 | IN2(A通道) | 左轮组方向2 |
| GPIO4 | ENA(A通道) | 左轮组速度 PWM |
| GPIO5 | IN3(B通道) | 右轮组方向1 |
| GPIO6 | IN4(B通道) | 右轮组方向2 |
| GPIO7 | ENB(B通道) | 右轮组速度 PWM |
| GND | GND | 共地(必须) |
| 电池 7.4V | VCC/12V 端子 | 电机电源(L298N 建议加散热片) |


引脚定义在
.ino顶部,可按实际焊接修改;若某一侧转向相反,互换该侧两根 IN 线即可,不用改代码。
四、软件环境
4.1 开发环境
- Arduino IDE(2.x 均可),安装 Espressif ESP32 板卡包(3.x)
- 开发板选择:ESP32C6 Dev Module
- 工具 → USB CDC On Boot = Enabled(否则程序运行后串口会断开)
- 库:ArduinoJson + 小智的 WebSocketMCP 库(用法与官方例程一致;其底层 WebSocket 库需支持 C6 的新版本)
4.2 小智 MCP 接入
- App:手机版小智 App(连接虾哥服务器)
https://rcnuybsa4dtk.feishu.cn/docx/LUl9dkbXnofsh5xqA5Tc0vDQnff
- MCP 接入点:
wss://api.xiaozhi.me/mcp/?token=你的token - 流程:C6 连 WiFi → 建立 WebSocket → 连接成功后注册工具 → 小智 AI 在对话中根据用户意图自主调用工具
4.3 WiFi 配置
const char* WIFI_SSID = "你的热点"; // C6 只支持 2.4GHz
const char* WIFI_PASS = "你的密码";
// MCP 端点:
const char* MCP_ENDPOINT = "wss://api.xiaozhi.me/mcp/?token=你的token";
发布到社区前请把真实的热点名称/密码与 token 替换掉,勿公开真实凭据。
五、程序说明
5.1 程序结构
esp32c6_xiaozhi_car/
└── esp32c6_xiaozhi_car.ino ← C6 主程序(MCP 工具 + 电机控制 + 情绪脚本引擎)
主循环三件事:mcpClient.loop()(收工具调用)→ checkMotionEnd()(动作到时自动停车)→ 串口命令处理。动作控制非阻塞,WebSocket 不会被长的电机动作卡住。
5.2 注册的 MCP 工具(小智 AI 可调用)
| 工具 | 参数 | 作用 |
|---|---|---|
car_control |
action: forward/backward/left/right/stop;可选 duration_ms、speed |
前进/后退/左转/右转/停车,到时自动停车 |
car_emotion |
emotion: happy/excited/sad/angry/tired/surprised/nervous/love/curious/calm |
按情绪播放动作序列(见第六节) |
car_set_speed |
side: left/right/both;speed: 0~255 |
左右轮组独立调速 |
car_status |
无 | 返回当前动作、左右速度、WiFi/MCP 连接状态 |
car_emotion 的工具描述里就写明了每种情绪的语义和动作,AI 读到描述后会主动在合适时机调用:
mcpClient.registerTool(
"car_emotion",
"根据用户表达的情绪让小车做出相应动作。当用户表达高兴/难过/生气等情绪或感受时,"
"应调用此工具... happy=高兴(前后快速移动),sad=难过(左右摇摆并缓慢靠近用户以安慰)...",
"{\"properties\":{\"emotion\":{...\"enum\":[\"happy\",\"excited\",\"sad\",\"angry\","
"\"tired\",\"surprised\",\"nervous\",\"love\",\"curious\",\"calm\"]...}}}",
[](const String& args) { /* 解析 emotion → runEmotionScript */ }
);
5.3 情绪动作脚本引擎
每种情绪是一串 动作+时长 的序列(k* 数组),loop() 里逐段非阻塞播放,播完自动停车;新指令随时打断当前脚本:
static const ScriptStep kSad[] = {
{"LEFT",400},{"RIGHT",400},{"LEFT",400},{"RIGHT",400}, // 先左右摇摆
{"FORWARD",900}, // 再缓慢靠近你
};
static const ScriptStep kHappy[] = {
{"FORWARD",350},{"BACKWARD",350},{"FORWARD",350},{"BACKWARD",350}, // 前后快速移动
};
脚本还带速度覆盖与恢复:难过/喜爱用低速显得温柔,播完自动恢复原速度,不影响后续正常行驶。
5.4 串口调试命令
不连小智也能测车:forward / backward / left / right / stop 单动作,emotion happy、emotion sad 直接播放情绪动作,另有 help / status / tools / reconnect。
六、情绪 → 小车动作设计(核心玩法)
| 情绪 | 小车动作 | 速度 |
|---|---|---|
happy 高兴/开心 |
前后快速移动(350ms 往返 ×2) | 255 快 |
excited 兴奋 |
原地左右旋转(500ms 交替 ×2) | 200 |
sad 难过/低落 |
左右摇摆 ×2 → 缓慢前进到你面前(安慰) | 120 慢 |
angry 生气 |
快速冲撞式前进后退(600/400/500/300ms) | 255 快 |
tired 疲惫/困 |
缓慢爬行一步一歇(前600 → 停400 ×2) | 100 很慢 |
surprised 惊讶 |
向后退跳两下(300ms + 200ms) | 190 |
nervous 焦虑/紧张 |
原地来回踱步(前200 ↔ 后200 ×3) | 150 |
love 喜爱/撒娇 |
缓慢靠近并左右轻摇(前400 → 左摇右摇 → 前400) | 120 慢 |
curious 好奇 |
左右张望(左望→停→右望→停→左望) | 160 |
calm 平静 |
静止片刻 | — |
所有序列都在 k* 数组里,时长和速度随手可调:想让"难过"动作靠得更近,把最后的 FORWARD 时长加长即可。
七、制作步骤
- 切车身:设计亚克力底板(几毫米厚),预留 4 个电机座、L298N 固定孔、电池仓、顶部手机卡槽(手机横放/竖放均可,直接嵌入)
- 接线:四轮电机两两并联 → L298N A/B 通道,C6 GPIO 2~7 接 IN/ENA/ENB,务必共地,电池接 L298N 电机电源端子
- 烧录:Arduino IDE 打开
esp32c6_xiaozhi_car.ino,选板卡 "ESP32C6 Dev Module",USB CDC On Boot = Enabled,填好 WiFi 和 token 后上传 - 串口监视器(115200)确认
WiFi 已连接、MCP 已连接、工具注册完成,共4个工具 - 串口先测车:输入
forward、emotion sad,确认动作和转向正常(转向反了就互换该侧两根 IN 线) - 配小智 App:把手机放上车顶槽,连同一 WiFi;建议在 agent 提示词里加一句——"当用户表达高兴/难过/生气等情绪时,调用
car_emotion工具让小车做出相应动作" - 开始聊天,享受"看脸色行事"的小车


八、使用演示
| 你说 | 小车动作 |
|---|---|
| "我好高兴啊!" | 前后快速窜动 |
| "今天太兴奋了" | 原地旋转 |
| "我今天有些情绪低落" | 左右摇摆 → 缓慢驶到你面前停住 |
| "气死我了!" | 快速冲撞式前进后退 |
| "好困啊……" | 缓慢爬行,一步一歇 |
| "哇,好神奇!" | 向后跳退两下 |
| "我好害怕" | 原地来回踱步 |
| "最喜欢你了" | 慢慢靠近你,轻轻摇摆 |
| "这是什么呀?" | 左右张望 |
| "前进、左转、再停下" | 按普通指令行驶(car_control) |
九、技术难点与解决(经验分享)
- 让 AI 主动"看情绪",而不是只等用户下命令
→ 利用 MCP 工具描述即提示词:把每种情绪的语义、对应动作写进car_emotion的描述里;再在 agent 提示词补一句"表达情绪时调用 car_emotion"。AI 读到工具清单就会自主匹配。 - 一段情绪动作是"连续多步",不能阻塞 WebSocket
→ 动作脚本引擎:ScriptStep数组存"动作+时长",loop()非阻塞逐段推进,checkMotionEnd()到时自动切下一段或停车。长动作期间 MCP 收包不掉帧。 - AI 可能连发多条指令,新旧动作冲突
→ 每次新指令(工具调用或串口命令)先cancelScript()打断旧脚本,再执行新动作;所有动作都带超时自动停车作为保底。 - 四轮并联电流大
→ 电池选 2A 以上(推荐 7.4V 2S),L298N 加散热片;C6 不要从 L298N 的 5V 输出取电,避免压降掉线。 - 转向方向反了
→ 互换该侧两根 IN 线即可,无需改代码。 - 串口运行后断开
→ 工具 → USB CDC On Boot = Enabled。
十、注意事项
- MCP token 即账号凭据,勿公开上传;发布文章前把热点名称/密码和 token 替换为占位符
- C6 只支持 2.4GHz WiFi;手机与小 C6 连同一热点(或同一路由的 2.4G 段)信号更稳
- L298N 与 C6 必须共地;电机独立供电,不要从 C6 引脚取电
- 情绪"靠近/冲撞"动作执行时注意前方障碍和桌边,测试可先把对应
FORWARD时长调短 - 首次对话模型可能偏慢,属正常;MCP 断线后小车会自动重连等待
十一、参考资料
- ESP32-C6-DevKitM-1 :https://www.dfrobot.com.cn/goods-3704.html
- 小智 MCP 服务器:https://api.xiaozhi.me
- 项目文件:
esp32c6_xiaozhi_car/esp32c6_xiaozhi_car.ino(附件压缩包)
本文由实际完成的项目整理而成。如果你也有一辆亚克力小车和一部旧手机,接上小智,它就会有"情绪"——欢迎在评论区交流!




