DIYの記録

私のDIYを記録していきます

Arduino IDE版d48trファームウェアのカスタマイズ方法について

ソースコード入手方法

Arduino IDE版d48trファームウェア、及びソースは以下でダウンロードできます
GitHub - delayed-brain/d48tr_arduino

セットアップ方法

Arduino IDEがインストールされていることを前提とします。
d48tr_libディレクトリをArduino IDEのライブラリフォルダに配置します。
(デフォルトでは、ドキュメント/Arduino/libraries)
d48tr_keymapディレクトリ内のd48tr_keymap.inoを編集することでカスタマイズが可能です

次にカスタマイズ方法について説明します。

キーマップの変更

const uint16_t keyMap[][rowNum][colNum]  = {

/* Qwerty
 * ,-----------------------------------------------------------------------------------.
 * | Esc  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
 * |------+------+------+------+------+-------------+------+------+------+------+------|
 * | Tab  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   -  | Enter|
 * |------+------+------+------+------+------|------+------+------+------+------+------|
 * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  | Shift|
 * |------+------+------+------+------+------+------+------+------+------+------+------|
 * | Ctrl | GUI  |Alt/  |MS_WH |MS_L  |Space |Lower/|Raise/| Left | Down |  Up  |Right |
 * |      |      |MS_R  |      |      |      |Space |KANJI |      |      |      |      |
 * `-----------------------------------------------------------------------------------'
*/
  [_QWERTY] = {
    { KC_ESC ,  KC_Q,      KC_W,      KC_E,    KC_R,    KC_T,      KC_Y,             KC_U,               KC_I,    KC_O,    KC_P,    KC_BSPC },
    { KC_TAB ,  KC_A,      KC_S,      KC_D,    KC_F,    KC_G,      KC_H,             KC_J,               KC_K,    KC_L,    KC_MINS, KC_ENT  },
    { KC_LSFT,  KC_Z,      KC_X,      KC_C,    KC_V,    KC_B,      KC_N,             KC_M,               KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT },
    { KC_LCTL,  KC_LGUI,   ALT_MS_R,  MS_WH,   MS_L,    KC_SPC,    LT(_LOWER,KC_SPC),LT(_RAISE,KC_KANJI),KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT }
    }, 

d48tr_keymap.ino内のkeyMap配列を変更することでキーマップをカスタマイズできます。
キーコードはqmkのエイリアスと互換性を持たせていますが、使用できないコードがあります。
使用できるキーコードはこちら

シンプルに''で文字を囲っても入力できます。
こんな感じ。

    { KC_KANJI, 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', KC_BSPC },
    { KEY_TAB, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', '-', KEY_RETURN },
    { KEY_LEFT_SHIFT, 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', KEY_RIGHT_SHIFT  },
    { 'a', 'a', MS_R, MS_WH, MS_L, ' ', ' ', MO(_RAISE), 'a' , 'a', 'a', 'a' }

レイヤーの追加方法

enum layer_numberに所望のレイヤー名を追加します。(17レイヤー以上は作成できません)

enum layer_number {
  _QWERTY = 0,
  _RAISE,
  _LOWER
  _NEW_LAYER
};

既存レイヤーをコピペする等してconst uint16_t keyMap[][rowNum][colNum] 配下に新しいレイヤーを作成してください。

const uint16_t keyMap[][rowNum][colNum]  = {

//省略 

  [_NEW_LAYER] = {
    { KC_ESC ,  KC_Q,      KC_W,      KC_E,    KC_R,    KC_T,      KC_Y,             KC_U,               KC_I,    KC_O,    KC_P,    KC_BSPC },
    { KC_TAB ,  KC_A,      KC_S,      KC_D,    KC_F,    KC_G,      KC_H,             KC_J,               KC_K,    KC_L,    KC_MINS, KC_ENT  },
    { KC_LSFT,  KC_Z,      KC_X,      KC_C,    KC_V,    KC_B,      KC_N,             KC_M,               KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT },
    { KC_LCTL,  KC_LGUI,   ALT_MS_R,  MS_WH,   MS_L,    KC_SPC,    LT(_LOWER,KC_SPC),LT(_RAISE,KC_KANJI),KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT }
    }, 

//省略
};

カスタムキーの作り方(タップ、ホールド無)

ユーザで任意のアクションを定義可能なカスタムキーの作成方法です。
enum custom_keycodesに所望のキー名を追加します。

enum custom_keycodes {
  XXXXXXX = 0x1001,
  MS_L,
  MS_R,
  MS_WH,
  NEW_KEY
};

function_key関数の//custom_keycodes中にキーアクションを追加します。
「case key_press:」でキーを押した時
「case key_release:」でキーを離した時のアクションを定義してください。

/*---------------------------------------------------------------------------------------//
 * key functions
 */

void function_key(uint16_t keycode, int state){

//省略

  //custom_keycodes
  else if (function_digit == 1){

    //新規追加キー
    switch(keycode) {  
      case NEW_KEY:        //追加したキー名
        switch(state) {
          case key_press:                         //キーを押した時
            Keyboard.press(KC_A);
            break;
          case key_release:                      //キーを離した時
            Keyboard.press(KC_A);
            break;
        }
      break;

//省略
}

カスタムキーの作り方(タップ、ホールド有)

タップ操作、ホールド操作を判別可能なカスタムキーの作りかたです。
enum tap_custom_keycodesに所望のキー名を追加します。

enum tap_custom_keycodes {
  ALT_MS_R = 0x8001,
  NEW_TAPKEY
};

function_key関数の//custom_keycodes(Tap enable)中にキーアクションを追加します。
「case TAP:」でキーをタップ(素早くキーを押し、離す)
「case Hold:」でキーをホールド(押し続けた時)
「case Hold_release:」でキーをホールド状態から離した時
のアクションを定義してください。

void function_key(uint16_t keycode, int state){

//省略

  //custom_keycodes(Tap enable)
  else if (function_digit == 8){
    
    //新規追加キー
    switch(keycode) {
      case NEW_TAPKEY:                                     //追加したキー名
        switch(state) {
          case key_press:
          break;
        case Tap:                                                   //タップ時
          Mouse.press(MOUSE_RIGHT);
          Mouse.release(MOUSE_RIGHT);
          break;
        case Hold:                                                //ホールド時
          Keyboard.press(KC_LALT);
          break;
        case Hold_release:                                   //ホールドから離した時
          Keyboard.release(KC_LALT);
          break;
        }

//省略

タップの時間判定について

タップ、ホールドの時間判定は下記のパラメータでチューニングが可能です。

#define TAPPING_TERM 200

トラックボール操作について

ポインタの動きはDelayパラメータで変わります。
Delayは長いほどポインタの動きは大きくなりますが、動きが遅延します。

#define Delay 34

またライブラリ内のd48tr_lib.cppにトラックボールの動作を定義する関数PrintTrackData()が存在します。
この中で、

Mouse.move(abs(xReading)*xReading, abs(yReading)*yReading, 0);

としているように、デフォルトでは、トラックボールの速度に合わせポインタの速度が速くなるよう設定しています。