金曜日, 12月 6, 2013

デモシステム更新(カメラ制御)

しばらく間が空いてしまいましたが、デモシステムを更新します。ダウンロードリンクは前回のデモと同じ(relm_demo.jar)になります。

基本的に前回のデモ内容は全て含まれていますが、回路の変更によりソフトウェアの互換性はありません。今後この新しい回路の仕様に基づいてリファレンスを公開していく予定ですので、その点ご容赦ください。

最も主要な追加デモはCMOSセンサカメラの制御ですが、その他にもSVGA解像度(800×600)への対応やウォームリセット機能が追加されました。また、JTAG通信仕様の変更により、画像の転送が少し速くなっています。

デモ用ソフトウェアは以下になります。

reset.rb
ウォームリセットを実行します。実際にはコア戦争のVampire(またはpit-trapper)のように、メモリ全体をジャンプ命令で埋め尽くして全てのスレッドの捕獲を試みます。もしうまく捕獲できなかった場合にはLEDが点灯したままになりますので、そのときは「Config FPGA」でコールドリセットを実行してください。

vga.rb
SDRAMの内容をVGA(640×480, 60Hz)出力します。外付けの出力回路は前回の記事を参考にしてください。「Send Image File…」または「Send Image URL…」で画像データをSDRAMに書き込むことができます。

svga.rb
SDRAMの内容をSVGA(800×600, 72Hz)出力します。モニタによっては対応してないかもしれません。解像度を切り替える場合は、一旦ウォームリセットを実行してください。

gsensor.rb
加速度センサで画面出力をスクロールします。予めvga.rbかsvga.rbのどちらかを実行しておく必要があります。メモリ上に2048×2048ピクセルの仮想画面があり、その中で表示位置を移動します。ボード上のボタン操作でスクロール方向を反転させることができます。(KEY1: 通常, KEY0: 反転)

led.rb
LEDをランダムに点滅させるプログラムです。DE0-Nano本体のみで実行が可能です。

camera.rb
CMOSセンサカメラの画像をリアルタイムで画面出力します。予めvga.rbかsvga.rbのどちらかを実行しておく必要があります。CMOSセンサのデータはYUV形式で受け取れますので、色変換とディザ表示のために、残る全てのスレッドを消費して強引に高速実行しています。残念ながら、DE0-NanoにはSDRAMが一つしか載ってないので、表示のための読み出しと書き込みが同時にはできません。そのため、昔のVRAMのようにメモリ書き込みの際に表示読み出しをしないので、黒いノイズが入ってしまいます。ボード上のKEY0を押すと、垂直ブランク期間中にのみ書き込みを行うモードとの切り替えを行いますが、ノイズが消える代わりに表示速度が低下します。KEY1は簡易肌色検出モードの切り替えになります。

IMG_3955.jpg

外付けのCMOSセンサは、aitendoのカメラモジュール(OV9655)を利用します。ピンアサインはこのモジュールに合わせてあるので、同じくaitendoのピンヘッダ変換基盤を利用すれば、あとはピンソケットを2つ付けるだけで面倒な配線は全く不要になります。カメラの向きの関係でピンソケットの片方をL型にする必要がありますが、どちらをL型にするかで違った形のカメラ装着が可能です。

IMG_3957.jpgcamera_circuit.png

このデモではカメラ入力を直接画面に表示していますが、例えばこのカメラをロボットの制御に応用する場合、画面表示の代わりに画像認識やモータ制御を行うことになります。画像認識にちょっとした顔検出アルゴリズムを組み込めば、顔の方に寄って来るロボットが作れたりします。こういった多数のセンサやアクチュエータを同時制御するロボティクス応用において、このプロセッサはまさに打って付けであるといえます。