この記事はキーボード #2 Advent Calendar 2022の15日目の記事です。

昨日は、hachi868さんの レジンキーキャップ作りに無限に失敗して得た知見まとめでした。

今年は3つのカレンダーがあるようです。


この記事は、 去年の記事のバージョンアップ版で、 自分が新しいキーボードを作る時にしてるQMKの設定のメモになってます。 思い返してみると、QMKには今年になってから大規模な変更があったので、書く事にしました。

今年は基本的にはSTM32F401の載ってるblackpillでキーボードを作っていた。 変則マトリクスを使う事が多いので、それも扱います。

QMKの0.19.2をベースに説明します。

info.jsonの作成

JSONでいろいろ設定できるようになり、 マイコンの種類もここで指定するようになった。

info.jsonに

    "processor": "STM32F401",
    "development_board": "blackpill_f401",

ってかいたら基本的には動く。 Makefileに書く必要はもう必要ない。

マトリクスの指定

物理的な所は去年と同じ。

例えば、倍マトリクスを使っているPittheusではこのように指定している。

    "matrix_pins": {
        "cols": [
          "A6", "A5", "A4", "A3", "A2", "A1", "A0",
          "B9", "B8", "B7", "B6"
        ],
        "rows": [
          "B9", "B8", "B7", "B6",
          "A6", "A5", "A4", "A3", "A2", "A1", "A0"
        ]
    },

RowとColでピンリストを逆にしてるのはbootmagic_lite対策。 bootmagic_liteを使うには、 左上の0,0の場所、rowsとcolsのそれぞれの配列の1つ目のピンの間は スイッチにつながるようにしないといけない。

MATRIX_MASKED と matrix_mask の指定

この指定はinfo.jsonではできないので、 ここは、Cで書いている。

config.h

#pragma once
#define MATRIX_MASKED

keymap.c (!左右が反対なので注意!)

const matrix_row_t matrix_mask[MATRIX_ROWS] = {
  0b0000000001111111,
  0b0000000001111111,
  0b0000000001111111,
  0b0000000001111111,
  0b0000011110000000,
  0b0000011110000000,
  0b0000011110000000,
  0b0000011110000000,
  0b0000011110000000,
  0b0000011110000000,
  0b0000011110000000,
};

info.jsonのlayoutセクション

いつも書くのに混乱する。

            "layout": [
                { "matrix": [3, 0], "x": 0,  "y": 0 },
                { "matrix": [3, 1], "x": 1,  "y": 0 },
                { "matrix": [3, 2], "x": 2,  "y": 0 },

先に”x”と”y”を順番に並べて、 それに対応するマトリクス上の電気的な位置を “matrix”に書くとちょっとわかりやすいかも。

分割キーボードに追加で必要な設定

info.json

    "split": {
        "enabled": true,
        "soft_serial_pin": "A8",
        "main": "left"
    },

rules.mk

SPLIT_KEYBOARD = yes

これだけで済むかと思ったが、 chibiosを使っている時のコントローラ側からペリフェラル側へ 向う通信がうまくいかないみたい。

config.h

#define DISABLE_SYNC_TIMER

とりあえず、タイマを送るのを止めたらうごいた。 LED情報とかを送るとまた動かなくなると思われる。

マルチポインティングデバイス

左右にそれぞれポインティングデバイスをつけて使うのができるようになった。

Doubleの時は手でがんばって実装したが、 今なら標準でできるっぽい。

3mk(2022)では次のように設定した。

config.h

#define ANALOG_JOYSTICK_X_AXIS_PIN A0
#define ANALOG_JOYSTICK_Y_AXIS_PIN A1
#define SPLIT_POINTING_ENABLE
#define POINTING_DEVICE_COMBINED

info.json

    "features": {
...
        "mousekey": true,
    },

rules.mk

POINTING_DEVICE_ENABLE = yes
POINTING_DEVICE_DRIVER = analog_joystick

この設定で、左右のアナログスティックどっちでもポインタを動せる。 更に下のようにする事で、左右で動作を変えられる。

keymap.c (これはマニュアルからのコピペ)

report_mouse_t pointing_device_task_combined_user(report_mouse_t left_report, report_mouse_t right_report) {
    left_report.h = left_report.x;
    left_report.v = left_report.y;
    left_report.x = 0;
    left_report.y = 0;
    return pointing_device_combine_reports(left_report, right_report);
}

こう書いておくと、左のデバイスはスクロール、右はカーソル移動になる。

STMでanalog_joystickを使う場合は、 halconf.hとmcuconf.hもいる。 これはおしい。

また、ポインティングデバイスをさわったら、マウスレイヤに移動するのも、 コードを書かずにできるようになった。

まとめ

だんだんとconfig.hに書かないといけない事が減って、info.jsonで済むようになった。 来年はRP2040にも手を出す予定なので、どうなっているか、今から楽しみ。

この記事は3mkで書きました。


明日は、F_YUUCHIさんの”なにかかく 多分コミケの話”らしいです。