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言語使用。オプティマイザ無し。)


回路図

※9番、10番ピンは外部クロックを使用できるようにあけてあります。

【部品一覧】
パーツ 個数 ショップ等
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ピッチ変換1XBeeのピッチを標準ピッチに変換
LED1XBeeモジュールの稼動確認用
抵抗1330Ω(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経由で取り込んだ状態