ESP32-CAM做的摄像头小车

2020-07-313.7万
AI 快速预览详细 收起
本项目介绍如何使用ESP32-CAM模块制作一款互动性强的摄像头小车。所需器材包括ESP32-CAM控制器、小车底盘、电机驱动等。通过Arduino IDE编程,实现前进、后退、转弯等功能。文中详细介绍了硬件搭建、烧录方法、IP地址获取及代码示例。适合初学者和STEM教育场景。


引言:
ESP32系列模块由于可以用Arduino ide来进行编程,因此广受欢迎。而ESP32 CAM模块由于经济小巧并自带摄像头而更为创客们所青睐。今天给大家介绍一个互动性强的ESP32 CAM游戏,用ESP32 CAM来做一款摄像头小车,带LED灯光控制和伺服电机控制。当然稍加改动,就可以做出许多更实用的项目
ESP32-CAM做的摄像头小车图1

第一步:展示内容
打开摄像头,获取静态照片,获取流视频,小车的前进,后退和左右转弯。LED的灯光开闭,伺服电机的控制等
ESP32-CAM做的摄像头小车图3
ESP32-CAM做的摄像头小车图4

第二步:IP地址的获取
ESP32模块的IP地址是通过手机上下载的Fing软件获取的。
ESP32-CAM做的摄像头小车图2
第三步:硬件搭建
所需器材:(1) ESP32-CAM控制器(2);小车底盘(3);电机驱动(4);电源转接头
;(5);USB数据线;(6);DF的电源模块 (7);5v2A移动电源;

第四步:了解一下ESP32-CAM的连线和烧录
ESP32-CAM的烧录需要FTDI模块的帮助,然后安装支持文件和进行相关的板子的设置。
ESP32-CAM做的摄像头小车图5
ESP32-CAM做的摄像头小车图6
ESP32-CAM做的摄像头小车图7
ESP32-CAM做的摄像头小车图8
ESP32-CAM做的摄像头小车图9
ESP32-CAM做的摄像头小车图10
ESP32-CAM做的摄像头小车图11
ESP32-CAM做的摄像头小车图12



第五步:
发一些硬件的图片。让人有个直观的认识
DF的电源模块
5v2A移动电源,必须是用2A来驱动,否则无法工作
电机驱动的型号不详,某宝里买的-MX1508-2路直流电机驱动模块 正反转 PWM调速 双H桥步进电机迷你超L298N
ESP32-CAM做的摄像头小车图15



ESP32-CAM做的摄像头小车图13
小车底盘是自己改装的
第六步:总体介绍
摄像头小车的设计系统是由ESP32-cam,电机驱动和电源模块来完成的。可以实现小车
的前进,后退,左转和右转。开灯,打开伺服等动作,操控起来没有迟滞感,流视频也很流畅。
第七部:连线图
ESP32-CAM做的摄像头小车图14
第八部:代码部分的设计
代码部分的WIFI密码等要填你自己的信息
这个代码是主文件,其它几个支持文件是从样例里直接拷贝的。上图手写ok字样那张上面有支持文件的名称。
[mw_shl_code=applescript,false]/*
This sketch is made by gada888
2020-7-27
*/

const char* ssid = "xxxxx";
const char* password = "xxxxx";

#include "esp_camera.h"
#include <WiFi.h>
#include "soc/soc.h"
#include "soc/rtc_cntl_reg.h"

// WARNING!!! Make sure that you have either selected ESP32 Wrover Module,
//            or another board which has PSRAM enabled

//CAMERA_MODEL_AI_THINKER
#define PWDN_GPIO_NUM     32
#define RESET_GPIO_NUM    -1
#define XCLK_GPIO_NUM      0
#define SIOD_GPIO_NUM     26
#define SIOC_GPIO_NUM     27

#define Y9_GPIO_NUM       35
#define Y8_GPIO_NUM       34
#define Y7_GPIO_NUM       39
#define Y6_GPIO_NUM       36
#define Y5_GPIO_NUM       21
#define Y4_GPIO_NUM       19
#define Y3_GPIO_NUM       18
#define Y2_GPIO_NUM        5
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     23
#define PCLK_GPIO_NUM     22

void startCameraServer();

