当前位置: 首页 > news >正文

破产计划:ESP32s3+UVC+ov2640实现免驱摄像头

计划没有成功,arduino对于UVC的环境支持不是很完善所以导致项目破产,这里经供参考思想,后续有时间了技术长了再回来研究

SP32-S3 + OV2640摄像头模块  ESP32-S3开发板,可以使用TinyUSB库实现UVC,这样可以直接被Windows识别为摄像头,原本想法是作为windows登录时用来作为登陆使用的摄像头

所以不能使用原本上位机读取图像的办法而是要使用免驱摄像头类似的UVC协议

ESP32-S3 + OV2640

硬件连接(ESP32-S3与OV2640接线表)
OV2640 引脚ESP32-S3 引脚
3.3V3.3V
GNDGND
D0GPIO 1
D1GPIO 2
D2GPIO 3
D3GPIO 4
D4GPIO 5
D5GPIO 6
D6GPIO 7
D7GPIO 8
XCLKGPIO 15
PCLKGPIO 16
VSYNCGPIO 17
HREFGPIO 18
SDAGPIO 13
SCLGPIO 12
RESETGPIO 11 (可选)
PWDNGPIO 10 (可选)

arduino 代码

#include <esp_camera.h>
#include <Adafruit_TinyUSB.h>

// OV2640 摄像头配置
#define CAMERA_MODEL_AI_THINKER
#define PWDN_GPIO_NUM    10
#define RESET_GPIO_NUM   11
#define XCLK_GPIO_NUM    15
#define SIOD_GPIO_NUM    13
#define SIOC_GPIO_NUM    12
#define Y9_GPIO_NUM      8
#define Y8_GPIO_NUM      7
#define Y7_GPIO_NUM      6
#define Y6_GPIO_NUM      5
#define Y5_GPIO_NUM      4
#define Y4_GPIO_NUM      3
#define Y3_GPIO_NUM      2
#define Y2_GPIO_NUM      1
#define VSYNC_GPIO_NUM   17
#define HREF_GPIO_NUM    18
#define PCLK_GPIO_NUM    16

// TinyUSB UVC 配置
Adafruit_USBD_WebUSB usb_uvc;
uint8_t frame_buffer[1024 * 1024]; // 调整缓冲区大小以适应分辨率

void setup() {
  Serial.begin(115200);
  
  // 初始化摄像头配置
  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;
  
  // 根据PSRAM调整分辨率
  if (psramFound()) {
    config.frame_size = FRAMESIZE_SVGA; // 800x600
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_VGA; // 640x480
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }

  // 初始化摄像头
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("摄像头初始化失败: 0x%x", err);
    return;
  }

  // 初始化TinyUSB UVC
  TinyUSB_Device_Init(0);
  usb_uvc.setManufacturer("ESP32-UVC");
  usb_uvc.setProduct("OV2640 Camera");
  usb_uvc.begin();
}

void loop() {
  camera_fb_t *fb = esp_camera_fb_get();
  if (fb) {
    // 发送JPEG帧到USB
    usb_uvc.write(fb->buf, fb->len);
    esp_camera_fb_return(fb);
  }
  delay(33); // 约30 FPS
}

 

相关文章:

  • CExercise_12_单链表面试题_3合并两条有序的单向链表,使得合并后的链表也是有序的 (要求: 不能额 外申请堆内存空间)
  • 数字人:开启医疗领域的智慧变革新时代(5/10)
  • 计算机三级第一章:信息安全保障概述(以时间节点推进的总结)
  • 【Linux】进程概念(一):冯诺依曼体系结构 + 操作系统
  • ElementNotInteractableException原因及解决办法
  • 基于大模型的轻症急性胰腺炎全流程预测与诊疗方案研究报告
  • java操作redis库,开箱即用
  • 【C++】map与set
  • Vue 技术解析:从核心概念到实战应用
  • ArrayList 和 数组 的区别
  • Vue 3 + TypeScript 实现一个多语言国际化组件(支持语言切换与内容加载)
  • 【Linux系统】进程概念
  • qt designer 创建窗体选择哪种屏幕大小
  • Golang|抽奖相关
  • 路由器端口映射的意思、使用场景、及内网ip让公网访问常见问题和解决方法
  • 项目部署-(二)Linux下SpringBoot项目自动部署
  • MySQL流程控制
  • 如何管理“灰色时间”导致的成本漏洞
  • SOLID原则详解:提升软件设计质量的关键
  • 【DDR 内存学习专栏 1.3.1 -- DDR 的 Bank 及 burst 访问】
  • “70后”通化市委书记孙简已任吉林省政府领导
  • 蚂蚁财富28亿港元要约收购耀才证券,筹谋香港券商牌照
  • 秦洪看盘|短线热点降温,A股回落整固
  • 第六次“太空会师”,神舟二十号3名航天员顺利进驻中国空间站
  • 北京市平谷区政协原主席王春辉接受纪律审查和监察调查
  • 商务部:美方应彻底取消所有对华单边关税措施