1. 从零到一为什么选择ESP32-CAM做小车如果你对单片机、物联网或者机器人有点兴趣大概率在网上刷到过那种能跑能看、还能远程遥控的小车。这类项目看起来酷炫但真到自己动手时往往卡在几个关键环节摄像头怎么接视频怎么传控制信号怎么发电池怎么配一堆问题下来热情很容易被浇灭。我最近用ESP32-CAM模块完整地做了一台摄像头小车跑通了从硬件组装、固件烧录、到手机App遥控和视频流查看的全流程。整个过程踩了不少坑也总结了一套相对稳定、高性价比的方案。选择ESP32-CAM作为核心不是因为它最强大而是因为它在一个极小的体积和极低的成本下提供了一个“All-in-One”的解决方案它集成了ESP32主控芯片、一个OV2640摄像头模组、一个TF卡槽以及最重要的——Wi-Fi功能。这意味着你不需要额外购买摄像头模块、不需要复杂的视频信号线、也不需要单独的视频编码芯片一个模块就解决了“看”和“传”的核心问题。对于想入门智能小车或者物联网视觉应用的朋友来说ESP32-CAM小车是一个绝佳的练手项目。它成本可控整套下来百元以内技术栈覆盖了嵌入式开发、无线通信、视频流传输和简单的运动控制成就感来得非常直接。接下来我会把整个制作过程掰开揉碎从硬件选型、电路连接到代码编写、手机端配置再到实际跑起来遇到的各种“坑”和解决方案毫无保留地分享给你。2. 硬件清单与电路连接不只是“接上线就行”做硬件项目第一步永远是备齐材料并正确连接。ESP32-CAM小车听起来简单但细节决定成败。下面是我最终采用的物料清单和连接图每一件物品的选择都有其理由。2.1 核心物料清单与选型理由ESP32-CAM模块1个这是大脑和眼睛。市面上版本很多务必确认摄像头是OV2640200万像素它比OV7670性能好太多。模块自带了一个排针但通常需要自己焊接。注意很多便宜的模块为了省成本用的Flash是4MB的这会影响后续固件功能最好选择16MB Flash的版本。电机驱动板1个我选用的是L298N双H桥驱动模块。这是经典款驱动能力强可以同时控制两个直流电机正反转正好对应小车的左右轮。它的逻辑电压是5V驱动电机电压可以是7-12V兼容性很好。TT减速电机与车轮2套电机选的是N20减速电机配65mm橡胶轮。TT电机价格便宜扭力够用。关键参数工作电压3-6V减速比1:48。减速比高扭矩大小车爬坡能力强但速度会慢些。如果你追求速度可以选1:30或更低的。小车底盘1个亚克力或塑料的都可以我选的是四层亚克力板底盘结构稳固有足够的空间安装电池和电路板。注意底盘要能匹配你电机的安装孔位。电源系统18650锂电池2节电池盒1个这是动力来源。两节18650串联可以提供7.4V满电约8.4V的电压。为什么不用一块电池因为电机驱动板L298N和ESP32-CAM的电压需求不同需要分开供电。降压模块1个我用了AMS1117-3.3V降压模块。因为ESP32-CAM的工作电压是3.3V绝对不能直接接5V或电池电压会烧毁需要将电池电压7.4V降压到3.3V给它供电。万向轮1个安装在底盘前部或后部起到支撑和转向作用。杜邦线若干公对公、母对母、公对母都需要用于连接各模块。开关1个用于控制整个系统的电源方便调试。选型的核心思路是在保证基本功能稳定的前提下追求极致的性价比和易得性。所有元件都能在主流电子商城轻松买到总成本可以控制在80元人民币左右。2.2 电路连接详解与原理剖析连接电路是硬件部分最容易出错的地方。很多人照着图接完上电没反应或者冒烟问题都出在这里。我们分系统来连接1. 动力系统电池 - L298N - 电机将两节18650电池放入电池盒输出约7.4V。电池盒的正负极引出线连接到L298N驱动板的“电源输入正负极12V, GND”。这里L298N的供电电压就是7.4V。L298N上有OUT1, OUT2, OUT3, OUT4四个输出口。我们将左轮电机的两根线接在OUT1和OUT2上右轮电机的两根线接在OUT3和OUT4上。注意电机线序决定了小车前进时轮子的转向如果后面测试发现小车原地转圈把其中一个电机的两根线对调即可。L298N上还有一组“5V输出”和“GND”这组是给逻辑电路供电的。我们暂时不用它因为ESP32-CAM需要用3.3V供电。2. 控制系统ESP32-CAM - L298NESP32-CAM的GPIO引脚用来发送控制信号给L298N。L298N有6个控制引脚ENA, IN1, IN2 控制左轮ENB, IN3, IN4 控制右轮。使能端ENA, ENB接高电平3.3V则对应电机使能。我们可以直接将其接到ESP32-CAM的3.3V引脚上让电机一直处于可控制状态。如果想做PWM调速则需要接到ESP32的PWM引脚如GPIO12, 13。控制端IN1, IN2, IN3, IN4这决定了电机的转向。我们将其连接到ESP32-CAM的GPIO引脚上。我采用的映射关系是GPIO14-IN1(左轮正转)GPIO15-IN2(左轮反转)GPIO13-IN3(右轮正转)GPIO12-IN4(右轮反转)将ESP32-CAM的GND引脚与L298N的GND引脚连接确保两者共地这是信号正常传输的基础。3. 供电系统给ESP32-CAM供电这是最易出错、最需小心的部分ESP32-CAM的供电引脚是VCC和GND。绝对不能用5V或电池电压直接接VCC会瞬间烧毁模块。正确的做法将电池电压7.4V接入AMS1117降压模块的IN和IN-然后从降压模块的OUT和OUT-得到稳定的3.3V输出。将这3.3V输出正极接ESP32-CAM的VCC引脚负极接其GND引脚。同时将这个3.3V的GND与L298N的GND以及电池的GND全部连接在一起形成统一的“地”。重要提示ESP32-CAM模块上还有一个5V引脚那是给外部设备比如某些型号的闪光灯供电的输入口不是给模块本身供电的模块自身的供电只能通过VCC (3.3V)引脚。混淆这两个引脚是烧模块的首要原因。连接好后硬件部分就准备好了。建议先不要安装到底盘上在桌面上连接好方便后续调试和烧录程序。3. 固件烧录与开发环境搭建跨越第一道门槛硬件连好了接下来要让ESP32-CAM“活”起来。这一步对于软件新手可能有点挑战但跟着步骤走一定能成功。3.1 Arduino IDE环境配置我们使用Arduino IDE来编写和上传代码因为它对初学者最友好。安装Arduino IDE从官网下载并安装最新版。添加ESP32开发板支持打开Arduino IDE点击文件-首选项在“附加开发板管理器网址”中输入https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json然后点击工具-开发板-开发板管理器搜索“esp32”找到由Espressif Systems提供的“ESP32”开发板包点击安装。选择正确的开发板和配置安装完成后在工具菜单下开发板选择 “ESP32 Wrover Module”。Flash Size:必须选择“16MB Flash”即使你的模块是4MB的很多库也需要这个设置才能正常工作。Partition Scheme: 选择 “Huge APP (3MB No OTA/1MB SPIFFS)” 或 “Minimal SPIFFS (1.9MB APP with OTA)”。如果你后续需要OTA无线更新选后者。Upload Speed: 设置为 “115200”。Port: 暂时为空等连接好串口后会出现。3.2 连接与烧录模式切换ESP32-CAM没有内置USB转串口芯片所以不能像NodeMCU那样直接用USB线烧录。你需要一个USB转TTL串口模块比如CH340G、CP2102等。连接串口模块将USB转TTL模块的3.3V接ESP32-CAM的3.3V或VCC。GND接GND。TX接ESP32-CAM的U0R(GPIO3)。RX接ESP32-CAM的U0T(GPIO1)。进入下载模式这是关键ESP32-CAM有两个特殊引脚GPIO0和RST复位。在烧录程序时需要将GPIO0引脚接地GND。你可以用一根杜邦线一头插在GPIO0另一头准备接到GND上。操作顺序先确保所有连线正确然后将GPIO0与GND短接接着按一下RST按钮或者将RST引脚短暂接地再断开最后在Arduino IDE中点击上传。当IDE提示“正在编译...”时就可以断开GPIO0和GND的短接了。正常运行时GPIO0必须悬空不接任何东西或接高电平。这个“短接-复位-上传”的流程是每个ESP32-CAM新手必经的“仪式”多操作几次就熟练了。如果上传失败检查波特率、串口号以及GPIO0是否在正确的时间点被拉低。3.3 核心代码解析与库文件安装网上有很多ESP32-CAM小车的示例代码我推荐使用基于ESPAsyncWebServer和AsyncTCP库的版本它们效率更高能更好地处理并发请求。在Arduino IDE中通过项目-加载库-管理库...搜索并安装 “ESPAsyncWebServer” 和 “AsyncTCP”。代码的核心逻辑包括Wi-Fi连接启动后让ESP32-CAM连接到你家的Wi-Fi网络或者自身作为一个热点AP模式。我建议初始调试用AP模式这样即使没有路由器手机也能直接连上小车。创建Web服务器ESPAsyncWebServer库会在ESP32上创建一个网页服务器。这个服务器会提供几个关键页面一个控制页面HTML包含方向按钮和视频显示区域。一系列API接口例如/control?commandforward当你在网页上点击“前进”按钮时浏览器就会向这个地址发送请求。电机控制函数服务器收到不同的命令如forward, left, stop就调用对应的函数控制之前定义的GPIO引脚输出高低电平从而让L298N驱动电机正转、反转或停止。// 示例前进函数 void goForward() { digitalWrite(IN1, HIGH); // 左轮正转 digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); // 右轮正转 digitalWrite(IN4, LOW); }视频流服务这是最精彩的部分。ESP32-CAM通过camera.h库捕获OV2640的图像然后通过WiFiClient或者专门的流服务器将JPEG图片一帧一帧地发送出去。浏览器通过访问一个特定的地址如http://[小车IP]/stream就能看到实时的MJPEG视频流。将完整的代码包含Wi-Fi信息、引脚定义、服务器逻辑和视频流代码编译上传后打开串口监视器设置波特率为115200你就能看到ESP32-CAM打印出的IP地址比如Connected! IP address: 192.168.1.123。记下这个IP它就是小车的“门牌号”。4. 手机端控制与视频查看让小车动起来有了IP地址小车就已经在网络上“活”了。现在我们用手机来控制它。4.1 网页端直接控制最快捷这是最简单的方法无需安装任何App。确保你的手机和ESP32-CAM连接在同一个Wi-Fi网络下如果ESP32设为了AP模式则手机直接连接ESP32发出的热点。打开手机浏览器在地址栏输入小车的IP地址例如http://192.168.1.123。你应该会看到一个简单的网页上面有“前进”、“后退”、“左转”、“右转”、“停止”等按钮以及一个视频显示区域。点击按钮小车就会做出相应动作。视频区域可能会稍等几秒开始显示实时画面。这种方式优点是零配置但缺点也明显网页UI可能比较简陋按钮操作在移动端体验不佳且浏览器在后台时视频流可能会中断。4.2 使用专用App推荐体验更佳为了获得更好的操控体验我强烈推荐使用一些通用的网络摄像头或IP摄像头查看App它们通常也支持自定义控制接口。视频流查看在手机应用商店搜索“IP摄像头”或“MJPEG Viewer”。安装后添加一个新摄像头流地址Stream URL填写http://[小车IP]/stream。保存后就能看到实时视频了。运动控制这部分需要一点技巧。我们需要一个能发送HTTP GET请求的App。有些高级的IP摄像头App自带“方向控制”或“自定义按钮”功能。你可以创建几个按钮分别设置其动作为访问不同的URL前进http://[小车IP]/control?commandforward左转http://[小车IP]/control?commandleft停止http://[小车IP]/control?commandstop具体URL路径取决于你代码中定义的API地址这样你就能在一个App里同时看到视频和进行控制了。我实测过几款tinyCam Monitor安卓和IP Cam VieweriOS的可定制性都不错。4.3 信号延迟与卡顿优化第一次跑起来你可能会发现视频延迟很大好几秒或者控制指令反应慢。这不是你做错了而是无线视频流天生的挑战。可以从以下几个方面优化降低视频分辨率在代码的摄像头初始化部分将帧尺寸从FRAMESIZE_UXGA (1600x1200)改为FRAMESIZE_SVGA (800x600)或FRAMESIZE_VGA (640x480)。分辨率越低数据量越小延迟越低。降低帧率在视频流发送循环中增加一个delay()限制每秒发送的帧数如10-15帧。对于遥控小车流畅比高清更重要。优化Wi-Fi环境让小车和手机尽量靠近路由器避免隔墙。将ESP32-CAM的Wi-Fi模式设置为WIFI_MODE_STA仅站模式而不是WIFI_MODE_APSTA同时开启热点和连接路由器减少射频干扰。在代码中尝试不同的Wi-Fi信道。供电一定要足视频编码和无线发射是耗电大户。如果电池电量不足或降压模块输出电流不够建议AMS1117模块能提供1A以上电流会导致ESP32工作不稳定Wi-Fi信号弱从而加剧延迟和卡顿。用万用表测一下在摄像头工作时ESP32的VCC引脚电压是否稳定在3.3V左右。5. 进阶调试与实战避坑指南项目做到这里小车基本能跑能看了。但要想它跑得稳、看得清、不“抽风”还需要解决一些深层次的问题。下面是我在实战中遇到并解决的几个典型难题。5.1 电源噪声导致的系统重启与图像条纹现象小车在电机启动或转向的瞬间ESP32-CAM会无故重启或者视频图像出现横向条纹、抖动。根因分析直流电机是感性负载在启动、停止和换向的瞬间会产生很大的反向电动势电压尖峰。这个尖峰会通过电源线耦合到整个系统。虽然L298N内部有续流二极管但不足以完全消除干扰。ESP32芯片对电源电压的波动非常敏感一旦3.3V电源上有较大的毛刺就可能触发其欠压复位或导致内部电路工作异常。解决方案电源隔离与滤波这是治本的方法。在给ESP32-CAM供电的3.3V线路上靠近模块的VCC和GND引脚并联一个100μF的电解电容和一个0.1μF的陶瓷电容。大电容应对低频波动小电容滤除高频噪声。实测效果立竿见影。电机电源并联大电容在L298N的电机驱动电源输入端电池正负极并联一个470μF或更大的电解电容可以吸收电机产生的电流冲击稳定驱动板电压。使用独立的电池供电如果干扰依然严重可以考虑用两套独立的电池。一套如2节18650串联专门给L298N和电机供电另一套如1节18650加降压模块专门给ESP32-CAM供电。两者之间只共地GND连接电源完全隔离彻底杜绝通过电源线的干扰。5.2 Wi-Fi信号弱与连接不稳定现象小车离路由器稍远就断连或者在某个房间完全没信号。根因分析ESP32-CAM为了集成摄像头牺牲了部分天线性能。其PCB板载天线增益较低且容易被金属底盘或电池遮挡。解决方案外接天线购买一个ESP32-CAM专用的外接IPEX天线套件。这需要一点焊接功夫将模块上原来的板载天线一个小的贴片元件用热风枪吹下来然后焊上一个IPEX天线座子再插上外接天线。这是提升信号最有效的方法成本只需几块钱。优化天线位置如果使用板载天线务必确保天线区域模块上画着蛇形走线的部分朝向天空没有任何金属物体遮挡。可以将ESP32-CAM模块立起来安装。代码中提升发射功率在Arduino代码的setup()函数里Wi-Fi连接之前加入WiFi.setTxPower(WIFI_POWER_19_5dBm);这行代码将发射功率调到最大注意可能违反当地无线电法规且增加功耗。5.3 运动控制逻辑优化与“差速转向”现象小车转弯不灵活或者原地转弯时打滑严重。根因分析很多示例代码的“转弯”逻辑是让一侧轮子正转另一侧停止。这种单边制动转弯方式对于重心高、轮距窄的小车来说容易侧翻或打滑。优化方案差速转向。这是真实汽车和机器人的转向方式。前进左转左轮慢速正转或反转右轮快速正转。原地左转左轮反转右轮正转且速度相同。大半径转弯左右轮都正转但速度一快一慢。要实现差速就需要用到PWM脉冲宽度调制。之前我们把L298N的ENA和ENB接在了3.3V上电机是全速运行。现在需要将它们改接到ESP32的PWM引脚如GPIO2, GPIO0等注意GPIO0在烧录时的特殊用途。然后在代码中使用ledcAttachPin和ledcWrite函数来给这些引脚输出不同占空比的PWM信号从而控制电机速度。// 示例设置PWM通道 const int freq 5000; // PWM频率 const int resolution 8; // 分辨率8位即0-255 const int enaChannel 0; const int enbChannel 1; ledcSetup(enaChannel, freq, resolution); ledcAttachPin(ENA_PIN, enaChannel); // ENA_PIN 接GPIO2 // ... 对ENB同样操作 // 控制左轮速度值范围0-255 ledcWrite(enaChannel, 200); // 较快速度 ledcWrite(enaChannel, 100); // 较慢速度通过精细调整左右轮的速度差你可以让小车的运动轨迹更加平滑和可控。5.4 固件功能扩展思路当基础功能稳定后你可以尝试很多有趣的扩展人脸识别跟踪利用ESP32-CAM内置的硬件加速运行轻量级的人脸检测模型如MTMN模型检测到人脸后控制小车云台需要额外添加两个舵机转动使人脸始终保持在画面中央。图传与拍照存储除了实时流可以增加按钮控制ESP32-CAM拍摄一张高清照片并保存到插入的TF卡中。这对于做安防监控或者延时摄影很有用。电池电压监测通过ESP32的ADC引脚配合电阻分压电路实时读取电池电压并在网页上显示。当电压过低时自动控制小车返回充电座需要复杂的路径规划。接入智能家居平台通过MQTT协议将小车状态如视频流地址、电池电量发布到Home Assistant或阿里云物联网平台实现用语音助手如小爱同学、天猫精灵来控制小车。这个项目就像一棵技能树ESP32-CAM小车是树干以上这些扩展功能就是不同的枝桠。每实现一个你对嵌入式开发、网络通信和图像处理的理解就会更深一层。我从一个只会点灯的新手到能让小车跟着人跑中间经历了无数次的调试和失败但每一次解决问题后的成就感都是实实在在的。希望这份详细的指南能帮你绕过我踩过的那些坑更快地享受到创造的乐趣。