让吃灰的乐高EV3接入小智AI:ESP32-S3 AI智能摄像头 + EV3 语音控制小车实战

2026-09-172

前言:被遗忘在角落的 EV3

如果你是一位创客或STEM教育从业者,家里或学校的柜子里大概率躺着一台乐高 MINDSTORMS EV3。它曾是乐高机器人系列的旗舰产品,拥有强大的电机控制能力和丰富的传感器生态。但随着乐高官方逐渐将重心转向 SPIKE 系列,以及 micro:bit、行空板、Arduino 等开源硬件平台的崛起,EV3 渐渐被束之高阁,成为"吃灰"设备。

与此同时,AI 语音助手正在快速普及。以"小智AI"为代表的开源语音交互方案,让我们可以用极低的成本,把自然语言对话能力嵌入到自己的硬件项目中。而 ESP32-S3 AI智能摄像头 这类集成了麦克风、扬声器、摄像头和 Wi-Fi 的开发板,更是为语音交互提供了理想的硬件载体。

这篇文章要做的,就是把这两者结合起来:用 ESP32-S3 AI智能摄像头 运行小智AI固件作为语音交互入口,通过 MCP(Model Context Protocol) 桥接,远程控制乐高EV3的电机。让吃灰多年的 EV3 重新动起来,而且是用"说话"来驱动。

项目效果

对着 ESP32-S3 AI智能摄像头说一句"小车前进",EV3 上的 B 口和 C 口电机同时正转,小车向前行驶;说"左转""右转""后退""停止",EV3 都能准确响应。

整个系统不需要在 EV3 上运行任何 AI 模型,也不需要昂贵的硬件升级。EV3 只负责它最擅长的事——精确控制电机;AI 理解和语音交互,交给 ESP32-S3 AI智能摄像头和云端小智完成。

 让吃灰的乐高EV3接入小智AI:ESP32-S3 AI智能摄像头 + EV3 语音控制小车实战_image_1.webp

系统架构

整个控制链路分为四层:

┌─────────────────────────┐
│  ESP32-S3 AI智能摄像头   │  运行小智AI固件,负责语音识别与合成
│  (小智AI固件)            │
└────────────┬────────────┘
             │ MCP over WebSocket
             ▼
┌─────────────────────────┐
│  电脑端                  │  运行 mcp2xiaozhi 桥接器 + EV3 MCP 服务器
│  (MCP 桥接器)            │  接收小智指令,通过 SSH 转发到 EV3
└────────────┬────────────┘
             │ SSH (USB 网络共享)
             ▼
┌─────────────────────────┐
│  乐高 EV3                │  运行 ev3dev + Python 脚本
│  (ev3dev)                │  执行电机控制:B口 + C口
└─────────────────────────┘

为什么需要电脑做桥接? 因为 EV3 上的 ev3dev 系统 Python 版本较旧(3.5.3),无法直接运行小智 MCP 的 Python 库。把桥接器放在电脑上,EV3 只负责执行简单的电机控制脚本,各司其职。

硬件准备

硬件 数量 说明
乐高 EV3 主机 1 任意版本均可
大型电机 2 分别接在 B 口和 C 口
ESP32-S3 AI智能摄像头 1 运行小智AI固件
microSD 卡 1 至少 8GB,用于烧录 ev3dev
USB 数据线 1 连接 EV3 和电脑
小车底盘 1 可用乐高科技件自行搭建

 让吃灰的乐高EV3接入小智AI:ESP32-S3 AI智能摄像头 + EV3 语音控制小车实战_image_2.webp

第一步:给 EV3 安装 ev3dev 系统

ev3dev 是一个可以运行在 EV3 上的完整 Debian Linux 发行版。它不需要替换官方固件——只需把系统烧录到 SD 卡,插入 EV3,开机就会从 SD 卡启动。拔掉 SD 卡,EV3 又回到官方系统。

  1. 前往 ev3dev 官网 下载最新的 EV3 镜像文件。
  2. 使用 balenaEtcher 或 Raspberry Pi Imager 将镜像烧录到 microSD 卡。
     让吃灰的乐高EV3接入小智AI:ESP32-S3 AI智能摄像头 + EV3 语音控制小车实战_image_3.webp
  3. 将 SD 卡插入 EV3,开机启动。

启动后,EV3 屏幕上会显示 Brickman 可视化界面。
 让吃灰的乐高EV3接入小智AI:ESP32-S3 AI智能摄像头 + EV3 语音控制小车实战_image_4.webp
 让吃灰的乐高EV3接入小智AI:ESP32-S3 AI智能摄像头 + EV3 语音控制小车实战_image_5.webp

第二步:配置 USB 网络共享

由于 EV3 的 Wi-Fi 支持有限,我们用 USB 线把 EV3 连到电脑上,通过 Windows 的"Internet 连接共享"让 EV3 联网。这样也顺便建立了电脑和 EV3 之间的网络通道,后续 SSH 就靠它。

