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

自分で作成したPCBや空中配線で作ったキーボードのファームウェアの作成法のメモです。

(※ 2020/02/04 更新)
(※ 2022/05/22 QMK Firmwareの仕様が変更していたため新仕様での方法は[こちら](https://qiita.com/mizuhof/items/c2f9eb173b21593d969e)に新しくまとめ直しました)


## qmk/qmk_firmware のインストール

github から qmk_firmware のリポジトリをクローンしてきます。

```
$ git clone --recurse-submodules https://github.com/qmk/qmk_firmware.git
$ cd qmk_firmware
$ util/qmk_install.sh
```




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

ここからが本題。
オリジナルキーボードに合わせたファームウェアを作成していきます。
例として２ｘ２のキーボードのファームウェアを作成していきます。
自分の作成したいキーボードに合わせて便宜読み替えてください。

### 1. テンプレートを作成

`./util/new_keyboard.sh` を実行すると以下のようにキーボードの名前やキーボードタイプを聞かれるので、入力してください。
Keyboard Type はデフォルト（何も入力せずにエンター）で問題ありません。

```
$ cd qmk_firmware
$ ./util/new_keyboard.sh

Generating a new QMK keyboard directory

Keyboard Name: 4key
Keyboard Type [avr]:
Your Name [John Smith]:

Copying base template files... done
Copying avr template files... done
Renaming keyboard files... done
Replacing %YEAR% with 2020... done
Replacing %KEYBOARD% with 4key... done
Replacing %YOUR_NAME% with mizuhof... done

Created a new keyboard called 4key.

To start working on things, cd into keyboards/4key,
or open the directory in your favourite text editor.
```

`qmk_firmware/keyboards/4key`以下にテンプレートが作成されます。
フォルダの中身は以下のようになっています。

```
.
├── 4key.c
├── 4key.h
├── config.h
├── info.json
├── keymaps
│   └── default
│       ├── config.h
│       ├── keymap.c
│       └── readme.md
├── readme.md
└── rules.mk
```

### 2. ファイルの書き換え

主に書き換えるファイルは以下の4つ

- 4key.h
- config.h
- keymaps/default/keymap.c
- rules.mk


#### 4key.h

キーボードのレイアウトを以下のように定義していきます。
`#define LAYOUT`を書き換えます。 

```
（略）

#define LAYOUT( \
    k00, k01, \
    k10,  k11   \
    ) \
{ \
    { k00, k01,}, \
    { k10, k11 }, \
}


（略）
```

#### rules.mk

左右分離キーボードをつ

```
（略）

SPLIT_KEYBOARD = yes

（略）
```

#### config.h

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

![20171030180002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294169/7fe8a647-f4b1-6b4d-4939-d6650ab433f1.png)


```
（略）

/*
 * キーボードのレイアウトの設定
 */
#define MATRIX_ROWS 2  // キーボードの行の数
#define MATRIX_COLS 2  // キーボードの列の数

（略）

/*
 * キーボードの配線の変更
 * COLS: 列に使用するピンの指定, 左から右
 * ROWS: 行に使用するピンの指定, 上から下
 */
#define MATRIX_ROW_PINS { D4, C6 }     
#define MATRIX_COL_PINS { F4, F5 } 

（略）

/*
 * LEDの明るさの設定
 */
#define BACKLIGHT_LEVELS 3

（略）

/*
 * LEDの制御ピンの設定
 * LEDの数の設定
 */
#define RGB_DI_PIN E2
#ifdef RGB_DI_PIN
  #define RGBLED_NUM 4
  （他にも色々設定できるが今回は省略）
#endif

(略)

```

#### keymaps/default/keymap.c

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

```
（略）

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT( /* Base */
      KC_ESC,  KC_ENT, \
      KC_TAB,  KC_SPC  \
  ),
};

（略）
```

以上で最低限の設定は完了です。


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

先程設定したファイルを pro micro に書き込んでいきます。
手順は以下のとおりです。

1. ファームウェアをビルドする

    ```
    $ make 4key:default
    ```

1. ファームウェアを書き込む

    ```
    $ make 4key:default:avrdude
    ```

以上で完了です。

それでは、よいキーボードライフを！！！

## 参考

- [QMK AVR Processors](https://beta.docs.qmk.fm/hardware/hardware_avr#adding-your-avr-keyboard-to-qmk)
- [自作キーボードをQMK Firmwareに対応させる](http://kumatoki.hatenablog.com/entry/2017/11/08/175536)
- [Quantum Mechanical Keyboard Firmware](https://docs.qmk.fm/#/hardware_avr?id=adding-your-avr-keyboard-to-qmk)