回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

FireBeetle 2 Board ESP32-S3:舵机远程控制(小智AI+MCP) 简单

头像 rzyzzxw 2025.08.07 20 0

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标准板,基本上是一样的。

de20e33af48208936fefbc98fc4dc40.jpg

材料清单

  • FireBeetle 2 Board ESP32-S3开发板 X1
  • 舵机 X1

步骤1 安装esp32舵机库

工具---管理库……

搜索安装ESP32Servo舵机库,我顺手把360舵机的库也安装了。

在本帖子中,使用的是ESP32Servo库。

image.png

标准板的板载灯在IO2,我们这个在IO21。

舵机接GPIO12引脚---D12。

步骤2 代码改写

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

image.png

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

image.png

舵机初始化,设为90度。

image.png

完整代码如下:

代码
#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控制舵机。

image.png
image.png

小智后台:

image.png

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

评论

user-avatar