esp32cam初始化ov2640摄像头概要

esp32芯片与OV2640连接的电路图(主要部分)

右侧为摄像头的接口槽,摄像头Y1~Y8、PWDN、XCLK、SIO_C、SIO_D等引脚都已与esp32芯片对应的引脚连接,后续编程时会根据引脚对应关系来确认程序中的引脚参数。

使用arduino ide,安装esp32库后,样例程序在file-examples-esp32-camera-camerawebserver,

该程序支持多种esp32的硬件模组,自己对应的是#define CAMERA_MODEL_AI_THINKER(选择正确,后续的引脚初始设置才会引用camera_pins.h中正确的引脚定义数据)。

ov2640初始化关键的是camera_config_t config的初始设置(各引脚的设置),该函数esp_camera_init(&config)正确执行后,esp32与ov2640见就建立I2C通讯,esp32为主机(master)ov2640为从机(slave),可以写ov2640的寄存器来进一步设置摄像头(例如set_vflip(s, 1)垂直翻转等),以及进行获取图像动作(esp_camera_fb_get();)。

初始化函数esp_camera_init(&config)做了什么?可以通过github esp32-camera源程序来了解,各类源文件都在该项目下,主要内容如下:

1、cam_init(config);只是初始设置引脚数据;

2、camera_probe(config, &camera_model); 寻找摄像头,建立通讯,这个是关键;

     2.1 设置时钟: 通讯、图像数据获取都需要时钟,是必须的。

     if (config->pin_xclk >= 0) {
        ESP_LOGD(TAG, "Enabling XCLK output");
        CAMERA_ENABLE_OUT_CLOCK(config);
    }

     调用的是xclk.h中定义的camera_enable_out_clock(const camera_config_t *config),源码             在/target/xclk.c中。

     2.2 SCCB初始化:

      if (config->pin_sccb_sda != -1) {
        ESP_LOGD(TAG, "Initializing SCCB");
        ret = SCCB_Init(config->pin_sccb_sda, config->pin_sccb_scl);
    } else {
        ESP_LOGD(TAG, "Using existing I2C port");
        ret = SCCB_Use_Port(config->sccb_i2c_port);

      可以在sccb.c中了解int SCCB_Init(int pin_sda, int pin_scl)详细内容,是一个i2c通讯初始化过程。并且定义了sccb读写数据、寻找从设备的函数。

    2.3 通过操作pwdn引脚复位摄像头

    2.4 寻找从设备摄像头SCCB_Probe(),获得摄像头的I2C通讯地址(通讯建立成功)

3、在esp32与ov2640摄像头建立通讯后,各种摄像头设置(向摄像头各寄存器写设置数据)

补充:

OV2640摄像头公司的文档中提档,设备地址是写:0x60,读0x61,最后一位是读写标识。程序都设置了十六进制0X30地址,在真正读写前会做移位及加读写标识位。反过来理解0X60的二进制位向右移动一位,01100000--》00110000,0x60-->0x30。

arduino菜单examples里没有esp32的examples时需要重新选板的类型,先选个其它的板,再选esp32 cam的板。

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值