8.8
【写在前面】
这个帖子,将用ESP32 S3板载LED的控制开始,学习xiaozhi-mcp。所用到的主控板是某宝上购得的44针的ESP32 S3核心板板载1-N16R8 S3-DevKitC-1模块开发板。它并不是乐鑫标准板,应该是兼容板,引脚信息丝印在板子上,容易查看,便于在面包板上接线测试。

第一个帖子,记录小智AI用MCP控制它的板载LED灯。

材料清单
- K10小智AI X1
- ESP32 S3-DevKitC-1开发板(N16R8) X1
步骤1 Arduino下载安装和编译环境配置
(本步为小白学习记录)
一、下载安装Arduino IDE
1、访问官网
打开 Arduino 官方网站:https://www.arduino.cc/en/software。
2、选择版本
Windows:推荐下载 .exe安装包(如 Windows Installer)(我的电脑是windows)。
3、双击 .exe文件,以 管理员身份运行。
4、同意许可协议 → 选择 “为所有用户安装” → 自定义安装路径(建议非系统盘)。
5、勾选 “安装驱动程序”(确保开发板可识别)。
6、完成安装后,桌面生成快捷方式。
7、设置中文界面
文件 → 首选项 → Language → 选择“中文(简体)” → 重启 IDE
8、创建纯英文工作目录:(如果工作目录本来就是纯英文无需修改)
新建文件夹:例如:C:\ArduinoProjects
修改IDE设置:
文件 → 首选项 → 修改“项目文件夹位置”为 C:\ArduinoProjects

二、编译环境配置
1、开发板连接电脑
2、工具-开发板-开发板管理……-查找esp32-安装

工具→开发板---esp32:,选择ESP32S3 Dev Module

- 3、点击端口选择对应的串口。

现在开发板连接了Arduino IDE 。
4、安装必备库(关键!)
打开 Arduino IDE → 项目 → 加载库 → 管理库...
搜索安装以下库:
xiaozhi-mcp

WebSockets by Markus Sattler(选择 2.3.6+ 版本)

ArduinoJson by Benoit Blanchon(v6.21+)

步骤2 代码修改
点击左边的库管理,搜索找到xiaozhi-mcp库,点击库名字右边三个小点,找到示例,点击BasicExample在新窗口中打开示例代码。

因为我们这个板子不是乐鑫官方标准板,它的绿色板载LED引脚为IO43。如下图,板载一个RGB灯在IO48,红色LED为电源指示灯,绿-TX这颗LED灯可控,蓝-RX不可控。

所以代码做以下修改:
IO引脚由2改为43

填入自己的WIFI信息和从小智获取的MCP接入点地址,wss改为ws。

注册MCP工具部分,圆框中的修改一下,这个LED灯低电平亮,高电平灭。方框中的注意一下,对应下面三个控制功能。(为将更多代码修改做准备)

初始化也改成高电平-灭。

#include <WiFi.h>
#include <WebSocketMCP.h>
#define LED_BUILTIN 43
// WiFi配置
const char* ssid = "……";
const char* password = "……";
// MCP服务器配置
const char* mcpEndpoint = "ws://api.xiaozhi.me/mcp/?token=";
// 创建WebSocketMCP实例
WebSocketMCP mcpClient;
// 连接状态回调函数
void onConnectionStatus(bool connected) {
if (connected) {
Serial.println("[MCP] 已连接到服务器");
// 连接成功后注册工具
registerMcpTools();
} else {
Serial.println("[MCP] 与服务器断开连接");
}
}
// 注册MCP工具
void registerMcpTools() {
// 注册一个简单的LED控制工具
mcpClient.registerTool(
"led_blink",
"控制ESP32板载LED",
"{\"type\":\"object\",\"properties\":{\"state\":{\"type\":\"string\",\"enum\":[\"on\",\"off\",\"blink\"]}},\"required\":[\"state\"]}",
[](const String& args) {
DynamicJsonDocument doc(256);
deserializeJson(doc, args);
String state = doc["state"].as<String>();
if (state == "on") {
digitalWrite(LED_BUILTIN, LOW);
} else if (state == "off") {
digitalWrite(LED_BUILTIN, HIGH);
} else if (state == "blink") {
for (int i = 0; i < 5; i++) {
digitalWrite(LED_BUILTIN, LOW);
delay(200);
digitalWrite(LED_BUILTIN, HIGH);
delay(200);
}
}
return WebSocketMCP::ToolResponse("{\"success\":true,\"state\":\"" + state + "\"}");
}
);
Serial.println("[MCP] LED控制工具已注册");
}
void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
// 连接WiFi
Serial.print("连接到WiFi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi已连接");
Serial.println("IP地址: " + WiFi.localIP().toString());
// 初始化MCP客户端
mcpClient.begin(mcpEndpoint, onConnectionStatus);
}
void loop() {
// 处理MCP客户端事件
mcpClient.loop();
// 其他代码...
delay(10);
}
步骤3 参考资料
评论