基于Arduino的OV7670相机模块设计方案

电子说

1.3w人已加入

描述

在电子行业中,相机一直占据着主导地位,因为它用途广泛,如访客监控系统、救援系统、考勤系统等。现今,我们使用的相机非常智能,并具有早期相机中不存在的许多功能。现今的数码相机不仅捕捉图像,还能捕捉高清晰度画面并分析他们看到的内容。它广泛用于机器人、人工智能、机器学习等。捕获的帧使用人工智能和机器学习进行处理,然后用于许多应用,如车牌检测、物体检测、运动检测、面部识别等。

在本篇文章中,我们将使用最广泛使用的相机模块OV7670与Arduino UNO进行连接。相机模块OV7670也可以Arduino Mega开发板连接,具有相同的引脚配置、代码和步骤。相机模块很难连接,因为它需要大量的引脚和杂乱的布线。当使用相机模块时,走线变得非常重要,因为走线方式的选择和走线的长度会显着影响图像质量并且会带来噪声。

OV7670相机模块工作在3.3V,因此必须要注意,Arduino在其输出GPIO引脚上提供5V输出。 OV7670是一款FIFO相机。但在本文中,我们将在没有使用FIFO的情况下抓取图片。本问将提供简单的步骤和简化的编程,以便将OV7670与Arduino UNO进行连接。

需要的组件

● Arduino UNO开发

● OV7670相机模块

● 电阻(10k和4.7k)

● 跳线

有关相机模块OV7670的注意事项

OV7670相机模块是一种FIFO相机模块,可从不同制造商处获得,具有不同的引脚配置。 OV7670提供各种格式的全帧窗口8位图像。图像阵列能够在VGA中以高达每秒30帧(fps)的速度运行。 OV7670包括

● 图像传感器阵列(约656 x 488像素)

● 时序发生器

● 模拟信号处理器

● A / D转换器

● 测试模式生成器

● 数字信号处理器(DSP)

● 图像缩放器

● 数字视频端口

● LED和频闪闪光控制输出

OV7670图像传感器使用串行摄像机控制总线协议(SCCB)进行控制,SCCB是I2C协议的一种(SIOC、SIOD),最大时钟频率为400KHz。

相机协议带有握手信号,例如:

● VSYNC:垂直同步输出 - 帧期间低电平

● HREF:水平参考 - 行的有效像素期间为高电平

● PCLK:像素时钟输出 - 自由运行时钟。数据在上升沿有效

除此之外,它还有几个信号,如

● D0-D7:8位YUV / RGB视频分量数字输出

● PWDN:掉电模式选择 - 正常模式和掉电模式

● XCLK:系统时钟输入

● Reset:复位信号

OV7670采用24MHz振荡器提供时钟。这使得像素时钟(PCLK)输出为24MHz。 FIFO提供3Mbps的视频帧缓冲存储器。测试图案生成器具有8条彩条图案、淡灰色条纹图案。现在让我们开始编程Arduino UNO以测试相机模块OV7670,并使用串行端口读取器抓取帧。

威廉希尔官方网站 原理图

数码相机

编程Arduino UNO开发板

首先包含OV7670所需的库。由于OV7670使用的是I2C接口,因此需要包含《util / twi.h》库。该项目中使用的库是ArduinoIDE的内置库。我们只需要包含库来完成工作。

在此之后,需要针对OV7670修改寄存器。该程序分成几个部分进行讲解,以便能够更好地理解。

Setup()包括图像捕获所需的所有初始设置。第一个函数是arduinoUnoInut(),它用于初始化Arduino Uno。首先它会禁用所有全局中断并进行设置通信接口配置,例如PWM时钟、中断引脚选择、预分频器选择添加奇偶校验和停止位。

​arduinoUnoInut();

配置Arduino后,必须配置相机。要初始化相机,我们只能选择更改寄存器值。寄存器值需要从默认值更改为自定义。还要根据我们使用的微控制器频率添加所需的延迟时间。因为,低速微控制器具有较少的处理时间,以及捕获帧之间更多的延迟。

void camInit(void){

writeReg(0x12, 0x80);

_delay_ms(100);

wrSensorRegs8_8(ov7670_default_regs);

writeReg(REG_COM10, 32);//PCLK does not toggle on HBLANK.

}

相机设置为拍摄QVGA图像,因此需要选择分辨率。以下函数用于配置寄存器以获取QVGA图像。

setResolution();

在本文中,图像以单色拍摄,因此寄存器值设置为输出单色图像。该函数设置寄存器列表中的寄存器值,该寄存器列表在程序中预定义。

setColor();

以下函数用于写入寄存器,将十六进制值写入寄存器。如果你得到了扰乱的图像,那么试着改变第二个参数,即10到9/11/12。但大多数时候这个值工作正常,所以不需要改变它。

writeReg(0x11, 10);

以下函数用于设置图像分辨率大小。在这个项目中,我们拍摄的照片尺寸为320 x 240像素。

captureImg(320, 240);

除此之外,代码还将I2C配置分为几个部分。只是为了从摄像机获取数据,I2C配置有启动、读取、写入、设置地址等函数,这些函数在使用I2C协议时非常重要。

如何使用串行端口读取器读取图像

串行端口读取器是一个简单的GUI。该工具将捕获base64编码并对其进行解码以形成图像。只需按照以下简单步骤即可使用串行端口读取器

第1步:将Arduino开发板连接到PC的任何USB端口

数码相机

第2步:单击“Check”,找到您的Arduino COM端口

数码相机

第3步:最后点击“Start”按钮开始连续读取图像。

数码相机

第4步:只需点击“Save Picture”即可保存这些图片。

以下是从OV7670拍摄的图像示例

使用OV7670时的注意事项

● 尽量确保使用的导线或跳线越短越好

● 避免与Arduino或OV7670上的任何引脚接触不良

● 连接时要小心,因为大量的布线会导致短路

● 如果UNO向GPIO提供5V输出,请使用电平转换器。

● 使用3.3V作为OV7670的输入,超过此电压可能会损坏OV7670模块。

本文主要是为了简单介绍如何基于Arduino使用相机模块。由于Arduino的内存较小,因此处理可能不如预期。您可以使用具有更多内存的不同控制器进行处理。
编辑:hfy

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分