
做机器人最爽的时刻不是代码写完那一刻而是把成品放在地上、用手机看着摄像头画面遥控它钻到沙发底下的瞬间。之前在调试小车时总觉得串口线拖来拖去很麻烦后来把主控换成 ESP32-CAM视频回传和运动控制放到了一个芯片上整个项目一下子清爽了。这篇文章会把从零做一个“迷你 WiFi 机器人”的完整过程记录下来硬件怎么选、环境怎么搭、代码怎么写、常见坑怎么避。适合有一定 Arduino 基础、想尝试视频机器人或者准备用 ESP32 做 ROS 硬件前期的读者。1. 项目简介与核心概念1.1 为什么做这个迷你 WiFi 机器人做这个项目有几个很现实的理由第一它能代替人眼去观察不方便到达的地方比如沙发底、床底、管道背面、桌缝深处。这些场景人弯腰钻进去费劲但一台巴掌大的小车可以轻松开进去把视频实时传回来。第二它是一个非常典型的嵌入式综合项目。一个完整机器人通常至少包含四部分主控、通信、传感器、执行器。ESP32-CAM 这个方案正好把主控和无线通信都集成在同一颗芯片上视频采集也是板上自带的所以项目复杂度被压缩到了“一个开发板 电机驱动 小车底盘”非常适合用来学习。第三它是后续进阶功能的基础载体。后面如果你想学 Micro-ROS、ROS2 导航、SLAM 建图或者给机器人加语音控制目前这套 ESP32 平台都可以作为底层硬件直接复用。1.2 ESP32 与 ESP32-CAM 的区别ESP32 是乐鑫推出的一款双核 WiFi/蓝牙 SoC主频最高 240MHz片上有 SRAM 和 Flash支持 Arduino、ESP-IDF、MicroPython 等开发方式。它最大的优势是芯片成本低、外设丰富、WiFi 协议栈成熟所以目前很多物联网设备和入门级机器人项目都会选它。ESP32-CAM 是在 ESP32 芯片基础上集成了一颗 OV2640 摄像头、一个 TF 卡槽、一个板载闪光灯 LED 的开发板。它最大的特点就是“麻雀虽小五脏俱全”一块板子同时解决主控、WiFi、摄像头三个需求。但它也有一个容易踩坑的地方——板上没有 USB 转串口芯片所以烧录程序时必须外接一根 USB-TTL 串口线。1.3 系统整体架构整个机器人可以理解成一个“浏览器 → ESP32-CAM → 电机驱动 → 电机”的链路。手机或电脑浏览器访问 ESP32 开启的网页页面上会显示摄像头实时视频流同时提供控制按钮。点击按钮后浏览器会发送一个 HTTP GET 请求给 ESP32ESP32 解析请求参数后通过 GPIO 引脚控制电机驱动模块进而控制左右两个电机的转动方向。通信链路可以概括为浏览器网页 ↓ 访问 / 获取控制页面 ↓ 访问 /stream 持续接收 MJPEG 视频流 ↓ 点击按钮时请求 /control?dirforward ESP32-CAM ↓ GPIO 14/15/16/17 电机驱动 L298N 或 TB6612FNG ↓ OUT1~OUT4 左右两个 TT 马达这套架构的好处是“控制面”和“视频面”都在同一个芯片上完成不用额外接树莓派或电脑整机功耗和体积都能控制在很小的范围。2. 硬件清单与选型说明2.1 主控板ESP32-CAM目前市面上常见的 ESP32-CAM 大多是 AI Thinker 这个版本板子上印有“ESP32-CAM”字样摄像头默认是 OV2640。它有几个需要提前知道的特点工作电压 5V注意不要接到 3.3V 上否则供电不足会导致摄像头花屏或重启。板载 PSRAM这是跑高分辨率 JPEG 视频流的关键。没有 USB 转串口需要外接 USB-TTL 模块。板载天线是 PCB 天线WiFi 信号比外置天线的模块弱一些但近距离使用足够。2.2 运动平台与驱动模块底盘可以用常见的 2 驱 TT 马达小车底盘也可以用 4 驱版本。本文以 2 驱为例代码逻辑稍微调整就能扩展到 4 驱。电机驱动模块推荐两种一种是最常见的 L298N驱动能力强、便宜、资料多但体积大、压降明显。适合新手第一次搭。另一种是 TB6612FNG体积小、效率高最大驱动电流 1.2A对小车轮子来说够用。如果以后想把机器人做小建议优先考虑 TB6612FNG。我这里的示例接线和代码以 L298N 为例因为它的引脚逻辑更直观方便理解“双 H 桥”这个概念。2.3 完整物料清单下面是一份可供参考的物料列表分类器件数量说明主控ESP32-CAM1AI Thinker 版OV2640底盘2 驱 TT 马达小车底盘1含两个 TT 马达和车轮驱动L298N 电机驱动模块1控制电机正反转电池18650 电池盒2 节1给电机和主控供电电池18650 锂电池2单节 3.7V串联约 7.4V降压5V 降压模块可选1从 7.4V 降压到 5V稳定供电烧录USB-TTL 串口模块1常用 CH340/CP2102连接杜邦线若干20公对公、公对母都准备一些固定铜柱、螺丝、扎带若干固定开发板关于供电这里提前强调一下ESP32-CAM 在 WiFi 和摄像头同时工作时瞬时电流可能到 400mA 甚至更高。电机启动瞬间电流也很大。如果把它们简单并到一起轻则视频卡顿重则系统不断重启。所以工程上推荐把“主控供电”和“电机供电”分开只在 GND 处共地。2.4 接线方案以 L298N 为例把 ESP32-CAM 和电机驱动模块连接起来。L298N 的控制逻辑是L298N 引脚电平状态电机行为IN1HIGH, IN2LOW电机 A 正转左轮前进IN1LOW, IN2HIGH电机 A 反转左轮后退IN3HIGH, IN4LOW电机 B 正转右轮前进IN3LOW, IN4HIGH电机 B 反转右轮后退ESP32-CAM 与 L298N 的接线表如下ESP32-CAML298N说明GPIO14IN1控制左电机GPIO15IN2控制左电机GPIO16IN3控制右电机GPIO17IN4控制右电机GNDGND必须共地5V5V 输出或外接 5V给 ESP32-CAM 供电这里要特别注意最好不要把 ESP32-CAM 直接接到 L298N 板上的 5V 输出脚。因为 L298N 的 5V 输出能力有限当电机电流增大时电压会剧烈波动很容易把摄像头画面弄花。正确做法是电池给 L298N 供电L298N 输出给电机ESP32-CAM 用独立的 5V/2A 电源或降压模块供电两根 GND 连在一起。3. 开发环境准备3.1 安装 Arduino IDE本项目使用 Arduino IDE 开发。强烈不建议继续使用 1.8 以下的老版本建议直接安装 2.x 最新版。2.x 的界面更现代串口监视器也更好用。安装完成后先不着急插硬件我们把开发环境配置好再说。3.2 安装 ESP32 开发板支持打开 Arduino IDE在“文件 → 首选项 → 附加开发板管理器网址”里填入 ESP32 官方索引地址https://dl.espressif.com/dl/package_esp32_index.json然后打开“工具 → 开发板 → 开发板管理器”搜索esp32找到esp32 by Espressif Systems点击安装。这个安装包的体积比较大下载耗时会比较久。如果看到类似Failed to install platform: esp32:3.3.11或者download failed的报错通常是网络下载中断或镜像源不稳定导致的重试即可。如果长期失败可以考虑手动下载离线压缩包后解压到 Arduino 的硬件目录但注意不要使用来源不明的压缩包。3.3 选择正确的开发板型号编译前需要先选中开发板型号。在“工具 → 开发板 → ESP32 Arduino”中选择AI Thinker ESP32-CAM同时把下面几项配置好配置项推荐值说明Flash ModeQIO常见 ESP32-CAM 都支持 QIOFlash Size4MBAI Thinker 默认 4MBPartition SchemeHuge APP (3MB No OTA/1MB SPIFFS)给 APP 留更多空间Upload Speed115200烧录稳定PSRAMEnabled必须开启否则摄像头内存分配失败3.4 USB-TTL 烧录接线ESP32-CAM 没有 USB 接口所以需要临时接一根 USB-TTL 串口线来烧录程序。接线规则是“交叉连接”开发板的发送接串口模块的接收开发板的接收接串口模块的发送。ESP32-CAMUSB-TTL说明UORRXESP32 发送串口接收UOTTXESP32 接收串口发送GNDGND共地5V5V给开发板供电GPIO0GND拉低进入下载模式需要注意的是 GPIO0 不能一直接地。当串口提示Connecting...的时候程序已经进入下载模式烧录完成后要把 GPIO0 的跳线或杜邦线拔掉再按一次复位键程序才会正常以运行模式启动。4. 核心原理与模块拆解4.1 WiFi 连接方式本项目支持两种 WiFi 连接方式正常情况下建议使用 STA 模式也就是让 ESP32 去连接你家的路由器。这样手机和电脑只要和 ESP32 在同一个局域网内就能访问它的控制页面。STA 模式的优点是路由器信号覆盖范围大、传输稳定而且多个设备可以同时访问摄像头画面。还有一种方式是 AP 模式即让 ESP32 自己开一个 WiFi 热点手机连接这个热点后访问192.168.4.1。优点是完全不依赖路由器适合户外或临时使用。缺点是范围小、带宽有限。代码里的思路是优先尝试 STA 连接路由器如果超过 10 秒还没有连上就自动切换成 AP 模式。4.2 视频流原理OV2640 摄像头采集到的是图像帧ESP32 的摄像头驱动可以直接输出 JPEG 格式的压缩图像。视频流最常用的实现方式是 MJPEG也就是multipart/x-mixed-replace协议。简单理解就是 HTTP 响应头告诉浏览器“接下来我会连续推送多张 JPEG 图片”浏览器收到一张就显示一张看起来就像视频一样。这种方式实现简单浏览器原生支持不需要 JavaScript 做额外处理非常适合 ESP32 这种资源受限的设备。视频分辨率对帧率和延迟影响很大。建议默认使用VGA640x480。如果画面明显卡顿可以降到QVGA320x240如果只是想拍静态画面而不在乎流畅度再考虑UXGA1600x1200。4.3 电机控制原理L298N 是一个双 H 桥电机驱动芯片。“H 桥”的意思是芯片内部四个开关管组成类似字母 H 的结构通过控制不同开关管导通可以让电流正向或反向流过电机。正转、反转、停止的逻辑非常简单IN1 高电平、IN2 低电平电机正转。IN1 低电平、IN2 高电平电机反转。IN1 和 IN2 都是低电平电机停止。左右两个轮子配合就可以实现前进、后退、左转、右转。4.4 Web 控制交互控制页面是一个内嵌在代码里的 HTML 页面。页面里有一个视频流img标签src 指向/stream这样视频流就能直接显示在网页上。当用户点击按钮时JavaScript 会发出一条fetch请求/control?dirforwardESP32 的 HTTP 服务收到请求后解析dir参数调用电机控制函数把