QMK Firmware でオリジナルキーボードのファームウェアを作成する

1年ぶりにQMK Firmwareをさわったらだいぶ変わっていたので 2022/05/22 時点での自作キーボードのオリジナルのファームウェアの追加法をメモっときます．

# 事前準備

事前に[本家リポジトリ](https://github.com/qmk/qmk_firmware)をフォークしておきます．
フォークしたリポジトリをお好きな場所にクローンしておきます．

（この事前準備はしなくてもファームウェアを追加することはできるのですが，作成したファームウェアは自身のgithubで管理したほうが良いと思うのでこの方法をとっています．）

# 環境設定

```shell
# 結構時間かかります
brew install qmk/qmk/qmk


# 事前準備でクローンしてきたパスを設定
qmk setup -H <path>
```

確認するために適当なキーボードをコンパイルしてみます．

```shell
qmk compile -kb clueboard/66/rev3 -km default
```

エラーが出ていなければ設定は問題なくできてます．


# キーボードを追加する．

`qmk new-keyboard -u <github_username>`を実行して質問に答えていく．

```shell
$ qmk new-keyboard -u <github_username>
Ψ Generating a new QMK keyboard directory           
             
Name Your Keyboard Project                          
For more infomation, see:                           
https://docs.qmk.fm/#/hardware_keyboard_guidelines?id=naming-your-keyboardproject                       
             
Keyboard Name? sample2x2         # ← キーボードの名前を入力

Pick Base Layout
As a starting point, one of the common layouts can be used to bootstrap the process

Default Layout? 
        1. 60_abnt2
        2. 60_ansi
        ．．．
        50. tkl_nofrow_iso
        51. none of the above
Please enter your choice:  [51]  # ← ベースのレイアウトを選択．新規で追加するので５１．

What Powers Your Project
For more infomation, see:
https://docs.qmk.fm/#/compatible_microcontrollers

MCU? 
        1. at90usb1286
        ．．．
        12. atmega32u4
        ．．．
        36. WB32F3G71
Please enter your choice:  [12]  # mcuを選択．Promicroを使うのであれば12．
Ψ Created a new keyboard called sample2x2.
Ψ To start working on things, `cd` into keyboards/sample2x2,
Ψ or open the directory in your preferred text editor.
Ψ And build with qmk compile -kb sample2x2 -km default.
```

実行後` keyboards/sample2x2/`ができている．
ディレクトリ内のファイルは以下．

```shell
❯ tree keyboards/sample2x2 
keyboards/sample2x2
├── config.h
├── info.json
├── keymaps
│   └── default
│       └── keymap.c
├── readme.md
└── rules.mk

2 directories, 5 files
```

最低限編集しなければいけないファイルは`info.json`と`keymaps/default/keymap.c`．

## info.json

まずキーボードマトリックスの設定を行う．
キーマトリクスの行と列が pro micro のどのポートに対応しているのかなどを指定する．
pro micro のポートを指定する場合は以下の画像を参考．
ただし、先頭のPは省略する(例：PD3 → D3)．

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3239343136392f37666538613634372d663462312d366234642d343933392d6436363530616234333366312e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294169/3b6ec5a2-e356-8260-d86e-fc94f7cc8f72.png)

colsは左から右に，rowsは上から下に順に指定する．

```json
    "matrix_pins": {
        "cols": ["F4", "F5"],
        "rows": ["D1", "D0"]
    },
```

電気回路のマトリックスとこの後編集する`keymaps/default/keymap.c`で定義するキーマップの配列の対応を定義する．

```json
    "layouts": {
        "LAYOUT_2x2": {
            "layout": [
                { "matrix": [0, 0], "label": "A", "x": 0, "y": 0 },
                { "matrix": [0, 1], "label": "B", "x": 1, "y": 0 },
                { "matrix": [1, 0], "label": "C", "x": 0, "y": 1 },
                { "matrix": [1, 1], "label": "D", "x": 1, "y": 1 }
            ]
        }
    }
```

- "matrix": 電気回路のマトリックスの位置
- "label": ラベル．どのキーかを書いておくとわかりやすい．
- "x", "y": キーの位置（VIAで使う．qmkでファームウェアを書き込むだけならなくてもいい．）

ここで重要なのが"layout"内の要素の順番．
この順番とこの後定義する`keymaps/default/keymap.c`の配列の順番が対応することになる．

## keymaps/default/keymap.c

ここに、どのキーを押したら何を入力するのかを設定する．
入力される文字にはそれぞれキーコードが決まっているので，[Basic Keycodes](https://docs.qmk.fm/#/keycodes_basic)を参考に設定していく．

```c
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /*
     * ┌───┬───┐
     * │ A │ B │
     * ├───┼───┤
     * │ C │ D │
     * └───┴───┘
     */
    [0] = LAYOUT_2x2 (
        KC_A,   KC_B,
        KC_C,   KC_D
    )
};
```

## キーボードにファームウェアを書き込む

先程設定したファイルを pro micro に書き込む．

1. ファームウェアをコンパイルする．
    ```shell
    qmk compile -kb sample2x2 -km default
    ```

2. ファームウェアを書き込む．
    ```shell
    qmk flash -kb sample2x2 -km default
    ```
    私はM1 Macを使っているのですが，この方法でファームウェアを書き込もうとしてもうまく認識してくれなかったため[QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases)を使って書き込みました．

以上で完了.



# 参考

[Setting Up Your QMK Environment](https://docs.qmk.fm/#/newbs_getting_started)
[Keyboard Guidelines](https://docs.qmk.fm/#/hardware_keyboard_guidelines)
[Porting Keyboards](https://docs.qmk.fm/#/porting_your_keyboard_to_qmk)
[info.json Format](https://docs.qmk.fm/#/reference_info_json)