ESP32-S3 桌面语音移动机器人 DIY:可移动、可对话、带 OLED/RGB 和 3D 打印外壳
ESP32-S3 桌面语音移动机器人 DIY:可移动、可对话、带 OLED/RGB 和 3D 打印外壳
项目简介
这个项目是一个 500-1000 元级别的桌面语音移动机器人原型。它使用 ESP32-S3 作为主控,负责 Wi-Fi、音频采集与播放、电机控制、OLED 状态显示、RGB 状态灯和基础安全保护;AI 对话能力通过云端 API 实现。
第一版目标很明确:
-
可以在桌面上两轮差速移动
-
可以通过按键录音和云端 AI 对话
-
可以识别"前进、后退、左转、右转、停止、转一圈"等语音动作指令
-
OLED 小屏显示工作状态、电池电压、Wi-Fi 和安全状态
-
RGB LED 用颜色提示录音、思考、说话、移动和故障
-
底部红外传感器做桌面防跌落
-
前方传感器做基础避障
-
提供 3D 打印外壳 STL 和 OpenSCAD 参数化源文件
项目目录已经包含 Arduino 固件、接线文档、采购清单、云端接口约定、测试清单、3D 打印模型和安装爆炸图。
安装爆炸图

主要部件从上到下包括:
-
上盖
-
OLED 屏
-
RGB 灯
-
ESP32-S3 主控
-
INMP441 麦克风
-
MAX98357A 功放
-
小喇叭
-
18650 电池
-
TB6612FNG 电机驱动
-
N20 电机和车轮
-
防跌落传感器
-
前方避障传感器
-
底盘
硬件清单
| 模块 | 建议型号 | 数量 | 说明 |
|---|---:|---:|---|
| 主控 | ESP32-S3 N16R8 开发板 | 1 | 建议 16MB Flash、8MB PSRAM |
| 麦克风 | INMP441 I2S 数字麦克风 | 1 | 3.3V 供电 |
| 功放 | MAX98357A I2S 功放 | 1 | 接 4Ω/3W 小喇叭 |
| 喇叭 | 4Ω/3W | 1 | 小体积优先 |
| 电机 | N20 减速电机 | 2 | 6V、100-300RPM |
| 电机驱动 | TB6612FNG | 1 | 小车电机控制 |
| 底盘 | 两轮小车底盘 + 万向轮 | 1 | 可 3D 打印或亚克力 |
| 防跌落 | 红外反射传感器 | 2 | 装在底部前沿左右两侧 |
| 前方避障 | VL53L0X ToF 或数字避障模块 | 1 | 新手可先用数字避障模块 |
| 状态屏 | 0.96 寸 I2C SSD1306 OLED | 1 | 默认 128x64,地址 0x3C |
| 状态灯 | WS2812/NeoPixel RGB LED | 1 | 1 颗即可 |
| 电池 | 18650 + 保护板/电池盒 | 1 套 | 必须有保护 |
| 电源 | 5V 升压模块 | 1 | 主控供电稳定优先 |
| 外壳 | 3D 打印 PLA/PETG | 1 套 | 使用项目内 STL |
默认接线
TB6612FNG 电机驱动
| TB6612FNG | ESP32-S3 默认 GPIO | 说明 |
|---|---:|---|
| PWMA | GPIO 4 | 左轮 PWM |
| AIN1 | GPIO 5 | 左轮方向 |
| AIN2 | GPIO 6 | 左轮方向 |
| PWMB | GPIO 7 | 右轮 PWM |
| BIN1 | GPIO 15 | 右轮方向 |
| BIN2 | GPIO 16 | 右轮方向 |
| STBY | GPIO 17 | 高电平启用 |
I2S 麦克风 INMP441
| INMP441 | ESP32-S3 默认 GPIO |
|---|---:|
| SCK/BCLK | GPIO 12 |
| WS/LRCL | GPIO 13 |
| SD | GPIO 14 |
I2S 功放 MAX98357A
| MAX98357A | ESP32-S3 默认 GPIO |
|---|---:|
| BCLK | GPIO 9 |
| LRC | GPIO 10 |
| DIN | GPIO 11 |
OLED 和 RGB LED
| 模块 | ESP32-S3 默认 GPIO |
|---|---:|
| OLED SDA | GPIO 41 |
| OLED SCL | GPIO 42 |
| WS2812 DIN | GPIO 2 |
传感器和按键
| 模块 | ESP32-S3 默认 GPIO |
|---|---:|
| 左防跌落红外 | GPIO 18 |
| 右防跌落红外 | GPIO 8 |
| 前方避障 | GPIO 3 |
| 说话按键 | GPIO 0 |
| 电池电压 ADC | GPIO 1 |
软件架构
ESP32-S3 端负责硬件和联网,AI 能力放到云端中转服务。
交互流程:
-
按住说话键开始录音
-
松开按键后生成 16kHz、16-bit、mono WAV
-
上传 `/stt` 做语音识别
-
如果识别结果是移动指令,直接执行动作
-
如果是普通聊天,调用 `/chat`
-
再调用 `/tts` 生成语音
-
ESP32-S3 通过 MAX98357A 播放回复
云端 API 约定:
```http
POST /stt
Content-Type: audio/wav
```
返回:
```json
{
"text": "往前走"
}
```
聊天接口:
```http
POST /chat
Content-Type: application/json
```
```json
{
"text": "你好",
"device": "esp32-desktop-robot"
}
```
返回:
```json
{
"reply": "你好,我在桌面上待命。"
}
```
TTS 接口:
```http
POST /tts
Content-Type: application/json
```
响应体建议直接返回 16kHz、16-bit、mono WAV。
固件配置
复制:
```text
firmware/desktop_voice_robot/config.example.h
```
为:
```text
firmware/desktop_voice_robot/config.h
```
然后修改 Wi-Fi 和云端接口:
```cpp
#define WIFI_SSID "你的WiFi名称"
#define WIFI_PASSWORD "你的WiFi密码"
#define AI_API_KEY ""
#define STT_URL "http://你的服务器:8080/stt"
#define CHAT_URL "http://你的服务器:8080/chat"
#define TTS_URL "http://你的服务器:8080/tts"
```
OLED 和 RGB LED 默认启用:
```cpp
#define USE_OLED_DISPLAY true
#define OLED_I2C_ADDRESS 0x3C
#define PIN_I2C_SDA 41
#define PIN_I2C_SCL 42
#define USE_RGB_LED true
#define PIN_RGB_LED 2
#define RGB_LED_COUNT 1
```
本地模拟云端服务
没有真实 AI 服务时,可以先用项目里的模拟服务测试 ESP32 到服务器的 HTTP 链路:
```powershell
python tools/mock_cloud_server.py --port 8080 --stt-text "前进"
```
然后把 ESP32 的接口地址改成电脑局域网 IP,例如:
```cpp
#define STT_URL "http://192.168.1.10:8080/stt"
#define CHAT_URL "http://192.168.1.10:8080/chat"
#define TTS_URL "http://192.168.1.10:8080/tts"
```
模拟服务说明:
-
`/stt` 返回固定文字
-
`/chat` 回显文本
-
`/tts` 生成一段测试音 WAV
Arduino IDE 环境
-
安装 Arduino IDE
-
Boards Manager 安装 `esp32 by Espressif Systems`
-
Library Manager 安装:
-
`ArduinoJson`
-
`Adafruit SSD1306`
-
`Adafruit GFX Library`
-
`Adafruit NeoPixel`
- 打开:
```text
firmware/desktop_voice_robot/desktop_voice_robot.ino
```
-
开发板选择 ESP32-S3,建议启用 PSRAM
-
编译并上传
-
串口监视器设置 `115200`
串口调试命令
| 命令 | 动作 |
|---|---|
| `f` | 前进 |
| `b` | 后退 |
| `l` | 左转 |
| `r` | 右转 |
| `x` | 转一圈 |
| `s` | 停止 |
| `v` | 查看电池电压 |
第一次测试必须架空车轮,确认电机方向正确后再放到桌面。
3D 打印文件
项目内包含两个模型文件:
```text
models/desktop_robot_shell.scad
models/desktop_robot_shell.stl
```
其中:
-
`.scad` 是 OpenSCAD 参数化源文件,可以修改尺寸
-
`.stl` 可以直接导入切片软件
推荐打印参数:
-
材料:PLA 或 PETG
-
层高:0.2mm
-
填充:15%-25%
-
支撑:建议开启
-
打印方向:底面朝下
测试清单
电机
-
架空车轮后上电
-
串口输入 `f`,两轮应同时向前
-
串口输入 `b`,两轮应同时向后
-
串口输入 `l` 和 `r`,机器人应原地转向
-
串口输入 `s`,电机立即停止
防跌落
-
用桌面靠近传感器,应显示安全
-
让传感器悬空,应显示危险
-
桌边测试至少 20 次,必须全部停止或后退
OLED 和 RGB LED
-
上电后 OLED 显示设备名和启动状态
-
Wi-Fi 连接成功后 OLED 显示 `WiFi: OK`
-
按住说话键时 RGB LED 变红
-
AI 思考时 RGB LED 变黄
-
播放回复时 RGB LED 变青
-
移动时 RGB LED 变蓝
AI 和动作
-
说"前进",机器人前进一小段
-
说"停止",机器人立即停止
-
说"左转""右转""后退""转一圈",动作符合预期
-
普通聊天内容不应触发移动
注意事项
-
ESP32-S3 不适合本地跑大模型,AI 对话建议走云端或局域网中转服务
-
电机电源和主控电源建议分开稳压,但 GND 必须相连
-
电池必须使用保护板
-
电机启动导致 ESP32 重启时,需要检查升压模块余量、电容和走线
-
第一次桌面测试必须有人看着,防止机器人冲出桌边
项目文件结构
```text
.
├── README.md
├── docs
│ ├── bom.md
│ ├── cloud-api.md
│ ├── test-checklist.md
│ ├── wiring.md
│ └── images
│ └── assembly_exploded_view.png
├── firmware
│ └── desktop_voice_robot
│ ├── config.example.h
│ └── desktop_voice_robot.ino
├── models
│ ├── README.md
│ ├── desktop_robot_shell.scad
│ └── desktop_robot_shell.stl
└── tools
└── mock_cloud_server.py
```
总结
这个版本适合作为桌面语音机器人第一版原型:先把移动、安全、音频、云端 AI、OLED/RGB 状态和 3D 打印外壳全部跑通。后续可以继续升级摄像头识别、唤醒词、本地语音前端、表情动画和更完整的云端记忆能力。