摄像头一直占据着电子行业的主导地位,因为它具有许多应用程序,例如访客监视系统,监视系统,考勤系统等。我们今天使用的摄像头很智能,并且具有许多早期摄像头所没有的功能。当今的数码相机不仅可以捕获图像,还可以捕获场景的高级描述并分析其所见。它广泛用于机器人,人工智能,机器学习等。捕获的帧通过人工智能和机器学习进行处理,然后用于许多应用,例如车牌检测,物体检测,运动检测,面部识别等。
在本教程中,我们将使用最广泛的相机模块OV7670与Arduino UNO接口。相机模块OV7670可以通过相同的引脚配置,代码和步骤与Arduino Mega连接。摄像头模块很难连接,因为它具有大量的插针和混乱的接线。另外,在使用摄像头模块时,电线也变得非常重要,因为电线的选择和电线的长度会显着影响图像质量并带来噪音。
我们已经使用各种微控制器和IoT设备在相机上完成了很多项目,例如:
- 带有Raspberry Pi和Pi摄像头的访客监控系统
- 基于物联网的具有电子邮件警报的Raspberry Pi家庭安全系统
- 具有运动捕捉功能的Raspberry Pi监控摄像机
该摄像头OV7670工作电压为3.3V,因此它成为避免的Arduino这给5V的输出在其输出端GPIO引脚非常重要。OV7670是FIFO摄像机。但是在本教程中,将在没有FIFO的情况下抓取图片或帧。本教程将通过简单的步骤和简化的编程将OV7670与Arduino UNO接口。
所需组件
- Arduino UNO
- OV7670摄像头模块
- 电阻器(10k,4.7k)
- 跳线
所需软件:
- Arduino IDE
- 串行端口读取器(用于分析输出图像)
关于相机模块OV7670的注意事项
OV7670摄像头模块是FIFO摄像头模块,可以从不同的制造商处获得,它们具有不同的引脚配置。OV7670提供了多种格式的全帧窗口化8位图像。该图像阵列在VGA中最高可以每秒30帧(fps)的速度运行。OV7670包括
- 图像传感器阵列(约656 x 488像素)
- 定时发生器
- 模拟信号处理器
- A / D转换器
- 测试图案生成器
- 数字信号处理器(DSP)
- 图像缩放器
- 数字视频端口
- LED和频闪闪光灯控制输出
OV7670图像传感器使用串行相机控制总线(SCCB)进行控制,该总线是I2C接口(SIOC,SIOD),最大时钟频率为400KHz。
相机带有握手信号,例如:
- VSYNC:垂直同步输出–帧期间为低
- HREF: 水平参考–行的活动像素期间为高
- PCLK:像素时钟输出–自由运行时钟。数据在上升沿有效
除此之外,它还有其他一些信号,例如
- D0-D7: 8位YUV / RGB视频分量数字输出
- PWDN:掉电模式选择–正常模式和掉电模式
- XCLK:系统时钟输入
- 复位:复位信号
OV7670由24MHz振荡器提供时钟。这提供了24MHz的像素时钟(PCLK)输出。FIFO提供3Mbps的视频帧缓冲存储器。测试图案生成器具有8色彩条图案,渐变为灰色的彩条图案。现在,让我们开始对Arduino UNO进行编程,以测试Camera OV7670并使用串行端口读取器抓取帧。
电路原理图
编程Arduino UNO
编程从包括OV7670必需的必需库开始 。由于OV7670在I2C接口上运行,因此它包括此后,需要为OV7670修改寄存器。该程序分为几个小功能,以使您更好地理解。
的 设置() 包括所有仅用于图像捕获所需的初始设置。第一个函数是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不会在HBLANK上切换。 }
相机设置为拍摄QVGA图像,因此需要选择分辨率。该功能配置寄存器以拍摄QVGA图像。
setResolution();
在本教程中,图像以单色拍摄,因此将寄存器值设置为输出单色图像。该功能从程序中预定义的寄存器列表中设置寄存器值。
setColor();
下面的功能是写入寄存器功能,该功能将十六进制值写入寄存器。如果您得到了加扰的图像,则尝试将第二项(即10)更改为12年9月11日。但是在大多数情况下,此值可以正常工作,因此无需更改它。
writeReg(0x11,10);
此功能用于获取图像分辨率大小。在这个项目中,我们正在拍摄320 x 240像素的图片。
captureImg(320,240);
除此之外,该代码还将I2C配置分为几个部分。仅仅为了从摄像机获取数据,I2C配置具有开始,读取,写入,设置地址功能,这些功能在使用I2C协议时很重要。
您可以在本教程末尾找到带有演示视频的完整代码。只需上传代码并打开串行端口读取器并抓取帧即可。
如何使用串行端口读取器读取图像
串行端口读取器是一个简单的GUI,可从此处下载。这将捕获base64编码并对其进行解码以形成图像。只需按照以下简单步骤使用串行端口读取器步骤1:将Arduino连接到PC的任何USB端口
步骤2:点击“检查”以找到您的Arduino COM端口
第3步:最后单击“开始”按钮开始连续阅读。
第4步:只需单击“保存图片”,也可以保存这些图片。
以下是从OV7670拍摄的示例图像
使用OV7670时的注意事项
- 尝试使用尽可能短的电线或跳线
- 避免与Arduino或OV7670上的任何引脚松动接触
- 连接时要小心,因为大量接线可能导致短路
- 如果UNO将5V输出提供给GPIO,则使用电平转换器。
- 为OV7670使用3.3V输入,因为超过此电压可能会损坏OV7670模块。
创建该项目是为了概述如何将相机模块与Arduino一起使用。由于Arduino的内存较少,因此处理可能不符合预期。您可以使用具有更多内存进行处理的其他控制器。