不久前,我注意到ESP32基于摄像头板称为ESP32-CAM在立创商城上,计划买一个来玩,但直到最近我看到一个教程时才有机会。我觉得这是一个很好的板子,今天的教程将重点介绍使用ESP32-CAM板构建视频流服务器。
这个ESP32-CAM非常便宜(价格不到10美元),一个基于ESP32-S芯片的小型摄像头模块人工智能思考者. 它本质上包括OV2640相机内置ESP32模块和外设(传感器和执行器)可连接的几个GPIO,以及一个microSD卡插槽,可用于存储相机的图像。突出的事实是,它是专为独立摄像头应用程序设计的,ESP32-CAM没有配备USB端口等功能,所有这些功能都可以在普通的ESP-32主板上使用。缺少USB端口也意味着缺少FTDI芯片,要对电路板进行编程,您需要使用FTDI程序员。
ESP32-CAM(来源:Dealextreme)
ESP32-CAM板的一些功能如下所示:
- 802.11b/g/n Wi-Fi BT SoC模块,支持STA/AP/STA AP工作模式
- 低功耗32位CPU,也可以服务于应用处理器
- 最高160MHz时钟速度,总计算能力高达600 DMIPS
- 内置520 KB SRAM,外部4MPRAM
- 支持UART/SPI/I2C/PWM/ADC/DAC
- 支持OV2640和OV7670摄像头,并内置闪光灯
- 支持图像WiFI上传
- SD卡插槽
- 嵌入式Lwip和FreeRTOS
- 支持智能配置/AirKiss技术
- 支持串行端口本地和远程固件升级(FOTA)
为了演示ESP32-CAM是如何工作的,我们将构建一个视频流服务器,它的IP地址可以从外部访问,从而从ESP32-CAM摄像头获取实时流。
这些步骤非常简单,在本教程的最后,您应该熟悉ESP32-CAM,足以用它构建一个更惊人的项目。
所需组件
本项目所需的组成部分包括:;
- ESP32-CAM
- 3.3V FTDI Programmer
- 跨接导线
- 面包板
组件可以从附加链接购买。对于FTDI,SparkFun的FTDI基本突破被使用,但是您可以决定使用任何其他类似的板3.3V逻辑电平 .
示意图
ESP32-CAM附带连接的摄像头,如果您的情况不同,您只需将摄像头连接到所提供的端口即可。这就留下了ESP32-CAM和FTDI程序员之间的联系。FTDI编程器通过UART与ESP32-CAM通信,它将连接到ESP32-CAM的UART引脚。连接如下图所示;
示意图
再次检查连接,确保一切正常。
代码
我们将在这个项目中使用Arduino IDE,因此,我们需要为ESP32设置Arduino IDE和板文件。按照我们之前在鈥上写的本教程中详细介绍的步骤操作用Arduino IDE编程ESP32“去完成它
今天项目的代码基于CameraWebserverESP32库中的示例。这个项目背后的想法很简单,ESP32-CAM板被配置为一个web服务器,在网页上提供来自摄像头的实时反馈,因此与ESP在同一网络上的任何浏览器都可以通过访问该板的IP地址来查看实时提要。
代码使用esp摄像头图书馆和无线网络图书馆。这个esp摄像头库包含允许访问摄像机的功能和拍照和录制视频等功能,而ESP的无线网络库包含一些函数,这些函数允许我们将ESP32设置为web服务器。安装这些库时安装这些库ESP32 Arduino IDE公司因此,它们不需要特殊的安装过程。
像往常一样,我会对代码的某些部分做一个快速的解释,并在项目结束时提供完整的代码。
代码从包含我们将要使用的所有库开始。根据您的ESP32库/附加模块版本摄像头引脚.h文件将作为文件附着到草图,或将其内容复制到草图中。在我们的例子中,它是作为一个文件附加的,并且该文件已经被添加到下载部分下的文件中。
#include "esp_camera.h"#include <WiFi.h>#include "camera_pins.h"
接下来,将指定正在使用的相机的型号。在这种情况下,我们将使用人工智能思考者照相机,所以它是指定的。
// Select camera model//#define CAMERA_MODEL_WROVER_KIT//#define CAMERA_MODEL_ESP_EYE//#define CAMERA_MODEL_M5STACK_PSRAM//#define CAMERA_MODEL_M5STACK_WIDE#define CAMERA_MODEL_AI_THINKER
接下来,我们提供要连接ESP32的访问点的凭据,并初始化StartCameraServer功能
const char* ssid = "ssid";const char* password = "password";void startCameraServer();
接下来是无效设置()功能。我们通过初始化串行通信来启动函数,然后配置摄像机,将其引脚设置为存储在摄像头引脚.h文件。我们还设置了频率和像素格式等设置。
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.jpg";
接下来,我们检查电路板是否有一个PSRAM并初始化它,设置帧大小