AitendoにOV7670を使ったカメラモジュールが出ています。なんだかガッチリとした印象を受けるレンズが付いています。2.54mmピッチで足が出ているのがちょっと魅力的。
このモジュール本体もイイのですが、紹介されている応用参考回路に興味を持ちました。ATMEGA32を使っています。まったく説明が無いので、この回路図から、どうやってカメラからのデータを拾うのかを推測するという楽しみが生まれます。
次のような手順で、カメラから出力されるデータをATMEGA32を介さずに、そのままLCDに流しこめるのではないでしょうか?
と、まぁ、ざっとこんな仕掛けで1フレーム分のデータをLCDに送って、表示することができると思われます。LCDに表示された画像は、LCDへREADコマンドを送って読み取ることができますから、それをSDカードに書き込んでやることもできるでしょう。LCDの画面サイズよりも大きい解像度をサポートすることができないという制約はありますが、安価なATMEGAで自作デジカメが作れそうです。LCD表示をメモリ代りに使うなんて、うまいこと考えたもんですねぇ。どなたか、挑戦してみませんか?
このモジュール本体もイイのですが、紹介されている応用参考回路に興味を持ちました。ATMEGA32を使っています。まったく説明が無いので、この回路図から、どうやってカメラからのデータを拾うのかを推測するという楽しみが生まれます。
- MEGA32には2KしかRAMがありませんから、カメラからのフレーム画像データを全部蓄えることはできません。たとえ1ラスタ分であってもピクセル毎にRGBデータの保存に2バイトは必要なので、VGAであれば640*2 = 1280バイトになってしまいます。QCIFなら176*2 = 352バイトなので、数ラスタなら蓄えられます。
- LCDは16ビットバス接続のものを使っていますが、ATMEGAからは8ビット分のデータしか出ていません。そうすると、このLCDは8ビットでもつなげられるモードがあり、実際にはD8~D15しか使っていないのではないでしょうか。
- SPIは何に使っているのでしょうか?画像保存用のSDカードでしょうか?FAT動かすためには、そのためのバッファメモリが必要となりますから、いよいよラスタデータなんか蓄えていられません。
- PCLKとHREFの2つの信号は、カメラからのピクセルクロック信号と水平同期信号です。これらの信号が7400でゲーティングされてLCDへのWRとなっています。つまりは、カメラからのクロック信号で、そのままLCDへ書き込んでいることになりますね。
次のような手順で、カメラから出力されるデータをATMEGA32を介さずに、そのままLCDに流しこめるのではないでしょうか?
- LCDはRGB565のフォーマットをサポートしているでしょうから、カメラもRGB565で出力するように初期化しておきます。
- カメラの画像サイズにあわせて、LCDの描画ウィンドウを設定し、連続ピクセル描画コマンドを発行します。
- カメラへのRS信号を反転し、以後書き込まれるのはコマンドではなく、データであることを指示します。
- カメラからの画像出力を許可し、VSYNC信号の立下りを待ちます。
- VSYNCを検出したら、EN_EXCLKにHを出力し、CMOS_CSにLを出力します。すると、カメラからのRGBデータは74245を介してHREFの期間だけPCLKに同期してLCDに流れ始めます。
- MEGA32は、VSYNCの立ち上がりを検出したら、CMOS_CSとEN_EXCLKを反転してカメラからのデータを止めます。
- 最後に、連続描画動作を止めるためのコマンドをLCDに送ります。
と、まぁ、ざっとこんな仕掛けで1フレーム分のデータをLCDに送って、表示することができると思われます。LCDに表示された画像は、LCDへREADコマンドを送って読み取ることができますから、それをSDカードに書き込んでやることもできるでしょう。LCDの画面サイズよりも大きい解像度をサポートすることができないという制約はありますが、安価なATMEGAで自作デジカメが作れそうです。LCD表示をメモリ代りに使うなんて、うまいこと考えたもんですねぇ。どなたか、挑戦してみませんか?