
EDA-RobotPro AI智能机器狗
简介
本项目是EDA-Robot的升级版,搭载ESP32S3实现小智AI控制功能
简介:本项目是EDA-Robot的升级版,搭载ESP32S3实现小智AI控制功能开源协议
:GPL 3.0
描述
本项目使用 ESP32S3R8N16 模组,结合 INMP441 + MAX98357 实现小智AI对话及MCP协议控制机器狗运动。 相较于 EDA-Robot 简易机器狗项目而言,PRO版本加入的小智AI 提供的 LLM 大语言模型,不再需要通过手机 WEB 操控, 只需唤醒小智执行 “向前走”、“向后走” 等口语化指令即可。
相较于传统 ASR-PRO 指令的机器狗而言,LLM 大语言模型不需要手动指定词条应答, 而是由远端服务器模型推理得出应答结果,回答更加真实且富有情感。
本项目大部分均为插件,适合新手教学使用。
- ✳️ ESP32S3系列主控
- ✅ 支持AI大语言模型
- ✅ 双核 主频240MHz
- ❌ 成本较高
- ✳️ 需要联网,语音对话控制
- 🔋 双节 14500 电池供电
固件功能
项目参数
硬件设计
主控选用 ESP32S3系列 模组,集成 WiFi 功能,提供丰富的 GPIO 接口。 板载 USB 转串口芯片,方便程序下载和调试。
本系统使用 INMP441 数字麦克风模块进行音频采集,结构简单,可根据需求替换为更低成本型号。
音频输出部分采用 MAX98357 模块,支持I2S音频输入,驱动扬声器输出。设计简单,性能稳定。
显示部分采用 SSD1306/SSD1315 OLED 屏幕,分辨率128×64,尺寸0.96或1.3英寸,需注意I2C线序及上拉电阻配置。
电源供电电路与 EDA-Robot 标准版一致,采用两节串联 14500 电池,串联后满电电压 8.4V, 通过两路 LDO 分别降压至 5V 为舵机供电和 3.3V 为 MCU 供电。
舵机电路与标准版一致,采用 SG90/MG90 舵机,通过 PWM 信号控制角度。 由于舵机内部自带 5V 转 3.3V 驱动电路,PWM 信号可直接由 MCU IO 控制,无需电平转换。
按键电路与下载接口设计简洁,均可直接连接 MCU IO。由于 MCU 资源充足,可轻松扩展更多功能。
软件开发
完整源码请在附件查看
本项目采用 BSP(Board Support Package)板级适配架构,基于 xiaozhi-esp32 框架, 专门为EDA-Robot Pro硬件平台定制,实现了AI语音控制的四足机器狗功能。
- eda_robot_pro.cc: 主板支持包,硬件抽象层实现
- eda_dog_controller.cc: 机器狗MCP控制器,实现动作队列和工具注册
- eda_dog_movements_clean.cc: 步态运动算法实现
- eda_dog_movements.h: 步态运动类定义和接口声明
- oscillator.cc / .h: 舵机振荡器实现,提供平滑运动控制
- config.h: 硬件引脚定义和系统参数配置
- config.json: ESP-IDF构建配置,定义目标平台和编译选项
核心模块
eda_robot_pro.cc
硬件抽象层,负责硬件初始化和设备管理,包括I2C总线、OLED显示屏、按键、音频编解码器及机器狗控制器。
class EDARobotPro {
private:
i2c_master_bus_handle_t display_i2c_bus_; // I2C总线句柄
Display* display_; // 显示屏实例
Button boot_button_; // Boot按键
void InitializeDisplayI2c(); // 初始化显示I2C
void InitializeSsd1306Display(); // 初始化SSD1306显示屏
void InitializeButtons(); // 初始化按键
void InitializeEDARobotDogController(); // 初始化机器狗控制器
public:
virtual Led* GetLed() override; // 获取LED(此板无LED)
virtual AudioCodec* GetAudioCodec() override; // 获取音频编解码器
virtual Display* GetDisplay() override; // 获取显示屏
};
eda_dog_movements_clean.cc
机器狗动作控制模块,实现各种运动模式和动作序列,包括行走、转向、坐下、站立等基本动作。
class EDARobotDog {
private:
Oscillator servo_[SERVO_COUNT];
int servo_pins_[SERVO_COUNT];
int servo_trim_[SERVO_COUNT];
bool is_dog_resting_;
public:
void Init(int left_front_leg, int left_rear_leg, int right_front_leg, int right_rear_leg);
void Home();
void SetTrims(int left_front_leg, int left_rear_leg, int right_front_leg, int right_rear_leg);
void Walk(float steps, int period, int dir);
void Turn(float steps, int period, int dir);
void Sit(int period);
void Stand(int period);
void Sleep();
void Stretch(int period);
void Shake(int period);
void LiftLeftFrontLeg(int period, int height);
void LiftLeftRearLeg(int period, int height);
void LiftRightFrontLeg(int period, int height);
void LiftRightRearLeg(int period, int height);
};
oscillator.h
舵机振荡控制器,提供平滑的舵机运动控制,实现各种动作的精确执行。
class Oscillator {
private:
int pos_;
int amplitude_;
int offset_;
double phase_;
double phase0_;
int trim_;
public:
void SetA(unsigned int amplitude);
void SetO(int offset);
void SetPh(double Ph);
void SetTrim(int trim);
void Refresh();
int GetPosition();
};
config.json
项目构建配置文件,定义目标平台、分区表和编译选项。
{
"target": "esp32s3",
"builds": [
{
"name": "EDA-robot-pro",
"sdkconfig_append": [
"CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/16m.csv\"",
"CONFIG_OLED_SSD1306_128X64=y"
]
}
]
}
实现原理
硬件抽象层架构
基于 xiaozhi-esp32 框架的 BSP 架构,实现硬件抽象层,统一管理 I2C 总线、OLED 显示、音频编解码器等外设。
class EDARobotPro : public WifiBoard {
private:
i2c_master_bus_handle_t display_i2c_bus_;
esp_lcd_panel_handle_t panel_ = nullptr;
Display* display_ = nullptr;
Button boot_button_;
Button touch_button_;
void InitializeDisplayI2c(); // 初始化I2C总线
void InitializeSsd1306Display(); // 初始化SSD1306显示屏
void InitializeEDARobotDogController(); // 初始化机器狗控制器
void InitializeButtons(); // 初始化按键
public:
virtual AudioCodec* GetAudioCodec() override;
virtual Display* GetDisplay() override;
};
舵机振荡控制系统
基于 LEDC PWM 的舵机控制器,通过正弦波振荡实现平滑的舵机运动,支持幅度、偏移、相位和周期控制。
void Oscillator::Refresh() {
if (NextSample()) {
if (!stop_) {
// 正弦波振荡计算
int pos = std::round(amplitude_ * std::sin(phase_ + phase0_) + offset_);
if (rev_) pos = -pos;
Write(pos + 90); // 写入舵机位置
}
phase_ = phase_ + inc_; // 更新相位
}
}
void Oscillator::Write(int position) {
int angle = pos* + trim*; // 应用微调
angle = std::min(std::max(angle, 0), 180); // 限制角度范围
// 转换为LEDC占空比
uint32_t duty = (uint32_t)(((angle / 180.0) * 2.0 + 0.5) * 8191 / 20.0);
ESP_ERROR_CHECK(ledc_set_duty(ledc_speed_mode_, ledc_channel_, duty));
ESP_ERROR_CHECK(ledc_update_duty(ledc_speed_mode_, ledc_channel_));
}
步态运动算法
采用分步式步态控制,通过精确的舵机位置序列实现四足机器狗的前进和后退运动。
void EDARobotDog::Walk(float steps, int period, int dir) {
for (int step = 0; step < (int)steps; step++) {
if (dir == FORWARD) {
// 前进步态序列
int current_pos[SERVO_COUNT];
// 第1步:左前腿和右后腿抬起
current_pos[LEFT_FRONT_LEG] = 110;
current_pos[RIGHT_REAR_LEG] = 70;
current_pos[LEFT_REAR_LEG] = 90;
current_pos[RIGHT_FRONT_LEG] = 90;
MoveServos(100, current_pos);
// 第2步:对角线腿组协调运动
current_pos[LEFT_REAR_LEG] = 70;
current_pos[RIGHT_FRONT_LEG] = 110;
MoveServos(100, current_pos);
// 第3步:回到中性位置
current_pos[LEFT_FRONT_LEG] = 90;
current_pos[RIGHT_REAR_LEG] = 90;
MoveServos(100, current_pos);
// 继续其他步态序列...
}
}
}
MCP 协议集成
通过 MCP 协议向 AI 大语言模型暴露机器狗控制接口,支持参数验证和回调函数执行。
void EDARobotDogController::RegisterMcpTools() {
auto &mcp_server = McpServer::GetInstance();
// 注册行走工具
mcp_server.AddTool(
"self.dog.walk",
"行走。steps: 行走步数(1-100); speed: 行走速度(500-2000); direction: 方向(-1=后退, 1=前进)",
PropertyList({
Property("steps", kPropertyTypeInteger, 4, 1, 100),
Property("speed", kPropertyTypeInteger, 1000, 500, 2000),
Property("direction", kPropertyTypeInteger, 1, -1, 1)
}),
[this](const PropertyList &properties) -> ReturnValue {
int steps = properties["steps"].value();
int speed = properties["speed"].value();
int direction = properties["direction"].value();
QueueAction(ACTION_WALK, steps, speed, direction, 0);
return true;
}
);
}
FreeRTOS 任务调度
基于 FreeRTOS 队列的异步任务调度,确保动作执行不阻塞 AI 对话和其他系统功能。
static void ActionTask(void *arg) {
EDARobotDogController *controller = static_cast(arg);
DogActionParams params;
controller->dog_.AttachServos(); // 初始化舵机
while (true) {
// 从队列接收动作指令
if (xQueueReceive(controller->action_queue_, ¶ms, pdMS_TO_TICKS(1000)) == pdTRUE) {
controller->is_action_in_progress_ = true;
// 根据动作类型执行相应动作
switch (params.action_type) {
case ACTION_WALK:
controller->dog_.Walk(params.steps, params.speed, params.direction);
break;
case ACTION_TURN:
controller->dog_.Turn(params.steps, params.speed, params.direction);
break;
case ACTION_SIT:
controller->dog_.Sit(params.speed);
break;
}
// 动作完成后回到初始位置
if (params.action_type != ACTION_HOME && params.action_type != ACTION_SIT) {
controller->dog_.Home();
}
controller->is_action_in_progress_ = false;
}
}
}
安装结构
项目采用单外壳结构,由底盖构成,提供舵机固定及PCB固定。
- 延续EDA-Robot标准版设计风格,采用倒角设计
- 底盖内部空间充足,预留4个舵机位置及储线区域
- 升级舵机固定方式,添加限位卡口,舵机可无需螺丝便卡在槽位中
拓展方向
本项目提供了一个完整的 AI 机器狗方案,你可以基于此项目进行以下拓展:
- 增加更多机器狗动作和行为模式
- 支持视觉识别,添加摄像头模块
- 集成更多传感器(陀螺仪、加速度计等)
- 添加环境感知和避障功能
- 接入HomeAssistant实现智能家具控制
注意事项
立创商城采购物料清单
| 数量 | 器件 | 位号 | 商城编号 |
|---|---|---|---|
| 1 | 100nF | C1 | C5632430 |
| 4 | 10uF | C2,C3,C5,C6 | C43351 |
| 2 | 按键 | KEY1,KEY2 | C393938 |
| 1 | SSD1315/SSD1306 屏幕 | OLED1 | C5248080 |
| 10 | 10kΩ | R1,R2,R4,R5,R6,R7,R9,R10,R20,R22 | C410695 |
| 1 | 100kΩ | R23 | C176449 |
| 1 | SK-12D07-6 | SW1 | C5289941 |
| 4 | PZ254V-11-03P | T1,T2,T3,T4 | C2937625 |
| 1 | AMS1117-5.0 | U2 | C33960103 |
| 1 | AMS1117-3.3 | U3 | C2977152 |
| 1 | ESP32S3-N16R8 | U5 | C2913202 |
| 1 | 10Pin 排针 - 10P裁切 | U7, OLED1 | C492409 |
| 1 | 13Pin 排母 - 15P裁切 | U1, MIC1 | C2932676 |
其他平台采购物料清单
| 数量 | 器件 | 位号 |
|---|---|---|
| 8 | M2×4 螺丝 | SCREW3~SCREW10 |
| 1 | INMP441 模块 | MIC1 |
| 1 | MAX98357 模块 | U1 |
| 1 | 2节串联 14500 电池组 | BT1 |
| 4 | SG90舵机 | T1,T2,T3,T4 |
💡 提示:部分通用元件可选择等效型号,重点关注封装及电气参数一致性。
下表列出了 ESP32S3 固件烧录时的分区布局,地址与文件路径对应关系如下,可直接用于命令行烧录或 Flash 工具导入配置。
| 烧录地址 | 文件路径 | 说明 |
|---|---|---|
| 0x0 | bootloader/bootloader.bin | Bootloader 启动加载程序 |
| 0x8000 | partition_table/partition-table.bin | 分区表定义 |
| 0xd000 | ota_data_initial.bin | OTA 初始数据区 |
| 0x20000 | xiaozhi.bin | 主程序固件 |
| 0x800000 | generated_assets.bin | 资源文件(语音模型/AI配置) |
💡 提示:使用 esptool.py 可执行如下命令进行烧录:
esptool.py write_flash 0x0 bootloader/bootloader.bin 0x8000 partition_table/partition-table.bin 0xd000 ota_data_initial.bin 0x20000 xiaozhi.bin 0x800000 generated_assets.bin
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。










