2012/12/27

人工網膜LSIで星を撮る

ちょっと変わった製品もみつけた。

右:ポケットカメラ(M64282FP入り)  : 左 コナミ製PS2用のモーションセンサ(センサの型番不明)
中古屋でみつかるポケットカメラ(任天堂)。この"ゲーム用ソフト"の人工網膜LSIは128x123の解像度を持つモノクロイメージセンサで、低速マイコンでもインターフェース可能だ。

 製品自体も登場して14年くらい経つため、だいぶ話題から周回遅れだが…

 今回このセンサを使ってみて、普通ならロボットの視覚として高フレームレートを目指すところだけど、シャッター速度をかなり遅くできたので、逆の方向、長時間露光をテーマに撮影実験を行った。

 はたして、105円(税込)の視覚センサとArduinoで星は写せるのか。

M64282FP
自作のC基板Arduino互換機にシールドをつけて、カメラを配線している。
コードは、このサイトのものを参考にしている。
 http://www.bot-thoughts.com/2010/04/gameboy-camera-prototyping.html

シリアルで出てきた8ビットのグレースケール画像をBMP変換するという流れ。

人工網膜チップのPDF資料で、レジスタ設定などをひと通り確認できる。

レジスタ一覧 (Excel)

作って3年くらい経つ基板
普通に撮影した画像


露光時間を延ばす

 データシートには設定可能な露光時間が記載されていて、
C1レジスタを操作することで、最大1秒まで露光できるとある。
 ただし、これはクロックに500kHzを入力した場合の秒数らしいので、供給するクロックを下げると延びてゆく。 まだ50秒程(18kHz程度?)までしかテストしていないけど、もっと伸ばせるらしい。

一つ問題として、先ほどのコードでは逆に直射日光下での撮影は厳しい。
レジスタの設定も、露光時間を減らすと、ある時点で同期が取れていないような絵が撮れる。

ロジアナで測定してみた。

A/D変換にかかる遅延により、読み出し時はクロックがかなり間延びしているが、これ自体はあまり問題ないらしい。 てっきりどこも同じクロックを入力する必要があると思っていた。

問題の露光時にArduinoが出力するクロック出力速度は、合間のif文の処理時間などにより、200kHz程度までだった。

Arduinoだけだと明るい場所は減光フィルタでも入れたほうが良さそうだ。



 露光に関するパラメータとして、素子のゲインも調整できるが、上げすぎるとコントラストが失われるので、設定は半分程度までにする。

星の撮影だが、屋上にUSBデバイスサーバを設置してあるので、基板を外に設置しても、温かい室内でプログラムの修正と画像取得ができる(重要)
センサを南の方向、仰角80°程度に固定して、撮影エリアは移動せずに検証した。


明るい星を狙って、月の下にあるオリオン座と大三角の方角にレンズを向けた。 月があるので、あまり露光時間を上げられない。

30秒露出の画像。 写真はコントラスト修正後のものを、ニアレストネイバー法でピクセルを保ったまま4倍してある。
 上部に月の光が入射しているが、明るい輝点が3つ確認できる。下の滲んだ点がシリウスで、上の2つはオリオン座のベテルギウスとリゲルだった。   意外と映る。



少し時間が立って、星が動いてきた。 シリウスがはっきり確認できる。 一応星座として結んでみた。  星は映るが、128x123ピクセルしか無いので、ピクセルの境界に星がある場合は減光が確認できた。 1等か、ピクセルの位置が調度良かった2等星が映っていることになる。


実際の画像はこのような大きさ。



更に時間が経過して、大三角が見える位置になった。 下に雲が写っている。45秒露出。
シリウスは全天で月につぐ明るさがあるため、安定して写っている。


反転させる。 シリウスとベテルギウスは見やすいが、プロキオンがうっすらとしていて見えづらい。


一応、冬の大三角とオリオン座がこのような画角で撮れていた。
条件としては、月明かりもあり、あまり理想的ではなかったが。 意外と簡単に撮れた。
細かい星については、解像度が足りないということもあり、あまりはっきりとした像を捉えられていない。 数枚とって合成する手法が使えるかもしれない。

標準的な人工衛星では、太陽の向きでおおよその姿勢を把握してから、高度な姿勢決定のためにスタートラッカというセンサを使う。 カメラで星を撮像し、メモリに蓄えた恒星マップで画像推定を行い、どの方角を向いているのかを調べることができる。 今回作業していて、その作業をなぞったような気がした。

工夫すれば、この人工網膜LSIでも同じことができるかもしれない。写すのに結構時間がかかるのと、画素数、画角などの問題があるけれど、明るい光源に対してはある程度形状把握ができるので、2次元PSDセンサの代わりに太陽/地球センサとして使えるかも。

 このセンサは解像度は低いけど、幅広いシャッター速度で撮影可能なカメラモジュールとしては最もお手軽だと思う。 今回は試していないけれど、2値化やエッジ処理など、レジスタには面白そうな機能が沢山あるので、小ピンな32ビットマイコンも増える中、画像処理の方向で再び使うのも面白いかもしれない。

 とりあえず星が撮れるArduino互換機でした。   もっとポケットカメラ集めとこう…