自作キーボードっておもしろい!

自作したキーボードについて

RP2040-Zeroを使用した左右分離型キーボード用QMK firmwareについての覚書

 

RP2040-Zeroを使用した左右分離型キーボードでQMK firmwareを使用した際に困った点とその解決策のメモ。

 

困った点
  1. Windowsが休止状態から復帰した時にキーボードを認識しない。
  2. RGB matrixのタイムアウトが左右で同期しない。
解決策

1については、ネットで調べてみると色々情報が出てくるが、どうやらQMK firmwareの仕様らしい。詳しいことは以下を参照。

www.eisbahn.jp

解決方法として2つあるようだ。

  1. USB_VBUS_PINを指定する。
  2. SPLIT_USB_TIMEOUTを延ばす。

USB_VBUS_PINを指定するためには、どうやら基板上に何らかの設定(抵抗?)が必要らしい。詳しいことが分からないため試すことはできず。

SPLIT_USB_TIMEOUTは、左右のキーボードの通信を検知するまでの最大時間で、デフォルトでは2秒になっているらしい。この時間を延長することで、PC起動時に左右のキーボードの通信を検知する時間的猶予を与えることができるようだ。詳しいことは以下を参照。

note.com

 

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のタイムアウトが左右で同期されるようになった。