站内搜索
发作品签到
EDA-RobotPro AI智能机器狗
专业版

EDA-RobotPro AI智能机器狗

简介

本项目是EDA-Robot的升级版,搭载ESP32S3实现小智AI控制功能

简介:本项目是EDA-Robot的升级版,搭载ESP32S3实现小智AI控制功能
复刻成本:85

开源协议

GPL 3.0

创建时间:2025-10-06 15:26:31更新时间:2026-04-10 16:53:41

描述

项目介绍

本项目使用 ESP32S3R8N16 模组,结合 INMP441 + MAX98357 实现小智AI对话及MCP协议控制机器狗运动。 相较于 EDA-Robot 简易机器狗项目而言,PRO版本加入的小智AI 提供的 LLM 大语言模型,不再需要通过手机 WEB 操控, 只需唤醒小智执行 “向前走”、“向后走” 等口语化指令即可。

相较于传统 ASR-PRO 指令的机器狗而言,LLM 大语言模型不需要手动指定词条应答, 而是由远端服务器模型推理得出应答结果,回答更加真实且富有情感。

本项目大部分均为插件,适合新手教学使用。

项目介绍
EDA-Robot Pro
EDA-Robot Pro
  • ✳️ ESP32S3系列主控
  • ✅ 支持AI大语言模型
  • ✅ 双核 主频240MHz
  • ❌ 成本较高
  • ✳️ 需要联网,语音对话控制
  • 🔋 双节 14500 电池供电
查看 PRO 详情
EDA-Robot
EDA-Robot
  • ✳️ ESP8266主控
  • ❌ 离线词条语音控制
  • ❌ 单核 主频160MHz
  • ✅ 成本更低
  • ✳️ 离线局域网手机遥控
  • 🔋 双节 14500 电池供电
查看标准版详情
💡 EDA-Robot Pro 拥有更强大的AI功能和处理性能;EDA-Robot 则更为简单便宜。

固件功能

AI LLM

✅ 支持小智AI提供的大语言模型,能进行自然语言理解与处理。

MCP协议

✅ 支持MCP协议服务,LLM可通过MCP协议控制机器狗动作。

动作控制

✅ 支持通过自然语言控制,无需设置词条,均为LLM推理完成。

自定义唤醒

✅ 支持自定义名称唤醒机器狗,定制专属宠物。

项目参数

ESP32S3 系列

✅ ESP32S3 系列主控,内置 WiFi 功能

INMP441 模块

✅ 采用 INMP441 语音模块,采集环境音用于 LLM 输入

MAX98357 模块

✅ 采用 MAX98357 音频模块,输出音频用于 LLM 输

SG90/MG90 舵机组

✅ 采用 SG90/MG90 舵机(180°版本),用于机器狗关节实现运动功能

SSD1315/06 模块

✅ 采用 SSD1315/SSD1306 屏幕显示模块,用于表情及 LLM 输入输出显示

14500 电池组

✅ 采用双节串联14500电池组,无需升压电路,仅需LDO即可供电,节约空间

硬件设计

主控电路

主控选用 ESP32S3系列 模组,集成 WiFi 功能,提供丰富的 GPIO 接口。 板载 USB 转串口芯片,方便程序下载和调试。

ESP8266 Board
ESP32S3 主控模组原理图部分
ESP8266 Circuit
主控模组启动电路原理图部分
音频采集电路

本系统使用 INMP441 数字麦克风模块进行音频采集,结构简单,可根据需求替换为更低成本型号。

Audio Circuit
INMP441音频采集电路原理图部分
INMP441 Datasheet
INMP441数据手册引脚定义部分
音频输出电路

音频输出部分采用 MAX98357 模块,支持I2S音频输入,驱动扬声器输出。设计简单,性能稳定。

MAX98357音频输出电路原理图部分
MAX98357数据手册引脚定义部分
MAX98357原理图输出增益配置部分
显示电路

显示部分采用 SSD1306/SSD1315 OLED 屏幕,分辨率128×64,尺寸0.96或1.3英寸,需注意I2C线序及上拉电阻配置。

SSD1306 OLED显示屏电路原理图部分
电源供电电路

电源供电电路与 EDA-Robot 标准版一致,采用两节串联 14500 电池,串联后满电电压 8.4V, 通过两路 LDO 分别降压至 5V 为舵机供电和 3.3V 为 MCU 供电。

LDO to 5V 电路
5V LDO电路
5V 5V-LDO电路原理图部分
LDO to 3.3V 电路
3.3V LDO电路
3.3V 3.3V-LDO电路原理图部分
舵机电路