void setup() {
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
  
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  Serial.println();

  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  //init with high specs to pre-allocate larger buffers
  if(psramFound()){
    config.frame_size = FRAMESIZE_UXGA;
    config.jpeg_quality = 10;  //0-63 lower number means higher quality
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;  //0-63 lower number means higher quality
    config.fb_count = 1;
  }
  
  // camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    delay(1000);
    ESP.restart();
  }

  //drop down frame size for higher initial frame rate
  sensor_t * s = esp_camera_sensor_get();
  s->set_framesize(s, FRAMESIZE_QVGA);  // UXGA|SXGA|XGA|SVGA|VGA|CIF|QVGA|HQVGA|QQVGA
  
  //Servo
  ledcAttachPin(2, 3);  
  ledcSetup(3, 50, 16);
  ledcWrite(3, 4850);
  
  //Flash
  ledcAttachPin(4, 4);  
  ledcSetup(4, 5000, 8);
  
  //Wheel
  ledcAttachPin(12, 5);  //You can adjust the speed of the wheel. (gpio12, gpio13)
  ledcSetup(5, 5000, 8);      
  ledcAttachPin(13, 6);
  ledcSetup(6, 5000, 8);
  ledcWrite(6, 0);   
  pinMode(15, OUTPUT);  //If I output PWM to GPIO 15 using ledcWrite, it will lose control. Why?
  pinMode(14, OUTPUT);  

  Serial.println("ssid: " + (String)ssid);
  Serial.println("password: " + (String)password);
  
  WiFi.begin(ssid, password);

  long int StartTime=millis();
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      if ((StartTime+10000) < millis()) break;
  }

  startCameraServer();

  char* apssid = "ESP32-CAM";
  char* appassword = "12345678";         //AP password require at least 8 characters.
  Serial.println("");
  Serial.println("WiFi connected");   
  Serial.print("Camera Ready! Use 'http://");
  if (WiFi.status() == WL_CONNECTED) {
    Serial.print(WiFi.localIP());
    Serial.println("' to connect");
    WiFi.softAP((WiFi.localIP().toString()+"_"+(String)apssid).c_str(), appassword);   
   
    for (int i=0;i<5;i++) {
      ledcWrite(4,10);
      delay(200);
      ledcWrite(4,0);
      delay(200);   
    }        
  }
  else {
    Serial.print(WiFi.softAPIP());
    Serial.println("' to connect");
    WiFi.softAP((WiFi.softAPIP().toString()+"_"+(String)apssid).c_str(), appassword);   
   
    for (int i=0;i<2;i++) {
      ledcWrite(4,10);
      delay(1000);
      ledcWrite(4,0);
      delay(1000);   
    }  
  }     
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(10000);
}[/mw_shl_code]
代码烧录完后,在手机上打开浏览器,在地址栏输入你在Fing软件里看到的ESP32的IP地址,之后便可以看到你想看的html页面了。
代码已更新(ok-Car-cam)

car.rar

11.76 KB, 下载次数: 18884

ok-Car-cam.rar

46.03 KB, 下载次数: 18674

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(17)
137233843088338
137233843088338
大海田子
大海田子
点下载闪一下没了
蓝鹊
蓝鹊
博主,你好 使用car的代码报错,这种情况该如何处理
谭周强
谭周强
请问我的这个IP地址复制到网页不能访问怎么回事
AI创客
AI创客
您好,博主,下载了您提供的 car.rar 文件 进行了编译结果 如网友 所说 报错一样,请博主帮看下怎么回事吧,先谢谢博主了!
gada888
gada888
作者
回复AI创客
文件已更新了,你试一下在这里给我个反馈,我很久没测试ESP32-CAM版子了。那个主文件(ESP32-CAM Remote Control Car.ino)我记得后来用的是乐鑫官方文件,稍稍改了一下而已。
dekit
dekit

你好,我的2A的充电宝,直接一个USB口输出2路电源线到esp32 cam和电动机驱动板,估计电压互相干扰了。
想找图中的这个电源控制器,分别输出到esp32 cam 和 电动机驱动板。但是不知具体型号,找不到地方购买。
gada888
gada888
作者
回复dekit
25W DC-DC 降压模块
https://www.dfrobot.com.cn/goods-604.html
https://wiki.dfrobot.com.cn/_SKU_DFR0205_25W_DC-DC_%E9%99%8D%E5%8E%8B%E6%A8%A1%E5%9D%97
不好意思,我一开始没明白你的意思,好久以前的项目了。
gada888
gada888
作者
回复dekit
你可以试试双电源分别独立供电给ESP32-cam和电机驱动
dekit
dekit
#在这里快速回复#请问图中的DF电源模块是什么型号?淘宝中找不到。 我用移动电源直接接esp32和电动机驱动板cam会开启不了
gada888
gada888
作者
回复dekit
只要是5V2A电源就行。有的移动电源有5V1A和5V2A两个USB输出口的。我用的ROMOSS电源(充电宝),在咸鱼里有卖的。电机驱动板和我图示的一样?不一样要测试其启动电流的,如果用掉电流大,那就无法启动。因为ESP32-CAM耗电大。
dekit
dekit
请问图中的DF电源模块是什么型号?淘宝中找不到。
我用移动电源直接接esp32和电动机驱动板cam会开启不了。
永夜星空
永夜星空
报错啊……
gada888
gada888
作者
回复永夜星空



你学点html和html5就很快会改了。我最后这个是改的乐鑫官方app-httpd.cpp里的html5代码。
永夜星空
永夜星空

报错啊……
永夜星空
永夜星空
博主,新人请教一个问题,设置方向按钮在屏幕中的位置和具体功能的代码是哪部分?
gada888
gada888
作者
回复永夜星空


在它C++这个文件里改html界面。界面部分是html的代码。打开这个文件,一直往下找,看到button。stop什么的就是要改的界面文字和按钮位置

1906017327
1906017327
你好,我在网上找了很多ESP32cam的例子,只要博主的案例比较清晰而且开发深度高。请问我可以请教一下ESP32cam这主板能和测距传感器在Arduion上编译程序吗。我好像遇到不知道怎么分配引脚的问题了
gada888
gada888
作者
回复1906017327
不好意思,刚刚看到。你如果用普通的超声模块的话,连线引脚如下:
Trig -> IO2
Echo -> IO13
VCC -> 3.3V or VCC
GND -> GND
春爷
春爷
按照sample程序没有问题,按照您的程序怎么解析失败呢?
gada888
gada888
作者
回复春爷
肯定有步骤操作错了,不是只有这一个主程序,一共四个程序文件。

BUILDERlym
BUILDERlym
请问这个可以连接arduino uno用吗
gada888
gada888
作者
回复BUILDERlym
不可以,虽然都用同一个ide编译程序。这个从硬件到软件都是和arduino的设计思路不同。
BUILDERlym
BUILDERlym
很厉害啊
rzyzzxw
rzyzzxw
高级高级
pATAq
pATAq
很好的教程
- 没有更多了 -