古い光学マウスから取り出したセンサーでデジタルカメラを作る――そんなユニークなプロジェクトに65時間かけて挑んだMakerがいる。完成したカメラは30×30ピクセル、64階調グレースケールという超低解像度ながら、複数の撮影モードで撮影可能だ。
光学マウスのセンサーから画像を読み取れることは以前から知られていた。Dycus氏は何年も前に保管していたマウスのPCBを引っ張り出しカメラ製作に着手した。使用したセンサーはADNS-3090。本来はマウスの移動検出用だが、30×30ピクセルの画像センサーとしても機能する。64階調のグレースケールに対応している。
このアプローチの注目点は、センサーが通常モードでは内部処理を行い動き情報のみを出力する点だ。画像として読み取るには、センサーに特殊なコマンドを送る必要がある。読み出し速度は約90Hzに制限され、画面への描画速度を含めると20〜50Hzが実用的なフレームレートとなる。
レンズには3.5〜8.0mm F1.4のCCTVレンズを使用した。マウス用レンズは至近距離向けだが、CCTVレンズに交換することで遠方にピントを合わせられる。ズームと焦点調整が可能で、このプロジェクトにうまく適合したという。
撮影モードの工夫も面白い。単写、2連写、4連写といった通常モードに加え、「スミアショット」と呼ぶパノラマモードを実装した。これはカメラを横に振りながら1列ずつスキャンする仕組みで、垂直方向を2倍、水平方向を1倍で表示することで、横方向の時間分解能を稼ぐ。Dycus氏のお気に入りのモードだ。
露出の手動ロック、複数のカラーパレット切り替え、32KBのFRAMに48枚の写真保存、保存写真の閲覧・削除機能も備える。写真はPythonスクリプトとシリアルポート経由でPCにダウンロードできる。バッテリーは数時間持続する。
筐体設計では徹底的に小型化を追求した。2つの半分に分かれた内部はリボンケーブルで接続されている。当初は0.05インチピッチのコネクタを使おうとしたが、かさばりすぎて断念した。完成品は文字通り「ぎゅうぎゅう詰め」だという。
ソフトウェアは全てArduinoのC/C++で自作した。マイコンはTeensy LCを使用。Adafruitのライブラリを使ってOLED初期化やテキスト描画を行うが、センサーデータの描画は速度のため直接OLEDに書き込む。センサーとの通信プロトコルも自分で実装した。
UI設計も凝っている。50msごとにボタンをチェックし(チャタリングを避けつつ押下を検出できる速度)、センサーデータをRAMに保存してから画面に描画する。撮影モードに応じて表示位置とスケールを変更し、シャッターを押すと保存・削除のオプションを表示する。
低解像度でも認識可能な写真が撮れる理由について、Dycus氏はゲームボーイカメラとの比較で説明する。ゲームボーイカメラははるかに高解像度だが4色しかない。対してこのカメラは解像度が低くても64階調あることで、被写体を識別できるのだという。Dycus氏は「似たようなプロジェクトを『arduino mouse sensor』で検索すると見つかる」とアドバイスしつつ、最も重要なのはセンサーのデータシートを見つけることだと指摘している。