在電子行業(yè)中,相機一直占據著主導地位,因為它用途廣泛,如訪客監(jiān)控系統(tǒng)、救援系統(tǒng)、考勤系統(tǒng)等?,F今,我們使用的相機非常智能,并具有早期相機中不存在的許多功能。現今的數碼相機不僅捕捉圖像,還能捕捉高清晰度畫面并分析他們看到的內容。它廣泛用于機器人、人工智能、機器學習等。捕獲的幀使用人工智能和機器學習進行處理,然后用于許多應用,如車牌檢測、物體檢測、運動檢測、面部識別等。
在本篇文章中,我們將使用最廣泛使用的相機模塊OV7670與Arduino UNO進行連接。相機模塊OV7670也可以Arduino Mega開發(fā)板連接,具有相同的引腳配置、代碼和步驟。相機模塊很難連接,因為它需要大量的引腳和雜亂的布線。當使用相機模塊時,走線變得非常重要,因為走線方式的選擇和走線的長度會顯著影響圖像質量并且會帶來噪聲。
OV7670相機模塊工作在3.3V,因此必須要注意,Arduino在其輸出GPIO引腳上提供5V輸出。 OV7670是一款FIFO相機。但在本文中,我們將在沒有使用FIFO的情況下抓取圖片。本問將提供簡單的步驟和簡化的編程,以便將OV7670與Arduino UNO進行連接。
需要的組件
● Arduino UNO開發(fā)
● OV7670相機模塊
● 電阻(10k和4.7k)
● 跳線
有關相機模塊OV7670的注意事項
OV7670相機模塊是一種FIFO相機模塊,可從不同制造商處獲得,具有不同的引腳配置。 OV7670提供各種格式的全幀窗口8位圖像。圖像陣列能夠在VGA中以高達每秒30幀(fps)的速度運行。 OV7670包括
● 圖像傳感器陣列(約656 x 488像素)
● 時序發(fā)生器
● A / D轉換器
● 測試模式生成器
● 圖像縮放器
● LED和頻閃閃光控制輸出
OV7670圖像傳感器使用串行攝像機控制總線協(xié)議(SCCB)進行控制,SCCB是I2C協(xié)議的一種(SIOC、SIOD),最大時鐘頻率為400KHz。
相機協(xié)議帶有握手信號,例如:
● VSYNC:垂直同步輸出 - 幀期間低電平
● HREF:水平參考 - 行的有效像素期間為高電平
● PCLK:像素時鐘輸出 - 自由運行時鐘。數據在上升沿有效
除此之外,它還有幾個信號,如
● D0-D7:8位YUV / RGB視頻分量數字輸出
● PWDN:掉電模式選擇 - 正常模式和掉電模式
● XCLK:系統(tǒng)時鐘輸入
● Reset:復位信號
OV7670采用24MHz振蕩器提供時鐘。這使得像素時鐘(PCLK)輸出為24MHz。 FIFO提供3Mbps的視頻幀緩沖存儲器。測試圖案生成器具有8條彩條圖案、淡灰色條紋圖案?,F在讓我們開始編程Arduino UNO以測試相機模塊OV7670,并使用串行端口讀取器抓取幀。
電路原理圖
編程Arduino UNO開發(fā)板
首先包含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協(xié)議時非常重要。
如何使用串行端口讀取器讀取圖像
串行端口讀取器是一個簡單的GUI。該工具將捕獲base64編碼并對其進行解碼以形成圖像。只需按照以下簡單步驟即可使用串行端口讀取器
第1步:將Arduino開發(fā)板連接到PC的任何USB端口
第2步:單擊“Check”,找到您的Arduino COM端口
第3步:最后點擊“Start”按鈕開始連續(xù)讀取圖像。
第4步:只需點擊“Save Picture”即可保存這些圖片。
以下是從OV7670拍攝的圖像示例
使用OV7670時的注意事項
● 盡量確保使用的導線或跳線越短越好
● 避免與Arduino或OV7670上的任何引腳接觸不良
● 連接時要小心,因為大量的布線會導致短路
● 如果UNO向GPIO提供5V輸出,請使用電平轉換器。
● 使用3.3V作為OV7670的輸入,超過此電壓可能會損壞OV7670模塊。
本文主要是為了簡單介紹如何基于Arduino使用相機模塊。由于Arduino的內存較小,因此處理可能不如預期。您可以使用具有更多內存的不同控制器進行處理。
編輯:hfy
-
控制器
+關注
關注
112文章
16103瀏覽量
177077 -
數碼相機
+關注
關注
2文章
440瀏覽量
38322 -
OV7670
+關注
關注
5文章
59瀏覽量
27394
發(fā)布評論請先 登錄
相關推薦
評論