自作キーボード'meishi2'のキーマップをコマンドラインで変更する。

# 要約

meishi2のファームウェア書き込み・キーマップを変更する手順は以下の通り。

```
（１）QMK Firmwareをホームディレクトリにインストールする（ホームディレクトリに`qmk_firmware`フォルダが作成される。
（/Users/MYHOME/qmk_firmware/~~）

（２）作成中のキーボードの名前（今回は 'meishi2' ）とおなじ名前のフォルダを辿った先にあるkeymap.cを編集する。
（今回は/Users/MYHOME/qmk_firmware/keyboards/meishi2/keymaps/default/keymap.c）

（３）makefileがあるディレクトリへ移動。
（今回は/Users/MYHOME/qmk_firmware/Makefileとなっているはずなので/Users/MYHOME/qmk_firmware/へ移動）

（４）make コマンド実行（`make meishi2:default:avrdude`）。
```


# はじめに
　キーボード自作の練習として、シンプルなキーボード'meishi2'を作った。

　ここでは、meishi2のファームウェア書き込み・キーマップ変更の方法を述べる。

　ファームウェア書き込みとキーマップ変更にかなりてこずった。ファームウェア書き込みに関する素晴らしい記事はたくさんある。しかし、私のような初心者のつまづきポイントにはあまり言及されていない。この方[[1]]がおっしゃるように、まさにこれという情報がなくてつらく感じた。そこで、私のような初心者の方のお役に立てればという気持ちで、自作キーボードのファームウェア書き込みの記事を書くことにした。

　ファームウェア書き込みと書き換えは同じ手順でできる。

[1]:https://qiita.com/hokita222/items/a5567d955923125b93ed
>\[1\]自作キーボード初心者がfirmware書き込みで躓いたこと集 - Qiita, https://qiita.com/hokita222/items/a5567d955923125b93ed

![イメージ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444980/f39fe4f7-3107-4a53-a39c-a2d3a043c560.jpeg)


# 環境
macOS; version 11.3
zsh; zsh 5.8 (x86_64-apple-darwin20.0)
QMK Toolbox; Version 0.1.1 (0.1.1)


# （１）QMK Firmwareをインストール

　Pro Micro（Arduino互換機のこと）にファームウェアを書き込むのにはQMK Firmwareというソフトを用いる。

　meishi2のビルドガイド[[2]]に従い、QMK Firmwareをインストールした（詳細はビルドガイド参照）。
　
　なお、ここでは作業ディレクトリをホームディレクトリ（`/Users/MYHOME`）とした。

　インストールすると、作業ディレクトリに（MYHOMEフォルダ）に`qmk_firmware`フォルダが作成されるはず。

　あとでmakeコマンドを実行する際に、どこにフォルダが作成されたかが大事である。


[2]:https://biacco42.hatenablog.com/entry/2019/08/10/185624

>\[2\]meishi2 keyboard ビルドガイド - たのしい人生, https://biacco42.hatenablog.com/entry/2019/08/10/185624


# （２）keymap.cを編集

　以下のパスのkeymap.cを編集して、Pro Microに書き込むとキーマップを変更できる。

　keyboardsフォルダの一つ下の階層にずらっと各種キーボードキットの名前が並んでいて、自分が作っているキーボード（今回はmeishi2）の名前のフォルダをたどった先にある`keymap.c`ファイルを編集する。

`/Users/MYHOME/qmk_firmware/keyboards/meishi2/keymaps/default/keymap.c`

　keymap.cを適当なエディタで開き、以下の箇所を編集する。

　meishi2のkeymap.cは以下（meishi2はボタンが4つしかない）。

```c
~~略~~
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT( /* Base */
    LCTL(KC_Z),  LCTL(KC_X),  LCTL(KC_C), LCTL(KC_V) \
  )
};
~~略~~
```

　上記では、一番左のボタンが 'left control + z' となっている。

　しかし、Macでは取り消し（undo）は 'command + z' なので、ここを書き換えることにした。

　左のcommandキーは 'LGUI' と表すので、`LCTL(KC_Z)`となっている箇所を`LGUI(KC_Z)`と書き換える。

　なお、キーの表現方法は以下のように決まっているようである[[3]]。

