RP2040-Zeroを使用した左右分離型キーボードでQMK firmwareを使用した際に困った点とその解決策のメモ。
困った点
解決策
1については、ネットで調べてみると色々情報が出てくるが、どうやらQMK firmwareの仕様らしい。詳しいことは以下を参照。
解決方法として2つあるようだ。
- USB_VBUS_PINを指定する。
- SPLIT_USB_TIMEOUTを延ばす。
USB_VBUS_PINを指定するためには、どうやら基板上に何らかの設定(抵抗?)が必要らしい。詳しいことが分からないため試すことはできず。
SPLIT_USB_TIMEOUTは、左右のキーボードの通信を検知するまでの最大時間で、デフォルトでは2秒になっているらしい。この時間を延長することで、PC起動時に左右のキーボードの通信を検知する時間的猶予を与えることができるようだ。詳しいことは以下を参照。
config.hに以下を挿入する。
#define SPLIT_USB_TIMEOUT 10000 //数字はmsでこの場合は10秒
#define SPLIT_USB_TIMEOUT_POLL 10 //通信検知の間隔ms
SPLIT_USB_TIMEOUTの時間はPC環境によるようで、当初5000としたが、認識されなかった。その後、10000としてところ、認識されるようになった。短くするよりは、少し長めに設定した方が良いかもしれない。
2については、ネットで探してみたが全く解決策が分からなかった。
一応、config.hには以下の記載があるが、同期はできない。
#define SPLIT_ACTIVITY_ENABLE
#define SPLIT_LED_STATE_ENABLE
#define SPLIT_ACTIVITY_ENABLE
そんな時はChatGPTさんにお願いするしか無い。
Keymap.cに以下を挿入する。
#include "rgb_matrix.h"
static uint32_t last_activity_time = 0; // 最後にアクティビティがあった時間を保持
// キー入力があったときに呼び出される関数
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
last_activity_time = timer_read32(); // アクティビティ時間を更新
}
return true;
}// タイムアウト処理を行う関数
void matrix_scan_user(void) {
uint32_t current_time = timer_read32(); // 現在の時間を取得
if (current_time - last_activity_time > RGB_MATRIX_TIMEOUT) {
// タイムアウトした場合、RGBをオフにする
rgb_matrix_set_suspend_state(true); // RGB matrixを消灯
} else {
// アクティビティがある場合、RGBを再度オンにする
rgb_matrix_set_suspend_state(false); // RGB matrixを再点灯
}
}
これでRGB matrixのタイムアウトが左右で同期されるようになった。