想用ESP32开发板做一个AI机器人小伙伴,最怕的不是代码难写,而是第一步就搞混了“AI”到底放在哪一层。有人拿到板子就开始找大语言模型,有人先买回来一堆传感器,结果几天过去连固件都没烧进去。这篇不绕弯,直接按实际落地的顺序拆:先想清楚机器人的核心能力,再选板子、搭环境、跑通最小任务,最后逐步加上语音、屏幕、传感器和小车控制。目标很明确:用一块便宜的ESP32,做出一个能感知环境、能回应指令、能动起来的桌面级AI机器人原型。
如果你刚接触嵌入式开发,或者之前只玩过Arduino,这篇文章也适用。ESP32的编程方式对Arduino用户很友好,很多库可以直接复用。如果你已经有单片机经验,那重点可以放在后面的系统结构、电源管理和通信设计上。接下来直接从选型和路线说起。
1. 先判断你要做的“AI机器人小伙伴”是哪一种
1.1 不要把“AI”一股脑押在ESP32本地
很多人在标题里看到“AI”,第一反应是让机器人像手机助手一样自由对话。这个预期在ESP32上不现实,因为ESP32不是树莓派级别的算力平台。
主流ESP32芯片典型配置是双核240MHz,内置SRAM约520KB,支持2.4G WiFi和蓝牙。这个配置能做很多事情:跑轻量语音关键词识别、采集摄像头JPEG、驱动舵机、跑LVGL小屏界面、接收传感器数据,但跑不动大语言模型,也跑不动视觉大模型。
所以做这类项目,第一件事是给“AI”分层。ESP32负责采集、控制、交互,真正的语义理解视觉理解交给云端服务器或者旁边的一台PC。这样做既发挥ESP32实时性和低功耗的优势,又不会因为算力不够导致项目卡死。
1.2 三条最容易起步的技术路线
根据你做机器人的目的,可以先选一条主线,不要一上来所有功能都堆上去。
路线A:桌面交互助手。 ESP32 + 显示屏 + 语音播报模块,配合按键或触摸屏。机器人可以显示表情、播报温度、响应简单命令词。适合学习LVGL和基础外设控制,也是很多入门玩家最容易跑通的路。
路线B:联网语音对话机器人。 ESP32采集环境声音或文字指令,通过WiFi请求云端接口,拿到结果后通过TTS模块播放出来。这种方案体验最好,但需要管理麦克风模块、网络、接口Key和音频输出链路。
路线C:移动机器人平台。 在ESP32上接电机驱动、舵机、超声波模块,做成会走的小车。再通过Micro-ROS、串口或蓝牙和上层通信。如果你以后想学ROS2、机器人导航,这条路更接近真实产品结构。
三种路线不是互斥的,但顺序很重要。先做A或者C,再往B扩展,比较顺畅。反过来一上来就做语音对话,容易卡在音频采集、云端接口和网络稳定性上。
1.3 硬件清单与成本控制
做这台机器人大致会用到这些硬件:
- ESP32开发板:优先选带USB串口芯片的经典DevKit,例如ESP32 DevKitC,驱动稳定,资料多。
- 舵机:两个9g舵机,比如SG90,用于转头、抬手或控制云台。
- 显示屏:0.96寸OLED,或者1.9寸TFT彩屏。跑LVGL建议选带PSRAM的ESP32-S3或容量更大的TFT,普通ESP32也能跑,只是界面复杂时性能会紧张。
- 温湿度传感器:DHT11或DHT22,做环境感知最便宜。
- 麦克风模块或语音识别模块:取决于你是否要做语音交互。
- 小车底盘和电机驱动:两轮或四轮都可以,搭配L298N或DRV8833。
- 电源:电池、AMS1117稳压模块或DC-DC降压模块,注意舵机和电机不能直接从GPIO取电。
- 若干杜邦线、面包板、螺丝螺柱。
我的建议是不要一次买齐所有模块。先买一块ESP32开发板、一个DHT11、一个舵机,跑通最小演示。硬件堆得越多,排查问题越难,尤其是电源和接线问题,往往比代码问题更容易让人崩溃。
2. 开发板选型与环境准备:先把固件烧进去
2.1 常见ESP32开发板与引脚区别
市面上常见的有ESP32 DevKit、ESP32-S3、ESP32-C3、ESP32-CAM。
- ESP32经典版:性能均衡,适合大多数入门项目,外设资料最多。
- ESP32-S3:引入更多GPIO,带向量指令,跑LVGL和轻量AI加速上限更高,但部分库需要适配。
- ESP32-C3:单核RISC-V,价格低,适合简单控制,跑复杂任务偏吃力。
- ESP32-CAM:带摄像头接口,适合做图像采集,但GPIO复用严重,接扩展外设时容易冲突。
选板时不要只看型号,还要看丝印和引脚图。不同厂家的开发板引脚排列不完全一样,板子上的LED、按键位置也可能不同。第一次使用,先找厂家提供的引脚图,再连线,避免盲目猜引脚。
2.2 Arduino开发板包安装
我推荐用Arduino IDE开始,因为资料多、入门快。安装ESP32开发板包时,需要在“开发板管理器地址”里加入官方索引地址。网上能搜到最新地址,核心是路径要正确,不要填错。
然后打开开发板管理器,搜索esp32,安装对应平台的包。这个过程因为要下载多个文件,很依赖网络环境。如果你看到这样的报错:
failed to install platform: 'esp32:3.3.11'. 13 internal: download failed原因通常是网络下载失败,不是代码问题。先确认网络是否稳定,再检查本地Arduino目录下的包缓存是否损坏。如果反复失败,可以尝试清空缓存目录,或者换一个网络环境重试。不要反复点安装,容易产生残留文件。
2.3 首次烧录:从点亮LED开始
烧录前先确认三件事:
- Arduino IDE里选择的开发板型号是否和你的板子一致。
- 端口是否选对,Windows下通常是COM口,Linux和macOS下通常是/dev/ttyUSB0或/dev/ttyACM0。
- 串口驱动是否安装。常见CH340、CP2102驱动,如果没有安装,设备管理器里会看到未知设备。
先写一个最基础的Blink程序:
#define LED_PIN 2 void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(500); digitalWrite(LED_PIN, LOW); delay(500); }有些开发板的板载LED不在GPIO 2,可能在GPIO 8、GPIO 48或其它引脚,具体看丝印和原理图。如果上传后LED没反应,优先改LED_PIN,而不是怀疑板子坏了。
如果上传时卡在“Connecting...”,按住开发板上的BOOT键再点上传,出现连接提示后松开。这个操作在经典ESP32 DevKit上很常见,尤其是串口芯片和板载自动下载电路配合不好的时候。
烧录成功只是第一步。接下来不要急着接屏幕和麦克风,先把最简单的传感器跑起来,再去做“AI感”看起来更强的东西,这条路最省时间。
3. 先做一个“会感知”的底座:传感器和舵机
3.1 温湿度传感器接入
DHT11和DHT22是入门最常用的温湿度传感器。接线很简单:VCC接3.3V,GND接GND,DATA接一个GPIO。
在Arduino环境下,一般安装DHT sensor library,再配合Adafruit Unified Sensor库使用。示例代码结构大致如下:
#include <DHT.h> #define DHT_PIN 4 #define DHT_TYPE DHT11 DHT dht(DHT_PIN, DHT_TYPE); void setup() { Serial.begin(115200); dht.begin(); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); Serial.print("Humidity: "); Serial.print(h); Serial.print("% Temperature: "); Serial.println(t); delay(2000); }DHT系列读取速度不快,所以循环里加至少2秒延时。如果串口显示NaN或读数为0,先检查DATA引脚是否接对,再看开发板供电是否稳定。DHT11的响应速度和精度都不高,但用来做“环境感知”演示完全够。
3.2 舵机控制与供电
舵机是机器人关节的基础。SG90等9g舵机信号线接GPIO,VCC和GND需要外部供电。一个常见错误是直接用ESP32的3.3V引脚给舵机供电,结果舵机转不动,甚至导致板子重启。
控制舵机可以用ESP32Servo库。注意Arduino自带Servo库在ESP32上兼容性一般,建议用ESP32Servo。示例:
#include <ESP32Servo.h> Servo servoHead; void setup() { servoHead.attach(13); } void loop() { servoHead.write(0); delay(500); servoHead.write(90); delay(500); servoHead.write(180); delay(500); }如果舵机抖动、嗡嗡异响,先不要怀疑代码。优先检查电源:舵机启动瞬间电流可能接近1A,开发板稳压器扛不住。正确做法是舵机电源单独用5V供电,同时和ESP32共地。共地很容易被忽略,少了这一步,PWM信号参考电平不一致,舵机就会乱动。
3.3 机械结构和动作设计
代码之外,机械结构决定机器人看起来是否“灵”。
常见做法是买现成二自由度云台支架,或者打印3D外壳。如果你不想一开始就折腾建模,可以用亚克力板、洞洞板甚至厚纸板先把硬件固定住。重点是重心要低,舵机不要承受额外扭矩。机器人头部如果太重,舵机中位角会跑偏,动作会明显卡顿。
调动作时不要只盯着write角度。给舵机加一个缓慢平滑的过渡,比瞬间跳变更有“机器人小伙伴”的质感。简单的实现方式是用for循环逐步增加角度,而不是直接跳到目标角度。
4. 加上“AI感”:语音、屏幕和图像识别
4.1 语音交互的两种做法
语音交互分两层:语音识别和语音合成。
如果你希望机器人能听懂几个固定命令,比如“向前”“后退”“停止”,可以先用离线语音识别模块或类库。ESP32在本地也能跑命令词识别,但识别率受环境噪声影响较大,需要做好麦克风布局。
如果你希望机器人能对话,现实方案是ESP32负责采集音频并发送到云端接口,或者把文本发送到对话接口,语音合成结果再传回。注意几个问题:
- 音频采样格式和接口要求是否匹配。
- 网络延迟。从录音到返回再播放,通常需要几百毫秒到几秒,不要期待手机助手那样的即时反馈。
- 接口合规性和密钥保护。使用正式开放的接口,做好API Key管理,不把密钥硬编码暴露到公开仓库里。
- 成本。云接口按次数或按token计费,长期演示要有预算意识。
如果只是想先体验,可以用一个带TTS功能的语音播报模块播固定语句,再配合按键或触摸触发。这样链路短,稳定,适合初期Demo。
4.2 用LVGL给机器人做表情
一个没有屏幕的机器人很难让人感受到“AI”。接一块小TFT屏,用LVGL做表情和状态显示,是性价比很高的方案。
LVGL是一个开源嵌入式图形库。在ESP32上跑LVGL一般需要配合TFT_eSPI或LovyanGFX这类驱动库。关键点不是代码难,而是屏幕引脚配置。常见TFT屏幕通过SPI或并行接口连接,不同模块的引脚定义不同,需要按实际接线修改配置文件。
如果你用SquareLine Studio这类图形化工具,可以直接拖控件生成LVGL代码,适合不熟悉图形API的开发者。生成的代码里会包含事件回调,例如按键切换表情、滑动条控制舵机角度。
屏幕白屏是最常见问题。排查顺序是:
- 检查屏幕供电。
- 检查SPI引脚是否和配置文件一致。
- 检查屏幕初始化顺序是否正确。
- 检查背光引脚是否接了高电平。
LVGL在普通ESP32上也能运行,但界面复杂度越高,刷新越慢。如果要流畅切表情,建议选择带PSRAM的ESP32-S3 DevKitC,或降低屏幕分辨率和刷新区域。
4.3 摄像头图像采集
如果想让机器人“看见”,最省钱的方案是ESP32-CAM。它带有OV2640摄像头,可以拍摄JPEG图片,然后通过串口、WiFi或局域网发送到上位机处理。
典型流程是:
- ESP32-CAM定时拍照。
- 将JPEG数据保存到内存或SD卡。
- 通过WiFi发出HTTP请求,或通过串口发送二进制帧。
- 上位机用Python、OpenCV或AI框架完成人脸检测、物体分类等任务。
- 把识别结果回传给ESP32,控制舵机或屏幕显示。
这种方式把算力压力放到上位机,ESP32只做图像采集和通信,是很多机器人项目的做法。
但要注意,ESP32-CAM本身外设复用严重。很多GPIO被摄像头占用,可能无法同时接多个传感器和屏幕。另外JPEG图片传输需要时间,帧率通常不高,不要期待实时视频流。先抓单帧,再处理,是更稳的调试路径。
5. 从桌面玩偶升级成移动机器人
5.1 加入电机驱动与底盘
如果想让机器人动起来,可以加两轮或四轮底盘。电机不能直接接GPIO,需要电机驱动板。常见的有L298N、DRV8833、TB6612。
第一次跑电机时,先写一个PWM调速程序,把电机从零开始慢慢加速,不要直接全速。这样能提前发现接线错误。左右轮方向不一致时,多半是电机线接反了,交换两根输出线就好。
电机启动瞬间会产生较大电流和反电动势,随时可能让ESP32重启。一定要把电机电源和单片机电源分开,至少用一个大电容滤波,并确保两组电源共地。这个问题在“机器人能跑”的测试中最常见,不要等到烧坏板子才回头看电源设计。
5.2 Micro-ROS与ROS2:为学习机器人技术栈铺路
热搜里经常出现micro-ros arduino esp32、ros2机器人开发这些词。如果你以后想系统学ROS2,ESP32可以直接变成传感器和执行器节点。
Micro-ROS可以理解为嵌入式设备和ROS2之间的通信中间件。ESP32通过串口或WiFi连接运行ROS2的上位机,在上位机里做导航、路径规划、视觉处理,在下位机里做电机控制、传感器采集和底层执行。这个结构和真实机器人产品非常接近。
在Arduino环境下安装micro_ros_arduino库后,可以创建publisher和subscriber节点。比如ESP32发布里程计数据或传感器数据,上位机订阅后发布速度指令回来。ESP32收到速度指令再控制电机。这种流程比单纯的蓝牙遥控复杂,但对理解机器人系统帮助很大。
要注意,ESP32算力有限,不适合跑SLAM。完整的建图、定位、路径规划通常在上位机完成。ESP32需要保证实时性和通信稳定性,不要同时跑太多高负载任务。如果出现WiFi丢包,优先检查缓冲区大小、通信频率和干扰。
5.3 蓝牙APP控制
很多人喜欢用手机控制机器人。ESP32自带经典蓝牙和BLE,手机可以扫描到设备并发送指令。
最简单的方案是使用BLE串口透传。手机APP作为客户端连接ESP32,ESP32作为服务端输出一个UART服务。按一下手机按键,发送字符‘f’表示前进,ESP32收到后执行。
如果用的是ESP32-C3这类模块,也可以走AT指令模式。但需要确认固件是否带AT指令支持。很多C3模块出厂不带AT固件,需要重新烧录,所以先查清楚固件信息,再决定用AT还是直接用Arduino裸写。
蓝牙控制更适合做演示和调试,真正要自动化还是得靠传感器和上位机逻辑。
5.4 远程调试和OTA升级
机器人一旦装进底盘,插线烧录就很麻烦。建议尽早把OTA升级做了。ESP32可以通过WiFi接收新固件,不用拆外壳。
OTA升级的注意点:
- 固件要区分版本号,方便排查。
- 升级失败要有回滚机制,至少保留一个能用的分区。
- OTA过程中不要断电。
- 如果WiFi不稳定,先通过串口日志确认连接状态。
远程调试时,串口日志能保留多少信息,直接决定排查效率。我习惯在关键节点打印带标记的日志,比如“[DHT] temp=26.1 C”和“[MOTOR] speed=120 dir=1”,后续看日志时能快速定位是传感器问题、控制指令问题,还是通信问题。
6. 常见问题排查与批量处理经验
6.1 从现象到根因:先看电源,再看日志
我把ESP32机器人项目里常见的坑整理成一张表,按经验顺序排查:
| 现象 | 先查 | 再查 | 最后查 |
|---|---|---|---|
| 上传失败 | 端口和驱动 | BOOT按键 | 开发板型号和包缓存 |
| 连不上WiFi | SSID和密码 | 距离和频段 | 板载天线和电源 |
| 串口无输出 | 波特率 | 串口选择 | 代码是否跑起来 |
| 传感器读数为NaN | 接线和上拉 | 库版本和引脚 | 供电是否稳定 |
| 舵机抖动 | 外部供电 | 共地 | PWM库选择 |
| 屏幕白屏 | 背光引脚 | SPI引脚配置 | 初始化顺序 |
| 电机工作时板子重启 | 电源隔离 | 大电容 | 看门狗 |
| OTA失败 | 固件版本 | 分区表 | WiFi信号 |
很多问题看起来像“功能不支持”,实际是接线错误、电源不稳或输入格式不对。排查时不要一上来就改代码,先看日志和现象。一只机器人动了,但屏幕不亮,优先检查屏幕电源和引脚,而不是去翻LVGL配置。
6.2 用非阻塞方式提高稳定性
ESP32跑的任务一多,delay会卡住整个循环,导致传感器读取过期、WiFi断连、舵机响应迟钝。更合理的做法是用millis做定时调度,或者直接用FreeRTOS任务。
比如传感器任务每2秒读一次,舵机任务每50毫秒更新一次角度,通信任务每500毫秒发送一次心跳。三个任务独立运行,互不等待。ESP32本身支持FreeRTOS,这也是它比传统单片机适合做机器人的原因之一。
6.3 批量烧录和版本管理
如果你做的是课程项目或帮朋友做几台机器人,批量烧录前先做一块验证板。验证确认没有问题,再复制到下一块。很多人图省事,同时插多块板子一起烧,结果端口选错,固件烧到一半,反而浪费时间。
建议给每台机器人打一个固件版本号,放到开机日志里。这样用户报告问题时,可以快速知道对方跑的是哪个版本。命名要规范,例如:
robot_demo_v1.0_esp32dev robot_demo_v1.1_s3_lvgl如果使用PlatformIO,可以在platformio.ini里配置多个环境,比如一个环境给ESP32,另一个给ESP32-S3,避免手动改板型配置。
6.4 别把“AI”玩成风险词
做AI对话功能时,只接入正式、合规、有明确文档的接口,不要使用来路不明的第三方服务,也不要故意绕过接口限制。密钥要保存在服务端或环境变量里,不要直接写在公开代码仓库中。对于个人学习项目,可以把接口调用封装成一个独立模块,后续替换或关闭都方便。
6.5 把最小系统跑稳,再谈炫酷
最后说一个实际经验:这个项目里最值得炫耀的不是“我接了一个大模型”,而是“我能让机器人稳定运行一个完整闭环”。闭环包括感知到数据、处理后做出动作、在屏幕上给用户反馈、把关键日志记录下来。这才是做机器人最有价值的部分。
先点亮LED,再读温湿度,再让舵机平滑转头,然后加上屏幕表情、蓝牙控制、移动底盘。每一步都验证、打日志、保留版本。遇到问题先查电源和接线,再怀疑代码和库。把复杂度拆开,ESP32这台“AI机器人小伙伴”才能真正稳定跑起来。
如果你刚开始动手,我的建议很简单:买一块ESP32开发板、一个DHT11、一个舵机,从今天的第二个章节开始,先把LED点亮。等这块板子不再随机重启,串口日志清晰可靠,再往下加模块也不迟。