2014/04/18

マウスのLoD調整

マウスを持ち上げて反応しなくなる高さはマウスの種類によって微妙に異なります。
要するにLoDと呼ばれるパラメータなのですが、今回はLoDを簡単に調整する方法を紹介します。

対象はセンシング用の発光装置がLEDであるマウスです。
レーザーセンサーの場合、レーザーの照射光がセンサーのパッケージに付いているので照射位置の差が無く、この方法は使用できません。


1.リフトオフ判定について
・Lift Detection Cutoff Algorithm(リフト判定のカットオフアルゴリズム)
Avago社はリフトオフ判定についてのExampleを用意していて、すごく大まかにいうと以下のような感じです。
 
「ピクセルアレイの平均光量÷シャッター時間 が一定値以下」かつ、「SQUAL(センサーが可視可能な特徴の数)が一定値以下」である場合には、USBで転送するXとYの移動量を0とする。

このアルゴリズムによってMCUがリフトオフ判定を行っているとすると、意図的にLoDを増減することが可能であることが分かりますね。実際の所、各社から発売されているマウスのMCUのアルゴリズムはもう少し高級かもしれませんが、大枠ではこのような感じでしょう。

2.ユーザーが意図的にLoDを調整する方法
原理的にはこんな感じの図になります。
(かなり省略した図。純正レンズでの詳細な光路の例はデータシートの"Design considerations for improving ESD Performance"に書いてあります。)

何もしていないDefaultの状態でマウスを持ち上げるとこんな感じの光路になります。
Default

ちょっとした小細工(後述)をするとこんな感じの光路になります。
Fixed

このように、センサーが監視している範囲のLED照射を無くし、意図的に暗くします。こうすることでセンサーに入射する光量を減らします。光量が減少したことにより、ピクセルアレイの平均光量とSQUALは減少、シャッター時間は増加します。これによってセンサーに「リフトオフした」と誤認させる事ができます。

単純に光量の少ないLEDを導入するのに比べると、この手法のメリットはリフトオフしてない場合の光量はあまり減らないことです。このことによって通常時のトラッキング性能のある程度の維持が期待できます。

3.光路を修正する方法
遮った光の反射がセンサーに入るのを避けるために出来るだけマット(粗い)な黒い物を遮蔽物として図のように貼付します。黒い画用紙などが良さそうです。

・貼付箇所について
塞ぐ面積が大きくなれば(レンズに近づければ)より光量は抑えられますが、トラッキング性能が低下したり、常時リフトオフの判定をされたりする可能性があるので、貼付位置をよく調整することが必要です。



