ぶていのログでぶログ

思い出したが吉日

最高のポインティングデバイスを求めて 〜ミニトラックボール編〜

この記事は自作キーボード #2 Advent Calendar 2018の7日目の記事です。 昨日は@ffilccooさんのキーボードカスタムについてでした。 市販のキーボードのカスタムについて書かれていて、ENDGAMEキーボードは時間と共に変化する!! これは本当にそのとおりだと思います。 昨日の記事以外にも素晴らしい記事を書かれているのですが、残念ながらジオシティーズ終了とともにサイトが消滅してしまうようです。。 消滅の前に他のサイトにお引越しされることを願っております。


こんにちは、トラックポイントオタクです! でも、今日はミニトラックボールの話をしたいと思います(ぇ

トラックポイントの悩み

私はトラックポイントがとても好きなので、すべての自作キーボードにつけたいとおもっています。 しかし、トラックポイントを自作キーボードに取り付けるには様々な課題があります。

  1. トラックポイントモジュールが単体で売っていない*1
  2. 結構基板がでかい
  3. ProMicroのピンを専有する
  4. トラックポイントキートップツライチにするには加工するしかない

私が思いついた限りではこれだけ問題があります。 これらを解決して、自作キーボードに取り付けるには様々な苦労があります*2

そこで、これらの問題を解決して汎用的に使えて自作キーボードに取り付けられるポインティングデバイス探しをはじめました。

ミニトラックボールマウスの試作

私が出会ったナイスなデバイスが、冒頭の画像にあるミニトラックボールです。 このミニトラックボールは、BlackBerryに使われていたものらしいです。 私が手に入れたモジュールは、ミニトラックボールにSTMマイコンを搭載してI2Cで通信できるものです。 私はスイッチサイエンスで購入しました*3

I2Cで通信できるので、HelixやErgoDashなどすでにI2Cを使っているPCBではそのまま接続できます。

ミニトラックボールマウス

早速このミニトラックボールとQMKを使ってマウスを作ってみました。 まだ試作中なのでブレッドボードですw

ソースはここにあります。

ミニトラックボールマウス by buty4649 · Pull Request #8 · buty4649/qmk_firmware · GitHub

ソースの解説

特に難しいことはしていないです。 rules.mkに POINTING_DEVICE_ENABLE = yes を追加してQMKのPointingi Device機能を有効にしています。 また、HelixやErgoDashで使っているi2c.c/i2c.hをコピーしてきて使っています*4

keymap.c に pointing_device_init関数とpointing_device_task関数を追加します。 前者でデバイスの初期化を行い、後者でマウスの処理を行います。

ミニトラックボールバイスとの通信はサンプルコードを参考に実装しています。 4軸のセンサーと通信を行い変化量を検出し、その量に応じてマウスの速度を決定しています。 センサーの変化量は、pointing_device_taskが呼び出される間隔が短いせいか私が試したときは0〜2でした。 それに比べて、マウスの速度の変化量は-128〜128のレンジであるため、4軸センサーの変化量をそのままマウスの速度にしても微動だにしません。 今の実装では、変化があった方向に対して50倍した値をマウスの速度にしています。

課題1: 操作性

マウスの速度の決定方法については前述したとおりです。 しかし、変化量が固定であるため、細かい操作や逆に画面端から端にマウスを移動するみたいなときに不便です。 変化量を調整するためのスイッチを新たに増設する案が思いつきますが、これはこれで不便です。 そのため、将来的には加速度を考えるようにして、改善したいと考えています。

課題2: 大きさ

実は結構大きいです。以下の写真は、なぜか手元にあった紫軸を並べています。

この画像からわかるように、キースイッチの2倍くらいの大きさがあり、適当なスイッチの代わりに配置するには大きいです。 そのため、ErgoDashにつけるときは親指部分につけようかと画策しています。

I2C通信はできないですが、ミニトラックボールだけを実装したちょっと小型なモジュールもあります(ICSH044A)。 以下の写真右側。

どちらの基板の方が使いやすいかは調査中…。 仮にICSH044Aを使う場合は、I2Cへ信号変換しないといけないので、その部分はBeetle Virtual Keyboardで作ろうと思ってます*5。 ICSH044Aはなぜか4色のLEDがついていて、その分だけ基板がでかくなっています。。 この部分を省いてより小型にならないかなぁ・・・。

課題3: I2C通信が失敗する

GROVE版の基板とProMicroの相性のせいかもしれませんが、一度I2C通信がエラーになると、電源を切るまでエラーのままです…。 エラーになったあとにi2c_reset_stateを呼び出しているけど直らずよくわからん…。

まとめ

トラックポイントの代わりとしてミニトラックボールポインティングデバイスとして利用する方法を紹介しました。 まだ、ErgoDashに取り付けられていなくて実運用にのっていないので、実際に運用をしはじめたら新たに問題が出てくるかもしれません。 その時は別途ブログで報告させてもらいます。

おまけ

この記事だけでは、自作キーボードアドベントカレンダーに投稿されている他の記事の熱量には足りない!!!!!!! っと思ったので、積んでいたHelixにトラックポイントをつけた話のその3とその4を同時に投稿しました! ご興味があれば、あわせて読んでいただけると嬉しいです 😊

buty4649.hatenablog.com

buty4649.hatenablog.com

この記事はErgoDashを使って書かれました。

*1:PS/2で通信する基板は古いThinkpadにしかついてなく供給の問題もある

*2:Helixに取り付けられたのは幸運でした

*3:今見たら在庫切れになってますね・・・

*4:当初 drivers/avr/i2c_* なライブラリが使えると思って試していたのですが、ProMicroでは使えないことに気がついて絶望した…

*5:そこそこ小さくてATmega32u4を詰んでいるので