前不久注意到ESP32是基于李闯商城一个叫ESP32-CAM的摄像板,打算买一个玩玩,但是最近看到一个教程,一直没机会。我认为这是一块好板。今天的教程将重点介绍使用ESP32-CAM板构建视频流服务器。
这个ESP32-CAM非常便宜(价格不到10美元),一个基于ESP32-S芯片的小型摄像头模块人工智能思考者. 它本质上包括OV2***0相机内置ESP32模块和外设(传感器和执行器)可连接的几个GPIO,以及一个microSD卡插槽,可用于存储相机的图像。突出的事实是,它是专为独立摄像头应用程序设计的,ESP32-CAM没有配备USB端口等功能,所有这些功能都可以在普通的ESP-32主板上使用。缺少USB端口也意味着缺少FTDI芯片,要对电路板进行编程,您需要使用FTDI程序员。
这款ESP32-CAM非常便宜(价格不到10美元),基于ESP32-S芯片的小型摄像头模块人工智能思考者。它基本上包括OV2***0摄像机的内置ESP32模块和几个可以连接外设(传感器和执行器)的GPIO,以及一个突出的事实是,它是专为独立摄像机应用而设计的。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支持OV2***0和OV7670摄像头,并内置闪光灯支持图像WiFI上传SD卡插槽嵌入式Lwip和FreeRTOS支持智能配置/AirKiss技术支持串行端口本地和远程固件升级(FOTA)
为了演示ESP32-CAM如何工作,我们将构建一个视频流服务器,其IP地址可以从外部访问,以便从ESP32-CAM摄像机获取实时流。
这些步骤非常简单。在本教程结束时,您应该对ESP32-CAM足够熟悉,可以用它来构建一个更令人惊叹的项目。
必需组件
该项目的必需组件包括:;
ESP32-CAM3.3V FTDI Programmer跨接导线面包板
组件可以从其他链接购买。对于FTDI,使用SparkFun的FTDI基本突破,但你可以决定使用任何其他类似的板3.3V逻辑电平。
原理图
ESP32-CAM附带连接的摄像头,如果您的情况不同,您只需将摄像头连接到所提供的端口即可。这就留下了ESP32-CAM和FTDI程序员之间的联系。FTDI编程器通过UART与ESP32-CAM通信,它将连接到ESP32-CAM的UART引脚。连接如下图所示;
ESP32-CAM附带一个连接的摄像头。如果你的情况不同,你只需要将相机连接到提供的端口。这就剩下ESP32-CAM和FTDI程序员之间的联系了。FTDI编程器通过UART与ESP32-CAM通信,UART将连接到ESP32-CAM的UART引脚。连接如下图所示;
示意图
再次检查连接,确保一切正常。
代码
我们将在这个项目中使用Arduino IDE,因此我们需要为ESP32设置Arduino IDE和板文件。按照我们之前编写的关于钬的教程中详细说明的步骤,使用Arduino IDE对ESP32”进行编程以完成该操作。
今天项目的代码是基于Camera Web ServerESP32库中的例子。这个项目背后的想法非常简单。ESP32-CAM板配置为web服务器,在网页上提供摄像头的实时反馈,因此与ESP位于同一网络的任何浏览器都可以通过访问此板的IP地址来查看实时反馈。
使用代码esp摄像头库和监听网络库。这个esp相机库包含了允许访问相机和拍摄照片和录制视频的功能,而esp的监听网络库包含了一些允许我们将ESP32设置为web服务器的功能。安装时安装这些库ESP32 Arduino IDE公司因此,它们不需要特殊的安装过程。
像往常一样,我将对代码的一些部分进行快速解释,并在项目结束时提供完整的代码。
代码从包含我们将使用的所有库开始。根据您的ESP32库/附加版本,camera pin.h文件将作为文件附加到草图,或者其内容将被***到草图中。在我们的例子中,它是作为一个文件附加的,并且该文件已经被添加到下载部分下的文件中。
#include "esp_camera.h"#include <WiFi.h>#include "camera_pins.h"
接下来,将指定正在使用的相机的型号。在这种情况下,我们将使用AI Thinker相机,因此指定。
// 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();
接下来是invalid setting ()函数。我们通过初始化串行通信来启动该功能,然后配置摄像头并将其pin设置为存储在camera pin.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_for***t = PIXFORMAT_JPEG;
接下来,我们检查电路板是否有PSRAM并初始化它,设置帧大小和JPEG质量。
if(psramFound()){ config.frame_size = FRAMESIZE_UXGA; config.jpeg_quality = 10; config.fb_count = 2; } else { config.frame_size = FRAMESIZE_SVGA; config.jpeg_quality = 12; config.fb_count = 1; }
接下来,我们用创建的配置初始化摄像机。
// camera initesp_err_t err = esp_camera_init(&config);if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x", err); return;}
并设置正在使用的相机传感器的属性。
sensor_t * s = esp_camera_sensor_get(); //initial sensors are flipped vertically and colors are a bit saturated if (s->id.PID == OV3660_PID) { s->set_vflip(s, 1);//flip it back s->set_brightness(s, 1);//up the blightness just a bit s->set_saturation(s, -2);//lower the saturation } //drop down frame size for higher initial frame rate s->set_framesize(s, FRAMESIZE_QVGA);#if defined(CAMERA_MODEL_M5STACK_WIDE) s->set_vflip(s, 1); s->set_hmirror(s, 1);#endif
接下来,我们使用前面提供的凭证将节点连接到接入点,并验证连接状态。
WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected");
我们通过WiFi调用StartCameraServer()。此功能可以自动开始将摄像机输入流传输到可通过主板的IP地址访问的网页(使用wifi.localip ()]功能显示在串行监视器上)
startCameraServer(); Serial.print("Camera Ready! Use 'http://"); Serial.print(WiFi.localIP()); Serial.println("' to connect");}
这个无效loop ()函数只是在每个刷新点引入一个延迟。
这个startCameraServer()函数是ESP32库中的内置函数之一。你可以去看看,以便更好地了解它是如何工作的。
该项目的完整代码如下所示,附在下载部分。
#include "esp_camera.h"#include <WiFi.h>#include "camera_pins.h"//// WARNING!!! Make sure that you have either selected ESP32 Wrover Module,// or another board which has PSRAM enabled//// 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_THINKERconst char* ssid = "ssid";const char* password = "password";void startCameraServer();void setup() { 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_for***t = PIXFORMAT_JPEG; //init with high specs to pre-allocate larger buffers if(psramFound()){ config.frame_size = FRAMESIZE_UXGA; config.jpeg_quality = 10; config.fb_count = 2; } else { config.frame_size = FRAMESIZE_SVGA; config.jpeg_quality = 12; config.fb_count = 1; }#if defined(CAMERA_MODEL_ESP_EYE) pinMode(13, INPUT_PULLUP); pinMode(14, INPUT_PULLUP);#endif // camera init esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x", err); return; } sensor_t * s = esp_camera_sensor_get(); //initial sensors are flipped vertically and colors are a bit saturated if (s->id.PID == OV3660_PID) { s->set_vflip(s, 1);//flip it back s->set_brightness(s, 1);//up the blightness just a bit s->set_saturation(s, -2);//lower the saturation } //drop down frame size for higher initial frame rate s->set_framesize(s, FRAMESIZE_QVGA);#if defined(CAMERA_MODEL_M5STACK_WIDE) s->set_vflip(s, 1); s->set_hmirror(s, 1);#endif WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); startCameraServer(); Serial.print("Camera Ready! Use 'http://"); Serial.print(WiFi.localIP()); Serial.println("' to connect");}void loop() { // put your ***in code here, to run repeatedly: delay(10000);}
演示
将ESP-32 CAM连接到FTDI编程器,确保GPIO引脚连接到GND,然后将编程器连接到您的PC,然后按照以下步骤上传代码:
去
工具
>
董事会
然后选择
ESP32翻转模块
去
工具
>
港口
并选择ESP32/FTDI所连接的COM端口在
工具
>
分区方案
, select
巨大的应用程序(3MB无OTA)
Holmium按下ESP32-CAM车载复位按钮然后,单击上载按钮上载代码
上传完代码后,断开GPIO 0与GND的连接,打开串口监视器串口,波特率为一百和五万两百(和)。Start ()函数)。按下ESP板上显示的ESP-IP地址重置按钮。
ip地址
要从摄像机访问信号源,请在与ESP位于同一网络的设备上打开浏览器,然后在地址栏中输入ESP32-CAM IP的IP地址。按Start Streaming按钮,您应该能够看到正在播放的视频。
这个项目可以取得相当大的进展。只需很少或不需要额外编码,您就可以轻松地将项目连接到您的家庭助理,以便您可以从家庭助理应用程序中查看流。只要再努力一点,再加一张SD卡,我们就能像面部识别一样做到。
就是这样!请随时通过评论部分与我联系有关该项目的问题,也让我知道你是否会做出任何改进。
本文来自转身以后投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/555288.html