在 Windows 11 上操作:

  1. 用 USB 线连接 EV3 和电脑。
  2. Win + R,输入 ncpa.cpl,打开"网络连接"窗口。
  3. 找到你上网用的网卡(如 WLAN),右键 → 属性 → 共享选项卡。
  4. 勾选"允许其他网络用户通过此计算机的 Internet 连接来连接"。
  5. 在下拉菜单中选择 EV3 对应的网卡(通常显示为"远程 NDIS 兼容设备"或"以太网")。
  6. 点击确定。
     让吃灰的乐高EV3接入小智AI:ESP32-S3 AI智能摄像头 + EV3 语音控制小车实战_image_6.webp

在 EV3 上操作:

进入 Brickman 的 Wireless and NetworksAll Network ConnectionsWired,选择 Connect。状态变为 Online 即表示成功。

第三步:配置 SSH 免密登录

我们需要让电脑能自动通过 SSH 向 EV3 发送命令,而不需要每次输入密码。

在 Windows CMD 中执行:

:: 生成密钥对(如果还没有)
ssh-keygen -t rsa

:: 把公钥复制到 EV3
type %USERPROFILE%\.ssh\id_rsa.pub | ssh robot@ev3dev.local "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

这一步会要求输入一次密码(默认 maker)。完成后测试:

ssh robot@ev3dev.local "echo hello"

如果直接输出 hello 而没有要求密码,说明免密配置成功。
 让吃灰的乐高EV3接入小智AI:ESP32-S3 AI智能摄像头 + EV3 语音控制小车实战_image_7.webp

第四步:在 EV3 上创建电机控制脚本

通过 SSH 登录 EV3:

ssh robot@ev3dev.local

创建 motor_control.py

nano motor_control.py

 让吃灰的乐高EV3接入小智AI:ESP32-S3 AI智能摄像头 + EV3 语音控制小车实战_image_8.webp

粘贴以下代码:

#!/usr/bin/env python3
from ev3dev2.motor import MoveTank, OUTPUT_B, OUTPUT_C, SpeedPercent
import sys

action = sys.argv[1] if len(sys.argv) > 1 else "stop"

tank = MoveTank(OUTPUT_B, OUTPUT_C)

if action == "forward":
    tank.on_for_seconds(SpeedPercent(50), SpeedPercent(50), seconds=2)
elif action == "backward":
    tank.on_for_seconds(SpeedPercent(-50), SpeedPercent(-50), seconds=2)
elif action == "turn_left":
    tank.on_for_seconds(SpeedPercent(0), SpeedPercent(50), seconds=2)
elif action == "turn_right":
    tank.on_for_seconds(SpeedPercent(50), SpeedPercent(0), seconds=2)
else:
    tank.off()

tank.off()

 让吃灰的乐高EV3接入小智AI:ESP32-S3 AI智能摄像头 + EV3 语音控制小车实战_image_9.webp

保存退出(Ctrl+O → 回车 → Ctrl+X),赋予执行权限:

chmod +x motor_control.py

手动测试:

python3 motor_control.py forward

如果 B 口和 C 口电机同时转动 2 秒,说明脚本正常。

第五步:在电脑上部署 MCP 桥接器

小智AI通过 MCP 协议调用外部工具。我们需要在电脑上运行一个 MCP 服务器,它暴露一个 control_ev3_motor 工具,接收到指令后通过 SSH 让 EV3 执行动作。

安装依赖:

pip install mcp2xiaozhi mcp

创建 ev3_mcp_server.py

import subprocess
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("EV3 Motor Control")

SCRIPT_PATH = "/home/robot/motor_control.py"

def run_ev3_command(action):
    """通过 SSH 在 EV3 上后台执行命令,立即返回"""
    ssh_cmd = [
        "ssh",
        "robot@ev3dev.local",
        f"nohup python3 {SCRIPT_PATH} {action} > /dev/null 2>&1 &"
    ]
    try:
        result = subprocess.run(
            ssh_cmd,
            capture_output=True,
            text=True,
            timeout=10,
            stdin=subprocess.DEVNULL
        )
        print(f"[EV3] 指令: {action}, 返回码: {result.returncode}")
        if result.returncode == 0:
            return f"指令 '{action}' 已发送"
        else:
            return f"指令 '{action}' 发送失败: {result.stderr.strip()}"
    except subprocess.TimeoutExpired:
        return f"指令 '{action}' SSH 连接超时"
    except Exception as e:
        return f"指令 '{action}' 执行异常: {str(e)}"

@mcp.tool()
def control_ev3_motor(action: str) -> str:
    """
    控制 EV3 机器人的 B 口和 C 口电机。
    参数 action 可选: forward(前进), backward(后退),
    turn_left(左转), turn_right(右转), stop(停止)
    """
    if action not in ["forward", "backward", "turn_left", "turn_right", "stop"]:
        return "无效的动作指令。"
    return run_ev3_command(action)

if __name__ == "__main__":
    mcp.run(transport='stdio')