[3]:https://github.com/qmk/qmk_firmware/blob/master/docs/keycodes.md
>\[3\]qmk_firmware/keycodes.md at master · qmk/qmk_firmware · GitHub, https://github.com/qmk/qmk_firmware/blob/master/docs/keycodes.md


　そして、同様にほかの3つのキーも変更する。

```c
~~略~~
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT( /* Base */
    LGUI(KC_Z),  LGUI(KC_X),  LGUI(KC_C), LGUI(KC_V) \
  )
};
~~略~~
```

# （３）makefileがあるディレクトリへ移動

　makefileがあるディレクトリへ移動する。

　今回は`/Users/MYHOME/qmk_firmware/`フォルダへ移動する。ここに`makefile`があるはず。

# （４）makeコマンド実行。

　ビルドガイドに従い、`make meishi2:default:avrdude`コマンドを実行すると書き込める（実行後、画面に従いリセットボタンを押すなどの手順があるが、それらはビルドガイド参照することとして、ここでは割愛）。

　上記のようにすると、キーマップ情報がおさまったhexファイルが作業フォルダに作成されつつ、Pro Microに書き込みが行われる。

　ここで、`make meishi2:default`とするとhexファイルが作成され、Pro Microへの書き込みは行われない[[4]]。hexファイルを作成してGUI（Graphycal User Interface）のQMK Toolboxを使って書き込むこともできる（ここでは割愛）。

[4]:https://kunipon.com/3295

>\[4\]Macでの QMK Firmware の書き込み | くにぽんず☆きちめきパラダイス, https://kunipon.com/3295

　もし書き込みに成功したら、以下のように表示され、`meishi2_default.hex`というファイルが作業ディレクトリに作成されているはずである。

```zsh
~/qmk_firmware% make meishi2:default 
〜〜略〜〜
Compiling: tmk_core/common/command.c                                                                [OK]
Linking: .build/meishi2_default.elf                                                                 [OK]
Creating load file for flashing: .build/meishi2_default.hex                                         [OK]
Copying meishi2_default.hex to qmk_firmware folder                                                  [OK]
Checking file size of meishi2_default.hex                                                           [OK]
〜〜略〜〜
```

　ちなみに、`makefile`がないフォルダで`make`コマンドを実行すると以下のようなエラーがでる。

```zsh
~ % make meishi2:default
make: *** No rule to make target `meishi2:default'.  Stop.
```

# その他

　参考[[1]]の方と同じように、usbケーブルのトラブルがあり、これを見つけるのにかなり時間を浪費した。

　具体的には、参考[[1]]の方と同じで、makeコマンド実行後にリセットボタンを押すのだが、押しても何も反応がなかった（スイッチの半田付けを失敗したと考え、ショートさせるなどしたが全く反応なく大変苦労した）。

　自宅にあるやや高級なusbケーブルに変えると普通に動いた。半田付けや書き込み手順などに問題がないにもかかわらず、全く反応しない場合は、ケーブルを試しに変えると良いと思う（マジで）。基本的には、自作キーボードキットに付属したケーブルを用いるとよいと思う。

# 考察
今回のファームウェア書き込みのつまづきポイント
（１）CUIかGUIか
・CUI: keymap.cを編集してmakeコマンドで書き込む
・GUI: hexファイルを準備してQMK Toolboxで書き込む。
　hexファイルはmakeコマンド実行で作成される。もしくは、誰かが作ってくれた、目的のキーボードに対する目的のキーマップのhexファイルをwebからダウンロードする。

（２）makeコマンド；makefileがあるディレクトリで行う。

（３）usbケーブル；非常に大事。

（４）その他
・参考[[1]]のように、QMK Firmwareのダウンロード元によっては「lufa」フォルダが空のことがある。対応は参考のようにするか、手作業でコピーしてきてもよい。なんにせよ、'meishi2'ビルドガイドにあるダウンロード元のものは、「lufa」が空ではなく、問題はなかった。

・makeコマンドは`make meishi2:default:avrdude`のような形でだいたいいける。しかし、キーボードの種類によっては、keymap.cの場所が異なり、このコマンドの形が多少変わることがある（例えば、Froggyの場合、make helix/rev3_5rows:froggy-jp:avrdude となる）。詳細は今回は割愛した。