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)
大海田子
点下载闪一下没了
蓝鹊
博主,你好 使用car的代码报错,这种情况该如何处理
谭周强
请问我的这个IP地址复制到网页不能访问怎么回事
AI创客
您好,博主,下载了您提供的 car.rar 文件 进行了编译结果 如网友 所说 报错一样,请博主帮看下怎么回事吧,先谢谢博主了!
gada888
gada888
作者
回复AI创客
文件已更新了,你试一下在这里给我个反馈,我很久没测试ESP32-CAM版子了。那个主文件(ESP32-CAM Remote Control Car.ino)我记得后来用的是乐鑫官方文件,稍稍改了一下而已。
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
#在这里快速回复#请问图中的DF电源模块是什么型号?淘宝中找不到。 我用移动电源直接接esp32和电动机驱动板cam会开启不了
gada888
gada888
作者
回复dekit
只要是5V2A电源就行。有的移动电源有5V1A和5V2A两个USB输出口的。我用的ROMOSS电源(充电宝),在咸鱼里有卖的。电机驱动板和我图示的一样?不一样要测试其启动电流的,如果用掉电流大,那就无法启动。因为ESP32-CAM耗电大。
dekit
请问图中的DF电源模块是什么型号?淘宝中找不到。
我用移动电源直接接esp32和电动机驱动板cam会开启不了。
永夜星空
报错啊……
gada888
gada888
作者
回复永夜星空



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

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


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

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

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