关键点:用 nohup ... & 让 EV3 上的脚本在后台运行,SSH 命令不等电机转完就返回。否则电机转动 2 秒会让 MCP 调用阻塞,导致小智语音反馈超时。

创建 mcp_config.json

{
  "mcpServers": {
    "ev3-motor": {
      "type": "stdio",
      "command": "python",
      "args": ["ev3_mcp_server.py"]
    }
  }
}

第六步:配置 ESP32-S3 AI智能摄像头运行小智AI固件

ESP32-S3 AI智能摄像头是一款集成了摄像头、麦克风、扬声器和 Wi-Fi 的开发板,非常适合运行小智AI固件。具体烧录步骤请参考小智AI官方文档和硬件厂商提供的教程。

烧录完成后,在 xiaozhi.me 控制台创建一个智能体,获取 MCP 接入点地址(以 wss:// 开头)。
 让吃灰的乐高EV3接入小智AI:ESP32-S3 AI智能摄像头 + EV3 语音控制小车实战_image_10.webp

第七步:启动桥接器并联调

在电脑上打开 CMD,切换到存放 mcp_config.jsonev3_mcp_server.py 的目录:

cd /d D:\ev3
set MCP_ENDPOINT=wss://api.xiaozhi.me/mcp/?token=你的token
mcp2xiaozhi run ev3-motor

看到以下日志说明桥接成功:

Registered server 'ev3-motor' (stdio) -> wss://api.xiaozhi.me/mcp/?<redacted>
[ev3-motor] bridge starting (stdio <-> ws)
[ev3-motor] WebSocket connected

 让吃灰的乐高EV3接入小智AI:ESP32-S3 AI智能摄像头 + EV3 语音控制小车实战_image_11.webp

现在对着 ESP32-S3 AI智能摄像头说"小车前进",EV3 应该就会动起来。

小智AI控制乐高EV3-哔哩哔哩

踩坑记录与解决方案

坑1:小智语音反馈"执行失败"或"超时"

现象:EV3 电机确实转了,但小智说"执行失败"。

原因:EV3 脚本里 on_for_seconds 是阻塞调用,电机转 2 秒期间 SSH 命令一直不返回,MCP 调用超时。

解决:在 SSH 命令里加 nohup ... &,让 EV3 后台执行,SSH 立即返回。

坑2:EV3 的 Python 版本太旧

EV3 上的 ev3dev 预装 Python 3.5.3,无法直接安装小智 MCP 的 Python 库(要求 3.7+)。这就是为什么我们采用"电脑桥接 + EV3 执行"的架构,而不是把 MCP 直接跑在 EV3 上。

坑3:Windows 网络共享不稳定

Windows 的 Internet 连接共享(ICS)偶尔会无故停止工作。如果 EV3 突然断网,重新取消勾选再勾选一次共享即可。

坑4:SSH 免密登录失效

如果重新烧录了 SD 卡,或者 EV3 的 ~/.ssh/authorized_keys 权限被改乱,免密登录会失效。重新执行第三步的公钥复制命令即可。

坑5:ESP32-S3 AI智能摄像头固件烧录失败

不同厂商的 ESP32-S3 AI智能摄像头硬件设计略有差异,烧录前请确认固件版本与硬件型号匹配。如果烧录后无法启动,检查 USB 驱动和烧录工具版本,必要时按住 BOOT 键再上电进入下载模式。

扩展思路

这个项目只是一个起点。基于"小智AI + MCP + EV3"的架构,你还可以做很多事:

  • 接入传感器:在 EV3 脚本里读取颜色传感器、超声波传感器,让 EV3 根据环境自主决策,小智负责语音播报。
  • 多设备联动:用同一个 MCP 桥接器同时控制多台 EV3,实现编队行驶。
  • 接入更多工具:在 MCP 服务器里添加更多工具函数,比如"查询天气""播放音乐",让小智的能力不局限于控制电机。
  • 脱离电脑:把 MCP 桥接器部署到树莓派或 NAS 上,实现 7×24 小时运行。
  • 视觉能力:ESP32-S3 AI智能摄像头自带摄像头,后续可以结合视觉识别,让 EV3 根据"看到"的东西自主行动。

结语

乐高EV3是一台被低估的设备。它的电机控制精度、传感器生态和结构件兼容性,在今天依然有很高的价值。它缺的不是能力,而是一个跟上时代的交互入口。

小智AI和 MCP 协议的出现,恰好补上了这块短板。通过 ESP32-S3 AI智能摄像头作为语音入口,电脑作为协议桥接,EV3 作为执行终端,我们让一台"吃灰"多年的设备,重新拥有了自然语言交互的能力。

希望这篇文章能给你带来一些灵感。如果你手里也有一台闲置的 EV3,不妨试试让它"开口说话"。


项目参考资源:

本文首发于 DF 创客社区,转载请注明出处。

创作许可协议

本项目采用 CC BY(署名) 进行许可。

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