マイコン工作実験日記

Microcontroller を用いての工作、実験記録

OV7670

2009-12-05 18:22:56 | CMOSカメラ
AitendoにOV7670を使ったカメラモジュールが出ています。なんだかガッチリとした印象を受けるレンズが付いています。2.54mmピッチで足が出ているのがちょっと魅力的。

このモジュール本体もイイのですが、紹介されている応用参考回路に興味を持ちました。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に流しこめるのではないでしょうか?
  1. LCDはRGB565のフォーマットをサポートしているでしょうから、カメラもRGB565で出力するように初期化しておきます。
  2. カメラの画像サイズにあわせて、LCDの描画ウィンドウを設定し、連続ピクセル描画コマンドを発行します。
  3. カメラへのRS信号を反転し、以後書き込まれるのはコマンドではなく、データであることを指示します。
  4. カメラからの画像出力を許可し、VSYNC信号の立下りを待ちます。
  5. VSYNCを検出したら、EN_EXCLKにHを出力し、CMOS_CSにLを出力します。すると、カメラからのRGBデータは74245を介してHREFの期間だけPCLKに同期してLCDに流れ始めます。
  6. MEGA32は、VSYNCの立ち上がりを検出したら、CMOS_CSとEN_EXCLKを反転してカメラからのデータを止めます。
  7. 最後に、連続描画動作を止めるためのコマンドをLCDに送ります。

と、まぁ、ざっとこんな仕掛けで1フレーム分のデータをLCDに送って、表示することができると思われます。LCDに表示された画像は、LCDへREADコマンドを送って読み取ることができますから、それをSDカードに書き込んでやることもできるでしょう。LCDの画面サイズよりも大きい解像度をサポートすることができないという制約はありますが、安価なATMEGAで自作デジカメが作れそうです。LCD表示をメモリ代りに使うなんて、うまいこと考えたもんですねぇ。どなたか、挑戦してみませんか?

最新の画像もっと見る

6 コメント

コメント日が  古い順  |   新しい順
Unknown (そら。)
2009-12-05 20:48:49
私も気になりました。

たぶん、仰る通りの方法ではないかと私も思いました。

実際に自作デジカメとなるとねぇ。

作る楽しみで終わりそう。

返信する
Re: Unknown (sirius506)
2009-12-06 02:16:14
そら。さん、

わたしはCMOSカメラのインタフェースを使いたいがために、AT91SAM9260を買ってしまったくらいなので、こんなに簡単につなげられると知ってちょっと驚きました。ハード屋さんなら、ごく自然にこういう発想が出てくるものなのでしょうか。
返信する
Unknown (そら。)
2009-12-06 08:51:11
どうなんでしよう。
私もソフト系なので、なんとも。

応用例の回路図を見ていると作ってみたくなります。

外部RAMを付けてカメラから外部RAMへ直接書き込むように出来れば低能力マイコンでもVGAで撮影出来るかもしれませんね。

返信する
Re: Unknown (sirius506)
2009-12-06 16:01:09
VGAになると、LCDも8bitパラレル接続ではなくてTTL 18/24bitとかLVDSになってしまうでしょうから、やはりRAM積むことになるでしょうしね。
Blogの写真はいつもVGAでしか撮っていませんが、VGAで充分に実用的だと思っています。
また、CMOSカメラで何か試してみたくなってきました。
返信する
Engineer (Juan Luis González)
2013-08-29 03:10:12
Hello, do you use some kind of DMA in order to display video taken by this camera in the screen, or it passes through the MCU?
返信する
Re: Engineer (sirius506)
2013-08-29 09:06:27
Hi,

Following two projects use DMA to send image data to SPI connected LCD.

http://youtu.be/jYKhIX_3XGI
http://youtu.be/I8q9fPOStbI

Below project uses OV9650 and LCD is connected through 16bit parallel interface. In this project, data is sent via MCU software controlled GPIO.

http://youtu.be/jLEHPgfWVxA

All above three projects use DMA to capture image data from CMOS camera.
返信する

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。