DIYの記録

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

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

はじめに

d48trのQMK版ファームウェアはこちらにございます。
github.com


QMKの基本的なカスタマイズ方法については他の記事を参考にしていただくとして、ここではd48trに特化したマウス部分を中心に解説します。

keymaps.cについて

マウス用キーとして、左クリック、右クリック、ホイールキーをカスタムキーとして設定しています。

enum custom_keycodes {
  QWERTY = SAFE_RANGE,
  LOWER,
  RAISE,
  MS_L,
  MS_R,
  MS_WH
};

また、同ディレクトリに存在するtrackball.cをインクルードすることで、トラックボールを制御しています。

#include "trackball.c"

trackball.cについて

2つの「//Parameter of trackball」のコメント配下にある設定がチューニングのポイントになります。
1つめ

//Parameter of trackball sensitivity [ms]
#define DELAY_TIME 24

トラックボールの移動量を取得する間隔の設定です。値が大きければ大きい程、検出する移動量が大きくなりますが、その分ポインタの動きが遅延します。
2つめ

      //Parameter of trackball sensitivity
      currentReport.x = abs(left-right) * (left-right);
      currentReport.y = abs(up-down) * (up-down);

検出したトラックボールの移動量を、ポインタの動きに変換している式です。
デフォルトでは上記のように、移動量の2乗としています。こちらについては、ある一定の移動量を超えると〇倍にするなどの設定にするなどもありだと思います。

トラックボールを押した時の動作について

トラックボール自身もボタンになっており、押した際の動作はtrackball.cの以下の部分で定義できます。

    //Trackball click action
    if (button == 0x01){
      tb_btn1 = true;   //left click
      //tb_btn2 = true;     //right click

    }
    else {
      tb_btn1 = false;   //left click
      //tb_btn2 = false;     //right click

デフォルトは左クリック動作ですが、コメントを付け替えてもらうと右クリック動作となります。

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);

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

Arduino IDE版d48trファーム キーコード一覧

Arduino IDE版d48trファームにて使用可能なキーコード一覧です。
qmkのエイリアスと互換性を持たせてあります。

通常キー

