我知道互联网上有很多关于 OV7670 的信息(例如 http://forum.arduino.cc/index.php?topic=159557.0),并且我读了很多相关内容,但似乎缺少一些内容。
首先,我研究了如何从相机中逐像素读取以构建矩形 600 X 480 图像,考虑到此处文档中描述的 HREF、VSYNCH 和 PCLOCK,这很容易理解: http://www.voti.nl/docs/OV7670.pdf 。我将 XCLOCK 理解为我需要提供给 OV7670 作为一种周期 Controller 的输入,而 RESET 将用于重置它。
因此,此时我认为此类相机的功能可以通过连接以下引脚来实现:
- D0..D7 - 用于连接到 arduino 数字引脚 0 到 7 作为 arduino 板上输入的数据(像素)
- XCLK - 用于连接到 arduino 数字引脚 8 作为 arduino 板输出的相机时钟
- PCLK - 用于连接到 arduino 数字引脚 9 作为 arduino 板上输入的像素时钟
- HREF - 定义线路何时开始/结束连接到 arduino 数字引脚 10 作为 arduino 板上的输入
- VSYCH - 定义帧何时开始/结束连接到 arduino 数字引脚 11 作为 arduino 板上的输入
- GRD - 连接到 arduino GRD 的接地
- 3V3 - 3,3 输入连接到 arduino 3,3v
- RESET - 连接到arduino RESET
- PWDN - 连接到 arduino GRD
从我的角度来看,这种方法的实现类似于: 代码:
for each loop function do
write high to XCLK
if VSYNCH is HIGH
return;
if HREF is LOW
return;
if lastPCLOCK was HIGH and currentPCLOCK is LOW
readPixelFromDataPins();
end for
我的 readPixelFromDataPins()
基本上只读取第一个字节(因为我只是测试是否可以从相机读取某些内容),其编写如下:
代码:
byte readPixelFromDataPins() {
byte result = 0;
for (int i = 0; i < 8; i++) {
result = result << 1 | digitalRead(data_p[i]);
}
return result;
}
为了检查是否正在从相机读取某些内容,我只需将其打印到 Serial 9600,即从数据引脚读取的字节作为数字。但目前我只收到零值。我用来检索图像的代码存储在此处:https://gist.github.com/franciscospaeth/8503747 .
让 OV7670 与 Arduino 一起工作的人是否已经弄清楚我做错了什么?我想我错误地使用了 XCLOCK,对吗?我该怎么做才能让它正常工作?
我搜索了很多,没有找到任何使用arduino的相机的SSCCE(http://sscce.org/),如果有人有请告诉我。
<小时/>这个问题也出现在arduino论坛(http://forum.arduino.cc/index.php?topic=211741.0)上。
最佳答案
你的想法不错,但是...... xclock 需要是一个时钟(在你的程序中只是从 0 到 1 的转换并且在那里卡住) 您还需要使用 I2C 与 SIOC 和 SIOD 来配置相机(或者您可以使用默认设置,但我不确定是否是适合您的正确输出格式,30F/s,VGA,YUV 格式......)
在同一循环中使用串行输出和读取数据,代码执行速度会变慢 我建议您切换 xclock 引脚并在 if() 中移动像素打印。此外,如果您只想读取一个字节,那么您将只能在非常精确的时间内读取数据,那么在 HREF 从 0 到 1 的转换之后,您需要等待 PCLK 从 0 到 1 的新转换(您在 PCLK 的 784x2 转换后,将只能看到 HREF 的 0-1 转换,(每行 640 个事件像素 + 144 个死区时间)x 2(对于 YUV 或 RGB,每个像素接收 2 个字节))
关于camera - Arduino + OV7670 - 不带 FIFO - 读取快照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21220738/