XIAO RP2040で分割キーボード

今回はXIAO RP2040+QMK Firmwareを使って、分割キーボードを作りました。

RP2040+QMK Firmwareでの分割キーボードの問題点

RP2040でQMK Firmwareを使った分割キーボードでは、SPLIT_USB_DETECTが有効のとき、PCのコールドスタート時、キーボードが認識されない不具合があります。(バージョン0.20.00時点の場合であり、今後のバージョンアップで改善される場合があります)
ブレッドボードで分割キーボードのサンプルを作って試してみると、たしかに私の環境でもキーボードをPCの起動前から接続していた場合や休止状態(ハイバネーション)からの復帰時にOS起動後、キーボードとして認識されませんでした。
www.eisbahn.jp
上記の記事を参考にさせて頂くと対策として、「USB通信検知のタイムアウト時間を調整する」、または、「VBUS検知(USB_VBUS_PINを設定)を有効にする」があるようです。
Rapberry Pi Picoの場合、USBからの電源供給(VBUS)とその他の外部電源供給(VSYS)で分かれており、GPIO24を見ることでVBUSの状態を検知できるようになっています。
しかし、XIAO RP2040では回路図を見る限り、Rapberry Pi PicoのようにVBUSを検知できるようなGPIOは割り当てられていないようです。XIAO RP2040の5VにはVBUSがそのまま引き出されているようにみえます。
XIAO RP2040の回路図はスイッチサイエンスの商品ページに記載されているものを参考にしました。
Seeed Studio XIAO RP2040 — スイッチサイエンス

この5Vを使って、Rapberry Pi Picoと同じように分圧(VBUSが5Vのとき、3V付近になるように)してGPIOに接続するようにしてみました。(XIAO RP2040の11本しかない貴重なGPIOを使うことになってしまいますが。。)左右のキーボード間は3.3Vで電源を供給するようにしました。

作ってみる

レイアウトはいつもの18x17mmキーピッチの36キーの格子配列です。
最下段の空いている2キーの部分にXIAO RP2040を入れることができたので、左右を接続するTRRSコネクタも表面実装のものを使い、キーの裏側へ入れ、できるだけコンパクトになるようにしました。(XIAO RP2040も裏側にピンヘッダを使わず、実装するようにしました。)
ケースはネジを使わずに、ネオジム磁石で上下からスイッチプレートを挟み込む形で作ってみました。


VBUS検知(USB_VBUS_PIN)設定の効果を確認する

// config.h
#define USB_VBUS_PIN GP7

USB_VBUS_PINを設定しない場合(SPLIT_USB_DETECTが有効)は、休止状態から復帰するとキーボードは認識されておらず、一度USBケーブルを抜き差しして再認識させる必要がありました。
USB_VBUS_PINの設定を有効すると、PC起動時や休止状態から復帰してもキーボードは問題なく動作することが確認できました。

まとめ

XIAO RP2040+QMK FirmwareでVBUSを検知できるようにして分割キーボードを作りました。
PC起動時や休止状態からの復帰時にキーボードが認識されないのはやはりストレスなので、VBUSを検知する方法を採用してよかったです。
しかし、RP2040を採用したキーボードは色々なファームウェアが選択できるので、QMK Firmwareの対策だけにXIAO RP2040では特に数少ないGPIOを1つ割り当てるのは悩ましいです。