极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 51110|回复: 28

用arduino due 驱动ov7670拍照

[复制链接]
发表于 2016-9-12 18:49:02 | 显示全部楼层 |阅读模式
本帖最后由 维博哥哥 于 2016-9-12 18:54 编辑
  1. #include <Wire.h>
  2. #include <OV7670.h>

  3. int PinD7 = 53;
  4. int PinD6 = 52;
  5. int PinD5 = 51;
  6. int PinD4 = 50;
  7. int PinD3 = 49;
  8. int PinD2 = 48;
  9. int PinD1 = 47;
  10. int PinD0 = 46;

  11. int WRST = 45;
  12. int RRST = 43;
  13. int OE = 41;
  14. int RCLK = 44;
  15. int WEN = 42;
  16. int VSY = 40;

  17. int led = 13;

  18. OV7670 cam;

  19. unsigned int temp1;
  20. int flag;

  21. unsigned char cur_status=0;
  22. volatile int state = LOW;
  23.   

  24. void setup() {
  25.   Serial.begin(9600);
  26.   Wire.begin();
  27.    
  28.   pinMode(PinD7,INPUT_PULLUP);
  29.   pinMode(PinD6,INPUT_PULLUP);
  30.   pinMode(PinD5,INPUT_PULLUP);
  31.   pinMode(PinD4,INPUT_PULLUP);
  32.   pinMode(PinD3,INPUT_PULLUP);
  33.   pinMode(PinD2,INPUT_PULLUP);
  34.   pinMode(PinD1,INPUT_PULLUP);
  35.   pinMode(PinD0,INPUT_PULLUP);
  36.   
  37.   pinMode(WRST,OUTPUT);
  38.   pinMode(RRST,OUTPUT);
  39.   pinMode(OE,OUTPUT);
  40.   pinMode(RCLK,OUTPUT);
  41.   pinMode(WEN,OUTPUT);
  42.   
  43.   pinMode(led,OUTPUT);
  44.   

  45.   cam.init();
  46.   digitalWrite(OE,LOW);
  47.   attachInterrupt(VSY, stateChange, CHANGE);
  48. }
  49. void loop() {
  50.   int i,j;
  51.   cam.readpid();
  52.   Serial.println("*****************");
  53.   Serial.println((int)cam.pid);
  54.   Serial.println("*****************");

  55.   
  56.   if(cur_status == 2)
  57.   {
  58.    
  59.     digitalWrite(RRST,LOW);
  60.     digitalWrite(RCLK,LOW);
  61.     digitalWrite(RCLK,HIGH);
  62.     digitalWrite(RCLK,LOW);
  63.     digitalWrite(RRST,HIGH);
  64.     digitalWrite(RCLK,HIGH);
  65.     for(i=0;i<240;i++)
  66.     {
  67.       Serial.print(i);
  68.       Serial.println(" ");
  69.       for(j=0;j<320;j++)
  70.       {
  71.         digitalWrite(RCLK,LOW);
  72.         temp1 = Read();
  73.         digitalWrite(RCLK,HIGH);      
  74.         flag = temp1>>7;
  75.         temp1 <<= 8;
  76.         digitalWrite(RCLK,LOW);
  77.         temp1 |= Read();
  78.         digitalWrite(RCLK,HIGH);
  79.         
  80.         //Serial.print(temp1,HEX);
  81.         Serial.print(flag);
  82.         Serial.print(" ");
  83.       }
  84.       Serial.println("");
  85.     }
  86.     while(1);
  87.   }
  88.   delay(1000);
  89. }

  90. uint8_t Read(void)
  91. {
  92.     uint8_t tmp;
  93.     tmp = 0;
  94.     tmp |= (digitalRead(PinD0)  << 0);
  95.     tmp |= (digitalRead(PinD1)  << 1);
  96.     tmp |= (digitalRead(PinD2)  << 2);
  97.     tmp |= (digitalRead(PinD3)  << 3);
  98.     tmp |= (digitalRead(PinD4)  << 4);
  99.     tmp |= (digitalRead(PinD5)  << 5);
  100.     tmp |= (digitalRead(PinD6)  << 6);
  101.     tmp |= (digitalRead(PinD7) << 7);
  102.    
  103.     return tmp;
  104. }
  105. void stateChange()
  106. {
  107.   if(cur_status==0) //如果此时状态为0,则说明是一个图像的开始,开始向FIFO罐入数据
  108.     {
  109.     digitalWrite(WRST,LOW);// FIFO_WRST=0;
  110.     digitalWrite(WRST,HIGH);//FIFO_WRST=1;
  111.     digitalWrite(WEN,HIGH);//FIFO_WEN=1;
  112.      cur_status=1; //标记为1
  113.     }
  114.    else
  115.     if(cur_status==1)        //说明此处为图像的结束,亦即下一图像的开始
  116.      {
  117.       digitalWrite(WEN,LOW);// FIFO_WEN=0;
  118.       digitalWrite(WRST,LOW);//FIFO_WRST=0;
  119.        digitalWrite(WRST,HIGH);//FIFO_WRST=1;
  120.        cur_status=2;
  121.        state = !state;
  122.        digitalWrite(led,HIGH);
  123.      }
  124. }
