天高工房

キーキャップに印字して遊んだり電子工作して遊んだりしたことを書くかもしれません。

分割キーボードを定義する

通常のキーボード定義の話は本稿では省略します。

環境

この記事を書いているとき、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

それぞれのデバイスが内部に両方のキーマップを持っていますので、キーコードで一時的に左右の手を切り替えることもできます。

skyhigh-works.hatenablog.com

ハードウェアに変更を加えて

ハードウェアに変更を加えることが可能な場合は、空いている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_PINSMATRIX_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 氏の連続ツイートを主に参考にしました。

また、Discordでまとまっているという情報があったので以下のドキュメントを参照しました。

github.com

おまけ

QMKの標準スプリットキーボードは、スレーブデバイスのLEDはサポートしてないそうです。

どうやら、TRRSで片方を単線通信用、片方をLED信号用にすることで実現できるようです。品質の良くないケーブルを使うと動かなくなりそうですね。

光らせたい&OLEDを点灯させたいというのはよくわからないので、Helix回路/コードを流用するのがよいのではないでしょうか。

正確な日付は覚えていませんが、現在は単線通信でもRGBLEDがサポートされています。