この記事は キーボード #1 Advent Calendar 2019 の11日の記事です。
前置き 〜私のキーボードとマウス事情〜
私は普段仕事ではCorne ChocolateをMacBook Proに乗せて使っています。
ほとんどのマウス操作はキーボードで行いますが、一部ピンチ操作が必要になる場面でMacBook Proのトラックパッドを使うというスタイルです。
MacBook Proのトラックパッドは様々な操作がシンプルに統合された画期的な入力デバイスで、多くのインスピレーションをもらっていますが、自分の場合は下記のような問題があります。
コーディング中に手に汗をかいていて、トラックパッドの反応が悪くなってしまう
手の甲がタッチパッドに当たって誤操作してしまう
-
MacBook Proの上に置いてもトラックパッドまで親指を伸ばすとちょっと遠い
(これはキーボードとトラックパッドの位置の最適化で解消する余地はありそうですが)
マウス操作もキーボードでできたら快適に操作できそうだ、と思いましたので
マウスの操作性を重視しながらファームウェアをカスタマイズしています。
なお、QMKのMouse Keys
の機能はデフォルトの動きだと操作性があまり快適に感じられなかったので、マウスポインタを質点とみなし、物理シミュレーションでなめらかにマウスを動かせるようするみたいな変更を入れてカスタマイズしています。(取り急ぎコミットのリンクだけ恐縮ですが、いずれQMK本家にPR出したいと思っています)
キーでマウスを操作する際の問題点
さて、キーボードだけでポインティングデバイスをエミュレートする場合、いくつかの問題があります。
問題1. レイヤーとキーを消費する
これは当然なのですが、ざっと考えただけでも、一般的なマウスのオペレーションをする上で、下記のキーが必要になります。
移動
KC_MS_UP
KC_MS_DOWN
KC_MS_LEFT
KC_MS_RIGHT
スクロール
KC_MS_WH_UP
KC_MS_WH_DOWN
KC_MS_WH_LEFT
KC_MS_WH_RIGHT
クリックボタン
-
KC_MS_BTN1
(左クリック) -
KC_MS_BTN2
(右クリック) -
KC_MS_BTN3
(中クリック)
移動とスクロールは、別のレイヤーにしつつ、それぞれ同じ物理キー(例: ASDW
, ESDF
や HJKL
など)を使うということも可能ですが、ボタンはドラッグ操作を可能にするのに、マウス移動と同時に押せる位置であることが求められます。
このように、マウス機能が消費する物理キーは決して少なくないため、
その分レイヤーと物理キーの組み合わせの選択肢が減ってしまうことになります。
問題2. マウスカーソル動かすたびにキーがカチャカチャなる
キーを押してマウス操作をする以上、これはある意味仕方ないのですが
騒音の問題もありますし、できれば静かな方がいいですよね
問題3. ファームウェアサイズやソースの可読性の問題
秒間60Hz, あるいは144Hzのスピードでマウスカーソルの質点力学シミュレーションを行うには、それなりに高精度な数値計算が必要になります。
そのためfloat
もしくは固定小数点数
を使う必要がありますが
float
を使うとファームウェアのサイズが肥大化したり、ProMicroのATmega32U4
はFPUを持っていないため、処理速度の懸念もあります。
また、固定小数点数の場合は、サイズや速度の懸念は少ないものの、範囲外の値で容易に計算精度が破綻したり、値の変換処理が必要となるため、ソースが煩雑になるという問題が伴います(自分のソースがこれですね。頑張って解決したいです…!)
そこで、キーボードにポインティングデバイスを搭載
上記の問題を解消するために、自分もポインティングデバイス搭載のキーボードを設計して作ってみたいと思っています。
その上で、先人の方のポインティングデバイス内蔵の試みの記事が大変参考になったので、
いくつか紹介させていただきたいと思います。
自作キーボードHelixにトラックポイントを付ける その1
自作キーボードHelixにトラックポイントを付ける その2
自作キーボードHelixにトラックポイントを付ける その3
Helix KeyboardにThinkPadのトラックポイント部品を移植するという内容です。
リセット回路の制作が必要だったり、既存のトラックポイント部品を使うと
何かとワークアラウンドが必要のようですね。
入手性の問題はありますが、トラックポイントはすごい使いやすそうですよね・・・!
Helixの親指拡張を作った
Helix Keyboardに、モジュールとしてジョイスティックを追加するというアプローチがスマートですね!