2012/02/26からのアクセス回数 8000
カメラのテストをするには、画像を表示する液晶が必要です。
そこで、トラ技別冊のMARYボードの周辺機器として販売されているカラー有機EL ディスプレイ基板を使うことにしました *1 。
mbedやXPresso1768が接続でき、MARYの周辺機器もつながるMAPLEボードを使う ことにしました。
カメラの接続もMARYの拡張基板にコネクターを付けてみました。
さすがmbedですね。 検索すると、すぐにMARYの有機液晶ディスプレイとチョコっとカメラの ライブラリーが見つかりました。
デバッグができるようにmbedのローカルコンパイル環境を以下の様に整えました。
最初は、上手く接続できているか確かめるために少しずつデバッガで 動作を確認しながら進めました。
main.cppのmainの関数は以下の様になりました。
int main() {
// OLEDのテスト表示
test_oled();
oled1.locate( 0, 3 );
// カメラの初期化
OV7670 camera(
p28,p27, // SDA,SCL(I2C / SCCB)
p21,p22,p20, // VSYNC,HREF,WEN(FIFO)
p19,p18,p17,p16,p15,p14,p13,p12, // D7-D0
p23,p24,p25) ; // RRST,OE,RCLK
// カメラのリセット
oled1.printf("Camera resetting..¥r¥n") ;
camera.Reset() ;
// カメラの初期化
oled1.printf("Camera initializing..¥r¥n") ;
camera.InitQQVGA() ;
// カメラの画像を取り込む
while(1) {
myled = 1;
camera.CaptureNext() ;
while(camera.CaptureDone() == false) ;
camera.ReadStart() ;
myled = 0;
for (int y = 0; y < SIZEY; y++) {
int r, g, b,d1, d2;
for (int x = 0; x < SIZEX; x++) {
d1 = camera.ReadOneByte() ; // upper nibble is XXX , lower nibble is B
d2 = camera.ReadOneByte() ; // upper nibble is G , lower nibble is R
b = (d1 & 0x0F) ;
g = (d2 & 0xF0) >> 4 ;
r = (d2 & 0x0F) ;
if (y < 120 && x < 128)
oled1.pixel( x, y, (r << 20) | (g << 12) | (b << 4));
}
}
}
}
最初に困ったのは、カメラのリセットの途中で止まってしまうことでした。
ということなので、MAPLEボード中央のDIPスイッチを3,4をオフにしました。
それでもガメラからの設定を確認するための、処理をいれると途中で止まって しまいましたので、今回は先に進むことを優先して、設定のチェックを外しました。
画像の取り込み時間がどのくらいか分かるようにcamera.CaptureNextの前後に LEDの点滅を入れてみました。
思った通り液晶ディスプレイへの表示に時間が掛かっていました。約1.5秒に1枚の 表示です。
また、表示上下に反転しているので今回は被写体のトラ技本を逆さまにして 表示しています。
画像のピントも調整しないと上手く表示できないので画像表示機能がないと他の 処理もできないことが分かりました。
皆様のご意見、ご希望をお待ちしております。