| 物品 | 说明 |
| ESP32-S3 核心板 | 推荐带 USB 直连的版本(如 ESP32-S3-DevKitC),某宝 25~50 元 |
| USB 数据线 | Type-C,必须是数据线(纯充电线无法烧录) |
| 项目 | 版本 |
| 操作系统 | Ubuntu(本文使用虚拟机,建议磁盘分配 40GB 以上) |
| ESP-IDF | v5.5.2(通过官方安装脚本安装) |
| Python | 3.8+(ESP-IDF 安装时会自动处理) |
| Git | 用于克隆代码 |
sudo apt update
sudo apt install -y git wget flex bison gperf python3 python3-pip python3-venv cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0 3.2 运行官方安装脚本
./scripts/setup_idf_ubuntu.sh
./scripts/build_ubuntu.sh 说明:这个步骤会配置 ESP-IDF v5.5 工具链,它是官方用于 ESP32 编译的框架。
cd ~
git clone -b v5.5.2 --recursive https://github.com/espressif/esp-idf.git esp-idf-v5.5.2
cd esp-idf-v5.5.2
./install.sh esp32s3 安装完成后,ESP-IDF 默认位于:
. $HOME/.espressif/esp-idf-v5.5.2/export.sh
注意:不要直接复制网上带 /home/某某用户名/ 的路径,用 $HOME 代替,它会自动匹配你的用户目录。
idf.py --version 输出类似 ESP-IDF v5.5.2 即为成功。
echo '. $HOME/.espressif/esp-idf-v5.5.2/export.sh' >> ~/.bashrc
source ~/.bashrc
curl https://api.deepseek.com/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer 你的DeepSeek_API_Key" \
-d '{
"model": "deepseek-chat",
"messages": [
{"role": "user", "content": "Hello"}
],
"stream": false
}' 成功返回 类似以下 JSON,说明一切正常:
{
"id": "chatcmpl-xxx",
"choices": [
{
"message": {
"role": "assistant",
"content": "Hello! How can I help you today?"
}
}
]
}
| 现象 | 原因 |
| 401 Unauthorized | API Key 填错了 |
| connection refused | 网络问题(虚拟机 DNS / 代理) |
| curl: command not found | 执行 sudo apt install curl |
确认 API 调通后再进行下一步。
cd ~
git clone https://github.com/memovai/mimiclaw.git
cd mimiclaw 如果 GitHub 访问超时,可以使用加速镜像:
git clone https://ghproxy.com/https://github.com/memovai/mimiclaw.git 克隆完成后,查看项目结构:
ls -la 确认能看到 CMakeLists.txt、main/ 目录等关键文件。
# 在项目根目录执行
cp mimi_secrets.h.example mimi_secrets.h 如果找不到 .example 文件,用 find . -name "*secret*" 搜索一下它的实际位置。
nano mimi_secrets.h 修改为以下内容:
#pragma once
#define MIMI_SECRET_WIFI_SSID "你的WiFi名称"
#define MIMI_SECRET_WIFI_PASS "你的WiFi密码"
/* DeepSeek API 配置 */
#define MIMI_SECRET_API_KEY "sk-你的DeepSeek_API_Key"
#define MIMI_SECRET_MODEL "deepseek-chat"
#define MIMI_SECRET_MODEL_PROVIDER "openai" 按 Ctrl + O 保存,Ctrl + X 退出。
安全提醒: mimi_secrets.h 包含你的密钥,绝对不要公开。
| 项目 | OpenAI 默认值 | DeepSeek 需改为 |
| Host | api.openai.com | api.deepseek.com |
| Path | /v1/chat/completions | /chat/completions |
nano main/llm/llm_proxy.c 找到这一行(可用 Ctrl + W 搜索 provider_is_openai):
static bool provider_is_openai(void)
{
return strcmp(s_provider, "openai") == 0;
}
static const char *llm_api_url(void)
{
return provider_is_openai() ? MIMI_OPENAI_API_URL : MIMI_LLM_API_URL;
}
static const char *llm_api_host(void)
{
return provider_is_openai() ? "api.deepseek.com" : "api.anthropic.com";
}
static const char *llm_api_path(void)
{
return provider_is_openai() ? "/chat/completions" : "/v1/messages";
} 修改为:
static bool provider_is_openai(void)
{
return strcmp(s_provider, "openai") == 0 || strcmp(s_provider, "deepseek") == 0;
}
static const char *llm_api_url(void)
{
if (strcmp(s_provider, "deepseek") == 0) return MIMI_DEEPSEEK_API_URL;
if (strcmp(s_provider, "openai") == 0) return MIMI_OPENAI_API_URL;
return MIMI_LLM_API_URL;
}
static const char *llm_api_host(void)
{
if (strcmp(s_provider, "deepseek") == 0) return "api.deepseek.com";
if (strcmp(s_provider, "openai") == 0) return "api.openai.com";
return "api.anthropic.com";
}
static const char *llm_api_path(void)
{
if (provider_is_openai()) return "/v1/chat/completions";
return "/v1/messages";
} 保存退出。
更优雅的方式是在 mimi_secrets.h 中添加 Host / Path 的宏定义,但这需要改动更多代码,本文先用最简单的方式。
. $HOME/.espressif/esp-idf-v5.5.2/export.sh 8.2 设置目标芯片
cd ~/mimiclaw
idf.py set-target esp32s3 这一步会告诉编译系统,我们的目标芯片是 ESP32-S3(而不是 ESP32 / ESP32-C3 等)。
idf.py fullclean 为什么要执行这一步?因为在改完代码、换过 target 后,旧的缓存可能导致编译异常。fullclean 会删除整个 build/ 目录,确保干净编译。
idf.py build 首次编译大约需要 5~15 分钟,取决于电脑性能。请耐心等待
Project build complete. To flash, run:
idf.py flash
or
idf.py -p PORT flash
Generated xxx/mimiclaw.bin 8.5 连接开发板并烧录
ls /dev/ttyACM*
# 或
ls /dev/ttyUSB* 看到 /dev/ttyACM0 之类的设备即可。
idf.py -p /dev/ttyACM0 flash monitor 或者直接
idf.py flash monitor flash monitor 是两个命令的合并,烧录完成后自动打开串口监视器,方便查看运行日志。
sudo usermod -aG dialout $USER 然后必须重启(注销不够,要完全重启):
sudo reboot 重启后再次执行编译烧录即可。
✅ WiFi connected, IP: 192.168.x.x
✅ DNS resolved: api.deepseek.com
✅ TLS handshake OK
✅ HTTP POST → 200 OK
✅ Response parsed
✅ Assistant: Hello! How can I help you? (实际输出格式以项目代码为准,上面是语义示意)
✅ 连接 WiFi
✅ 调用 DeepSeek API
✅ 接收并解析大模型回复 恭喜,部署成功!
LLM 作为决策层,MCU 作为执行层几个可以立刻上手的方向:
准备硬件(ESP32-S3 + USB数据线)
↓
安装 ESP-IDF v5.5.2
↓
获取 DeepSeek API Key
↓
curl 测试 API 是否可用
↓
git clone MimicLaw
↓
配置 mimi_secrets.h
↓
修改 llm_proxy.c(Host + Path)
↓
idf.py set-target esp32s3
↓
idf.py build
↓
idf.py flash monitor
↓
成功运行!
| 问题 | 解决方案 |
| idf.py: command not found | 执行 . $HOME/.espressif/esp-idf-v5.5.2/export.sh |
| No space left on device | 扩展虚拟机磁盘 + 执行 growpart + resize2fs |
| Permission denied: /dev/ttyACM0 | sudo usermod -aG dialout $USER 然后重启 |
| WiFi 连不上 | 确认是 2.4GHz 网络,检查 SSID/密码是否正确 |
| API 返回 401 | API Key 无效,重新检查 mimi_secrets.h |
| 编译报找不到 mimi_secrets.h | 确认已执行 cp 命令,且文件在正确目录 |
| 串口监视器乱码 | 波特率设为 115200(ESP-IDF 默认值) |
| 串口监视器无输出 | 用ESP32开发板上的USB端口连接电脑,而不是USB-to-Serial端口。 |
| 烧录时连接失败 | 按住 BOOT → 按 RST → 松开 RST → 开始烧录 → 松开 BOOT |
步进电机是将电脉冲信号,转变为角位移或线位移的开环控制电机,又称为脉冲电机。
本文将从手绘架构图入手,逐层拆解 MimiClaw 的分层设计、核心模块、数据流转与底层实现,带你解剖这只“智能虾”的技术骨架,看懂在 C 语言加持下,AI 智能体如何以可穿戴设备的形态,在你身边稳稳运行、离线服务、主动响应。
本文介绍如何在不脱离 ArduinoIDE 可视化开发的前提下,通过一个名为 platform.local.txt 的小文件,实现对 ESP32 编译流程的精准控制。
本文将系统分析程序体积增长的五大根源,并提供经过验证的优化方案,帮助减小固件大小。
本文所DIY的语音助手设备端使用的是MicroPython、服务端是Python,对于很多开发者来说MicroPython入门没难度。
本小节使用音频开发框架实现一个音频录制到文件的示例。
I2S协议通过BCLK、LRCLK和DATA三线精准传输音频数据,但时序边沿、帧格式、时钟源等细节常引发噪声或断连。本文详解ESP32的I2S实现,从协议原理到ESP-IDF v5.x代码配置,助你避开常见陷阱,确保音频稳定传输。
本小节介绍音频的基础知识、音频开发框架和AudioCodec的简介,用一个音频播放示例来说明音频管道的使用。
MimiClaw是基于ESP32-S3芯片的超轻量级AI助手,通过Telegram或WebSocket提供Claude/GPT智能服务。
本小节是一个Web服务结合SD卡文件系统的应用示例。
本节主要讲解FileSystem类的使用,以及Flash文件系统配置和SD存储模块的使用。