前からときどき、Ubuntuがフリーズする。そのとき安全に再起動する手順を実行したいが、現在使っている2台目の自作キーボードにはPrintScreenがない。キーボードのファームウェアを書き換えて、PrintScreenを作る。
この記事を書こうと思ったのはそういう目的。あと自作キーボードの作成について記事を書こうと思っていたのに未だに書いていなかったのでついでにそれも書く。

1台目の自作キーボード

はじめに人生初自作キーボードのMint60について。
公式紹介は以下参照。

2019年当時、というかその少し前から「自作キーボード沼」という言葉が流行っていて、自分もちょっと足を踏み入れてみたいと思っていた。そんなとき、ネットで話題になっていたのがMint60。見た目もカラフルでおしゃれだし、左右分離型キーボードというのがどういうものか知りたかったので注文した。はんだごてのための作業道具も買って組み立てた。

なおはんだ付けのために以下を購入した。

自分ははんだ付けは決して得意ではないが、以前所属していた会社では補聴器の中の極小の基板に(顕微鏡をのぞき込みながら)はんだ付けをすることがあり、それに比べれば顕微鏡を使わないはんだ付けは遥かに楽だった(上手にできたとは言わない)。
鉛フリーはんだは一般的には溶けにくく扱いにくいとされているが今回はチャレンジとして選んだ。フラックスははんだ付けがしやすくなるもの。

Mint60の組み立てではスタビライザーの組み立てが一番悩んだ。(たしか「これ以上力を入れると壊れるんじゃないか?」とびびりながら組み立てた気がする。)他はわりとスムーズにできた。

2台目の自作キーボード

Mint60を完成させ、憧れの自作キーボードを日常使いするようになると、だんだん欲が出てきた。主に以下の2点。

  • 打鍵音をもっと小さくしたい
    Mint60ではキースイッチを選択できる。自分は 茶軸 を選んでいた。いまMint60のサイトを見ると赤軸を推しているようなので、なぜ自分が茶軸にしたかよくわからないが、自作キーボードについていろいろ調べる中で茶軸がスタンダードという思い込みを持っていたのだと思う。
    当時はわりと壁が薄いマンションに住んでおり、一挙手一投足に神経を遣う生活を送っていた。そのため、茶軸の打鍵音が大きすぎるのではないかという強迫観念じみた思いに取り憑かれるようになった。
    Mint60はメインに茶軸を選んでも、体験版的にいろいろな軸が1個ずつ付属するという粋な計らいがあり、自分はそれを使ったのでキーボードのいくつかのキーは別の軸だった。するとだんだん、赤軸や黒軸の静かでスコスコした打鍵感が好きになっていった。黒軸は押下圧が大きいので全部がこれだと疲れるかもしれないと思い、次は 赤軸 を選ぶことにした。
    なお自分は2021年6月に引っ越しをし、その部屋を離れた。いまMint60を触ってみると、茶軸の打鍵音が隣室に聞こえるほど大きいかもというのはやはり神経質すぎるとしか言いようがないので、普通は気にしなくていいと思う。(そしていま久々に出してみて、Micro USB端子がぶっ壊れていることに気が付いた。)
  • 左右分離型じゃない方がいい
    物珍しさで使っていたが、左右分離型は自分には合わなかった。左右のキーボードをつなぐための線はない方が嬉しいし、どうも打っていてキーの場所が固定せずタッチタイピングしにくく感じた(個人の感想です)。左右分離型は肩こりに良いらしいが、元々肩こりがないのでそのメリットも感じなかった。

(これを見てわかるように、Mint60に対する不満というよりは、単なる好みの問題だ。特にキースイッチは赤軸を選べばよかっただけの話。Mint60は素晴らしいキットなので、自作キーボード初心者である自分がここから入ったのは幸運だったと思う。)

2台目はこれらを考慮し、2020年に以下のキットを買って作った。AliExpressで買ったのは、自作キーボード関連の商品が多いという評判を聞いていたため。

はっきり言って何も尖ったところのない面白くない構成。でも気に入ってる。
1つ大失敗をした。基板には柔軟なキー配置ができるように、キースイッチを差し込む穴が何パターンも空いていたのだが、適当に挿してはんだ付けまでしてしまったため、隣のキーキャップとぶつかってキーキャップをはめられないキーができてしまった。事前に考えてからはんだ付けすべき。

2nd keyboard

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

2台目のキーボードで、キーマップを変えたいのでファームウェアを書き込む。QMK Firmwareのサイトに詳しいドキュメントがあるので、そのままやる。

Ubuntu 20.04でやった。 sankaku はユーザ名。

セットアップ

