如果想好一些的页面格式或者下载源代码可以到我的个人网站:
做这个摄像头本来也很无奈.
因为买不到好的模块啊.
不是太贵就是质量太差,要不就是又贵又差.
所以就想,不如自己做一个好了.
事情就这样定下来了.
从淘宝寄来OV7640的当天就把硬件完成了.
麻烦的其实是软件.OV官方说"为了给第三方开发者空间,所以不提供例程".
所以我只好抱着一个标记着"preliminary"的OV7640文档.看着含糊不清的说明慢慢的尝试.
电路原理图:
(原文件名:OV7640电路原理图.gif) 做完的实物:
(原文件名:实物图.JPG) 在Linux上编写了上位机的程序来采集图象,采用串口 115200,n,8,1 进行通信.
OV7640拍摄的图象:
(原文件名:样片.jpg) 左图为RGB565,QVGA,右图为255级灰度.
关于SCCB的总线协议:
SCCB协议充分展现了产商的协议不统一是一件多么麻烦的事情.
SCCB协议就是 Serial Camera Control Bus. 不晓得它和I2C哪个先出生.
这里只说明单字节操作.
SCCB的单字节写操作协议完全和I2C一样:
起始位 ---> 器件地址(0x42) ---> ACK ---> 内部寄存器地址 ---> ACK ---> 写入数据 ---> ACK ---> 结束位
在I2C总线当中,器件地址的最后一位为 0 时表示为写操作的开始,最后一位为 1 时表示读操作的开始.
所以在使用ARM9例如 AT91系列的TWI总线接口时,器件地址应该等于 0x21(7位),再根据读写操作的选择补充最后一位为1或者为0.
SCCB协议的单字节随机地址读协议比I2C的多出了一个停止位:
起始位 --> 器件地址(0x42) --> ACK --> 内部寄存器地址 --> ACK --> 结束位 --> 起始位 --> 器件地址(0x43) -->ACK --> 数据 --> NOACK --> 停止位
而I2C的单字节随机地址读操作为:
起始位 --> 器件地址(0x42) --> ACK --> 内部寄存器地址 --> ACK --> 起始位 --> 器件地址(0x43) -->ACK --> 数据 --> NOACK --> 停止位
红色标记的读协议就是SCCB总线所特有的.
不管怎样,如果用现成的ARM9外设的I2C接口,只能执行写操作.如果需要读操作需要自己编写SCCB的模拟总线,加上SCCB多生出来的一个停止位.
关于OV系列的寄存器设置:
这个要怪OV,你说不给例程也就罢了吧,连个寄存器的使用说明都没有.许多设置含含糊糊的让人不知所错.
我只好一一尝试.不管怎样,下面的这些寄存器对于采集图象来说是常用的(针对OV7640):
地址 主要用途 范例值
0x11 OV器件时钟分频 0x3f 时钟分频到最大,其余选项为默认
0x28 选择黑白模式(OV7141)或者彩色模式(OV7640) 0x60 选择黑白模式,其余选项为默认(系统默认为彩色模式)
0x14 QVGA格式或者VGA格式选择 0x24 QVGA输出, 0x04 VGA输出
0x1F RGB565或者RGB555格式选择 0x11 RGB565输出
0x12 自动白平衡,RGB和YUV设置 0x18 关闭自动白平衡,其余默认
如果在OV7141~黑白模式下设置OV7640彩色模式用到的寄存器会造成图象黑屏.
有一些寄存器的功能有重叠,例如在0x1F设置了RGB565或者RGB55输出,就不需要在0x12中选择RGB输出.
关于硬件的连接方法(for ARM):
输入线: HREF VSYNC PCLK Y[7:0]
输出线: PWDN RESET
外部时钟: CLK
SCCB总线: TWI等I2C总线(只能写),或者模拟SCCB总线(读写)
关于图象采集:
对于图象的采集需要用到 HREF VSYNC PCLK Y[7:0]
其中 HREF 为行同步, VSYNC为帧同步,PCLK为数据输出的时钟,Y[7:0]为数据总线.
VSYNC出现一次正脉冲说明一帧图象已经准备好,HREF由0-->1说明1行图象数据已经准备好.
采集顺序为:
等待VSNYC的正脉冲 ---> (循环)等待HREF由 0 到 1 ---> (循环)当PCLK由 0--->1的时候采集Y[7:0]上的数据 --> HREF由 1 到 0(一行结束)
关于采集图象的质量:
CMOS的30万摄像头,我本来也不对图象质量报太高期望.
不管怎么说,问题出现在两个方面:
1. 所用的镜头滤镜
2. 图象采集的频率
很难找到和手头芯片一致符合的镜头,某些不合适的镜头的滤镜可能会造成图象的色彩失真.
采集的频率决定了自动白平衡和自动增益的参数设定,如果采集的频率很小,例如1秒钟只采集一幅图象,那么自动白平衡有可能得不到足够的参数而使得图象失 真.这个时候关闭自动白平衡反而会比较好.
关于输出图象格式:
采集到的图象通常有几种格式: 黑白,RGB565,RGB555,RGB原始图象
黑白图象为 255 级灰度,每一个字节的数据对应一个象素.不需要转换.
RGB565的输出顺序为: 第一字节 第二字节
R4 R3 R2 R1 R0 G5 G4 G3 G2 G1 G0 B4 B3 B2 B1 B0
转换为RGB24: R G B
(R4 R3 R2 R1 R0) * 8 (G5 G4 G3 G2 G1 G0) * 4 (B4 B3 B2 B1 B0) * 8
也就是说RGB565的两个字节数据对应一个象素.
RGB555的输出顺序为: 第一字节 第二字节
X R4 R3 R2 R1 R0 G4 G3 G2 G1 G0 B4 B3 B2 B1 B0
例程:
图象采集:
(原文件名:图象读取代码.GIF)