5 件のコメント:

  1. はじめまして
    すごくInformativeな記事を立て続けにお疲れ様です。
    レンズマスク関係の投稿で原理と方法がここまでまとめられているものは他に見たことがありません。
    OCForumに巣食っているマウスマニア達が見たら泣いて喜びそうです:p

    一つだけ素朴な疑問ですが
    記載のカットオフアルゴリズムについて
    例えばレジスタでAGC無効になっておりMaxShutter時間が固定値としてあるファームウェアだった場合でも
    問題なく機能するものなのでしょうか?
    というのもsystemaさんからすると極めて稚拙な実験で恥ずかしい限りですが
    過去色々なマウスのLEDの光量を変えてみて、Liftoffの変化具合がどうなるか試してみたことがあり
    その時同タイプのセンサー&レンズを積んでいるマウスでも
    LEDの光量変化によってLiftoffが大きく変化するものとそうでないものが存在しました。
    この辺りがファームのカットオフアルゴリズムの違いからくるのか
    センサーレジスタ設定の違いからくるものなのか疑問で悶々としており
    systemaさんなら何かお解りになるかと思って質問させて貰います。

    長々と失礼しました。
    センサー実験などを追わせてもらってから
    Avagoセンサーについて大きく勘違いしていたことが色々と解っていつも勉強させて貰っています。
    今後も興味深い検証期待しております:)

    返信削除
    返信
    1. rafaさん
      コメントありがとうございます。いつも見ているブログで紹介して頂けるというのは良いものです:D

      >レジスタでAGC無効になっておりMaxShutter時間が固定値としてあるファームウェアだった場合でも問題なく機能するものなのでしょうか?

      (確実なことはわからないので、予想なのですが)このアルゴリズムに関して言えば、シャッター時間は一定値になり、PIX_ACCUMとSQUALは減少すると思うので一応動くのかな、と思います。Shutter値は一定ですので、ちょっと判定が鈍くなるでしょうか。

      また、Shutter時間がAutoの条件でも、レンズから数ミリ浮かせると光量不足で特徴点を見つけられず、⊿X、⊿Yは自然と0になりますので「プログラム側でカットオフしないマウスも極普通に普及している可能性があるかも?」と考えています。
      (ADNS-5090の場合は{SHUT_H * 256 + SHUT_L}が440に張り付いているので、シャッター時間を最大値にしてもなお十分な光量が得れず、暗すぎて特徴点を見つけられていない状態だと思われます。)

      光量を減らしてもLoDが短くならないのはセンサが自分で調整しているか、MCU側がレジスタを読んでセンサのレジスタに適切な値を書き込んでいるからだと思います。
      逆に、光量によってLoDが変わるマウスの場合は、マウスが調整出来る上限を超えたくらいに光量が小さいかそもそも調整機能が無いか、のどちらかでしょうか。

      光量によるLoD変化の原因がレジスタの設定かMCU側のアルゴリズムなのかは自分には分かりかねます。直感的にはマウスパッドへの相性問題を考えるとNAGCでShutter値一定はあり得ないですね。多分Shutterの最大値がそこそこ低めに与えられている、とかでしょうか。
      確実に確認するなら、動いてるセンサーに自前のMCUの端子を貼り付けてレジスタの値を無理やり読み出すくらいしか確認する方法が無いような気がします。

      また、Z軸方向のセンサと滑走面との距離によって変化するパラメタは複数ありますので、カットオフの判定は(実用性は置いておいて)様々な手法があると個人的には思っていますし、市場の商品はもう少し高度なアルゴリズムで判定しているかもしれません。ここらへんのアルゴリズムと境界値の決め方はメーカがラインナップしているマウスパッドへの対応などの事情に大きく依るのではないかと推測しています。

      削除
    2. 漠然とした質問に詳細なご返答ありがとうございます。
      私では完全には理解できませんがとてもためになります。色々と腑に落ちることばかりです。

      とりあえずNAGCでShutter値固定の設計はあり得ないということですね・・・
      LEDによってLoD変化が大きいマウス、私が試した中で具体的にはDA3.5GやAbyssusですが
      仰られるような調整機能が無いマウスに属しそうですね。
      私は大きな誤解をしていたようで、Shutter時間やFrame時間の動的コントロールは
      パフォーマンス重視の設計だと使わない方が良いものだと思っていました。
      そのために両方レジスタで切れるようになっているものだと。
      しかし様々な種類の滑走面で、特徴点の数を最適な値に保つためには
      必要な機構ということですね。

      実際にセンサーを動かしてフレームキャプチャやレジスタ読み取りまで実装されている
      systemaさんのスキルが羨ましい限りです:o
      例えば超高輝度のLEDを大電流で動かし
      なおかつ滑走面が光沢ありの白色といった露光オーバーが起こりそうな極端な条件にすると
      実際のSQUALやPixel_Sumの値がどうなるのか
      Shutter時間&Frame時間のオートコントロールの働き具合はどういう感じなのか
      素人ながらにとても興味出ましたが、私は実際に確認することができないので悲しさいっぱい:(

      少し話が逸れますが、一部のマウスに
      マウスパッドとの相性を数値で判定する機能がついているものがありますけど
      あれは特徴点の数で良い悪いを判定しているのでしょうかね?
      そっちも素朴に疑問でしたが
      メーカーに質問しても無視されるでしょうし
      SQUAL値を使って単純な判定をしているのだろうと思い込んでいました。
      しかしこれも実際のところ全くの見当違いかもと・・・

      取りとめも無く長文失礼しました。

      削除
    3. 相性判定といいますと、rafaさんが記事にされているCorsair M90のテストでしょうか。
      あの結果を見た時は、SQUALを適当に1~5の数字に丸めているんだろうなぁと思っていました。

      Number of features = SQUAL register value *4 [3090のデータシートより]
      つまり、SQUAL∝特徴点の数 になりますので、意味的には特徴点での判定とSQUALは同じだと当方は理解しています。

      センサーの仕様を見る限り、SQUAL以上にTrackingにクリティカルに影響しそうなパラメタは無いのでやはりSQUALの値なのではないかと思います。

      削除
    4. そうです。大分前にM90で実験しました。
      (systemaさんが見られても面白いような記事ではありませんが・・・)
      合成樹脂だと高く、布系だと低いという
      ハッキリとした傾向が見られたため
      あながちデタラメな算出をしているようではないと感じていました。

      やはりSQUALを元にしている可能性が高いのですね。
      色々と腑に落ちました。ありがとうございます。

      余談となりますがADNS-9xxxの世代になると
      Lift_Detection_Thrというレジスタを持つようになっていますけど
      systemaさんが上げられたようなカットオフコードを固定機能として内臓してしまい
      そのパラメーターをレジスタで触れるようにしてあるのですかね。
      ファームを書く側から見るとハイエンドのほうが便利そうだなぁと。

      削除