EdisonにCMOSカメラモジュールを繋げてみました。
使用したのはOV7670+FIFOカメラモジュールです。
Edisonの3.3V出力で動かせそうだったのと、割とネットに情報が多かったので購入してみました。
回路
Edisonの論理レベルは1.8Vで、OV7670は3.3Vなので、そのまま接続出来ないため、次の電圧レベル変換モジュールを使いました。
・I2Cバス用双方向電圧レベル変換モジュール(PCA9306)
・8ビット双方向ロジックレベル変換モジュール × 2
『I2Cバス用双方向電圧レベル変換モジュール』は標準でプルアップ抵抗が付いていますが、Edisonは自前でプルアップしているので不要です。加えて、OV7670+FIFOモジュールもSDAはプルアップされているので不要です。
したがって、『I2Cバス用双方向電圧レベル変換モジュール』でプルアップが必要なのはOV7670+FIFOモジュールのSCL線だけなので、それ意外は裏のジャンパ(J3,J4,J5)を切って下さい。
ブレッドボード上に繋げていったらごちゃごちゃしてきました(´・ω・`)
ハマったところ
・OV7670のSCLはプルアップが必要
上記の通りです。
・GP135ではロジックレベル変換モジュールが使えない?
GP135はbreakout boardのFTDI UARTに接続されているため、ロジック変換モジュールと接続すると回路的におかしくなって入力が取れないようです。
※ハードに関しては全然詳しくないのでよく解りませんが、波形がぐちゃぐちゃになってしまいました。
・MRAAではGP111はGPIOとして使えない?
GP111(MRAA Num=9)をGPIOとして使用するとプログラムがAbortで強制終了する。
Using GP111 as input?
・配線が長いとノイズ(特にRCK)がのって上手く画像がとれない
配線が長すぎるとノイズが乗るようで、上手くデータが読み取れず、水平同期がとれていない様な画像になってしまう。
失敗例
プログラム
OV7670+FIFOのドライバプログラムについては、検索すると割とたくさんあるので割愛します。
特に下記が参考になりました。
Linux/driversmedia/i2c/ov7670.c
トラ技 頒布カメラB(OV7670 FIFO AL422B)の動作確認
特にOV7670のレジスタ設定については、公式のドキュメントがさっぱりなので、ネットに挙がっているものを多いに参考にしないとまともに動きません。
動かない場合は、まずはOV7670をカラーバー表示にしてレジスタ設定が悪いのか、ドライバプログラムが悪いのか切り分けながら進めていかないと間違いなく暗礁に乗り上げます。
表示方法は
COM17(0x42)に0x08を書き込む
ハマったところ
・電源を入れなおさないとレジスタ設定が反映されない場合があるかもしれない?
謎ですが、いくらレジスタ設定しても動作が変わらないのに電源入れなおすと反映されることがあった。(…ような気がする)
・レジスタ設定を連続で書き換えるとたまに書き込みミスがおこる
書き込み間隔にある程度待ち時間を設定してあげる必要があるっぽい。
・レジスタ設定が謎すぎる
いろいろ設定できるようですが、どこをどう弄ればいいのか解らない…。
・GPIOはuseMMapを有効にしないと遅い
RCLKを高速で出力する時必要
QVGA – Bayer RAW画像 → OpenCVでJPGに出力した結果
蛍光灯が付いた明るい部屋で撮影したのですが、かなり暗い…。
レジスタ設定が悪い気がしますがどう直したものか。
今回はここまで。とりあえず動かすことはできたと言ったレベルです。
あとがき
安くカメラモジュールを使おうとしたら、かなりハマってしまった。
こんなことならWebカメラ買えば良かったかも(´ヘ`;)ウーム…
追記
レジスタ設定についてのマニュアルがありました。
これで色々いじれそうです。
https://www.fer.unizg.hr/_download/repository/OV7670new.pdf