キーコード キー
KC_EXLM !
KC_HASH #
KC_DLR $
KC_AMPR &
KC_QUOT '
KC_LPRN (
KC_RPRN )
KC_PAST
KC_PPLS +
KC_COMM ,
KC_PMNS -
KC_DOT .
KC_SLSH /
KC_0 0
KC_1 1
KC_2 2
KC_3 3
KC_4 4
KC_5 5
KC_6 6
KC_7 7
KC_8 8
KC_9 9
KC_COLN :
KC_SCLN ;
KC_LABK <
KC_EQL =
KC_RABK >
KC_QUES ?
KC_JYEN \
KC_RBRC ]
KC_CIRC ^
KC_UNDS _
KC_GRV `
KC_A a
KC_B b
KC_C c
KC_D d
KC_E e
KC_F f
KC_G g
KC_H h
KC_I i
KC_J j
KC_K k
KC_L l
KC_M m
KC_N n
KC_O o
KC_P p
KC_Q q
KC_R r
KC_S s
KC_T t
KC_U u
KC_V v
KC_W w
KC_X x
KC_Y y
KC_Z z
KC_LCBR {
KC_PIPE |
KC_RCBR }
KC_TILD ~
KC_ENT Return (Enter)
KC_ESC Escape
KC_BSPC Delete (Backspace)
KC_TAB Tab
KC_SPC Space
KC_MINS -
KC_CIRC ^
KC_AT @
KC_LBRC [
KC_RBRC ]
KANJI 半角/全角
KC_CAPS Caps Lock
KC_F1 F1
KC_F2 F2
KC_F3 F3
KC_F4 F4
KC_F5 F5
KC_F6 F6
KC_F7 F7
KC_F8 F8
KC_F9 F9
KC_F10 F10
KC_F11 F11
KC_F12 F12
KC_PSCR Print Screen
KC_SLCK Scroll Lock
KC_PAUS Pause
KC_INS Insert
KC_HOME Home
KC_PGUP PageUp
KC_DEL Delete
KC_END End
KC_PGDN PageDown
KC_RGHT
KC_LEFT
KC_DOWN
KC_UP
KANA カナ
HENKAN 変換
MUHENKAN 無変換
KC_LCTL Ctrl
KC_LSFT Shift
KC_LALT Alt
KC_LGUI 0xe3
KC_RCTL GUI
KC_RSFT Shift
KC_RALT Alt
KC_RGUI GUI

レイヤーキー

キーコード キー
MO(layer) 押している間だけ指定したレイヤー
LT(layer, kc) 押している間だけ指定したレイヤー、タップでkc

自作キーボードキットd48trビルドガイド

d48trのご紹介

d48trは、小型トラックボールを搭載した軽量メカニカルキーボードキットです。 
BOOTHにて販売しております
delayedbrain.booth.pm

実装版は半田付けの箇所も比較的少ないので、自作キーボード初心者の方も是非!

同梱物

物品 個数
PCB 1枚
ケース上下 1セット
ミニトラックボール基板(Groveケーブル含む) 1個
タクトスイッチ 1個
スライドスイッチ 1個
M2ネジ 3mm 7個
M2ネジ  5mm 1個
Grove メスコネクタ 1個
ファーム導入済Pro Micro互換 ※初回版のみ同梱 1個

キット以外に必要なもの

物品 個数
Pro Micro※初回版のみ同梱 1個
Kailhロープロファイルキースイッチ(choc) 48個
Kailhロープロファイルキーキャップ(choc) 48個
ダイオード ※通常版のみで必要 48個

バックライト(オプション)実装時に本キット以外に必要なもの ※通常版のみ(上級者向け)

物品 個数
表面実装LED(EIA:0603 JIS:1608) 48個
表面実装抵抗 4.7kΩ(EIA:0805 JIS:2012) 48個

はじめに

PCBは写真の面を表面、反対の面を裏面とします
※通常版のPCBは黒色です
f:id:delayedbrain:20200309212513p:plain

ダイオードの取り付け※通常版のみ

写真のようにダイオードを取り付け、はんだ付けします。
向きに注意してください。四角いフットプリントの方がカソード(オビの入っている方)となるよう取り付けます。
f:id:delayedbrain:20200420223851p:plain
全部で48個あります。すべてはんだ付けします。

抵抗、LEDの取り付け※通常版のみのオプション(上級者向け)

写真の赤色の箇所にLED、緑色の箇所に抵抗を取り付けます。それぞれ48個づつ取り付けます。
表面実装パーツのはんだ付け方法はここでは割愛しますが
細かいパーツのはんだ付けとなりますので、上級者向けとなります。
f:id:delayedbrain:20200420224433p:plain

キースイッチをはんだ付けする

キースイッチをPCBの表面からしっかりとはめ込みます。
f:id:delayedbrain:20200309212924p:plain
PCBを裏返し、接点を2か所はんだ付けします。
f:id:delayedbrain:20200309213552p:plain

上記を繰り返し、キースイッチ48個をPCBに取り付けます。
※一度キー48個を全部はめ込んでから、裏返して全部の接点をはんだ付けした方が効率的かもしれません
f:id:delayedbrain:20200309214022p:plain

Pro Microを取り付ける

同梱のピンヘッダあるいはスプリングピンヘッダ(別売)により取り付けます。
まずはPro Microにピンヘッダを取り付けます。
【注意!】Pro Microは裏返し(平らな方が表になるよう)に取り付けます。
     下の写真のようにピンヘッダを取り付け、はんだ付けしてください。
f:id:delayedbrain:20200309214738p:plain

次にPCBにPro Microを取り付けます。
【注意!】Pro Microの位置に上下13個づつの穴がありますがPro Microで使用する穴は12個です。
表面から見て、左に詰めるように取り付けます。
f:id:delayedbrain:20200309215624p:plain
PCB表面からPro Microを差し込みます。
f:id:delayedbrain:20200309215801p:plain

必要であればマスキングテープ等で固定し、PCBの裏面からはんだ付けしてください。
f:id:delayedbrain:20200309220115p:plain

同梱のピンヘッダを使用した場合、ピンへヘッダが長くはみ出るのでニッパ等でカットします。
ピンが飛びちり誤って目などに入らないよう、注意してカットしてください。
f:id:delayedbrain:20200309222339p:plainf:id:delayedbrain:20200309222354p:plain

スライドスイッチはんだ付け(バックライトを使用しない場合は不要)

表面からスライドスイッチをPCBに取り付けてください。マスキングテープ等で仮固定すると安定します。裏面からはんだ付けします。
f:id:delayedbrain:20200309221605p:plain
f:id:delayedbrain:20200309221608p:plain

スライドスイッチの足が長いので、余っているピンはニッパ等でカットしてください。
f:id:delayedbrain:20200309221612p:plain
f:id:delayedbrain:20200309221615p:plain

実装版もしくはオプションバックライトを取り付けた場合は、スライドスイッチ、Pro Micro取り付け後、Pro MicroにUSBケーブルを接続し電源を入れるとLEDが点灯します。点灯しない場合はスライドスイッチを切り替えてみてください。
f:id:delayedbrain:20200309221601p:plain

リセットスイッチはんだ付け

表面からタクトスイッチをPCBに取り付けてください。マスキングテープ等で仮固定すると安定します。裏面からはんだ付けします。
f:id:delayedbrain:20200309223019p:plain

トラックボール接続用コネクタ(Groveメスコネクタ)はんだ付け

表面からGroveメスコネクタをPCBに取り付けてください。マスキングテープ等で仮固定すると安定します。
f:id:delayedbrain:20200309223151p:plain
裏面からはんだ付けします。
f:id:delayedbrain:20200309223443p:plain

PCBをケースに取り付ける

PCBをケースに取り付けます。3mmネジ(短いほう)を使用します。
3Dプリンタでのケース出力ではどうしても若干の歪みが発生してしまうため、ネジ穴は多少ずれている場合があります。自然に入らない場合は自分でネジ穴を切るつもりで強く押し当てながらネジを回していくと入っていきます。
f:id:delayedbrain:20200309223852p:plain
下の写真の通り、5か所をネジ止めします。
f:id:delayedbrain:20200309223900p:plain

トラックボール基板をケースに取り付ける

トラックボール基板をケースに取り付けます。3mmネジ(短いほう)2本と5mmネジ(長いほう)1本を使用します。
写真のように配置します。上側のネジ穴は基板と重なるように配置し、5mmネジで固定します。
f:id:delayedbrain:20200309225359p:plain
f:id:delayedbrain:20200309225407p:plain

ケーブル取り付け

PCBに取りつけたコネクタとトラックボール基板のコネクタをGroveケーブルで接続してください。
写真のように、ケーブルをPCBのコネクタの隙間に挟み込むように収納すると収まりが良くなります。
f:id:delayedbrain:20200309230250p:plain

ケース(上部)の取り付け

下部のレールにスライドさせるように取り付けてください。
f:id:delayedbrain:20200309230307p:plain

完成

お好みのキーキャップを取り付けて完成です。

ファームウェアについて

ファームウェアはArduinoIDE版、QMK版の2種類があります。
どちらをお使い戴いても問題ありません。

<QMK版>
https://github.com/delayed-brain/qmk_firmware/tree/master/keyboards/d48tr
チューニング方法: 
QMK版 d48trのファームウェアカスタマイズ方法について - DIYの記録

ArduinoIDE版の導入方法については別記事に記載します。
<ArduinoIDE版>
Arduino IDE版d48trファームウェアのカスタマイズ方法について - DIYの記録

dマガジン用のchrome拡張機能を作った

なぜ作ろうと思ったか

dマガジンをPCやwindowsタブレットで見る場合、ブラウザで見ることになると思います。

私はchromeで見ているのですが、通常のまま見ると、なんか少しぼやけて見えるような、、画質が悪くなっているような気がします。これは拡大率を下げると改善し、下図のようにくっきり見えるようになるのですが、引きずられて上下のメニューバーも小さくなってしまいます。

f:id:delayedbrain:20190825221735p:plain

f:id:delayedbrain:20190825222707p:plain

dマガジンwebビューワ

拡大率を下げると、この上下のメニューバーまで小っちゃくなっちゃいます。 また、本を選ぶ画面に戻っても、拡大率が維持されちゃうので、小っちゃくなったままです。

拡張機能を作った

以上の問題点をいい感じにしてくれるchrome拡張機能を作りました。  

 ・ビューワ画面に移動すると自動的に拡大率を下げて、解像度を上げる  

 ・上下のメニューバーは小さくならない  

 ・ビューワ画面以外は拡大率100%に戻す

ストアに上げているので良かったら試してください。

https://chrome.google.com/webstore/detail/dmagazineviewer/jhgihlihpgbpihdhlpljhhhjkaoaihgd?hl=ja