manvaのエンジニアリング魂

エンジニアリング・ものづくり・DIYをもっと身近にするためのブログ。インスピレーションを刺激します。

マウス内蔵キーボードのためのQMK firmwareの書き方

QMK firmwareの書き方はネット上にいろいろ情報が出ているが、

  • オリジナルのキーボード
  • 左右分割キーボード
  • マウスとして操作できるキーボード

の場合にどうすればいいか、となると、あちこち調べなければならなかったので、ここにまとめておく。
(記事執筆時点のQMK Firmware のバージョンは0.7.103)

オリジナルキーボードの場合

まずは単なるオリジナルキーボードの場合。↓の記事が参考になる。
qiita.com


手順
1.ソフトのインストール
2.テンプレートを作成
3.テンプレートを修正
4.ファームウェアをビルド
5.書き込み

1.ソフトのインストール

1-1.MSYS2のインストール

QMK firmwareの前に,まずコマンドライン環境のMSYS2をインストールする。
MSYS2 homepage
からダウンロードしてインストール。例えばWindows64bit版なら↓
msys2-x86_64-20190524.exe

1-2. MSYS2のパッケージを最新へ更新

MSYS2を起動,下記コマンド入力(パックマンはパッケージマネージャの略らしい。アメリカンジョークなのか・・)

$ pacman -Syu

下記の警告メッセージが表示されるが,

警告: terminate MSYS2 without returning to shell and check for updates again
警告: for example close your terminal window instead of calling exit

MSYS2を一旦閉じて,また起動し再度上記のコマンドを実行。2回やるのが普通らしい。

1-3.gitコマンドをインストール
$ pacman -S git
1-4.qmk/qmk_firmware のインストール
$ git clone --recurse-submodules https://github.com/qmk/qmk_firmware.git
$ cd qmk_firmware
$ util/qmk_install.sh

2.テンプレートを作成

(オリジナルキーボードの場合のポイントはここ。ネット上には、new_project.shを使う記事があるが,qmkのバージョンアップでnew_project.shがなくなって下記に変更されたらしい)

$ util/new_keyboard.sh

キーボード名を聞かれるので,

Keyboard Name: 

自分でつけたオリジナルキーボードの名前を入力。
C:\msys64\home\(ユーザ名)\qmk_firmware\keyboards\(キーボード名)
ができる。

3.テンプレートを修正

とりあえず,下記3つのファイルを修正すればよい。

  • config.h
  • (キーボード名).h
  • keymaps/default/keymap.c
3-1.config.h

下記を自分のキーボードの行・列の数に変更する。行と列は配線の仕方による。テンプレートでは、下記のように2行3列になっている。

#define MATRIX_ROWS 2
#define MATRIX_COLS 3

行と列の線を,Pro Microのどのピンにつなぐのかを下記のように書く。使えるピンは,
TXO, RXI, 2, 3, 4, 5, 6, 7, 8, 9, A3, A2, A1, A0, 15, 14, 16, 10
の18本であり,ピンの名前は,上記の順に,
D3, D2, D1, D0, D4, C6, D7, E6, B4, B5, F4, F5, F6, F7, B1, B3, B2, B6
となっている。

#define MATRIX_ROW_PINS { D0, D5 }
#define MATRIX_COL_PINS { F1, F0, B0 }
3-2 (キーボード名).h

レイアウトの設定(マクロ)を自分のキーボードに合わせて修正する。テンプレートのコードを見たらなんとなくわかると思うが,上のほうの( )の中は使うキーの名前(自分でつけてよい)をカンマ区切りで並べて,下の{ }の方は,名前をつけたキーがどこにあるのか,行と列の配列の形で並べる。存在しないキーはKC_NOとする。下記テンプレートのコードの例では,2行2列目のキーは存在しない。(このマクロの必要性がいまいちわからず,普通にkeymap.cを{ }で書いたら良くない?と思ったが,たぶんkeymap.cを図的に見やすくするためだな。配列の0番を右にしたい場合など,ここでひっくり返しておけばよい)

#define LAYOUT( 
    k00, k01, k02,
      k10,  k12
) 
{ 
    { k00, k01,   k02 }, 
    { k10, KC_NO, k12 } 
}
3-3 keymaps/default/keymap.c

