chroju.dev/blog

the world as code

Quick7 を BLE Micro Pro で無線化した

はじめに断ると、結構イレギュラーな感じになったのでオススメはしない。

ロータリーエンコーダ付きのマクロパッドというものが欲しくなり、わりと直感的にカッコいいなというのと、必要十分なキー数だなというところで遊舎工房の Quick7 を購入した。これ自体は文字通りクイックに作れてとてもいいキットだった。慣れている人であれば1時間とかそこらで作れると思う。

さて問題はここからで、マクロパッドというものはホームポジションで固定的に使う普通のキーボードと違い、ポジションの自由度が高い。そのため使っているうちに有線が煩わしく思えてきた。幸いにして家には、使っていない BLE Micro Pro があったので、では無線化しようと思い至ったのだが、そう簡単な話ではなかった。

BLE Micro Pro との config 互換性

BLE Micro Pro (BMP) は自作キーボードでよく使われる QMK Firmware と高い互換性を持ったファームウェアを使用しているが、完全互換ではない。各種設定は QWK ではC言語で定義することになるが、 BMP ではこれを JSON 形式に変換したものを用いる。この2つが1対1には必ずしも対応していない。

Quick7 で具体的に問題となったのは、キースイッチの押下を感知する基盤のピン設定である。多くの自作キーボードでは、 MATRIX_PINS を用いる。これはキーボードを格子配列にみたてて、行列それぞれにピンを割り当てる方式だ。

Image from Gyazo

簡単に言えば上図の1〜6がピン割り当てになる。1と5のピンに通電すれば「D」が押されたと検知する、という具合だ。 QMK Firmware での設定の書き方は、 crkbd (Corne Keyboard) を例にすると以下のようになる。

#define MATRIX_ROWS 8
#define MATRIX_COLS 6
#define MATRIX_ROW_PINS { D4, C6, D7, E6 }
#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3 }

BMP の場合 は以下。

"matrix":{"rows":8,"cols":6,"device_rows":4, "device_cols":6,
	"debounce":1,"is_left_hand":1,"diode_direction":0,
	"row_pins":[7, 8, 9, 10],
	"col_pins":[20, 19, 18, 17, 16, 15],

一方 Quick7 など、一部のマクロパッドにおいては MATRIX_PINS ではなく、1キーにつき1ピンを割り当てる、 DIRECT_PINS という設定を用いている。キー数が少ない故、マトリクスの形を取らなくとも、 Pro Micro のピンが足りるためと思われる(設計者ではないので断言ができない)。そして現状、 BMP の config.json は DIRECT_PINS に対応していない。

ではどうしたか、だが、擬似的に 1x9 のマトリクスとみなすことで対処した。

実は、 MATRIX_PINS で設定している際、行列双方のピンが通電していなければ、キーを検知しないわけではない。例えば先の図で1番のピンだけが通電したとする。このときは、A、D、Gの3キーが押されたと検知する。したがって 1x9 のマトリクスとみなし、 DIRECT_PINS として設定されていた9つのピンを各列に設定すれば、各キー入力の検知は可能になる。

具体的には、 Quick7 の QMK Firmware における DIRECT_PINS は以下の設定であり、

#define DIRECT_PINS { \
      { D2, D4, F4 }, \
      { D7, B1, B3 }, \
      { E6, B4, B2 }, \
}

これに対し、 BMP をこのように設定した。ピンの表記が双方で異なるためわかりづらいかもしれないが、 DIRECT_PINS の各行のピンを横に並べ直すような形で col_pins に設定している。

"matrix":{"rows":1,"cols":9,"device_rows":1, "device_cols":9,
	"debounce":1,"is_left_hand":1,"diode_direction":0,
	"row_pins":[13],
	"col_pins":[10, 11, 14,  9, 16, 15, 2, 7, 20],

ちなみに row_pins に設定している13ピンは、 Quick7 では使われていないピンをダミーで設定した。

電池基盤格納の物理的な問題

BMP を稼働させるには、別途電池基盤を接続する必要がある。 Quick7 はかなりコンパクトな筐体であるため、これをどこに格納するかが問題になった。

多いパターンとしては、遊舎工房で販売されている電池基盤が BMP とほぼ同じ大きさのため、 BMP の裏側に載せるような形で格納するパターンだ。実は手元にあった BMP は、すでにこの形で電池基盤をはんだ付けしてあるものだった。しかし、 Quick7 はトッププレートとボトムプレートの間を 10mm のスペーサーで結んでおり、この隙間に電池基盤付きの BMP は収まらなかった。

Image from Gyazo

結論としてはシンプルに、 15mm のスペーサーに換装することで対応した。電池基盤を BMP と接着せず、横に並べるような形で配置すれば、もう少し薄くすることは可能かもしれない。

Conclusion

はじめに書いたことの繰り返しだが、特にこういったやり方をおすすめする記事ではなく、技術的なメモに近い内容である。ロータリーエンコーダ付きマクロパッドでは、公式に BMP 対応している Palette1202 なども存在するので、そちらを使ったほうがスムーズかもしれない。また、 QMK Firmware や BMP に僕自身そこまで詳しいとは思っていないので、ここで書いた方法以外の何かスマートな解決策が存在する可能性もある。

とはいえ出来には満足している。普段使いは Corne Cherry で長らく落ち着いてしまったが、たまにはこうやってキーボードを作ることも続けてみたい。