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)を使って書きました。

2023-07-26

AZ1UBALLをPro MicroでQMK Firmwareな自作キーボードで使うための検証をした(Pro MciroとRP2040) [自キ沼 #34]

AZ1UBALL(BOOTHの購入ページ、githubの技術情報)を現時点の最新のQMK Firmware version 0.21.3で動かしてみました。
最新のQMKを使うと非常に少ないコードで対応できました。
まだ実験なので、SU120から空中配線しています(写真は載せませんがお察しください)。

ポインティングデバイスのドライバの説明はこちらです。
Pro Microとの接続ピンは、I2C通信なのでD1とD2で固定です。
以下、QMKに設定した内容です。

rule.mk :

POINTING_DEVICE_ENABLE = yes
POINTING_DEVICE_DRIVER = pimoroni_trackball

config.h : ポインタの移動速度、2倍が限界、これ以上だとポインタが飛び飛びになる

#define PIMORONI_TRACKBALL_SCALE 10    // default 5

keymap.c : 加速度モードを設定しようとしています、必須ではない

// AZ1UBALL
void pointing_device_init_kb(void) {
    uint8_t addr=(0x0a << 1 );        // ic2 address with 1bit shift up
    //uint8_t data[]={0x90, 0x00};    // AZ1UBALL normal speed mode
    uint8_t data[]={0x91, 0x00};      // AZ1UBALL accellaration mode
    uint16_t timeout=100;             // in milli-seconds
    i2c_status_t status;
    status  = i2c_transmit (addr, data, 1, timeout);
    //if (status != I2C_STATUS_SCCESS) {
    if (status != 0) {
        return;
    }
}

AZ1UBALL を実際に試してみて良いな、と思った点を挙げます。

  • 触感:どういう仕組みなのかわかりませんが、操作するとジ、ジ、ジと指先にクリック感が来ます。これがとても良いフィードバックです
  • 細かな操作:細かな操作はとても直感的に行えます
  • QMKですぐ動作:I2C接続のPiromoni互換のトラックボールとして設定するだけで動きます
  • 1u、ロープロファイル:16mm角の正方形なのでキーボードの1uの余裕で収められます。また、ソケットプレートの上に置いて、ちょうどロープロファイルキーボードのキートップと同じくらいの高さに抑えられているので、デザインの自由度が大きいです

工夫して使わないと、と思った点もあります。

  • 移動速度:タブレットくらいの画面までは快適なのですが、大画面では難ありと思いました。ボールが小さいので一度にたくさん動かせないのと、同方向に慣性で転がし続ける動きができません。keymap.cで0x91の加速モード設定も試してみましたが、それほど違いが出ませんでした(設定できていないのかもしれずもう少し調査必要)
  • 天面の処理:低頭の小ネジの頭が天板に出ているため、操作の際に邪魔に感じることがありました。3Dプリンタ等でケースを作った方が良いのかもしれません
  • キーボードへの固定方法:基板への実装は、2.54mmの標準ピンヘッダでのハンダ直付けかソケット化しかなさそうで多少心許ないかもしれません。ネジでしっかりと固定する方法があれば良いのですが。また、側面が空いているのでケースで覆うかマスキングテープでカバーしたいです

このAZ1UBALLと、Joyconアナログジョイスティック(それと、もしかして秋月電子のPSPアナログジョイスティック部品も、あとジャンクのトラックポイント部品もあったような)は並行して試していきます。

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


[2023-08-24] Yuta Sakaiさんがコードのスペルミスと、i2cアドレスの指定方法の誤り(QMKのi2cアドレス指定方法の説明箇所)を見つけてくださいました(Twitterでのやりとり)ので、手直ししました。
さらにこの方は、加速度機能の動的ON/OFF、感度の動的変更と、気の利いた追加機能まで考えられています。
コチラの記事に掲載されています。

[2023-12-29] QMKをRP2040(Raspberry PI PicoやRP2040-Zero)で使う場合の設定です。
m.kiさんのTwitter投稿「AZ1UBALLをqmk0.22.3とRP2040-Zeroで試してみました (2023-12-26)」と、よしザウルスさんのブログ「QMK FirmwareをRaspberry Pi Picoで使ってみる (2022-07-24)」からの転記です。

rules.mk :

POINTING_DEVICE_ENABLE = yes
POINTING_DEVICE_DRIVER = pimoroni_trackball
I2C_DRIVER_REQUIRED = yes

halconf.h :

#define HAL_USE_I2C TRUE

mcuconf.h :

#undef RP_I2C_USE_I2C0
#define RP_I2C_USE_I2C0 FALSE
#undef RP_I2C_USE_I2C1
#define RP_I2C_USE_I2C1 TRUE    # 例

config.h :

#define I2C1_SCL_PIN GP27    # 例
#define I2C1_SDA_PIN GP26
#define I2C_DRIVER I2CD1    # 例

2023-07-13

次のLilithは...2台同時進行で制作する!? [自キ沼 #33]

ロープロファイル&左右分割Alice配列の自作キーボード、わたしのLilith v2.5を1月に作ってからもう半年が経ちました。
自分としてはなかなかのお気に入りで、ざっくり80%以上の満足度と言ったところ。
もう日常的に手放せないキーボードになっています。

強いて挙げれば次のような難点が残っていて、改善版を作りたい気持ちはなえていません。

  • ポインティングデバイスのチューニング:
    ある程度は操作できるのですが、加速度の調整がまだまだだと思っています。
    アナログジョイスティックでアナログ値そのままではなくて、ゆるやかに段階的にギアチェンジするような感じが良さそうです。
    いわゆるマウスボタンの左右ボタンの配置もまだしっくりきていません。
  • Numキーの位置:
    親指ブロックの長いEnterキーの右側に置いているので、親指を少し捻って押すことになって、少し辛いです。
    左手親指のBackspaceとCmd(Win)の押し間違えも、手探りで区別しにくいためか多いです。
  • バックライト:
    目立ちたがり屋の電飾ではなくて、暗がりでもキーキャップの刻印が見えるようにする実用的なバックライトがやはり欲しいです。
    やれやれ、キーキャップの選択肢がさらに狭まってしまいますね。
  • USB-C左右接続:
    抜き差しでどうしてもショートしてしまうTRRSを排除したいです。
  • Gateron low profileスイッチが抜けやすい:
    GLPは足が細めで短いのと、プレートに引っかかる爪が弱いようで、キーキャップを抜こうとすると一緒にスイッチまで抜けてしまいます。
    基板をもう少し薄くしてソケットに深く挿さるようにする、プレートの穴をもう少し狭くするなどの対策を打ちたいです。

また、現状のLilithが7.5x4と多めの70キー(左右4行のうち8列と7列が半々なので7.5x)なのに対して、5x3または6x3の縮小キーボードも、実際使ってみてどんな感じなのか大いに興味があるのは、最近投稿しているとおりです。

前置きが長くなってしまいましたが、あれこれ試行錯誤中のキー配置をいったん図にまとめてみました。
標準サイズLilithとLilith miniです。

miniの方は、最初5x3あるいは5.3x3と攻めたやつ、と思っていたのですが、やはり6x3くらいの方が使いやすそうと思っています。
タイマーによるキー長押しレイヤ移動はわたしの指癖には合わないようで、やはり嫌なので、親指ブロックも多めです。
6x3と小指ブロックが2列に増えたので、Alice配列に寄せています。
憧れのCorne(crkbd)のレプリカとまではいきませんが、Corneの形状をインスパイアしています。

上記に加えて、今回の制作上のチャレンジポイントは以下です。

  • 標準サイズLilithの親指ブロックの配置がまだしっくりきていません。
  • Lilith miniは、この際なので、さらに攻めて、よりロープロファイルのmini chocを試してみようかと思っています。
    キーキャップはchoc v1と共通で、高さがさらに2〜3割減できます。
    ソケットがないので、Mil-Max(や、その類似品)でどうかと思っています。
  • いずれもリバーシブル基板は継続したいです。
    現状のLilithは左右で行のズレを変えていて、左右のスイッチの上下(南北)を変えないと収まらないくらいリバーシブルが限界ギリギリなのですが、Jones配列を参考に左右対称にしてやれば配置の余地が増えて、バックライトLEDも入れられそうです。
  • QMK Firmwareのバージョンアップをしておきたいです。
    現状はSU120用の古いものそのままです。
    最近のQMK Firmwareでは、アナログジョイスティックも標準サポートされて、ポインティング速度のパラメータ調整の自由度と、ポインティングレイヤでキーを共有できそうなのですが、これもまだ試せていません。
    現状のJoyconアナログスティックは0.5mmピッチのFPCコネクタがネックなので、AZ1UBALL(こちらは固定と配線が悩ましい)も試してみたいです。
    こちらもI2C接続のポインティングデバイスとしてQMK Firmwareで標準サポートされています。

2台並列制作をやっちゃうのが良いのかどうか、悩ましく、うれしい悲鳴をあげています。

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