何行目の何列目が何のキーか(文字・記号・機能)を割り当てるマップ。キーコードは↓
https://docs.qmk.fm/#/keycodes
レイヤーを切り替えるキーは,テンプレートのコードを参考に。この例では,1行3列目のキーを押すとFNという名前のレイヤーに切り替わる。切り替え先は_______としている。こうしておかないとキーを離しても元のBASEレイヤーに戻らない。

    [_BASE] = LAYOUT(
        KC_A,    KC_1,    MO(_FN),
            KC_TAB,   KC_SPC
    ),
    [_FN] = LAYOUT(
        QMKBEST, QMKURL,  _______,
            RESET,    XXXXXXX
    )

4.ファームウェアをビルド

$ make (キーボード名):default

エラーが出なければOk。

5.書き込み

PCとPro MicroをUSBケーブルで接続する。USBケーブルは,最初↓を使ったら書き込みできなかった。

給電用のケーブルだと,信号線がつながっていないものがあるのだと思われる。他のケーブルに変えたら問題なくできた。同じ問題で困っている人がいるかも知れないので一応書いておこう。

接続したら,下記コマンドを実行。(4.でビルドが終わっていなければ,下記コマンドを実行すると,ビルドしてから書き込むので,4.は飛ばしても良い)

$ make (キーボード名):default:avrdude

→途中,リセットをするように言われるのでリセットスイッチを押す。

Detecting USB port, reset your controller now....

(「Pro Microのおうち」等を使っていてリセットスイッチがある場合はそのスイッチを押す。なければRSTピンとGNDピンを適当な線でショートさせる)

初回であれば,Windowsに認識され,(キーボード名)をセットアップしています,という表示がでる。
2回目以降,キーボードとして認識された状態で接続していても,5.を実行してリセットを押せば書き換えられる。

分割キーボードの場合

次に,分割キーボードの場合。↓の記事が参考になる。
skyhigh-works.hatenablog.com

以下の前提(限定)で説明する。

  • Pro Microと「ProMicroのおうち」↓を2個ずつ使う

swanmatch.booth.pm

  • ProMicroのおうちにTRRSジャックを取り付け
  • TRRSケーブルで左右のキーボードを接続
  • USBケーブルで繋がっている方が左手(デフォルトのまま)
  • キーの行と列の配線は,左右のPro Microで同じピンを使う(こうした方が楽)


手順
1.ソフトのインストール
2.テンプレートを作成
は,分割でないオリジナルキーボードの場合と同じ。

3.テンプレートを修正(分割の場合)

下記4つのファイルを修正すればよい。

  • rules.mk
  • config.h
  • (キーボード名).h
  • keymaps/default/keymap.c
3-1.rules.mk

このファイルのどこかに

SPLIT_KEYBOARD = yes

と追記。

3-2.config.h

分割の場合,キーの配列は,左手の行の後に右手の行が並ぶ配列となる。例えば私の場合,左右それぞれ3行8列なので,下記のように行の数を,2倍の6とした。

#define MATRIX_ROWS 6
#define MATRIX_COLS 8

行と列の線を,Pro Microのどのピンにつなぐのかを下記のように書く。例えば私の場合,左右同じピンで,下記のようにつないだ。

#define MATRIX_ROW_PINS { D4, C6, D7 }
#define MATRIX_COL_PINS { B6, B2, B3, B1, F7, F6, F5, F4 }

あと,Pro Microのおうちでは,シリアル通信に使うTRRSジャックが,Pro MicroのピンD2に接続されているらしい。テンプレートではD0になっているのでこれを修正する。

#define SOFT_SERIAL_PIN D2
3-3.(キーボード名).h

キーの配列をLAYOUTマクロに書く。例えば左右それぞれ3行8列の私のキーボードの場合,下記のようになる。(配線の都合で私の場合は下の配列の方を左右ひっくり返しているが,自分の配線に合わせる)

