分割キーボードを定義する
通常のキーボード定義の話は本稿では省略します。
環境
この記事を書いているとき、QMKバージョンは 0.6.242
でした。
新しい分割キーボードの定義
分割キーボードを新しく定義する際にやるべきことは3つです。
rule.mk
以下を追加して分割キーボードに関するライブラリの読み込みを有効にします。
SPLIT_KEYBOARD=yes
config.h
TRSを用いた単線通信の場合は以下を定義します。使えるピンは D0, D1, D2, D3, E6
の5ピンです。
#define SOFT_SERIAL_PIN DX
TRRSを用いたI2Cを使う場合は以下を定義します。
#define USE_I2C
キーマップの定義
キーマップを定義する前にレイアウトマクロを定義します。この際に、そのまま行を2倍にします。
前半行が左手、後半行が左手になります。
分かりやすさのため、前半はprefixをKでなくL、後半のprefixをRとする人もいます。
キーマップはレイアウトマクロを使って過不足なく定義してください。
ファームウェアのビルドと書き込み
ファームウェアのビルド方法は変わりません。
オプション
マスタデバイスの向きを切り替える
ここでいうマスタデバイス(マスタ)とは、分割キーボードのうちUSBケーブルでPCと接続された側のデバイスのことをいいます。 逆に、マスタデバイスとオーディオ4極ケーブル等で接続されたデバイスをスレーブデバイス(スレーブ)とします。
デフォルトではマスタは左手です。そのため、USBが接続されたデバイスは必ず左手として認識されます。
ハードウェアの変更なしにUSBを右手に接続したい場合は以下を定義します。
#define MASTER_RIGHT
それぞれのデバイスが内部に両方のキーマップを持っていますので、キーコードで一時的に左右の手を切り替えることもできます。
ハードウェアに変更を加えて
ハードウェアに変更を加えることが可能な場合は、空いているGPIOを一つ用意します。
#define SPLIT_HAND_PIN your_choose_pin
そして、左手になるデバイスのこのピンをVCCに接続してください。右手になるデバイスはこのピンをGNDに接続してください。
これで、左右の役割が固定されるのでどちらのUSBに接続しても役割が変わらず利用できます。
左右の手で異なるマトリクスを使う
追加で接続されるデバイスは右手扱いになります。以下の定義をすることで異なるピンアサインを定義できます。
#define MATRIX_ROW_PINS_RIGHT {X,X,X.,..,X} #define MATRIX_COL_PINS_RIGHT {X,X,X,...,X}
注意事項として、現在は MATRIX_ROW_PINS
とMATRIX_ROW_PINS_RIGHT
は同じ長さにしなくてはならない、とあります。
ピン数さえ揃えれば動作します。
確かオタクスプリットで使いました。
RGBLED
QMK用語でとても分かりにくいものにLEDがあります。
- BACKLIGHT(普通のLED)
- RGBLED(neopixel系)
- RGBMATRIX(普通のLED+LEDドライバだったけど最近neopixel系も盛り込まれた)
これらはすべて別個です。 ここではRGBLEDもしくはLEDという語句を使ったとき、ws2812やsk6812といったneopixel系の単線通信マイコン内蔵のフルカラーLEDのことを指します。
まずLEDの信号を吐き出すピンを定義します。左右とも同じピンを使います。
define RGB_DI_PIN YOUR_LED_PIN
次に、左右それぞれのLEDの数を指定してください。
define RGBLED_SPLIT {LEFT_NUM, RIGHT_NUM}
以上です。RGBLIGHT_SPLIT
という定数もありますが、これはRGBLED_SPLIT
を定義したときに暗黙に定義されるので設計者が定義する必要はありません。定義するとコードレビュー時に「意味ないから消せ」っていわれます。
参考ページ
@mtei 氏の連続ツイートを主に参考にしました。
qmk_firmware で、自分の作ったキーボード基板向けのファームウェアを作る最初の一歩。
— m.tei / ishii (@mtei) 2018年12月25日
shell script で、雛形を作る。
$ sh util/new_project.sh my_endgame
また、Discordでまとまっているという情報があったので以下のドキュメントを参照しました。
おまけ
QMKの標準スプリットキーボードは、スレーブデバイスのLEDはサポートしてないそうです。
どうやら、TRRSで片方を単線通信用、片方をLED信号用にすることで実現できるようです。品質の良くないケーブルを使うと動かなくなりそうですね。
光らせたい&OLEDを点灯させたいというのはよくわからないので、Helix回路/コードを流用するのがよいのではないでしょうか。
正確な日付は覚えていませんが、現在は単線通信でもRGBLEDがサポートされています。