MĂłdulo CAM ESP-32 com cĂąmera da
DiymoreServidor de Streaming de VĂdeo ESP32-CAM
Um exemplo de uso estĂĄ
aqui .
VocĂȘ deve primeiro instalar as bibliotecas:
Placa Esp32 no Arduino Ide Placa Windows /
Esp32 no Arduino Ide Linux e MacConfiguraçÔes detalhadas estão no artigo.
No meu caso, usei o mĂłdulo AI-THINKER tĂŁo descomentado
#define CAMERA_MODEL_AI_THINKER
A funcionalidade do reconhecimento de rosto nĂŁo funcionou para mim. O comentĂĄrio no artigo foi Ăștil.
Parece que o reconhecimento de faces nĂŁo estĂĄ mais funcionando (pelo menos com o programa de exemplo) ao usar o nĂșcleo 1.02 ESP. Revertendo para o nĂșcleo 1.01 e usando o programa de exemplo pertencente a esse nĂșcleo, ele serĂĄ corrigido
Depois de reverter para a versĂŁo anterior da biblioteca 1.01, tudo funcionou.
Eu tenho um par de displays I2C 128x64 e TFT SPI 128x128
Artigo
OV7670 com FIFO como conectar a cĂąmera ao monitor se vocĂȘ nĂŁo possui um mĂłdulo CAM. Suporte cĂąmeras OV2640 e OV7670
No momento em que escrevi, o seguinte funcionou para mim
CĂąmera ESP32 + Servidor Wi-Fi + Tela I2C (AdaFruit)
CĂąmera ESP32 + Tela SPI 1,44 "TFT 128x128 v1.1 (AdaFruit)
CĂąmera ESP32 + Tela SPI 1,8 "TFT 128 * 160 (biblioteca Espressif)
O driver WiFi entra em conflito com o barramento SPI. Solução possĂvel para usar uma biblioteca diferente. O problema surgiu no momento da inicialização do mĂłdulo WiFi.
O principal problema Ă© que o mĂłdulo ESP32-CAM possui um nĂșmero limitado de pernas livres. Parte das portas Ă© usada para a cĂąmera, parte em paralelo com o cartĂŁo SD. O conector da placa sd estĂĄ instalado na placa. Outra conclusĂŁo (IO4) Ă© a lanterna LED.
A tela I2C P / B nĂŁo Ă© de particular interesse para uso real com a imagem recebida da cĂąmera. Cor TFT e alta resolução. Nele vocĂȘ jĂĄ pode ver o rosto. Em um monitor ou com uma resolução um pouco mais alta, vocĂȘ pode fazer o Door Eye
Eu direi imediatamente que a biblioteca do AdaFruit nĂŁo Ă© a mais rĂĄpida. Consegui exibir alguns quadros por segundo. Ă mais promissor usar bibliotecas que funcionam em um nĂvel baixo. Mas nĂŁo consegui obter uma ESP32_TFT_library com a tela 1,44 "128x128 SPI V1.1. Talvez o ILI9163 nĂŁo seja suportado. Tirei 1,8" 128 * 160 SPI TFT e consegui espremer cerca de 12 FPS!
LinkExistem algumas bibliotecas que funcionam mais rapidamente. Mas alguns nĂŁo sĂŁo portados para o esp-32 (
link ):
4,98 seg. Adafruit_ST7735
1,71 seg ST7735X_kbv
1,30 seg PDQ_ST7735
O vĂdeo parece impressionante:
Ao usar
duas portas, uma das portas de hardware HSPI ou VSPI no microcontrolador e a tela com o driver ILI9341 podem receber 30 quadros por segundo (
link ).
Mas, como eu disse anteriormente no mĂłdulo ESP32-CAM, apenas um SPI Ă© gratuito. Ă exibido nos seguintes PINS:
IO2 - CC (A0)
IO14 - CLK
IO15 - CS
IO13 - MOSI (SDA)
IO12 - MISO (entrada. NĂŁo usado)
IO0 - BCKL (luz de fundo. NĂŁo usado)
IO16 - RST


