自作日本語キーボードのススメ 4th key

2020年12月31日

自作キーボードの日本語化

前回まででようやく物理的には日本語配列のキーボードができました

ただ、このままではもともと海外で生産されたPCBに無理やり日本語配列通りにキースイッチをくっつけて、キートップをつけただけです。
実際に打ってみるとわかりますが、思ったように文字が入力できません
そこで今回は、DZ60(今回使用したPCB)のファームウェアを書き換えて、真の意味でのオリジナル自作日本語キーボードを完成させましょう!!

そう「オリジナル自作日本語キーボード」を!!

【以下余談】
なぜ2回言ったのかというと、会社の先輩方にも
😤「日本語配列は情弱の極み、英語配列キーボードこそ最適化されたキーボードで仕事も捗る!!」
と煽られるですが、キーボードを自作するようなちょっと変わった方々も同じなのか、情報が少量しかないんですよね。
それでも邪教(日本語配列)を崇拝する同志の手助けになるべく記録を残したいと思います。
おや…誰か来たようだ。誰だろう、こんな夜中なのに…

理想の配列を具現化しよう

キースイッチの配置が同じでも、各キースイッチに何を割り当てるかは完全に個人の自由です!!
まず自分の理想とするキー配置を一旦整理しましょう。

そこでオススメのツールはkeyboard-layout-editor.com
ここで自分の追い求める理想のキーマップを形にしていきましょう。

使い方は簡単
上のpresetからISO60%を読み込んで、DeleteKeyとAddKeyを駆使して形にしていくだけ!

今回、私が目指すキーマップはこんな感じ
(かの名機BLACK PAWNを参考にした配列になってます)

キー配列構成図
Layer 1
キー配列構成図
Layer2

突然レイヤーという概念が出てきましたが、難しいことはなにもありません。
基本的にはLayer1はそのまま押したときの動作。
その他のレイヤーは指定したキーを押しながら入力した際の動作を示してます。
ちなみにShiftキーの機能(「Shiftキー+1キー」で「!」)はレイヤーではなく標準で決まっています。

今回はFnキーを押しながらの時の動作をLayer2にまとめてます。
ファンクションキーとプリントスクリーンキー、LEDの調光機能を実現しています。
RGB関係のキーはリファレンスを参照

Layerはいくつでも設定できますのでここはお好みでどうぞ。

意外と書き出してみると、あーでもないこーでもないと思案しますが、それがいい…
キーボードを作る時はね、誰にも邪魔されず 自由でなんというか救われてなきゃあダメなんだ 独りで静かで豊かで・・・

ファームウェアの書き換え

ではゴールが決まったので、早速設定を作り込んでいきましょう!!

環境構築

実際にキーボードへの書き込みにはqmk_firmwareというツールを使います。

私はMac OS Catalina で実施しました。
Windowsの方はWSLを利用すると同様の手順で実施できるかと思います。

cd WorkDir
git clone https://github.com/qmk/qmk_firmware
cd qmk_firmware
./util/qmk_install.sh
make git-submodule

それなりに時間がかかるので、終わるまでのんびり待ちましょう。
これで環境構築は終わりです。

キーマップの定義ファイル

実行が終わると、様々なPCB用の定義ファイルなどがダウロードされています。
その中にあるDZ60用のプロファイルに、先程決めたキーマップを定義していきます。

今回はDZ60を使っているので
keyboards/dz60/dz60.hの最終行の
#endif
の手前に下記コードを追加してくだい。
これによって今回のキースイッチの配列をPCBに宣言することができます。

#define LAYOUT_65_yuzuki( \
    k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, k0f, \
    k10,      k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d,      \
    k20,      k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k1e, k2d, \
    k30,      k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \
    k40, k41, k43,                k46,                k4a, k4b, k4c, k4d, k4e  \
) 
{ \
    { k00,  k01,   k02,   k03,  k04,   k05,   k06,  k07,   k08,   k09,   k0a,  k0b,  k0c,   k0e,   k0f   }, \
    { k10,  KC_NO, k12,   k13,  k14,   k15,   k16,  k17,   k18,   k19,   k1a,  k1b,  k1c,   k1d,   k1e   }, \
    { k20,  KC_NO, k22,   k23,  k24,   k25,   k26,  k27,   k28,   k29,   k2a,  k2b,  k2c,   k2d,   KC_NO }, \
    { k30,  KC_NO, k32,   k33,  k34,   k35,   k36,  k37,   k38,   k39,   k3a,  k3b,  k3c,   k3d,   k3e   }, \
    { k40,  k41,   KC_NO, k43,  KC_NO, KC_NO, k46,  KC_NO, KC_NO, KC_NO, k4a,  k4b,  k4c,   k4d,   k4e   }  \
}

