電子工作初心者が自作キーボードでハローワールドするまで

# はじめに
これは、WEB+DB PRESS vol.112で「自作キーボードのススメ」という記事を読んで、面白そう！と思って手を出してみた記録です。実際に材料や道具を揃えて作成したのは1月下旬〜2月上旬です。

# 完成品
![完成品](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60396/ce4d28a4-cf68-0114-73ba-5e74716af454.jpeg)

# 手短に
* これは楽しい
* meishi2のキースイッチは5ピンのものを用意しよう
* QMKのビルド環境はMac OS以外を用意したほうが良さそう

# 準備物
## キーボード本体
### meishi2
初めての自作キーボードにあたり、苦労するのははんだ付けであろうことは想像に難くありませんでした。はんだ付けを避けることもできそうでしたが、できるだけキー数の少ないキットで入門することで、はんだ付けの練習も兼ねることにしました。

### キースイッチ・キーキャップ
![キースイッチ・キーキャップ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60396/b85cfdfd-c18a-d6f8-d775-1e5eaa5102ed.jpeg)

Gateronの所謂「青軸」です。実用目的ではないので、最も「ポチッとな」感があるものを選びました。
ちょっと失敗だったのが、3ピンだと基板にはめ込んだときに隙間ができてしまい、ガタガタになってしまいました。5ピンのものだとピッタリ収まるようです。

## 道具
* はんだこて
* こて台
* はんだ
* はんだ吸取り線
    * 用意しましたが、まだ使っていません
* ニッパー
    * 百均で調達しましたが切れ味が悪かったので、ケチらずちゃんとしたものを買おうと思いました
* メンディングテープ
    * 部品の固定用
    * 半田こてが当たってしまうと溶けてビニールくさいので、紙製のマスキングテープのほうがいいんだなと実感しました
* USBケーブル
    * PCとキーボードを繋ぎます
* Raspberry Pi
    * 当初は使う予定はありませんでしたが、Macでファームウェアの書き込みができなかったため使いました

# 部品の組み立て
## 半田付け
主に下記のリンクを参考に半田付けをしました。

* [ハンダごてを買わされ、そして教わる :: デイリーポータルZ](https://dailyportalz.jp/kiji/180903203841)
* [はんだ付け講座 - ゴッドはんだ株式会社](https://godhanda.co.jp/kouza#web)

# ファームウェアの書き込み
当初はMacにインストールしたQMK Toolboxで試みましたが、不具合を踏んでしまいました。

[macOS Catalina: Pro Micro (w/Caterina bootloader) flashing - avrdude: butterfly_recv(): programmer is not responding · Issue #6133 · qmk/qmk_firmware · GitHub](https://github.com/qmk/qmk_firmware/issues/6133)

MacOS側の問題で、アップデートすれば解消するようです。QMK Toolbox自体が公開されたばかりで、今はこれ以上不具合を踏みたくないと思ったので、家にあったラズパイのRaspbian環境で構築しました。

## ビルド環境の構築
ドキュメントに記載はありませんが、avrdudeをインストールします。インストールしないと書き込み時にコマンドが見つからずエラーとなります。

```sh
apt-get install avrdude
```

あとはドキュメントに沿ってインストールします。

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

## ビルド
インストールが完了したらビルドと書き込みをします。meishi2をUSBポートに繋ぎます。赤色のランプが2つと緑色のランプが1つ点灯します。
meishi2ビルドガイドを参考にコマンドを実行します。

```sh
make meishi2:default:avrdude
```

途中でリセットしてねとメッセージが出てくるので、リセットボタンを押します。

```sh
Detecting USB port, reset your controller now.........
```

適切にはんだ付けができていれば、リセットボタンを押したときにチカッとランプが一瞬消えるようです。私のは押してもランプに変化がなく、ターミナルの反応もありませんでした。スイッチのはんだ付けができていないとみなし、GNDとRSTをショートさせてリセットしました。
はんだこてを使って、GNDとRSTを繋ぐように触れると、ランプがチカッと消えました。ターミナルでも文字が流れはじめ、しばらくすると「avrdude done. Thank you.」と表示されて処理が終わります。

## 動作確認
書き込みが終わってすぐにキーをポチポチ押しても反応しませんでした。一度USBケーブルを抜いて挿し直すと、2つの赤色のランプが消え、緑色のランプのみが点灯しました。この状態で押してみると・・・コピペできたー！
ひとつずつ動作確認してみると、1キーだけ反応しませんでした。うまくはんだ付けができていないようです。

## キーマップのカスタマイズ
キーマップを書き換えて、右端のキーを押したら「Hello, World.」と入力できるようにします。
新しいキーマップ用のファイルを生成します。

```sh
# new_keymap.sh <キーボード名> <新しいキーマップ名>
./util/new_keymap.sh meishi2 custom
vi keyboards/meishi2/keymaps/custom/keymap.c
```

生成したファイルのうち `keymap.c` を書き換えます。

```c:keyboards/meishi2/keymaps/custom/keymap.c
#include QMK_KEYBOARD_H

enum custom_keycodes {
  HELLO = SAFE_RANGE,
}

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  switch (keycode) {
    case HELLO:
      if (record->event.pressed) {
        SEND_STRING("Hello, world.");
      }
      break;
  }
  return true;
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  [0] = LAYOUT( /* Base */
    KC_A, KC_B, KC_C, HELLO \
  )
};
```

書き換えが終わったら保存して、再度ビルドを実行します。

```sh
# make <キーボード名>:<キーマップ名>:avrdude
make meishi2:custom:avrdude
```

## 参考
* [WEB+DB PRESS Vol.112｜技術評論社](https://gihyo.jp/magazine/wdpress/archive/2019/vol112)
* [WEB+DB PRESS Vol.112) に、 「自作キーボードのススメ」という記事を書きました。 - takkanm’s blog](https://takkanm.hateblo.jp/entry/2019/08/19/122739)
* [meishi2 keyboard ビルドガイド - たのしい人生](http://biacco42.hatenablog.com/entry/2019/08/10/185624)
* [(广东惠州)KS-8机械键盘青轴广东佳达隆GATERON支持客制化定制(佳达隆,机械键盘,蓝轴,手感) - 惠州佳达隆电子科技有限公司](http://www.gateron.com/supply/70.html)
* [QMK Firmware - An open source firmware for AVR and ARM based keyboards](https://qmk.fm/)
* [GitHub - qmk/qmk_toolbox: A Toolbox companion for QMK Firmware](https://github.com/qmk/qmk_toolbox)
* [macOS Catalinaでavrdudeを使ってProMicroに書き込もうとするとprogrammer is not respondingというエラーが出る - ぽよメモ](https://poyo.hatenablog.jp/entry/2019/11/04/005016)
* [Pro Micro &amp; QMK Firmware のセットアップガイド (Let's Split編) - Voxel Highway](http://riv-mk.hateblo.jp/entry/pro_micro_and_qmk)
* [macでqmk_firmwareを用いて書き込む時に`sh: avrdude: command not found`エラーが出る場合の対処法](https://medium.com/@hagevvashi/mac%E3%81%A7qmk-firmware%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%80%E6%99%82%E3%81%AB-sh-avrdude-command-not-found-%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E5%87%BA%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95-qiita-fec3bd3f4e6)
* [avrdude: not found · Issue #2163 · qmk/qmk_firmware · GitHub](https://github.com/qmk/qmk_firmware/issues/2163)
* [The New Way: SEND_STRING() & process_record_user - Macros - QMK](https://beta.docs.qmk.fm/using-qmk/advanced-keycodes/feature_macros#the-new-way-send_string-and-process_record_user)