問題の1つを解決するために、紙の表面の小さな領域の画像を非常に近い距離からプログラムで受信して処理する必要がありました。 通常のUSBカメラを使用していて、電子顕微鏡用の店舗までの道のりの半分では、質の良いものを受け取っていなかったので、コンピューターのマウスなど、さまざまなデバイスがどのように配置されているかを教えられた講義の1つを思い出しました。
準備といくつかの理論
現代の光学式マウスの動作原理については詳しく説明しません。 ここで詳しく説明します (一般的な開発のために読むことをお勧めします)。
このトピックに関する情報をグーグルで調べ、古いLogitech PS / 2マウスを分解すると、インターネット上の記事からおなじみの写真を見ました。
「第1世代のマウス」の非常に複雑なスキームではなく、中央の光学センサーとPS / 2インターフェイスチップがわずかに高くなっています。 私が手にした光学センサーは、「人気のある」モデルADNS2610 / ADNS2620 / PAN3101のアナログです。 彼らとそのアナログは同じ中国の工場で大量生産され、出力で異なるマーキングを受けたと思います。 さまざまなコード例と一緒にでも、そのドキュメントは非常に簡単に見つかりました 。
このセンサーは、毎秒1,500回までこのセンサーが18x18ピクセル(解像度400cpi)を測定する表面の画像を受け取り、それを記憶し、画像比較アルゴリズムを使用して、以前の位置に対するXおよびY座標に沿った変位を計算すると述べています。
実装
「センサーとの通信」には、人気の高いArduinoコンピューティングプラットフォームを使用し、チップの脚に直接はんだ付けすることにしました。
5VとGNDを対応するArduino出力に接続し、SDIOとSCLKセンサーのレッグをデジタルピン8と9に接続します。
座標のオフセットを取得するには、0x02(X)および0x03(Y)でチップレジスタの値を読み取る必要があり、画像をダンプするには、最初に0x08で値0x2Aを書き込んでから、そこから同じ18x18回読み取ります。 これは、光学センサーからの画像輝度マトリックスの最後の「記憶された」値です。
Arduinoでこれをどのように実装したかは、 http : //pastebin.com/YpRGbzAS (合計で約100行のコード)で確認できます。
また、画像を取得して表示するために、Processingでプログラムが作成されました。
ここのソース: http : //pastebin.com/XqGyP5EA
結果
プロジェクトのプログラムを少し「仕上げ」た後、光学センサーから直接画像を取得し、必要な計算をすべて行うことができました。
表面のテクスチャー(紙)と、その上にある個々の文字にさえ気づくことができます。 このマウスモデルの開発者は、センサーの真下に小さなレンズを備えた特別なガラススタンドをデザインに追加したため、このような鮮明な画質が得られることに注意してください。
数ミリメートルでもマウスを表面から持ち上げると、明瞭さがすぐに消えます。
突然自宅でこれを繰り返したい場合は、PS / 2インターフェイスを備えた古いデバイスを探して、同様のセンサーを持つマウスを見つけることをお勧めします。
おわりに
結果の画像はそれほど大きくありませんが、これで問題を解決するのに十分でした(バーコードスキャナー)。 非常に経済的で高速であることがわかりました(〜100rのマウス+ Arduino +コードを書くのに数日かかります)。
この問題を解決するのに非常に役立つ資料へのリンクを残します。 それは本当に難しくはなく、とても喜んで行われました。 現在、高解像度で高品質の画像を取得するための、より高価な最新マウスのモデルのチップに関する情報を探しています。 おそらく私は顕微鏡のようなものを組み立てることさえできるでしょう(現在のセンサーからの画像の品質は明らかにこれには適していません)。 ご清聴ありがとうございました!
理論
http://www.ixbt.com/peripheral/mice-sensor.shtml
同様の仕事
http://spritesmods.com/?art=mouseeye&page=1
http://www.bidouille.org/hack/mousecam
ドキュメント
http://www.avagotech.com/docs/AV02-1184EN
ソースコード
http://pastebin.com/YpRGbzAS
http://pastebin.com/XqGyP5EA
09/23からのUPD : arduinsのレンズとピン番号に関する情報を追加しました。