キーボード #2 Advent Calender 2023 9日目担当のせきごんです。BLE Micro Proなどキーボード関連のモジュールを色々作っています。

今年作ったものを振り返っていきます。

今年作ったもの

Keyboard Quantizer Mini

Keyboard Quantizerの小型版を作りました。Keyboard Quantizerは、USBキーボード・マウスとPCの間に挟むことでQMKを使って設定を変更できるようにするアダプタです。 2021年末に作ったPico-PIO-USBを利用することでRP2040単体でUSBホスト・デバイスが実現できたため、基板を小型化できました。

Keyboard Quantizer Mini - のぎけす屋 - BOOTH

** これは有線版です。無線への変換は Keyboard Quantizer B ( https://nogikes.booth.pm/items/3095820 )が対応しています ** ** 使い方によってはファームウェア開発が必要になる場合があります ** Keyboard Quantizerは一般的なUSBキーボードやマウスを自作キーボード用のファームウェアの定番であるQMKに対応させるためのアダプタです。キー配列を自由に変えられるだけでなく、キーボードにレイヤ、マクロ、コンビネーション、タップダンスなどの機能を追加できるようになります。

GitHub - sekigon-gonnoc/keyboard-quantizer-doc

Convert your keyboard QMK enabled. Contribute to sekigon-gonnoc/keyboard-quantizer-doc development by creating an account on GitHub.

ファームウェアの構成も合わせて変更しました。RemapやVialからキーマップを変更できるバージョンと、YAML形式の設定ファイルを使用するバージョンの2種類を作成しました。 後者のバージョンを作成した理由はいくつかあります。

  • Remap, Vialよりもさらに細かく色々な設定を変更したい
  • テキストで設定を管理したい
    • 後から設定を見返したときに、どのキーに置き換えを設定しているのか一目でわかるようにしたい
    • コメントを付けたい
    • 差分管理できるようにしたい
    • GUIをポチポチするのが面倒くさい

PCでコンパニオンアプリを実行することで、フォーカスが当たっているウィンドウ合わせてキーマップや設定を変えられるようにもしてみました。

設定サンプル1
# マウス用設定
- application:
    # 常時有効なキーマップを定義する
    keymaps:
      - layer:
          # レイヤ0ではボタン6,7,8の動作を変更する
          id: 0
          keys:
            # ボタン6,7でコピペ
            KC_BTN6: LCTL(KC_C)
            KC_BTN7: LCTL(KC_V)
            # ボタン8をタップしたときは中クリック、長押ししたときはレイヤ1に移動
            KC_BTN8: LT(1, KC_BTN3)
          mouse:
            # xyの移動速度を1.5にする
            scale_x: 1.5
            scale_y: 1.5
      - layer:
          # レイヤ1では各ボタン、ホイール、ジェスチャに機能を割り当てる
          id: 1
          keys:
            KC_BTN1: KC_ENT
            KC_BTN2: KC_BSPC
            # 中クリックで再生・停止
            KC_BTN3: KC_MEDIA_STOP
            # レイヤ1でのホイールの動作を割り当てる
            # 左右で曲送り、曲戻し
            KC_MS_WH_RIGHT: KC_MEDIA_PREV_TRACK
            KC_MS_WH_LEFT: KC_MEDIA_NEXT_TRACK
            # 上下でウィンドウ切り替え
            KC_MS_WH_UP: LALT(KC_TAB)
            KC_MS_WH_DOWN: LSA(KC_TAB)
            # レイヤ1の状態でカーソルを動かし、レイヤ0に戻るタイミングでマウスジェスチャが実行される
            # 左下に移動したらEndを送信
            MS_GESTURE_DL: KC_END
            # 左上に移動したらHomeを送信
            MS_GESTURE_UL: KC_HOME
設定サンプル2
- application:
    # 常時有効な設定
    keymaps:
      - layer:
          id: 0
          keys:
            # CAPSを単押しTAB, 長押しCTRL
            KC_CAPS: LCTL_T(KC_TAB)
            # RSHIFTを単押しでLEADER, 長押しでSHIFT
            KC_RSFT:
              { tap_dance: { single_tap: QK_LEAD, single_hold: KC_RSFT } }
    combos:
      - combo:
          # D,L同時押しで一行削除
          keys: [KC_D, KC_L]
          keycode:
            {
              macro:
                [
                  { action: down, keycodes: [KC_LCTL] }, { action: tap, keycodes: [KC_LEFT] }, { action: down, keycodes: [KC_LSFT] },
                  { action: tap, keycodes: [KC_RGHT] }, { action: up, keycodes: [KC_LCTL, KC_LSFT] }, { action: tap, keycodes: [KC_BSPC] },
                ],
            }
          # 100ms以上長押ししたときだけ発動
          term: 100
          only: hold
    leaders:
      # LEADERのあとに入れたキーの順番で分岐
      - leader:
          # twitterを開く
          keys: [KC_T, KC_W, KC_T]
          keycode: { command:  start firefox -ArgumentList "-url https://twitter.com" }
      - leader:
          # コンパニオンアプリを送り込む
          keys: [KC_C, KC_M, KC_P]
          keycode: LAUNCH_COMPANION
- application:
    # フォーカス中の画面がchatGPTのときだけ有効なキーマップ
    url: https://chat.openai.com/.*
    overrides:
      # Shift+Enter押したらEnter, Enter押したらShift+Enterが押されるようにする
      - basic:
          trigger_mods:
            - Shift
          trigger_key: KC_ENT
          replacement_key: KC_ENT
      - w_layer_neg:
          trigger_mods: []
          trigger_key: KC_ENT
          replacement_key: S(KC_ENT)
          layers: 0xffff
          negative_mask:
            - Shift
- application:
    # Libreoffice Impressのときだけ有効
    title: ".*Impress$"
    leaders:
      - leader:
          # 上ぞろえ
          keys: [KC_A, KC_T]
          keycode: { macro: [{ action: tap, keycodes: [KC_LALT] }, ont] }

Vial対応BLE Micro Pro

RemapがQMK0.18準拠のプロトコルのサポートをやめるかもしれないということで、BLE Micro Proのファームウェアを更新する必要がありました。 今後も設定ツールの変更にあわせてオンタイムにファームウェアを更新し続けるのは大変なので、Vialに移行することにしました。

VialもWebブラウザからQMKのキーマップを設定できるツールで、コンボやタップダンスやその他各種設定も変更できます。 ブラウザ上だけでなくローカル環境での実行ファイルも用意されています。 また、キーレイアウトなどの情報をキーボード側に保持しているほか、ファームウェアのバージョンに応じてキーコード定義を切り替えるようにもなっています。

これらの特徴のおかげで、一度セットアップを整えれば各種サービスの運営状況によらず長く使い続けられるようになると考えています。

BLE Micro Proは共通のファームウェアに対してキーボードごとの設定ファイルを書き込む構成です。 この設定ファイルをQMKのinfo.jsonから生成するツールも更新し、Vial用の設定ファイルも生成できるようにしました。

なお、現時点では最新版のRemapにも対応しています。 オリジナルのVialは古いVIAプロトコルにしか対応していないのですが、ちょっとだけ変更を加えて最新のVIAプロトコルにも対応しました。

https://sekigon-gonnoc.github.io/BLE-Micro-Pro


今年はあんまり捗りませんでした。トラックボール付きで無線対応のキーボードとか、そのために更に消費電力を削減したBLE Micro Proのファームウェアなども開発中です。

この記事はCorne ECで書きました。