スキップしてメイン コンテンツに移動

人工網膜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互換機でした。   もっとポケットカメラ集めとこう… 

Popular posts

Arduino Nano Everyを試す

 秋月で売っていたAtmega8と、感光基板でエッチングしたArduino互換ボードを製作してみて、次に本家ボードも買って…  と気が付いたら10年が経過していた。  ハードウェア的な観点では、今は32bitMCUの低価格化、高性能化、低消費電力化が著しい。動作周波数も100MHz超えが当たり前で、30mA程度しか消費しない。  動作電圧範囲が広く、単純な8ビットMCUが不要になることはまだないだろうけど、クラシックなAVRマイコンは値上がりしており、価格競争力は無くなりつつある。 そしてコモディティ化により、公式ボードでは不可能な値付けの安価な互換ボードがたいていの需要を満たすようになってしまった。     Arduino Nano Every https://store.arduino.cc/usa/nano-every https://www.arduino.cc/en/Guide/NANOEvery  そんな中、Arduino本家がリリースした新しいNanoボードの一つ。  他のボード2種はATSAMD21(Cortex-M0+)と無線モジュールを搭載したArduino zero(生産終了済み)ベースのIoT向けボードだが、 Nano EveryはWifi Rev2と同じくAtmega4809を採用していて、安価で5V単電源な8ビットAVRボードだ。  Atmega4809はATmegaと名がついているが、アーキテクチャはXMEGAベースとなり、クラシックAVRとの間にレジスタレベルの互換性は無い。   https://blog.kemushicomputer.com/2018/08/megaavr0.html  もちろん、ArduinoとしてはArduinoAPIのみで記述されたスケッチやライブラリは普通に動作するし、Nano Every用のボードオプションとして、I/Oレジスタ操作についてはAPIでエミュレーションするコンパイルオプション(328Pモード)がある。 公式のMegaAVR0ボードはどれもブートローダーを使わず、オンボードデバッガで直接書き込みを行っている。  ボードを観察してみると、プログラマ・USBCDCとしてATSAMD21が搭載されている(中央の四角いQFNパッケージ)MCU的にはnEDBG

【サボテン】太陽電池の結線

 久しぶりにサボテン計画。 忙しかったり投薬治療直前でだるかったりして、かなり放置していた。 さぼてんも不機嫌そうだ。 せっかくなので、園芸用の水受けに移す。  関節痛で寝込んでる間に、エイプリルフール終わってましたね^^・・・。  太陽電池の展開機構を想像したが、まずは太陽電池の結線を済ませよう。  配線を綺麗にまとめたくていろいろ探していたら、千石電商でぴったりなものを見つけた。 LEDリング基板 というらしい http://www.led-paradise.com/product/629?  本来はチップLEDをリング状にまとめる代物。 イレギュラーな使い道だ。   今度は小径のを買って、GX200のリングライトに仕立て上げよう。   嬉しいことにフレーム径にジャストフィット。 配線を綺麗にまとめられた。   太陽電池の接続部。逆流防止用にショットキーダイオードを入れている。 かなりスッキリ。 蛍光灯下 500ルクスでの実験。 EDLCは10Fを使用。  ちゃんと充電が行われている。 といっても、とてもとてもゆっくりとだけれど・・・。

GPSアンテナをつくる

