この記事は、 キーボード #3 Advent Calendar 2021 - Adventarの18日目の記事です。

17日目はAIN0204さんの「MXスイッチソケットに対応したHelix(5/4行対応)を作った」でした。

背景

一般的に、自作キーボードにはマトリクス配線が使われている。

マトリクスの図

しかし、自分は配線数を減らしたり、GPIOピンを節約したりするために、 変則マトリクスを使う事が多い。

例えば、倍マトリクスとか、二乗マトリクスだ。

倍マトリクス

倍マトリクスの図

二乗マトリクス

二乗マトリクスの図

例えば、最近作ったplanckスタイルのキーボードは倍マトリクスを採用した。

倍マトリクスの例

これをQMKファームウエアで使う場合、 MATRIX_ROW_PINSとMATRIX_COL_PINSに同じ値を設定するのが簡単だ。

#define MATRIX_ROW_PINS { B7, B6, B5, B4, B3, A15, B12, B13, B14, B15 }
#define MATRIX_COL_PINS { B7, B6, B5, B4, B3, A15, B12, B13, B14, B15 }

しかし、この方法にはいくつか罠がある。 今回はその罠を紹介したい。

Bootmagic liteの罠

bootmagic liteは、 キーボードの電源が入った時にROW0とCOL0の間のスイッチが押されてると、 キーボードを起動させずファームウエア書き込みモードになるという機能だ。

しかし、上に書いたように設定をすると、 ROW0とCOL0が同じピンになるので、常に接続されている扱いになる。 そのため、常にファームウエア書き込みモードになるので、 キーボードが起動しなくなる。

回避方法としては、bootmagic-liteをオフにするか、 次のように、ROWとCOLで順序を入れかえておくと回避できる。

#define MATRIX_ROW_PINS { B12, B13, B14, B15,        B7, B6, B5, B4, B3, A15 }
#define MATRIX_COL_PINS { B7, B6, B5, B4, B3, A15,   B12, B13, B14, B15 }

Chibiosのsuspendの罠

PCがサスペンド中にキーボードのキーを押すと、 PCはサスペンドから復帰する。

QMKはPCのサスペンド中、 キーが押されたらUSB接続をリセットし、 PCを復帰させる。

しかし、STM32版でキーボードが起動するときに、 いずれかのキーが押されていると、 USB接続のリセットが連続で行われ続けて、 キーボードがPCと接続できなくなるようだ。

しかし、ROWとCOLが同じ値を含んでいる場合、 そこは押しっぱなしの扱いになるため、 動作に問題をきたす。

相談した所、マトリクスマスクという機能で、 マトリクスの一部を上書きして押していないようにする機能があると教えてもらった。

そこで今回は次のように設定した。

config.h

#define MATRIX_MASKED

[keyboard].c

const matrix_row_t matrix_mask[MATRIX_ROWS] = {
  0b0000000000111111,
  0b0000000000111111,
  0b0000000000111111,
  0b0000000000111111,
  0b0000001111000000,
  0b0000001111000000,
  0b0000001111000000,
  0b0000001111000000,
  0b0000001111000000,
  0b0000001111000000,
};

matrix_maskは、左右が反転しているので注意が必要だ。

まとめ

倍マトリクスや二乗マトリクスを使うと、 GPIO数に対して沢山のスイッチを使える。

以前はmatrix.cを改造して使っていたが、 今は今回説明したテクニックを使って、 設定用ファイルの変更だけでこれらのマトリクス方式を使える。

今後も活用していきたい。