复制代码

OV7670是Omni公司的一款30W像素的摄像头,在单片机摄像头里边属于入门级的了。一般的有两种,带fifo缓存芯片的和不带的。我刚用的时候也犯过这种错误,以为不带的fifo只需要单片机读的速度快一点就行。但事实上,没有fifo芯片的ov7670还没有晶振,一般只用做那种开发板给它振动频率,然后直接显示在液晶屏上,不做任何处理。


网上关于OV7670的资料很多,但是用arduino驱动的很少,之前在arduino.cc看有国外的人写过驱动,但不是用arduino的软件编译,不是很懂。再有就是没有接线图,让一般人摸不着头脑。


我之前也写过一篇关于arduino读OV7670的寄存器的帖子,但那比较简单。这次我直接给arduino DUE写了一个库,设置几乎绝大多数寄存器,这个成功让我很有成就感。


但是,限于我对图片保存的知识的欠缺,我只能将读到的图像数据,通过串口转化成二值矩阵,复制成一个文本文件,用Matlab显示出来。


摄像头的接线,按照代码里就行,我用DUE直接I2C读这个SCCB协议的数据。设置的图片240*360,所以最后在串口助手中显示得很大。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2016-9-12 18:57:39 | 显示全部楼层
以后有机会我可以好好写写这个程序的思路
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-14 20:50:14 | 显示全部楼层
好贴标记收藏先
回复 支持 反对

使用道具 举报

发表于 2016-9-14 22:12:08 | 显示全部楼层
这个很厉害啊
回复 支持 反对

使用道具 举报

发表于 2016-11-27 19:11:36 | 显示全部楼层
請問你的arduino 驅動ov7670那帖子,sd卡是必需要接上的嗎?
想請問詳細的接腳圖是否可以分享?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-28 11:12:37 | 显示全部楼层
alphafuu 发表于 2016-11-27 19:11
請問你的arduino 驅動ov7670那帖子,sd卡是必需要接上的嗎?
想請問詳細的接腳圖是否可以分享?

不用完全接上SD卡,接脚图压缩包里的驱动里应该有对应的
回复 支持 反对

使用道具 举报

发表于 2016-11-30 11:19:31 | 显示全部楼层
维博哥哥 发表于 2016-11-28 11:12
不用完全接上SD卡,接脚图压缩包里的驱动里应该有对应的

我看一下壓縮包的內容是ov7670的庫文件,
主要是我看arduino程式碼中的腳位宣告,
有點不太明白,
像是SIOC、SIOD、PCLK、XCLK、Reset、PWDN此類的,
對應不到你宣告的
WRST、RRST 、OE、RCLK 、WEN 這幾隻腳。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-5 21:34:29 | 显示全部楼层
alphafuu 发表于 2016-11-30 11:19
我看一下壓縮包的內容是ov7670的庫文件,
主要是我看arduino程式碼中的腳位宣告,
有點不太明白,

可能是用的ov7670不同,我用的是带fifo芯片的模块,没有你所说的那些引脚
回复 支持 反对

使用道具 举报

发表于 2017-1-11 03:17:43 | 显示全部楼层
维博哥哥 发表于 2016-12-5 21:34
可能是用的ov7670不同,我用的是带fifo芯片的模块,没有你所说的那些引脚

hi~我後來找了帶fifo芯片的模块,可以抓到數值,
請問得到那一塊2進制的數值是如何轉成圖片檔。
回复 支持 反对

使用道具 举报

发表于 2017-1-15 19:50:43 | 显示全部楼层
高度赞扬楼主精神!!!
回复 支持 反对

使用道具 举报

发表于 2017-3-29 20:44:28 | 显示全部楼层
压缩包怎么下载不了
回复 支持 反对

使用道具 举报

发表于 2017-5-15 20:47:54 | 显示全部楼层
可以将数据通过蓝牙传输至手机然后经app解析成图像,
你这个SD是不是没接?我以为你用它保存照片
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 20:23 , Processed in 0.048192 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表