新しい令和時代のキーボード (自作キーボード初心者が Meishi で U+32FF [㋿] を入力する話)

## 作ったもの

![reiwa_keyboard.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58889/5e809100-2c20-7a2a-2ff5-5702af70f5ad.gif)
㍼㍻🔜㋿

## TL;DR

- Meishi のファームウェア初回書き込みはリセットボタンを連打して成功しました
- Windows の場合は [WinCompose](https://github.com/samhocevar/wincompose) を常駐させておくことで Unicode をキーボードから直接入力できます
- 「㋿」を入力する場合は `rules.mk` で `UNICODE_ENABLE = yes` にして `UC(0x32FF)` をキーマップに書いてコンパイルしましょう
- 「🔜」などの絵文字も入力したい場合は `UNICODE_ENABLE` の代わりに `UNICODEMAP_ENABLE` を使いましょう

## はじめに：自作キーボードに入門する

ゴールデンウィーク中、急にキーボードを自作したくなったので遊舎工房に行ってみたところ、入門者に良さそうな [Meishi ― The micro macro keyboard kit](https://booth.pm/ja/items/736796) を見つけたので早速作ってみることにしました。店頭ではスイッチとキーキャップ付きで 1,620 円でした。ちなみに、自作キーボード作成経験は [Google 日本語入力 ピロピロバージョン](https://www.google.co.jp/ime/___o/)ぐらいしかありません。キーやボードがあるのは初めてです。

また、店頭では[令和キーキャップ](https://yushakobo.jp/shop/reiwa/)が売っていました。
![reiwa_keycap.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58889/d6c40208-6a17-2707-44ab-9eefea1a5da3.jpeg)

この時、これは新元号「令和」を打つためのキーボードを作れという事だ、と私は理解しました。早速取りかかりましょう。

## Meishi の組み立て

組み立て方は「[Meishi keyboard 組み立て方ガイド \- たのしい人生](http://biacco42.hatenablog.com/entry/2018/01/21/204749)」に記載されています。見落としがちな点として、マイコン基盤 (Pro Micro) の横にあるタクトスイッチ (丸い小さなスイッチ) は Pro Micro のリセットボタンです。ファームウェア書き込みに使います。

はんだ付けは先人達のガイド（例えば「[キーボード自作、特に Helix キーボードキットの製作に最低必要な工具のメモ](https://gist.github.com/mtei/6957107a676ddfa85bde0ae41f8fa849)」）などを参考に良い道具を揃えて挑みましょう。道具代の方が高いですが、これから沼に浸かっていく際にずっと使い続けられるので、実質無料みたいなものです。道具を揃えられない場合は[遊舎工房の工作室](https://yushakobo.jp/shopinfo/)や、[DMM.make AKIBA](https://akiba.dmm-make.com/about/plan)を活用するのも手でしょう。

![handazuke.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58889/2e4b27a1-fecc-016c-ddcd-723e26cf6f9e.jpeg)

できあがり。

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

Windows 10 で QMK Toolbox を使って書き込みました。

### 1. QMK Driver のインストール

[Releases · qmk/qmk\_driver\_installer](https://github.com/qmk/qmk_driver_installer/releases) から `qmk_driver_installer.zip` をダウンロードしてインストールします。管理者権限のコマンドプロンプトから `install_all_drivers.bat` を実行します。（なお Meishi 接続後に `install_connected_drivers.bat` でインストールしようとしたら「プロセスが使用中」と言われて失敗しました。）

ドライバインストールが終わったら、念のため PC を再起動します。その後、Meishi を PC に接続します。

### 2. QMK Toolbox とデフォルトファームウェアの準備

[Releases · qmk/qmk\_toolbox](https://github.com/qmk/qmk_toolbox/releases)から `qmk_toolbox.exe` をダウンロードして起動します。

ファームウェアを [QMK Firmware \- All Supported Keyboards](https://qmk.fm/keyboards/) から meishi を探してダウンロードします。ダウンロード先の URL は https://qmk.fm/compiled/meishi_default.hex でした。落としたファームウェアを QMK Toolbox の Open ボタンを押して開きます。

### 3. ファームウェアの書き込み (ハマりポイント)

QMK Toolbox の Auto-Flash にチェックを付けます。そしてリセットボタンを **連打** します。（初回書き込み時のみ。2 回目以降はリセットボタンを 1 回押すだけで OK。）書き込み処理後に `avrdude.exe done.  Thank you.` と表示されたら完了です。動作確認をしてみましょう。

ファームウェアの書き込みで私はハマりました。上記の通りやれば成功するはずです。私は Auto-Flash を使わず Flash ボタンで書き込もうとしていたのですが、何度やっても

```text
Connecting to programmer: .avrdude: butterfly_recv(): programmer is not responding
```

と出て止まってしまって、さらに Ubuntu で試してみてもうまくいかず…。
結局、下記サイトを参考に「リセットボタンを連打する→Flashボタンを押下→連打を止める」としたら成功しました。以降はリセットボタンを 1 回押すだけで書き込まれるようになります。おそらく Auto-Flash を使えばリセット連打して書き込み準備が整ったタイミングで処理が走るため、よりうまく行きやすいでしょう。リセットボタンを押すだけで書き込まれるようにできるので Auto-Flash は便利です。

- 参考：
    - [Helixキーボードを組み立てた \- 面白コンテンツ探求日記](https://horimislime.hateblo.jp/entry/building-helix-keyboard)
        - 書き込みがうまくいかない時の対処について参考になりました。適当にリセット連打するのが解決策だとは思わなかったです。
    - [（初心者編）自作キーボードにファームウェアを書き込む \- 自作キーボード温泉街の歩き方](https://salicylic-acid3.hatenablog.com/entry/qmk-toolbox)
        - QMK Toolbox の使い方の参考にしました。

## キーマップのカスタマイズ

「㋿」を入力できるようにするため、キーマップをカスタマイズします。その前にちょっと Unicode の確認と環境の準備をしましょう。

### 新元号「令和」と Unicode

Unicode では「令和」の合字「㋿」が `U+32FF` に割り当てられています。

- 参考：[新元号「令和」の合字がU\+32FFに割り当てられたけど、そこは丸囲みの「ン」でなくて良いの？\(^\_^;\) \- Sakura scope](https://www.nishishi.com/blog/2019/04/reiwa_u32ff.html)

2019/5/1 に Windows では早速アップデートが入り、合字のグリフが実装されています。Windows 10 であればこの記事のタイトルにも使っている「㋿」が tofu にならずに見えているかもしれません。（私は 5/4 に更新が降ってきて見えるようになりました）

その他、調べてみると [Source Han Sans こと源ノ角ゴシックは令和の合字に対応した](https://blogs.adobe.com/CCJKType/2019/04/source-han-sans-2001.html)ようですね。他にも [https://32ff.info/](https://32ff.info/)という Web ページも見つけましたがこのためだけにドメイン取ったのかな…。

### コンパイル環境の構築

[QMK Firmware 公式ドキュメントの Getting Started](https://docs.qmk.fm/#/newbs_getting_started)の Set Up Your Environment を参考にコンパイル環境を構築しましょう。私は Ubuntu 18.04 上に環境を作りました。Windows でも大丈夫です。
`util/qmk_install.sh` は必要なパッケージをその環境のパッケージマネージャからダウンロードするスクリプトなので Ubuntu の場合は `sudo` を付けて実行しましょう。

### ファームウェアのコンパイル

`git clone` した `qmk_framework` ディレクトリで以下のコマンドを打てば Meishi 向けファームウェアがコンパイルされます。

```
make meishi:default
```

`default` というのはキーマップで、`qmk_firmware/keyboards/meishi/keymaps/default/` ディレクトリを指しています。コンパイルされたファームウェアは `qmk_firmware/meishi_default.hex` に出力されます。

## 「㋿」へのマッピング

ここからファームウェアをカスタマイズします。
QMK Firmware は [Unicode の入力に対応しています](https://docs.qmk.fm/#/feature_unicode)がいくつか注意点があります。

- OS によって入力方式が異なります。Windows や macOS では異なる手法で Unicode を入力するため、使う OS を変える場合は設定を変えたファームウェアを書き込み直す必要があります。
    - Windows の場合は [WinCompose](https://github.com/samhocevar/wincompose) (ポータブル版あり) を起動した状態での入力を想定しています。
- `UNICODE_ENABLE` は `0xFFFF` まで入力できるため `0x32FF` の「㋿」を入力できます。この文字だけ打ちたい場合はこの手法が便利です。ただし、絵文字を入力したい場合はこのコードポイントの範囲外にあるため `UNICODEMAP_ENABLE` を使う必要があります。
    - 例えば 🔜 のコードポイントは `0x1F51C` です。（参考：[🔜 Soon With Rightwards Arrow Above Emoji](https://emojipedia.org/emoji/%F0%9F%94%9C/)）

今回は `UNICODEMAP_ENABLE` を使って実現しました。

### 1. キーマップの雛型を作る

`qmk_firmware/keyboards/meishi/keymaps/default/` ディレクトリを `qmk_firmware/keyboards/meishi/keymaps/reiwa/` にコピーします。これを雛型とします。

### 2. `rules.mk` にビルドオプションを追加する

`qmk_firmware/keyboards/meishi/rules.mk` を編集します。下の方にあるビルドオプションに `UNICODEMAP_ENABLE = yes` を追加します。

```qmk_firmware/keyboards/meishi/rules.mk
# Build Options
#   change yes to no to disable
#
BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
CONSOLE_ENABLE = yes        # Console for debug(+400)
COMMAND_ENABLE = yes        # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no            # USB Nkey Rollover
BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality on B7 by default
MIDI_ENABLE = no            # MIDI support (+2400 to 4200, depending on config)
UNICODE_ENABLE = no         # Unicode
BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE = no           # Audio output on port C6
FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
UNICODEMAP_ENABLE = yes     # これを追加
```

### 3. キーマップの編集

`qmk_firmware/keyboards/meishi/keymaps/reiwa/keymap.c` を編集します。

```qmk_firmware/keyboards/meishi/keymaps/reiwa/keymap.c
#include QMK_KEYBOARD_H

enum unicode_names {
  SOON,
  SHOWA,
  HEISEI,
  REIWA,
};

const uint32_t PROGMEM unicode_map[] = {
  [SOON]  = 0x1F51C, // 入力したい Unicode のコードポイントを指定
  [SHOWA] = 0x337C,
  [HEISEI] = 0x337B,
  [REIWA] = 0x32FF,
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT( /* Base */
  X(SHOWA), X(HEISEI), X(SOON), X(REIWA) \ // X() を使って入力キーを指定
),
};

const uint16_t PROGMEM fn_actions[] = {

};

void matrix_init_user(void) {
 set_unicode_input_mode(UC_WINC); // Windows 向けの入力方式に設定。macOS なら UC_OSX とする
}

void matrix_scan_user(void) {

}

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  return true;
}

void led_set_user(uint8_t usb_led) {

}
```

### 4. カスタムファームウェアのコンパイル

`qmk_firmware` ディレクトリでコンパイルを実行します。

```
make meishi:reiwa
```

### 5. カスタムファームウェアの書き込み

出来上がった `meishi_reiwa.hex` を QMK Toolbox で書き込みます。Auto-Flash にチェックしてリセットボタンを押せば OK。

これで完成！
[WinCompose](https://github.com/samhocevar/wincompose) を立ち上げた状態で入力してみましょう！

## 番外編：簡単にキーマップを変えるには

[QMK Configurator](https://config.qmk.fm/) を使うと Web 上で簡単にキーマップを変更したファームウェアを作成できます。残念ながら Unicode には対応していませんが、大体のことはできます。使い方は「[QMK configuratorを使ってキーマップを作成する \- 天高工房](https://skyhigh-works.hatenablog.com/entry/2019/02/13/161011)」を参考にすると良いです。

上記のサイトで途中、**芋が焼けるまで待ってください**とあって :thinking: となると思います。つまり、コンパイル中はこういう画面なわけです。

![baked_potato.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58889/acc55d10-1f48-efe0-8e80-9de62f5f5e01.jpeg)


## その他参考

- [【Let's split】qmkの書き込み \- ULTRA GENMA](http://ultra-genma.hateblo.jp/entry/2017/11/23/221256)
    - VM 上の Linux で書き込みしようとしたとき参考にしました。結局 VM からだとシリアル接続がうまくいかなくて諦めました。
- [Ubuntu 18\.04にArduino IDEをインストールして、プログラムをArduinoに書き込む \- Symfoware](https://symfoware.blog.fc2.com/blog-entry-2230.html)
    - Linux 上で Arduino の認識がうまくいかないなと思って Arduino IDE でポートを見たりしたときの参考です。
- [Arduino Pro MicroにキーパッドをつなげてPCの入力装置に \| 東京お気楽カメラ](http://okiraku-camera.tokyo/blog/?p=7988)
    - 同じ Pro Micro を使ったキーボード作成例です。素の Arduino を触るときの参考になるかなと。
- [QMK Firmwareによる日本語入力 \- NaCl非公式ブログ](https://nacl-ltd.github.io/2018/01/23/japanese-input-by-qmk.html)
    - `UC()` について、このサイトによれば

    > ドキュメントには `UNICODE_ENABLE` で `0xFFFF` までの値を入力できるとありますが、 `UC()` というマクロで MSB を立てて他のキーコードと区別するようになっているので、MSB が立っている値を入力すると MSB が落ちて入力されてしまいます。

    とのことです。今もこの事象は発生するかは未検証です。