这块25元的板子,能跑能拍能遥控
ESP32-CAM这块板子玩家圈子里几乎人手一块,25块钱包邮,自带OV2640摄像头、WiFi和蓝牙。但多数人拿它当个网络摄像头玩玩就搁置了。今天这篇教程,把它变成一台能通过浏览器实时遥控的视频监控小车——手机打开网页就能看画面、打方向,控制延迟大概100ms左右,室内玩完全够用。
项目综合了Instructables上两个高赞ESP32-CAM小车方案和keyestudio开源文档(10月26日查),我重新整理了接线和代码,确保新手也能一次跑通。

材料清单:120块搞定全套
ESP32-CAM模块(AI-Thinker版,带OV2640摄像头)×1,大概25元。CP2102 USB转TTL模块×1,约8元。L298N电机驱动板×1,约12元。四驱小车底盘套件(含4个N20电机+4个轮子),约35元。18650锂电池×2+电池盒,约25元。杜邦线若干、开关一个。
总价大概120元以内,比买成品遥控车便宜,而且你能完全掌控底层逻辑。
接线:ESP32-CAM和L298N的硬连线
这是最关键的一步,接错了板子可能直接烧。L298N有4个输入引脚需要接到ESP32-CAM的GPIO上:
L298N的IN1接ESP32-CAM的GPIO 14;IN2接GPIO 15;IN3接GPIO 13;IN4接GPIO 12。电机的正极接L298N的Motor A和Motor B输出端,电池正极接L298N的+12V端子,负极共地。

注意一个坑:ESP32-CAM的5V供电要从L298N的+5V端子取电,需要把L298N板上的电源跳线帽装上。如果你用USB供电烧录代码时电机不转,那就是供电没接对——L298N需要独立供电才能驱动电机。
CP2102只在烧录固件时使用:TX接ESP32-CAM的RX,RX接TX,GPIO 0接地进入下载模式。烧录完成后拔掉CP2102,改用电池供电。
代码核心:40行控制逻辑
完整代码比较长,我把核心控制逻辑摘出来:
#include "esp_camera.h"
#include "WiFi.h"
#include "WebServer.h"
#define IN1 14
#define IN2 15
#define IN3 13
#define IN4 12
const char* ssid = "ESP32CAM_Car";
const char* password = "12345678";
WebServer server(80);
void stopMotors() {
digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
}
void moveForward() {
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void moveBackward() {
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
void turnLeft() {
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
void turnRight() {
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
void setup() {
Serial.begin(115200);
pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
stopMotors();
WiFi.softAP(ssid, password);
Serial.println("AP: " + WiFi.softAPIP().toString());
server.on("/forward", moveForward);
server.on("/backward", moveBackward);
server.on("/left", turnLeft);
server.on("/right", turnRight);
server.on("/stop", stopMotors);
server.on("/capture", []() {
auto fb = esp_camera_fb_get();
if (fb) {
server.send_P(200, "image/jpeg",
(const char*)fb->buf, fb->len);
esp_camera_fb_return(fb);
}
});
server.begin();
}这段代码做了三件事:创建WiFi热点、注册HTTP路由控制方向、通过/capture接口返回JPEG画面。手机连上ESP32-CAM的热点后,浏览器访问192.168.4.1/forward就是前进,/capture就是抓一帧画面。
实际表现:延迟和距离实测
WiFi热点模式下,手机连ESP32-CAM的热点,拍一张照片大概200-300ms,遥控指令响应约100ms。如果在STA模式(ESP32-CAM连家里路由器),延迟能降到50-80ms。

传输距离方面,室内环境(隔两堵墙)大概20-30米,空旷环境能到50米以上。OV2640默认分辨率QVGA(320×240),帧率约5-8fps。想更流畅可以降到QQVGA(160×120),帧率能到10fps以上,但画面比较糊。
踩坑记录
烧录时如果一直报"problem uploading to board",按住ESP32-CAM的RST键再松开同时点上传,就能进下载模式。摄像头报错"camera not detected",大概率是排线没插紧或者供电不足。
L298N驱动板有个跳线帽问题:如果电机只转不反转,检查ENA和ENB跳线帽是否装好,不调速也要装上直通。WiFi热点密码至少8位,ESP32的softAP要求。
整体来说,ESP32-CAM做WiFi监控小车,性价比和可玩性都很高。25块钱的板子加百来块外设,一个下午搞定。适合给小朋友做STEM启蒙,或者研究嵌入式WiFi控制的入门项目。












L298N的跳线帽确实是个坑,我第一次玩的时候就是这里卡了半天
代码很清晰,新手友好,比那些上来就丢整个工程的强多了
ESP32-CAM这板子我之前买来吃灰了,看了这篇又想翻出来搞搞
请问这个延迟打打游戏够不够用?