AVR
(ATmega88PA)でOV7670+FIFOモジュール 安価なカメラモジュールを安価なAVR (ATmega88PA)で使う ・OV7670+FIFO、AVRで最低限の画像撮影とパソコンでの表示を目的に作成しました。カラー調整とかはお好みで。 ・AVR+LCDで画像表示の実装は結構あったんだけど、パソコンへの取り込みは案外なかったのでやってみました。 OV7670+FIFOモジュールでの実装例って少ないですね。OV7670+FPGAとかOV7670+ARMなどの速度に余裕のある実装はたくさんあるのですが。 ・XBee転送なので画像転送時間は結構かかります。(AVRは内部クロック8MHz、USARTは38400bpsでやりました。) ・ATmega168Pのほうであれば、圧縮アルゴリズムとかもっといろいろ組み込めるかと思います。 ATmega88Pだと最低限のロジックだけでプログラム領域を80%~90%以上使います。(gccでC言語使用。オプティマイザ無し。) |
パーツ | 個数 | ショップ等 |
AVR (ATmega88PA) | 1 | ATmega48P、ATmega168P、ATmega328Pでも代用可(Pなしも当然可) (※ATmega88PかATmega168PかATmega328Pを推奨) |
OV7670+FIFO | 1 | www.csun.co.jp/SHOP/2011102801.html |
XBee | 2 | PC用(受信),AVR用(送信) |
XBeeピッチ変換 | 1 | XBeeのピッチを標準ピッチに変換 |
LED | 1 | XBeeモジュールの稼動確認用 |
抵抗 | 1 | 330Ω(LED用) |
ブレッドボード | 1 | |
3端子レギュレーター(3.3V) | 1 | |
コンデンサ(0.1μF) | 1 | |
電解コンデンサ(33μF) | 1 |
SCCB(レジスタに対するデータの書き込み) 間隔は100μ秒 |
SCCB(レジスタに対するデータの読み込み) 間隔は100μ秒 |
画像をFIFOに書き込む |
【注意】 VSYNCをNegativeに変更すること。(アドレス:0x15、値:0x02) HREFは変更の必要性は無い。 |
FIFOから画像を読み出す |
【注意】 FIFOへの書き込みから読み込みへの移行は、「128サイクル後」でないとダメと仕様書に書いてある。 |
下記レジスタの定数は、右サイトを参照⇒ | www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/drivers/media/video/ov7670.c |
レジスタの初期化 | アドレス:0x12 値:0x80 |
QQVGA(120 x 160)、RGB444 カラーバー表示による実験 (※まず、これでカラーバーが取得でSCCBやデータのWrite、Readのロジック点検) | struct register_format { char address; char value; }; struct register_format register_list[] = { //OV7670+FIFOでQQVGA(120x240)のColorBAR表示レジストデータ {REG_COM10,COM10_VS_NEG}, //COM10 (0x15) VSYNC-Negative {REG_COM7,COM7_RGB}, //COM7 (0x12 QQVGA-RGB) =0x04 {REG_RGB444,R444_ENABLE}, //RGB444 (0x8C) =0x02 {REG_COM15,COM15_R00FF | COM15_RGB565}, {REG_HSTART,0x16}, //HSTART (0x17) {REG_HSTOP,0x04}, //HSTOP (0x18) {REG_HREF,0x0A4}, //HREF (0x32) {REG_VSTART,0x02}, //VSTRT (0x19) {REG_VSTOP,0x7A}, //VSTOP (0x1A) {REG_VREF,0x0A}, //VREF (0x03) =0x0A {REG_COM3,COM3_DCWEN}, //COM3 (0x0C SCALE,DCW設定) =0x04 {REG_COM14,COM14_DCWEN | COM14_QVGA | COM14_D4}, //COM14 (0x3E DCW,QVGA,PCLK=1/2)=0x1A {SCALING_DCWCTR,0x22}, //SCALING_D (0x72)=0x22 {SCALING_PCLK_DIV,0xF0 | COM14_D4}, //SCALING_P (0x73)=0xF2 {SCALING_PCLK_DELAY,0x05}, //SCALING_P_D(0xA2) =0x05 {REG_COM13,COM13_GAMMA | COM13_UVSAT | 0x02}, // (0x3D) {REG_COM17,COM17_CBAR}, //ColorBAR (0x42)=0x08 {0xFF,0xFF} } |
QQVGA(120 x 160)、RGB444 画像の取得 (※カラーバーが取得できたら画像の取得に挑戦) | struct register_format { char address; char value; }; struct register_format register_list[] = { //QQVGA-RGB444 //VSYNCをActiveLowに設定(OV7670+FIFOの回路設計上) {REG_COM10,COM10_VS_NEG}, //COM10 (0x15) VSYNC-Negative //RGB設定 {REG_COM7,COM7_RGB}, //COM7 (0x12 QQVGA-RGB) =0x04 {REG_RGB444,R444_ENABLE}, //RGB444 (0x8C) =0x02 {REG_COM15,COM15_R00FF | COM15_RGB565}, {REG_COM11,0x0A}, {REG_TSLB,0x04}, //QQVGA設定 {REG_HSTART,0x16}, //HSTART (0x17) {REG_HSTOP,0x04}, //HSTOP (0x18) {REG_HREF,0x24}, //HREF (0x32) {REG_VSTART,0x02}, //VSTRT (0x19) {REG_VSTOP,0x7A}, //VSTOP (0x1A) {REG_VREF,0x0A}, //VREF (0x03) =0x0A //タイミング等 {REG_COM3,COM3_DCWEN}, //COM3 (0x0C SCALE,DCW設定) =0x04 {REG_COM14,COM14_DCWEN | COM14_QVGA | COM14_D4}, //COM14 (0x3E DCW,QVGA,PCLK=1/2)=0x1A {SCALING_DCWCTR,0x22}, //SCALING_D (0x72) =0x22 {SCALING_PCLK_DIV,0xF0 | COM14_D4}, //SCALING_P (0x73) =0xF2 //Color設定 {0x4f, 0x80},{0x50, 0x80},{0x51, 0x00},{0x52, 0x22}, {0x53, 0x5e},{0x54, 0x80},{0x56, 0x40},{0x58, 0x9e}, {0x59, 0x88},{0x5a, 0x88},{0x5b, 0x44},{0x5c, 0x67}, {0x5d, 0x49},{0x5e, 0x0e},{0x69, 0x00},{0x6b, 0x0a}, {0x6c, 0x0a},{0x6d, 0x55},{0x6e, 0x11},{0x6f, 0x9f}, {0xFF,0xFF} //終了 } |
横から見た写真 | |
上から見た写真 ※ 配線ケーブルで、一見ごっちゃごちゃですが、案外シンプルな接続です。 | |
カメラのレンズの溝数(カメラのピント調整) ※ 大体4~5溝くらい出てるくらいがちょうどいいみたい。 このOV7670カメラモジュールはピントがある程度あってないと、 ものすごいグチャグチャ(ズレてたり、写真になってないカラー画像が来たり)な絵になる模様。 レジスタ設定がミスってるのかと思うくらい。(これで相当時間を費やした(;_;)) | |
パソコン側の状態 (※XBeeをUSB-XBee変換モジュールに乗せただけ) | |
画像をXBee経由で取り込んだ状態 |