見出し画像

nubkey_moduleについて

今回はnubkey_moduleについてです。

nubkey_moduleとは

パレットシステムのよっぴさんが開発された、磁器スイッチの軸ブレを利用したマウスです。軸ブレをマウスのように扱うために、ホールセンサーを4つ十字に並べているのが特徴です。

マウスとしての使用感

このモジュールはキーボードの中の1キーとして組み込んで、そのキーがマウスとしての役割も果たす、という使い方を想定していると思われます。

非常に面白そうなモジュールで、アイディアに共感して購入させていただきましたが、なかなか触ってみると難しいと感じる部分があります。

1.キースイッチとセンサーの位置関係がとてもシビア

この点はよっぴさんも設計上の注意として挙げられていますが、かなり設置位置がシビアです。問題なのは、初期位置のキャリブレーションで対応できる範囲も狭い点です。

0.数mm単位で使用感が変わってしまうとのことで、私の手元の環境では、どうしても4方向中の1方向だけマウスカーソルの移動が難しい状態になってしまいました。(ThinkPadのトラックポイントの初期位置が偏って動かしにくくなった状態、というと伝わる人もいるかと思います)
これはハードウェア的・ソフトウェア的なキャリブレーションでどうにかなる気もするのですが、キーボードへの組み込みを考えた時に設計がだいぶ難しいと感じています。というのも、トッププレートをしっかりとネジで固定する機構にしつつ、ある程度調整幅がとれるようにバカ穴で設計し、それでいて運用中に位置が簡単にずれないようにする必要があるわけです。
あとは、私の環境でどうしても良い位置に調整ができていないので、各ホールセンサーの値をコンソールに出力しつつ、磁石がしっかりと中心に位置するよう調整できるように、キャリブレーション環境を整える必要がありそうです。この点は、モジュール制御のマイコンであるATtiny424自体をいじらないと難しいのかと思われます。モジュール化してQMKからI2C通信でマウスとして扱えるようになっているとはいえ、ある程度マイコンの知識が深くないと取り扱いは難しいという印象でした。

2.使えるスイッチが限定されている

これは主に動作確認がとれているという点でGateron KS-20しか対応していないのだと思われます。ホールセンサー自体は、原理的には軸に磁石が付いていれば反応するはずなので、個別にキャリブレーションは必要だと思いますが、他のものも使えるのではないかと思われます。なので、今後より良い磁器スイッチが出た時に乗り換えられるかというと、おそらくできるのではないかと楽観視しております。

自分なりの使用方法の模索

さて、今回購入したは良いもののマウスとしての使用感はちょっと厳しい印象だったので何か良い使い道はないかと考えてみました。
1方向のカーソル移動が厳しい状態でも、4方向の検知自体はできているので、いっそのこと1キーで4方向の矢印キーを内包する、矢印キーマクロパッドにできないか、と考え至りました。
おそらくもっと良い実装方法はあると思うのですが、今回はqmkのquantum/pointing_device/pointing_device_drivers.cを直接編集してみました。

矢印キーのキーコードをkeycodes.hから、またキーが押された状態を再現するのにaction.hからtap_codeを、またキーが押される間隔の調整のためにutil/delay.hから_delay_msを使いました。

#include "action.h"
#include "keycodes.h"
#include <util/delay.h>

たどっていくと分かるのですが、nubkey_moduleはpimoroniトラックボールとして動作するので、pointing_device_drivers.cのpimoroni_trackball_get_report関数の中でマウスイベントが処理されています。

                    //mouse_report.x = pimoroni_trackball_adapt_values(&x_offset);
                    //mouse_report.y = pimoroni_trackball_adapt_values(&y_offset);
                    x_move = pimoroni_trackball_adapt_values(&x_offset);
                    y_move = pimoroni_trackball_adapt_values(&y_offset); 
                    if  (x_move>threshold) {
                        tap_code(KC_RIGHT);
                        _delay_ms(100); 
                    } else if (x_move<-threshold) {
                        tap_code(KC_LEFT);
                        _delay_ms(100); 
                    } else if (y_move>threshold) {
                        tap_code(KC_DOWN);
                        _delay_ms(100); 
                    } else if (y_move<-threshold) {
                        tap_code(KC_UP);
                        _delay_ms(100); 
                    }

今回は力業でマウスイベントを返す部分をtap_codeによるキーコード発行に置き換えました。

nubkey_moduleの矢印キー可化

とりあえず動いています。ただ、本来はnubkey_moduleをI2C通信するIOエキスパンダーとして扱って、matrix_scanをカスタマイズするようにした方がキーのカスタマイズなども楽ですし実用性が高いと思います。私はQMKもマイコン制御も勉強が足りないのですが、しばらくこの方向で研究してみようかと思っております。

さいごに

マウスモジュールとして生み出されたnubkey_moduleですが、無理やり5キーマクロパッド(矢印四方向+左クリック)にしてみたという実験紹介の記事でした。将来的にはこれで10キー並べれば、DataHandもどきにならないかと妄想しております。
この記事はShoebill43TGで書きました。


この記事が気に入ったらサポートをしてみませんか?