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


まえがき

本記事は私の記事の改変・転載になります。
少しでも多くの方に自作キーボードの素晴らしさを広めたいと思いこのような形となりました。
一人でも多く、キーボード自作erが増えてくれれば嬉しく思います。

最後に、次回のリンクがありますがQiitaへの転載は順次行います。
早く続きが読みたい方はリンクから飛んでみてくださいませ。

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

前回まででようやく物理的にはJIS(日本語)配列のキーボードができました。
ただ、このままではもともと海外で生産された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ファイルを追加していきます。

MOUSEKEY_ENABLE = no
CONSOLE_ENABLE = yes
#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.
というエラーが出ます。
このエラーが出たら、キーボードをひっくり返して…

リセットボタン

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

完成!!

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

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

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

待て!次回!!