8.7
【写在前面】
8.5,行空板发布了新版系统V0.4.1,昨天给M10刷机并进行了使用测试,五星好评,MCP的连接速度和MCP运行稳定性都非常满意,这个内容记录在:棒棒的,行空板系统V0.4.1--测试体验五颗星- Makelog(造物记)中了。这样在后面的日子里就可以继续用M10的MCP库和小智AI互动来做项目了。
不过ESP32 S3上通过MCP和小智互动的新坑还是很吸引我继续探索学习,今天要记录的是小智AI通过MCP远程控制舵机,我用的是DFrobot FireBeetle 2 Board ESP32-S3开发板,如果你用esp32 s3标准板,基本上是一样的。

材料清单
- FireBeetle 2 Board ESP32-S3开发板 X1
- 舵机 X1
步骤1 安装esp32舵机库
工具---管理库……
搜索安装ESP32Servo舵机库,我顺手把360舵机的库也安装了。
在本帖子中,使用的是ESP32Servo库。

标准板的板载灯在IO2,我们这个在IO21。
舵机接GPIO12引脚---D12。

步骤2 代码改写
我的代码是由xiaozhi-mcp库中的示例程序BasicExample改写来的,因为不需要板载灯的控制,只让它上电就亮,当做指示灯用。

原来控制板载灯的部分,改成舵机控制。

舵机初始化,设为90度。

完整代码如下:
代码
#include <WiFi.h>
#include <WebSocketMCP.h>
#include <ESP32Servo.h> // 使用兼容ESP32的舵机库
#define LED_BUILTIN 21 // 板载LED引脚 GPIO21
#define SERVO_PIN 12 // 舵机控制引脚(GPIO12)
// WiFi配置
const char* ssid = "******";
const char* password = "******";
// MCP服务器配置
const char* mcpEndpoint = "ws://api.xiaozhi.me/mcp/?token=……";
// 创建舵机对象
Servo myServo;
// 创建WebSocketMCP实例
WebSocketMCP mcpClient;
// 连接状态回调函数
void onConnectionStatus(bool connected) {
if (connected) {
Serial.println("[MCP] 已连接到服务器");
registerMcpTools(); // 注册舵机控制工具
} else {
Serial.println("[MCP] 与服务器断开连接");
}
}
// 设置舵机角度(0-180°)
void setServoAngle(int angle) {
angle = constrain(angle, 0, 180); // 限制角度范围
myServo.write(angle); // 使用库函数设置角度
Serial.printf("舵机角度设置: %d°\n", angle);
}
// 注册MCP工具
void registerMcpTools() {
// 舵机角度控制工具
mcpClient.registerTool(
"servo_control",
"控制舵机角度(0-180°)",
"{\"type\":\"object\",\"properties\":{\"angle\":{\"type\":\"integer\",\"minimum\":0,\"maximum\":180}},\"required\":[\"angle\"]}",
[](const String& args) {
DynamicJsonDocument doc(256);
deserializeJson(doc, args);
int angle = doc["angle"]; // 解析角度值
setServoAngle(angle); // 调用舵机控制函数
// 返回成功响应
return WebSocketMCP::ToolResponse("{\"success\":true,\"angle\":" + String(angle) + "}");
}
);
Serial.println("[MCP] 舵机控制工具已注册");
}
void setup() {
Serial.begin(115200);
// 配置板载LED为上电常亮
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH); // 始终点亮
// 初始化舵机(500-2500μs脉宽范围对应0-180°)
ESP32PWM::allocateTimer(0); // 分配定时器资源
myServo.setPeriodHertz(50); // 标准舵机频率50Hz
myServo.attach(SERVO_PIN, 500, 2500); // 引脚和脉宽范围
setServoAngle(90); // 初始设为90度(中间位置)
// 连接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);
}
舵机正确接线。必要时可以给舵机单独供电。
上传编译烧录代码到开发板,用小智AI控制舵机。


小智后台:

我同时在测试仰望小车,可用工具的前5个请忽略。
评论