GPSアンテナを作ってみた。 1575MHzの波長は約19cmなので、半波長で9.5cmとなる。 GHz帯とはいえ、結構長いものだなぁ。 セラミック等の誘電体がなければ、平面アンテナで真面目に半波長アンテナを作ろうとすると手のひらサイズの面積が必要になってしまう。 普通のダイポールだと指向性があるので、交差させてクロスダイポールにする。 屋外地上局のアマチュア衛星用アンテナの設計をそのまま縮小したもの。 水平パターンはややいびつ 92.2mmの真鍮の針金(Φ=0.5mmくらい)を2本用意して、42.3mmで90°に曲げる。 長さの同じ素子同士を並べて配置する。 (全長が半波長より長い素子と短い素子が交差した状態) 片方をアンテナ信号線、もう片方をGNDにつなげば完成。 実際5分くらいでつくったけれど、果たしてどうだろうか。 今回は、道具箱に眠っていた表面実装タイプのMT3339系モジュールに取り付けた。 アンテナはもともと3x1.2mm程度のとても小さいチップアンテナで、 LNAが入っているけど感度が悪かったのでお蔵入りしていた代物。 最近の携帯機器はみなアンテナに厳しい。 さて・・・ クロスダイポール版モジュールをPCでモニタしたウインドウ(左)と、QZ-Rader画面 東側に建物遮蔽があるので、そちら側の衛星はSNが悪い。 とりあえず補足できた衛星数はシミュレーションされたものとほぼおなじだった。 アンテナの角度をいろいろ振って、逆さまにしてもロストすることはなかった。 セラミックのパッチアンテナレベルにはなったかな・・・。 簡単にできてそれなりに測位するけれど、携帯性は皆無になった。 あと、近接周波数の干渉を受けやすいかもしれない。 GPSアンテナのDIY例としては、QFHアンテナもある。 ラジオゾンデなどで使われている例がある。 いつもお世話になっているQFHアンテナ計算シートのサイト https://www.jcoppens.com/ant/qfh/fotos_gps.en.php ヘリカルアンテナは加工精度の難易度が上がるので、今回はクロスダイポールにした。 GNSSとなると、複数の周波数のために調整されているセラミックパッチアンテナが有利だと思う。 セラミックパッチア

ATmega4809(megaAVR0)を試す

megaAVR 0という新しいAVRシリーズを試してみた。  小さいパッケージなのに、UARTが4本もあるのが気になったのがきっかけ。 登場すると噂の Arduino Uno Wifi rev2  にも採用されるらしい。  簡単にデータシートを眺めてみると、アーキテクチャはXmegaシリーズを簡素化し、動作電圧範囲を広げたもののようだ。  CPUの命令セットはAVRxtと新しくなっているが、Xmegaで拡張された一部の命令(DESやUSBで使われる命令)が削除されていて、基本的に今までのATmegaとほぼ同じだ。  コンパイラからは、先に登場した新しいtinyAVR0, tinyAVR1シリーズと共にAVR8Xと呼ばれて区別されている。  CPU周りを見てみると、割り込みレベルなど、今までのクラシックなATmegaで足りないなと思っていたものがかなり強化されていた。 ArduinoAPIを再実装するとしたら便利そうなペリフェラルもだいたい揃っている。 データシート P6  DMAは無いけれど、周辺機能にイベント駆動用の割り込みネットワークが張り巡らされているのがわかる。  できるだけCPUを介在させない使い方がいろいろ提案されているので、アプリケーションノートやマニュアルを読み込むことになる。 ピックアップした特徴 ・データメモリ空間(64kB)に統合されたFlashROMとEEPROM ・RAM 6kB ROM 最大48kB (メモリ空間制限のため) ・デバッグ専用の端子 UPDIを搭載 ・優先度付きの割り込み(NMIと2レベル) ・ピン単位の割り込み(かなり複雑になった) ・リセットコントローラ(ソフトウェアリセット用レジスタが実装され、リセット原因が何だったかもリセット後に読み出せるようになった) ・豊富な16ビットタイマ(4809では5基) ・16ビット リアルタイムカウンタ(RTC) ・豊富な非同期シリアル/同期シリアル(USART 4ch、SPI 1ch,TWI 1ch) ・内蔵クロックは最高20MHz(PLL)と32kHzの2種類。外部クロックは発振器と時計用水晶のみ ・ADCは10bit 16ch ・内蔵VREF電圧が5種類と多い(0.55V,1.1V,1.5V.2.5V.4.3V