Setupを参考に。

  1. python3 -m pip install --user qmk
  2. qmk setup
    途中で、どこにcloneするか聞かれるので、OKならyを押す。
      $ qmk setup
       Could not find qmk_firmware!
      Would you like to clone qmk/qmk_firmware to /home/sankaku/qmk_firmware? [y/n] 
      Would you like to clone qmk/qmk_firmware to /home/sankaku/qmk_firmware? [y/n] y
      Cloning into '/home/sankaku/qmk_firmware'...
    
  3. qmk compile -kb yd60mq -km default
    ただのテスト。うまくコンパイルできることを確認する。
    キーボードの種類(?)としてyd60mqを指定している。上に書いたキットのページに「Kit 2: Case+ 2u Shift Silver Plate+Stablizers+ YD60MQ Type C Gold Pad Black PCB (no underglow RGB included)」と書いているので、これで正しいはず…。あんまりよくわかってない。
  4. qmk config user.keyboard=yd60mq
    設定。
  5. qmk config user.keymap=sankaku
    設定。

キーマップの設定

Building Your First Firmwareを参考に。

  1. qmk new-keymap
    キーマップを書くためのディレクトリが作成される。
      $ qmk new-keymap
      Ψ sankaku keymap directory created in: /home/sankaku/qmk_firmware/keyboards/yd60mq/keymaps/sankaku
      Ψ Compile a firmware with your new keymap by typing: 
    
          qmk compile -kb yd60mq -km sankaku
    
  2. ~/qmk_firmware/keyboards/yd60mq/keymaps/sankaku/keymap.c を編集
    一応、元のファイルをバックアップしておいてから編集。
    Full ListBasic Keycodesなどを参考に書く。
  3. qmk compile
    コンパイル。
  4. qmk flash
    基板に書き込み。
    RESET状態にあるキーボードを探して書き込むよう。書き込み対象のキーボードの他に、コマンドを打つためのキーボードも必要になるのかと思ったが、コマンドを打ったあとでRESET状態にすればうまくいった。
    RESET状態にする方法はFlashing Firmwareを参照。

上に書いたのは最近行った、2度目の書き込み作業。1度目はキーボード組み立て直後にやっていたが、やり方を完全に忘れていた。自分はこの1度目の書き込みのとき、RESETを「Fn + `」に割り当てていたので、これを押してRESET状態にした。1度目はたしか両方のShiftを押した後でBを押してRESETにした…気がするがよく覚えていない。

keymap.c

実際に書き換えたkeymap.cは以下。MOはFn的なもの。 MO(1) を押すと [1] のレイヤーに行き、さらにそのまま MO(2) を押すと [2] のレイヤーに行く。

#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

	[0] = LAYOUT_all(
        KC_GRV,  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_BSPC, KC_BSPC,
        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_BSLS,
        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_ENT, KC_ENT,
        KC_LSFT, 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_UP,   MO(1),
        KC_LCTL, KC_LGUI, KC_LALT,                   KC_SPC,   KC_SPC,  KC_SPC,                   KC_ESC,  KC_DEL,  KC_LEFT, KC_DOWN, KC_RGHT
    ),

	[1] = LAYOUT_all(
        MO(2),   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_DEL,
        _______, _______, KC_UP,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
        _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
        _______, _______, _______, KC_PSCR, _______,  _______, _______,  _______, _______, _______, _______, _______, _______,KC_PGUP, _______,
        _______, _______, _______,                   _______, _______, _______,                   _______, _______, KC_HOME,  KC_PGDN,KC_END
    ),

	[2] = LAYOUT_all(
        _______,  _______,    _______,    _______,    _______,    _______,    _______,    _______,    _______,    _______,    _______,    _______, _______,  _______, _______,
        _______,  _______,    _______,    _______,    RESET,    _______,    _______,    _______,    _______,    _______,    _______,    _______, _______, _______,
        _______, _______,    _______,    _______,    _______,    _______,    _______,    _______,    _______,    _______,    _______, _______, _______, _______,
        _______, _______, _______,    _______,    _______,    _______,    _______,    _______,    _______,    _______, _______,  _______, _______, _______,   _______,
        _______, _______, _______,                   _______,   _______,  _______,                   _______,  _______,  _______, _______,_______
    ),
};
  • RESETを変えた
    前回の書き換えでは「Fn + `」にしていた。ところがこれをRESETに割り当てていたことを完全に忘れていた。このキーはたまに(誤って)押してしまうことがあり、そのたびにキーボードが入力不能になって、何が起きたのかと戸惑っていた。こういうことがあると困るので、絶対に押さない場所にした。
  • PrintScreenを設定した
    KC_PSCRがそれ。
  • MO(1) がここにあると便利
    PageUpとかがやりやすい。
  • ESC(KC_ESC)がここにあると便利
    押しやすい。