自作キーボード設計に挑戦した記録（本格的なのはこれから）

# はじめに

これは初めて自作キーボード設計に挑戦したときの記録です。
初めて自作キーボードを行う方への入門のような記事ではなく、ただの自己満足＋記録用のページです。


# まず何をしたか

いきなり設計をするのは難しいので、はじめに販売されているキーボードの作成から開始しました。
分離型を作ってみたかったので、色々調べた結果、Irisを作成してみることにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/5b70dc56-ceb1-e05f-18fe-c96fec35d980.png)


PCB（基板）はkeebioのページで注文。PCB以外に各種パーツもついてきます。
ネジやPro Microはついていないので、AliExpress等で発注。全部届くまで1～2か月ぐらいかかりました。


# 勉強

既存の自作キーボードを作成することで、組み立てはできるようになりましたが、設計は当然ながら分からないので、まずは基板の設計等について勉強を始める。
まずはネットで調べてみたが、最終的には以下の3冊を購入して勉強した。

- [自作キーボード設計入門](https://booth.pm/ja/items/1044084)
- [自作キーボード設計入門2](https://booth.pm/ja/items/1315935)
- [KiCad 5.0 / 5.1 入門実習テキスト『KiCad Basics for 5.x』 ](https://booth.pm/ja/items/941963)

上の2冊で自作キーボードは設計できるようになるはず。ただし、KiCadの操作方法の記載が薄いので、下の1冊も買って勉強すると設計がスムースになるかと思います。


# キーボードレイアウト設計

まずは、キーボードレイアウトを決めます。
いきなりフルキーボードを作成するのは難しいので、10cm x 10cmにすると安く作成できるので10キーの小さなキーボードを作成しました。

以下のサイトでキーボードレイアウトを作成します。

- [Keyboard Layout Editor](http://www.keyboard-layout-editor.com/#/)

3x3の9キーと、右下にレイヤー切り替えのキーを配置しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/aaa532ff-c804-c999-c15b-07293a6dd8f3.png)


# PCB（基板）設計

KiCadでPCBを設計します。
作成方法等は省略。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/92a8c799-fba6-0a13-c126-91b9e3159dde.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/8ff8fb9b-7786-94b5-304c-1e84d0628238.png)


# ケース（プレート）設計

KiCadから基板をエクスポートし、InkScapeに取り込んでケースを設計します。
今回はアクリルプレートで作成し、PCBの上下をサンドイッチするため、ボトムプレートとトッププレートの2つを設計します。

KiCADで「Dwgs.User」、「Edge.Cuts」、「F.CrtYd」と「Eco2.User」の4つをSVGで出力します。
「ファイル」-「プロット」で製造ファイル出力ダイアログを出力し、先ほどのレイヤーを選択し、「製造ファイル出力」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/599f3eee-1a6c-1106-de34-fa087d01a4ea.png)

次に出力したSVGファイルをInkScapeで取り込んで編集します。
作成したプレートは以下のようになります。
最終的に発注するためにDXFフォーマットで出力します。

- トッププレート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/a986c2b9-9b7e-63c0-3565-2621a68e2867.png)

- ボトムプレート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/6b87094f-0ca2-3c10-1139-60ae46114c29.png)


## Inkscapeの設定

Inkscapeの設定を開き、「使用する境界枠」に「幾何学的境界枠」を設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/8b3ab2fd-2c1a-63bf-3fcf-57529c99d5d5.png)

「ドキュメントのプロパティ」からグリッドの設定で、グリッドの単位は「mm」に設定し、X/Y方向の間隔を0.1mm程度に設定しておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/a8a0aeed-91fd-2e05-2bc7-b76f3ad7cb0f.png)


# 発注

PCB、ケースともに[Elecrow](https://www.elecrow.com/)に発注しました。
アクリルならファイルを持ち込んでレーザー加工するという方法もあるようですが、近くに手頃なお店がなかったので、時間はかかりますがElecrowを利用。

今回は10cm x 10cm用なので送料は高くなりますがPCB、ケース自体は5ドルぐらいで安かった。
たしか1～2週間で届いたはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/291e52ea-806e-58fa-a6ea-0d09c04856a1.png)

最低発注が5個からなので、PCB、ケースともに5枚ずつ届きました。

アクリルの価格は以下のとおり（2019年12月時点）。

- 10cm x 10cm x 2mm $5.8
- 20cm x 20cm x 2mm $16.55
- 30cm x 30cm x 2mm $37.8


# ファームウェア作成

発注している間、作成するキーボードのファームウェアをプログラミングします。

QMK Firmwareというフレームワークを利用し雛型を生成できるので、単純なキーボードであればプログラム自体はほとんどなしで作成できます。

## MSYS2をインストール

まずはファームウェアを開発するための環境構築です。MSYS2を以下からダウンロードします。

- https://www.msys2.org/

インストールし、「C:\msys64\msys2.exe」をダブルクリックし起動します。

MSYS2のパッケージを最新へ更新するために以下のコマンドを実行（したはず）

