2023-07-30

アナログジョイスティックデバイスを最新のQMK Firmware 0.21に対応してみた [自キ沼#35]

見慣れたNintendo Switch Joyconのアナログジョイスティックの保守部品を、以前から自作のLilithキーボードに組み込んでいます。

当初はQMK 0.12上でアナログデータを直接読み取ってマウスポインタ移動情報を生成していましたが、思ったほどスムーズな動きが実現できていなくて、メイン利用のMagic Trackpadを無くすにはまだまだです。

QMKの最近のバージョンを見ていると、アナログジョイスティックのドライバが少し前から提供されるようになっています。
このドライバが、QMK 0.21の設定だけでどこまで使えるかを今回試してみました。

ADC(ADコンバータ)入力はPro Microのほぼ全てのピンでサポートされています。
どのピンに接続するのかはconfig.hで設定します。
マウスボタンをレイヤに定義するだけで動作する自動マウスレイヤ機能や、左右分割キーボードでホストに接続していない側にジョイスティックがあっても動作させられるsplit pointing機能も、使えるようになりました。
以下、QMKに設定した内容です。

rule.mk :

POINTING_DEVICE_ENABLE = yes
POINTING_DEVICE_DRIVER = analog_joystick 

config.h :

// アナログジョイスティックの基本設定
#define ANALOG_JOYSTICK_X_AXIS_PIN F4 // ADC機能のある任意のピン
#define ANALOG_JOYSTICK_Y_AXIS_PIN F5
#define ANALOG_JOYSTICK_SPEED_REGULATOR 5 // default 20
#define ANALOG_JOYSTICK_SPEED_MAX 1 // default 2
// 自動マウスレイヤ機能
#define POINTING_DEVICE_AUTO_MOUSE_ENABLE
//#define AUTO_MOUSE_DEFAULT_LAYER 3 // 今回はkeymap.cで設定した
// 左右どちらのPro Microをホストに繋いでもジョイスティックが動作するように
#define SPLIT_POINTING_ENABLE
#define POINTING_DEVICE_RIGHT

keymap.c :

void pointing_device_init_user(void) {
    set_auto_mouse_layer(3);       // 今回はレイヤ3にKC_BTN1とKC_BTN2を置いた
    set_auto_mouse_enable(true);
}

最新のQMK Firmwareのアナログジョイスティックドライバで良い点は以下です。

  • 上記の簡単な設定だけで、ポインタ動作がある程度スムーズに動作するようになります。操作に慣れればこれだけでも日常使いできるかもしれないレベルです。
  • 抵抗値の変化でアナログ的に出力をするジョイスティックであれば、どのデバイスでも汎用的に対応できそうです。たまたまなのかもしれませんがセンターの抵抗値のキャリブレーションなしで問題なく動いています(ソースコードを確認しておきます)。
  • 自動マウスレイヤや、split pointingなど高度な機能を実現できます。

 この方式の現状の課題は以下です。

  • Joyconのアナログジョイスティック部品は0.5mmピッチのFPCリボン接続です。コネクタの手ハンダは(私には)無理なのでPCBA必須なのが費用的に少し不利です。PSP用の部品など他のデバイスも試してみたいところです。
  • ポインタ動作はほぼスムーズなのですが、小さな動きが少し難しいのと、大きく動かすのもじれったい感じがあるので、移動量データに補正を入れるなどして、なんとかしたいところです。
  • ポインタ操作でスクロールするモードも試してみたのですが、スクロール速度が速すぎるのを調整できていません。他の仕組みのポインティングデバイスであればCPIの設定等があるようなのですがアナログジョイスティックではできません。何が起こっているのかもう少し解析が必要です。

完成形まで後少しといったところかな、と思います。

この投稿は自作Lilithキーボード(LilithKbd)を使って書きました。

No comments:

Post a Comment