A primeira biblioteca que tentei foi o AdaFruit SSD1306
Tela OLED azul I2C 128x64
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display; void init_display(){ pinMode(14,INPUT_PULLUP); pinMode(15,INPUT_PULLUP); Wire.begin(14,15); display = Adafruit_SSD1306(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64 Serial.println(F("SSD1306 allocation failed")); for(;;); // Don't proceed, loop forever } ....
Ao trabalhar no esp32, a emulação de Software I2C é usada. IO14 e IO15 envolvidas. Quase todas as portas livres podem ser usadas, e não o barramento H / W.
Como conectar o
monitor monocromĂĄtico de 0,96 "i2c OLED . VocĂȘ precisa prestar atenção ao endereço de exibição no barramento I2C. Nesse caso, 0x3C
Biblioteca SPI Display 1,8 "TFT 128 * 160 Espressif
Diagrama de fiação:
IO2 - A0
IO14 - SCK
IO15 - CS
IO13 - SDA
IO16 - RESET

A placa também possui um leitor de cartão SD
Configuração de E / S:
Instale o ambiente e ambiente de desenvolvimento da
Espressif . InstruçÔes detalhadas sobre
como fazer isso .
Instale a
biblioteca . Duas correçÔes precisam ser feitas para montar a biblioteca.
Makefile:
+ CFLAGS += -Wno-error=tautological-compare \ + -Wno-implicit-fallthrough \ + -Wno-implicit-function-declaration
components / tft / tftspi.c:
+ #include "driver/gpio.h
â
PatchEm seguida, instale o
driver da cĂąmera ESP32 .
Configure:
#. $ HOME / esp / esp-idf / export.sh
# idf.py menuconfig
Permitir acesso Ă porta USB para firmware e monitoramento:
#sudo chmod 777 / dev / ttyUSB0
Coletamos e preenchemos:
#make -j4 && make flash
12FPS é alcançado através da gravação de pacotes usando o método send_data. A gravação não é pixel por pixel, mas uma linha inteira igual à largura da tela:
esp_err_t camera_capture(){ uint32_t tstart, t1, t2; tstart = clock();
Configuração da cĂąmera â
GistFRAME_WIDTH Ă© a largura do quadro de 320 pixels para QVGA config.frame_size = FRAMESIZE_QVGA;
De fato, vemos na janela de exibição 128 * 160 do quadro completo
Registre a configuração com um buffer de cĂąmera de vĂdeo (config.fb_count = 1)
Capturar tempo da cĂąmera: 32 ms
Tempo de buffer de envio: 47 ms
Capturar quadro ok.Resultado
1000 / (32 + 47) = 12,65 FPSRegistre a configuração com dois buffers da cĂąmera de vĂdeo (config.fb_count = 2)Capturar tempo da cĂąmera: 39 ms
Tempo de buffer de envio: 63 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 0 ms
Tempo de buffer de envio: 59 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 0 ms
Tempo de buffer de envio: 34 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 40 ms
Tempo de buffer de envio: 64 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 0 ms
Tempo de buffer de envio: 59 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 0 ms
Tempo de buffer de envio: 34 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 40 ms
Tempo de buffer de envio: 63 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 0 ms
Tempo de buffer de envio: 60 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 0 ms
Tempo de buffer de envio: 34 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 39 ms
Tempo de buffer de envio: 63 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 0 ms
Tempo de buffer de envio: 60 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 1 ms
Tempo de buffer de envio: 34 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 40 ms
Tempo de buffer de envio: 63 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 0 ms
Tempo de buffer de envio: 60 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 0 ms
Tempo de buffer de envio: 34 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 40 ms
Tempo de buffer de envio: 63 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 0 ms
Tempo de buffer de envio: 59 ms
Capturar quadro ok.
Capturar tempo da cĂąmera: 0 ms
Tempo de buffer de envio: 35 ms
Capturar quadro ok.
Usando o segundo buffer da cĂąmera de vĂdeo, o buffer em alguns ciclos Ă© obtido instantaneamente. Inicialmente, o ciclo completo Ă© obtido em menos de um buffer, mas dessa vez "continua". O intervalo entre os ciclos Ă© flutuante.
Vårias vezes peguei nos registros "O detector de trincas foi acionado" e desliguei o detector. Porque no começo eu alimentei a tela de luz de fundo do pino ESP32-CAM de 3,3
#include "soc/rtc_cntl_reg.h" ... WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
ConclusĂŁo
MĂłdulo funcional de baixo custo ESP32. HĂĄ uma falta catastrĂłfica de conclusĂ”es para as portas implementadas na versĂŁo CAM da placa; portanto, escolha a versĂŁo CAM se vocĂȘ realmente precisa de uma cĂąmera.