#define LAYOUT(
  L00, L01, L02, L03, L04, L05, L06, L07, R00, R01, R02, R03, R04, R05, R06, R07,
  L10, L11, L12, L13, L14, L15, L16, L17, R10, R11, R12, R13, R14, R15, R16, R17,
  L20, L21, L22, L23, L24, L25, L26, L27, R20, R21, R22, R23, R24, R25, R26, R27
  )
  {
    { L07, L06, L05, L04, L03, L02, L01, L00 },
    { L17, L16, L15, L14, L13, L12, L11, L10 },
    { L27, L26, L25, L24, L23, L22, L21, L20 },
    { R07, R06, R05, R04, R03, R02, R01, R00 },
    { R17, R16, R15, R14, R13, R12, R11, R10 },
    { R27, R26, R25, R24, R23, R22, R21, R20 }
  }
3-4.keymaps/default/keymap.c

後はキーマップを好きなように決めるだけ。私のキーマップを書いておく。(テンプレートから修正した部分のみ。とりあえず作成したばかりのマップなので,「マップ」は参考にならないので,行と列の数とか,「書き方」の参考に)

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
enum layer_names {
    _BASE,
    _MOUSE,
    _NUM,
    _FN
};
    [_BASE] = LAYOUT(
        KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,     MO(_FN),  KC_LCTL,    KC_RCTL,  MO(_NUM), KC_Y, KC_U, KC_I,    KC_O,   KC_P,     KC_AT,
        KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,     KC_RGUI,  KC_LALT,  MO(_MOUSE), KC_DEL,   KC_H, KC_J, KC_K,    KC_L,   KC_SCLN,  KC_COLN,
        KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,     KC_SPC,   KC_BSPC,    KC_ENT,   KC_SPC,   KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH,  KC_RSFT
    ),
    [_MOUSE] = LAYOUT(
        _______, _______, _______, _______, _______, _______,  _______, _______,    _______, _______,  KC_WH_U, _______, _______, _______, _______, _______,
        _______, _______, _______, _______, _______, _______,  _______, _______,    _______, _______,  KC_BTN3, KC_BTN1, KC_BTN2, _______, _______, _______,
        _______, _______, _______, _______, _______, _______,  _______, _______,    _______, _______,  KC_WH_D, _______, _______, _______, _______, _______
    ),
    [_NUM] = LAYOUT(
        KC_ESC,   KC_EXLM, KC_DQUO, KC_HASH, KC_DLR,  KC_PERC,  _______, _______,   _______, _______,  KC_AMPR, KC_QUOT, KC_LPRN, KC_RPRN, XXXXXXX,  KC_EQUAL,
        KC_CAPS,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,     _______, _______,   _______, _______,  KC_6,    KC_7,    KC_8,    KC_9,    KC_0,     KC_MINUS,
        KC_LANG5, KC_RO,   KC_CIRC, KC_JYEN, KC_TILD, KC_PIPE,  _______, _______,   _______, _______,  KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_UNDS,  KC_INS
    ),
    [_FN] = LAYOUT(
        KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,    _______, _______,    _______, _______,  KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,
        _______, _______, _______, KC_LEFT, KC_UP,   KC_RIGHT, _______, _______,    _______, _______,  KC_PSCR, KC_PGUP, _______, KC_HOME, KC_END,  _______,
        _______, _______, _______, _______, KC_DOWN, _______,  _______, _______,    _______, _______,  _______, KC_PGDN, _______, _______, _______, _______
    )
};

4.ファームウェアをビルド

も分割でないオリジナルキーボードの場合と同じ

5.書き込み

も同じだが,分割の場合,上記でビルドしたファイル(同じもの)を左右両方のPro Microに書き込む。




マウスを使う場合(キーボウスの場合)

QMK firmwareに,キーボードをマウスとして使う機能が実装されている。この機能を使えるようにするには,rules.mk で

MOUSEKEY_ENABLE = yes

とすればよい。テンプレートを使えばデフォルトで書いてある。
この機能は,元々,キーボードのあるキーを押したとき,マウスポインタが押している時間だけスーッと動くような使い方を想定したものである。私は,マウスをキーボードにくっつけることでキーボード本体をマウスのように使えるようにしている。これを「キーボウス」と名付けた。
manva.hatenablog.com

左クリックを「J」,右クリックを「K」のキーに割当てる。上記の[_MOUSE]レイヤのように,KC_BTN1が左クリック,KC_BTN2が右クリックを表す。簡単。