ぶていのログでぶログ

思い出したが吉日

自作キーボードHelixにトラックポイントを付ける その4

その1その2その3

書き忘れがなければこれで最後! これまでの連載でトラックポイントが動いているはず!

…なのだが、キー入力の取りこぼしが発生しているため何回かキーを打っていると入力されていないキーが出てくる。。 これによってパスワードが通らなくなったりしてかなりつらい…。 どうしたものか…。

なぜキー入力を取りこぼすのか

トラックポイント基板とProMicroの接続は、Interruptモードで接続しているというのはその2で紹介したとおりだ。 トラックポイント基板というかPS/2プロトコルが定期的にクロックを飛ばしていて、ProMicroがクロックを受けると割り込み処理が発生して信号を処理する。 キー入力中に割り込み処理が発生すると、キー入力処理はスキップされてしまい結果として、キー入力の取りこぼしにつながる。 QMKのドキュメントにUSARTモードがbestと書かれているのは、USARTではこういったことが起こらないからだろうと思った。

対処

では対処をどうするか。 解決策の1つとしては、ゆっくり打鍵するというのが考えられる。いわゆる運用カバー。 キーが入力されている時間が増えれば、割り込み処理が発生してもキー入力処理が実施される確率が高くなるため取りこぼしする可能性は低くなる。 欠点として、最高のキーボードを求めているのにゆっくり打鍵しないといけないというのは矛盾した行為になるということだw

もう1つの解決策として、無駄な割り込み処理をなくすと言う方法がある。 トラックポイントを操作していなくてもクロック信号が出ていて、これが取りこぼしに影響するなら、割り込み処理を停止してしまえばよいという発想である。

割り込み処理の無効/有効は、PS2_INT_OFF/PS2_INT_ONマクロで定義されている。 次にどこに処理を入れるかだが、私はPS/2マウスのタスクを定義している部分*1に直接書くことにした。 そして、通常は割り込み処理を無効にしておき、3回に1回割り込み処理を有効にするようにした。 このパラメータはあまり論理的根拠がなく、実運用で調整しながらこの値にした。 詳しいコードは以下を見て欲しい。

https://github.com/buty4649/qmk_firmware/pull/7

まとめ

割り込み処理の回数を制限することで、キーの取りこぼしが減り快適なタイピングが行えるようになった。 しかしこの変更は、tmk_core配下を直接書き換えていてあまりよろしくない。。 ちゃんと調査できていないのだが、マウス処理用のuser関数あたり*2をkeymaps.cに書いてその中で制御する方がより汎用性が高くなるとおもう。

その1〜その4までで、Helixにトラックポイントを付ける方法を紹介した。 この方法は、QMKを使っているほかの自作キーボードにも使えると思う。 これらの記事がトラックポイントを付けたいと思っている人の役に立てば幸運である。

*1:tmk_core/protocol/ps2_mouse.c

*2:存在していれば