```
pacman -S git
pacman -Syu
pacman -Su
pacman -S avr-gcc
```

## QMK Firmwareをダウンロード

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

Which USB drivers do you want to install?
(A)all - All supported drivers will be installed
(C)onnected - Only drivers for connected keyboards (in bootloader/flashing mode)
              will be installed
(F)force - Like all, but will also override existing drivers for connected
           keyboards
(N)one - No drivers will be installed,
         flashing your keyboard will most likely not work
(A/C/F/N)? F
```

最後にmsysを再起動する。


## テンプレートを生成

```
$ cd qmk_firmware
$ util/new_keyboard.sh
Generating a new QMK keyboard directory
Keyboard Name: emkee10m
Keyboard Type [avr]:
Your Name: mkyz08
```

以下のディレクトリが作成される。
 keyboards/emkee10m/


## ファイルの修正

主に修正するファイルは以下の4つ。


- keyboard_name.h
- rules.mk
- config.h
- keymaps/default/keymap.c

```c:keyboard_name.h
#define LAYOUT( \
    k00, k01, k02, \
    k10, k11, k12, \
    k20, k21, k22, k23 \
) \
{ \
    { k00, k01, k02, KC_NO }, \
    { k10, k11, k12, KC_NO }, \
    { k20, k21, k22, k23 } \
}
```

```c:rules.mk
RGBLIGHT_ENABLE = yes        # Enable keyboard RGB underglow
```

```c:config.h
/* key matrix size */
#define MATRIX_ROWS 3
#define MATRIX_COLS 4

#define MATRIX_ROW_PINS { E6, B4, B5 }
#define MATRIX_COL_PINS { B3, B2, B6, B1 }

#ifdef RGB_DI_PIN
   #define RGBLED_NUM 16
   #define RGBLIGHT_HUE_STEP 8
   #define RGBLIGHT_SAT_STEP 8
   #define RGBLIGHT_VAL_STEP 8
   #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
   #define RGBLIGHT_SLEEP  /* If defined, the RGB lighting will be switched off when the host goes to sleep */
// /*== all animations enable ==*/
//   #define RGBLIGHT_ANIMATIONS
// /*== or choose animations ==*/
//   #define RGBLIGHT_EFFECT_BREATHING
   #define RGBLIGHT_EFFECT_RAINBOW_MOOD
//   #define RGBLIGHT_EFFECT_RAINBOW_SWIRL
//   #define RGBLIGHT_EFFECT_SNAKE
//   #define RGBLIGHT_EFFECT_KNIGHT
   #define RGBLIGHT_EFFECT_CHRISTMAS
//   #define RGBLIGHT_EFFECT_STATIC_GRADIENT
//   #define RGBLIGHT_EFFECT_RGB_TEST
//   #define RGBLIGHT_EFFECT_ALTERNATING
// /*== customize breathing effect ==*/
//   /*==== (DEFAULT) use fixed table instead of exp() and sin() ====*/
//   #define RGBLIGHT_BREATHE_TABLE_SIZE 256      // 256(default) or 128 or 64
//   /*==== use exp() and sin() ====*/
//   #define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85  // 1 to 2.7
//   #define RGBLIGHT_EFFECT_BREATHE_MAX    255   // 0 to 255
#endif

```

```c:keymap.c
// Defines names for use in layer keycodes and the keymap
enum layer_names {
    _BASE,
    _FN
};

// Defines the keycodes used by our macros in process_record_user
enum custom_keycodes {
    QMKBEST = SAFE_RANGE,
    QMKURL
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /* Base */
    [_BASE] = LAYOUT(
        KC_LCTL, KC_DEL, KC_BSPC,
        KC_LSHIFT, KC_UP, KC_ENT,
        KC_LEFT, KC_DOWN, KC_RIGHT, MO(_FN)
    ),
    [_FN] = LAYOUT(
        KC_LCTL, KC_C, KC_V,
        KC_SPC, KC_APPLICATION, KC_RALT,
        RGB_TOG, RGB_MOD, RGB_HUI, KC_TRNS
    )
};
```

## ビルドと書き込み

組み立て後になりますが、自作キーボードを接続し、以下のコマンドでファームウェアのビルドと書き込みが実行されます。

```
cd ~/firmware/qmk_firmware
make emkee10m:default:avrdude
```

以下のファイルができる。

 .build/emkee10m_default.hex


# 組み立て

PCBとプレートが届いたら、あとは頑張って組み立てる。
はんだごてなど買わなきゃいけないものが多く、部品もねじとかあらかじめ購入しておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/342d13b9-7141-aeff-113c-3f814550cc22.png)


# ソース

ソースはGitHubに公開しています。ライセンスはMITです。

https://github.com/mkyz08/emkee10m


# 最後に

最後に現在設計しているキーボード（未完成）です。
分割JISキーボードという既存ではほとんどないので自作中です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179607/6dac9270-4218-dd39-d45c-83c3ec78c0e4.png)


# 今回使用したソフトウェアとバージョン

- KiCad 5.1.4
- Inkscape 0.92.4
- MSYS
- QMK Firmware