舵机电路与标准版一致,采用 SG90/MG90 舵机,通过 PWM 信号控制角度。 由于舵机内部自带 5V 转 3.3V 驱动电路,PWM 信号可直接由 MCU IO 控制,无需电平转换。

舵机电路图
舵机控制电路原理图部分
其余电路

按键电路与下载接口设计简洁,均可直接连接 MCU IO。由于 MCU 资源充足,可轻松扩展更多功能。

按键电路
按键电路原理图部分
舵机模型
舵机3D模型封装
下载接口
下载接口电路部分
螺丝孔
PCB固定螺丝部分

软件开发

完整源码请在附件查看

开发环境
  • 软件环境:VSCode + ESP-IDF
  • 开发语言:C / C++
  • 框架:ESP-IDF Framework
项目依赖

本项目借助以下开源仓库协助开发:

感谢 Xiaoxia社区贡献者 对该项目的开源贡献。

BSP 模块

本项目采用 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

EDARobotPro 硬件抽象层

硬件抽象层,负责硬件初始化和设备管理,包括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

EDARobotDog 动作控制

机器狗动作控制模块,实现各种运动模式和动作序列,包括行走、转向、坐下、站立等基本动作。


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

Oscillator 振荡控制器

舵机振荡控制器,提供平滑的舵机运动控制,实现各种动作的精确执行。


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

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"
      ]
    }
  ]
}
  

实现原理

硬件抽象层架构

EDARobotPro 板级支持包

基于 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;
};
  

舵机振荡控制系统

Oscillator 振荡器实现

基于 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_));
}

步态运动算法

Walk 行走算法实现

采用分步式步态控制,通过精确的舵机位置序列实现四足机器狗的前进和后退运动。


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 工具注册机制

通过 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
采购须知
采购SSD1315/SSD1306显示屏时请务必注意线序,本项目使用GND/VCC/SCL/SDA线序,EDA-Robot标准版复刻中很多同学因为买错线序导致短路烧板。
2
焊接建议
1.MAX98357、INMP441及OLED模块可以使用排针直接焊接或排母连接,建议OLED使用排针焊接后掰弯,其余模块排母连接。2.焊接时建议焊接优先级为:贴片>阻容插件>其余插件>屏幕组件>电池盒组件
3
测试流程
焊接完成后请优先检查MCU相邻IO引脚有无连锡短路,MCU到板间有无短路。电容相邻焊盘有无连锡短路或插反。上电前先用万用表蜂鸣挡测试BAT+、3.3V和5V到GND有无短路。全部确认无误后再上电。
4
编译事宜
请务必确保源码路径中无中文路径,否则可能造成编译问题。编译前请安装好VSCODE和ESPIDF工具。
5
烧录教程
烧录部分可以参考 EDA-Robot机器狗-烧录教程
物料替换对照表

立创商城采购物料清单

数量 器件 位号 商城编号
1100nFC1C5632430
410uFC2,C3,C5,C6C43351
2按键KEY1,KEY2C393938
1SSD1315/SSD1306 屏幕OLED1C5248080
1010kΩR1,R2,R4,R5,R6,R7,R9,R10,R20,R22C410695
1100kΩR23C176449
1SK-12D07-6SW1C5289941
4PZ254V-11-03PT1,T2,T3,T4C2937625
1AMS1117-5.0U2C33960103
1AMS1117-3.3U3C2977152
1ESP32S3-N16R8U5C2913202
110Pin 排针 - 10P裁切U7, OLED1C492409
113Pin 排母 - 15P裁切U1, MIC1C2932676

其他平台采购物料清单

数量 器件 位号
8M2×4 螺丝SCREW3~SCREW10
1INMP441 模块MIC1
1MAX98357 模块U1
12节串联 14500 电池组BT1
4SG90舵机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

变更日志
#251211
Fix
3D预览
修正模型位置,确保3D预览显示与实物接近。
Fix
README
修正烧录教程的超链接地址错误。
#251218
Fix
README
变更实物图
#260320
Fix
xiaozhi源码/固件
优化步态算法

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
1
倒角机器狗.STL
1478
2
foot.stl
400

附件

序号文件名称下载次数
1
演示视频.mp4
1443
2
EDA-RobotPro资源包1.5.zip
724
克隆工程
添加到专辑
0
0
分享
侵权投诉
知识产权声明&复刻说明

本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。

请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。

底部导航