(KC_NOはキースイッチが接続されていないことを意味します)

キーの役割を決める

前項でPCBに「どこに何という名前のキースイッチが接続されているか」を教えてあげたので
次はPCBに「各名前のキースイッチの役割」を教えてあげます。
その定義ファイルはqmk_firmware/keyboards/dz60/keymaps 配下にあります。
過去の偉人達のテンプレートを見ることができます。
結構勉強になりますし、思わぬキーボードの使い方も発見できるので、一度見てみると楽しいです。

しかし、今回はこれらのテンプレートを使うことなく、新たに作っていきます。
まずは過去の偉人たちに仲間入りすべくディレクトリを作成。

# ディレクトリの作成
mkdir qmk_firmware/keyboards/dz60/keymaps/yuzuki-jis

その中に下記の2ファイルを追加していきます。

## rules.mk

MOUSEKEY_ENABLE = no
CONSOLE_ENABLE = yes
## keymap.c

#include QMK_KEYBOARD_H
enum layer_names {
  _QW,
  _L1,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  /* 0: qwerty */
  /*┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
    │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ ^ │ ¥ |BS │ 15
    ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤
    │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ @ │ [ │ Ent │ 13
    ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │
    │ Ctrl │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ : │ ] │    │ 14
    ├──────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬───┤
    │Shft   │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ _ | ↑ |Sft│ 14
    ├────┬──┴─┬─┴──┬┴───┴───┴───┴───┴───┴───┼───┼───┼───┼───┼───┤
    │Alt │Win │MHNK│         Space          |HNK│FN │ ← │ ↓ │ → │ 9
    └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘
    FnキーをL1レイヤーへの切り替えキーに指定
    */
  [_QW] = LAYOUT_65_yuzuki( \
//  1        2        3        4        5        6        7        8        9        10       11       12       13       14       15
    KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_JYEN, KC_BSLS,
    KC_TAB,           KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC,
    KC_LCTL,          KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_BSPC, 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_RO,   KC_UP,   KC_RSFT,
    KC_LALT, KC_LGUI, KC_HANJ,                            KC_SPC,                             KC_HAEN, MO(_L1), KC_LEFT, KC_DOWN, KC_RIGHT
  ),
  /* 1: fn 1 */
  /*┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
    │   │F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11│F12│   |Del│
    ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤
    │     │   │   │   │   │   │   │   │   │   │Prn│   │   │     │
    ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐    │
    │      │   │   │   │   │   │   │   │   │   │   │   │   │    │
    ├──────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬───┤
    │       │HUI│HUD│VAI│   │   │   │   │   │   │   │   |   |   │
    ├────┬──┴─┬─┴──┬┴───┴───┴───┴───┴───┴───┼───┼───┼───┼───┼───┤
    │    │    │    │                        |   │   │   │   │   │
    └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘
    HUI…色相を変更
    HUD…色相を逆方向に変更
    VAI…光度をアップ、Shiftを押しながらでダウン
    */
  [_L1] = LAYOUT_65_yuzuki( \
//  1        2        3        4        5        6        7        8        9        10       11       12       13       14       15
    _______, 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_PSCR, _______, _______,
    _______,          _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
    _______,          RGB_HUI, RGB_HUD, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
    _______, _______, _______,                            _______,                            _______, _______, _______, _______, _______
  ),
};

各コードの意味や役割はドキュメントを参照してください。
また関数名やレイヤー名は自由に変更しても大丈夫です。
これで、準備は完了です!

ファームウェアの書き込み

さぁいよいよ書き込みです。
キーボードをパソコンと接続して、下記コマンドを実行してください。

make dz60:yuzuki-jis:dfu

すると、実際にPCBに認識されているキースイッチの数と設定ファイルに書き込まれているキーの数に相違がなければ、5回[OK]という表記が出た後
ERROR: Bootloader not found. Trying again in 5s.
というエラーが出ます。
このエラーが出たら、キーボードをひっくり返して…

リセットボタン
リセットボタン

このリセットボタンをポチッと押しましょう。
すると、キーボード内のメモリに残っていた設定が消され、今回の設定が記録されます!!

完成!!

最後に入力テストを行って、問題がなければ…
これで名実ともに邪教(日本語配列)の自作キーボードの完成です!
お疲れ様でした!!

また、今更になりますが今回のコードはあくまでも一例です。
この通りにしなければいけないわけではなく、自由に書き換えて自分だけのキーマップを実現してください!

基本的にはこれが日本語キーボードの全てですが、実は細かい微調整もあるのでそのヒントは次回解説したいと思います。