健康的な仕事環境を自作キーボードで叶える！

# はじめに

株式会社ビットキー Advent Calendar 2023，22日目の記事を担当する @NaotoFujihiro です．

[株式会社ビットキー Developerのカレンダー | Advent Calendar 2023 - Qiita](https://qiita.com/advent-calendar/2023/bitkey)


# 概要

キーボード入力を長時間続けることにより，肩甲骨や鎖骨のあたりに強い痛み（いわゆる肩こり？）が現れていました．

痛みや不快感が強く，業務に集中できなかったため，特にキーボードを自作することで作業環境の改善に挑戦しました．

名付けて，『自作キーボードをつくってみた』プロジェクトです！

また，自作キーボードでは，ケース・電子回路・ファームウェアを開発する必要があるため，IoTプロダクト制作をやってみた記事でもあります．

ハードウェア（基板やプレート）を設計・製作し，そこにファームウェアを組み込むため，基本的にはウォーターフォール開発のプロセスを採用します．
一方で，小さく作って，素早く改善点や潜在的な好みを見つけるために，1ヶ月以内に実際に使えるプロトタイプを作成することを目指しました！

回路設計（KiCadなど）や3Dデザイン（Fusion360など）は使ったことがないため，習熟に要する時間を考慮し，今回のスコープでは紙で設計したり簡単な代替策を採用したりしています．

プロトタイプを実際に使って，そのフィードバックを設計に反映する際に，各種ツールを使いこなす予定です．


# この記事で伝えたいこと

自作キーボード（自キ活）は良いぞ！

電子工作の初心者が，とりあえず自作キーボードを完成させるまでの工程をお伝えします．

キットを購入するのではなく，自分なりのこだわりを反映したキーボードを作ります．

年末年始のお休みに，身体の健康を叶えるキーボードをぜひ自作してみてください！


## つかってみた！

自作キーボードを初めて1ヶ月の成果です！
![PXL_20231221_144225674.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/610c35e9-7792-fb5a-540d-de7cb7b56d68.jpeg)

左上のキー（行1列1）を入力すると，`7` が入力されます！！
![screenshot_2023-12-21_at_23.38.16-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/a4a6c63a-3888-b590-00db-67f316fded53.png)

以下の理由により，両手分のキーボードを作成して，実際に入力するところまでは完成しませんでした．．．

- 部品を表裏反対にはんだ付けしてしまい，追加部品の手配が間に合わなかった
- ファームウェアを書き込もうとしても，QMK Toolbox に Pro Micro が認識されない（タイピングしたキーは認識されている）問題が発生している

このような製作工程での失敗や，不測の事態を経験して対策を練るためにも，プロトタイピングを行った価値は十分にあったと考えています．


# 解決したい課題

普段は，MacBook Pro を使用して業務を行っているのですが，以下のような問題を抱えていました．

- MacBook 備え付けキーボードの清掃が難しい．
    - 手汗をかきやすい一方でハンドクリームを塗るため，キーボードをこまめに清掃する必要があります．
    - しかし，MacBook 備え付けキーボードは清掃が難しく，衛生面で懸念を抱えていました．
- 肩幅に対しキーボード幅が狭いため，巻き肩になる．
    - キーボード入力の際はキーボードに合わせて，肩をリラックスさせた状態から，肩を内側に入れる必要があります．
    - 身体に負担をかけており，鎖骨・肩甲骨・背骨あたりに慢性的な痛みを抱え，頭痛にも悩まされてました．
- 掌に対しキーボードが小さく，打鍵しにくい．
![PXL_20231219_061217470.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/bfe0fa7d-e079-53bc-32db-7e167aea88cd.jpeg)
    - 自然に手をホームポジションに置こうとすると，画像のように左下 (z) ・右下 (/) のキーを押しにくくなってしまいます．
    - キーボードに対し水平に指を置こうとすると，手首を曲げる必要がありますが，前述の肩幅の問題もあり，負担となり現実的ではありません．

本プロジェクトにおいては，Notionでプロジェクト管理していました．
![Screenshot 2023-12-21 at 14.50.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/d91619bb-fef2-a312-de99-d42d6ed4f218.png)

課題一覧をデータベースとしてまとめ，それぞれの課題に対して要求や要件をリレーションで紐づけています．

そうすることで，その機能が必要な理由や機能が解決している課題を，一瞥して理解できる状態で管理できます！


# 課題の原因

MacBook 備え付けキーボード，または，市販の一般的なキーボードが，私の身体に合っていないことが原因だと思います．

身長が平均より高いため，キーボードだけではなく，椅子や机も身体に合わないことがよくあります．


# 解決策の仮説

各課題に対して，解決策の仮説を立てました．
![Screenshot 2023-12-21 at 14.49.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/dd6bcb70-54f4-242c-d85d-8ef2bd0a4fbc.png)

これらの課題と解決策の仮説を立てた段階では，自作キーボードは『いつかやってみたい』という思いでした．

しかし，課題『掌に対しキーボードが小さく，打鍵しにくい』に対する，解決策の仮説として『自分の手に合わせたキー配置にする』を採用した段階で，自作キーボード沼に片足を踏み入れる決意を固めました．

キーボードを自作せずには，この仮説は検証できません．

そこで，この仮説を検証できるプロトタイプを作成するところまでを，本記事の範囲とします．


# 課題を解決する技術・手法

## 技術・手法の概要

解決策の仮説を踏まえ，左右分離型のキーボードを自作します！！！

自分の手に合わせたキーボードを作れば，問題解決に一歩前進できるはずです！

本記事では，電子工作の初心者が，まずは自作キーボードを完成させるまでの工程を記します．

そのため，自作キーボードの解説記事でよく見かける，KiCadでの回路設計やFusion360でのプレート設計などは，より簡単な他の方法で行いました．

実際に使用したツールは，[KLE](http://www.keyboard-layout-editor.com/#/)，[Plate & Case Builder](http://builder.swillkb.com/)， [Inkscape](https://inkscape.org/) です．

- [KLE](http://www.keyboard-layout-editor.com/#/)
    - 手形で作成したキー配列を，サイズも加味してデザインし直し，後工程で加工可能なデータ形式で保存するために使用します．
- [Plate & Case Builder](http://builder.swillkb.com/)
    - アクリルプレートをレーザーカッターで加工するために，KLEで出力されたデータを元に，キースイッチの位置をプロットしたデータを作成します．
- [Inkscape](https://inkscape.org/)
    - キースイッチがプロットされたデータに，プレートの外周やネジ・マイコンもプロットし，アクリルプレートを発注するために必要なデータを作成します．

各種ツールの使い方は，すでに素敵な方が解説してくださっているので，ぜひネットで検索してみてください．

一般的な自作キーボード制作は，すでに素敵な方が書籍を出版されています．参考文献にまとめたので，そちらをご覧ください．


## 要求分析

先に列挙した課題を解決するにあたり，どのような要求があるのか整理します！
![Screenshot 2023-12-21 at 14.49.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/f2b443dd-232c-b373-6500-496aeacf3e7f.png)

ここで，課題を解決するために必要な機能だけではなく，キーボードに外せない事項や個人のこだわりも盛り込みました．

私は特に，『打鍵音がうるさくない』『プロトタイプとして，改善点やこだわりを探索できる』を重要視しています．

初めての自作キーボードで，1回の制作で自分好みのキーボードに仕上げることは容易ではありません．

そのため，初回の制作では，解決したい課題を選定し，思い描いた解決策で本当に解決できているのか検証することを主目的とします．

そうすることで，第2弾・第3弾と制作を重ねるにつれ，このプロトタイプに，

- 仮説検証で導き出された改善点
- デザイン性
- 新規機能
- こだわり

を追加して，成長させていくことができます！！！

（これぞ，自作キーボードの醍醐味の1つかと．）


## 要件分析

要求を実現するために必要な要件を整理します．
![Screenshot 2023-12-21 at 14.49.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/cf2fbfd4-f463-2485-d87e-f06a0a3ef56b.png)

オフィス利用を想定しているため，打鍵音の小ささも重要な項目です．

もし要件を既存の自作キーボードのキットで解決できそうなら，購入するのも手だと思います！


## 手形を用いたキー配列デザイン

まずは，手形をとります！
![PXL_20231221_022644836.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/7f972f7a-8c44-2bd1-01f8-f46558a8995e.jpeg)

実線が，リラックスしてホームポジションに手を置いた状態で，キーボード中段の `H`, `J`, `K`, `L`, `;`, `’` を配置します．

点線が，自然に手を前後に動かして，その軌跡をプロットしたもので．キーボード上段や下段のキーを配置していきます．

私の場合は，よく使用する `Enter`, `Shift` , `delete` , `fn` などは，仮決めしては押下しやすいか実際に打鍵してから，配置を決定しました． 

この段階では，回路やプレートは考慮せずに，理想のキー配置のみを追求しました．

次に，キースイッチのサイズを考慮して，キー配置を設計していきます．
![PXL_20231211_114042144.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/6fee1f6c-f8ec-676d-cad9-9049f9be9773.jpeg)

ルーズリーフをキースイッチの大きさに切り出し，先ほどの手形をもとに並べていきます．

大きく4列に分かれています．

実際に私のタイピングを観察した際に，親指・人差し指・中指と薬指・小指で移動範囲や動かしやすさが分かれていたので，それに対応させて列を分けました．

実際に組み立ててから気づいたのですが，列同士の間隔が適度に空いていることにより，押し間違えがなくなるかもしれません．

一方で，小指側の外側の列が押しにくいことも発覚したので，次のバージョンで改善するつもりです！

この段階で，キーボードの頭脳であるマイコン（今回は ProMicro）の配置も決めました．

マイコンは意外とサイズが大きく，ここで配置を決めておかないと，プレートを設計する段階になってキースイッチと干渉することが判明して後戻りしてしまうからです．


## KLEによるデータ化

KLEは，http://www.keyboard-layout-editor.com/#/ にアクセスしてください．

キー配列をデザインできたので，KLEにプロットしていきます．

KLEでプロットすることで，キー同士が干渉しないか確認することができます．
![Screenshot 2023-12-19 at 17.30.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/21c1c422-2d70-ec70-1542-c9ce30ba4891.png)

斜めに配置したキーが，後工程の [Plate & Case Builder](http://builder.swillkb.com/) で意図通りに変換されなかったため，左右で分けてデータを作成すると良いかもしれません．

両手分プロットが完了すると，ようやくキーボードの原型が見えてきました！
![keyboard-layout-Left.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/30cfb54e-8851-e6d2-66d2-eb4e24926141.png)![keyboard-layout-Right.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/6e6f5196-0f81-9369-061a-ffedbdb94790.png)

本来であれば，次は回路設計（KiCadなど）を行います．

しかし，私がKiCadを使ったことがない状態で，動作するプロトタイプを早急に作成するために，今回はキースイッチ1つごとに基板を1枚ずつ割り当てます．

『[無限の可能性](https://swanmatch.github.io/MxLEDBitPCB/)』という商品を見つけたため，こちらを採用します！

1枚のプレートで基板をおこすためには，キースイッチの配置やサイズを部品の寸法も含めて回路設計する必要があります．

私にとってはハードルが高かったため，まずは完成させることを目指して基板をキースイッチごとに分離させることにしました．

次の段階のために，Raw Data より，JSON形式のデータをコピーします．


## Plate & Case Builder

Plate & Case Builder は，http://builder.swillkb.com/ よりアクセスしてください．

KLEでコピーしたJSON形式のデータを Plate & Case Builder にペーストして，パラメータを調整すれば，キースイッチの位置をプロットしたデータが出力されます．
![Screenshot 2023-12-19 at 17.42.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/f160c288-a81a-c953-6261-24e4c6a6ee36.png)


## Inkscape

Inkscape は，https://inkscape.org/ よりダウンロードしてください．

また，Plate & Case Builder からダウンロードした，

私は，遊舎工房さんの[レーザー加工サービス](https://shop.yushakobo.jp/products/lasercut)を利用しました．

遊舎工房さんの[デザインルール](https://yushakobo.jp/lasercut/)に従って，Incscapeでプレートを作成していきます．

アクリルプレートの外周を描くために，『ペンツール』を使い閉じた図形を描き，
![Screenshot 2023-12-19 at 17.51.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/ec04836b-fd7e-d20c-f7ca-ba60d82c3aef.png)

『角を追加 LPE』で角に丸みを持たせました．
![Screenshot 2023-12-19 at 17.51.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/d8759eef-6d81-99aa-dfbe-b81d68b088f6.png)

私は，左右で同じレイアウトにしているので，片手分を編集した後にコピペして反転すれば，もう片方分も作成できました．


## 部品の調達

要件を満たすために，特に重要な部品を紹介します．

### キースイッチ

利用シーンに合わせて，静音さや押し心地を追求します．

遊舎工房さんの店舗でキースイッチの試し打ちをさせていただき，好みを見つけていきました．

遊舎工房さんの [Yushakobo Fairy Silent Linear Switch](https://shop.yushakobo.jp/products/5659?_pos=1&_sid=1509cfbd7&_ss=r) を採用しています．

### キーキャップ

キーボードを光らせたいので，キーキャップは透明にしました．

US配列で option や command が印字されているセットは見つからなかったので，印字なしとなりました．

遊舎工房さんの [DSA 無刻印キーキャップ（1個）](https://shop.yushakobo.jp/products/dsa-blank-keycaps?_pos=1&_sid=069a60ee1&_ss=r&_fid=397ed3e27) を採用しています．

### 基板

キー配列を自由にカスタマイズできるように，キースイッチ1つに対し基板1枚を紐づけました．

また，キースイッチを脱着可能にするために，ソケット化にも対応しました．

こうすることで，今後アクリルプレートを変更するだけで，他のキー配列にも対応できます！

魔界鍵盤製作所さんの [無限の可能性-ConTaiNeR-](https://royal-keyboard-works.square.site/product/mugen-container/3?cp=true&sa=false&sbp=false&q=false&category_id=3) と併せて [Promicroのおうち](https://royal-keyboard-works.square.site/product/promicro-home/6?cp=true&sa=false&sbp=false&q=false&category_id=3) を採用しています．

## キースイッチの準備

ソケットや部品を基板にはんだ付けし，キースイッチを取り付けられるようにします．
![PXL_20231219_172247298.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/ea6ece13-ebf5-4ce6-2e4c-c03f1d5d0fb5.jpeg)


[TODO]Arduino IDE でデバッグした話


## アクリルプレートへのキースイッチのはめ込み

部品をはんだ付けした基板と，キースイッチ・キーキャップをアクリルプレートにはめ込んでいきます．

裏面から見ると，このような感じで，
![PXL_20231220_213246597.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/1c8345ec-5518-2890-0042-44d8ac73f4ae.jpeg)

表面から見ると，このような感じです．
![PXL_20231221_035105578.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/35bf4424-e826-cb7c-9797-5d1f2a3d82ab.jpeg)


## ProMicro と基板のはんだ付け

いよいよ，組み立ても大詰めを迎えます．

押下したキーを認識できるようにするために，ProMicroとキースイッチを取り付けた基板をはんだ付けしていきます．

KiCadなどで回路設計していれば不要な工程ですが，今回はキースイッチごとに基板を取り付けているので必要となります．

まずは，Inkscape で設計したアクリルプレートのPDFをプリントして，配線を書き込みます．
![PXL_20231221_122545035.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/6e4e285e-12c0-052d-cf9c-c13c25595ca9.jpeg)

Cn または Rn と記載されているキーを配線します（1 ≤ n ≤ 6）．

列1行1のはんだ付けが完了すると，このような空中配線となります．
![PXL_20231221_143714152.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/9fd80745-1aa9-b1f6-fc7f-68f5c87ce4e4.jpeg)

配線を間違えたり部品が故障したりしていることに気づかないまま，全てをはんだ付けして配線してしまうと，作業が台無しになってしまいます．

そこで，行1列1の配線が完了したタイミングで，ファームウェアを書き込み，期待通りのキーが押下されるかテストします．

もしテストに成功したら，あとは手書きの配線図をもとにはんだ付けしていけば完成となります．


## ファームウェアの書き込み

ここからは，[QMK Firmware](https://docs.qmk.fm/#/) に沿ってファームウェアを作成し書き込んでいきます．

公式ガイドに沿って環境構築すれば良いのですが，自作キーボード用のファームウェアを作成するところで，少々つまづいてしまいました．

[QMK Firmware でオリジナルキーボードのファームウェアを作成する](https://qiita.com/mizuhof/items/c2f9eb173b21593d969e)を参考にすることで，無事開発することができました．

`keymaps/default/keymap.c` にて，キー配列を定義していきます．

<details><summary>keymap.c</summary>

```c
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     /*
      * ┌───┬───┬───┬───┐
      * │ 7 │ 8 │ 9 │ / │
      * ├───┼───┼───┼───┤
      * │ 4 │ 5 │ 6 │ * │
      * ├───┼───┼───┼───┤
      * │ 1 │ 2 │ 3 │ - │
      * ├───┼───┼───┼───┤
      * │ 0 │ . │Ent│ + │
      * └───┴───┴───┴───┘
      */
     [0] = LAYOUT_mine(
         KC_P6,      KC_P7,      KC_P8,      KC_P9,              KC_P0,              KC_MINUS,
         KC_Y,       KC_Y,       KC_I,       KC_O,               KC_P,               KC_BACKSLASH,
         KC_H,       KC_J,       KC_K,       KC_L,               KC_SEMICOLON,       KC_QUOTE,
         KC_N,       KC_M,       KC_COMMA,   KC_DOT,             KC_SLASH,           KC_EQUAL,
         KC_SPACE,   KC_ENTER,   KC_NO,      KC_LEFT_BRACKET,    KC_RIGHT_BRACKET,   KC_NO,
         KC_NO,      KC_NO,      KC_LEFT,    KC_RIGHT,           KC_NO,              KC_NO
     )
 };
 ```
</details>


作成したファームウェアをコンパイルし，ProMicroに書き込む方法は2通りあります．

- `qmk flash` コマンド
- [QMK Toolbox](https://github.com/qmk/qmk_toolbox)

私の環境（MacBook Pro M1）では，どちらの方法でもエラーが発生し，一度しか書き込むことができていません．

- `qmk flash` コマンド
    - avrdude error: programmer is not responding
- [QMK Toolbox](https://github.com/qmk/qmk_toolbox)
    - ProMicro はUSBデバイスとして認識されているが，QMK Toolbox でファームウェア書き込み可能なデバイスとして認識されていない
![screenshot_2023-12-21_at_23.19.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317198/d1be0a1b-1173-3e9b-7df3-5247e3816411.png)

1回書き込めたおかげで，行1列1のテストまでは行うことができ，配線に成功していることを確認できました．

原因と解決策を突き止めたら，本記事に追記いたします．


# 制作期間

合計で，約4週間かかりました．

- キー配列の設計に1週間
- キー配列のデータ化に1週間
- プレートの設計と加工に1週間
- はんだ付け含む組み立てに1週間

プレートの加工は，私は遊舎工房さんの[レーザー加工サービス](https://shop.yushakobo.jp/products/lasercut)を利用しましたが，発注・加工・配送まで最短で1週間かかりました．

在庫や注文状況によっては，さらに時間を要する可能性があるため，余裕を持って発注することをおすすめします．

# 費用

35,635円！


# 参考文献

私が参考にした書籍を紹介しますので，詳細を知りたい方はご覧ください！

- [自作キーボード設計ガイド Vol1 設計入門編](https://salicylic-acid3.booth.pm/items/4410329)
- [自作キーボード設計ガイド Vol2 ケース設計編](https://salicylic-acid3.booth.pm/items/4982088)
- [自作キーボード設計入門(電子版)](https://booth.pm/ja/items/1044084)
- [自作キーボード設計入門2(電子版)](https://booth.pm/ja/items/1315935)


# おわりに

明日の[株式会社ビットキー Advent Calendar 2023](https://qiita.com/advent-calendar/2023/bitkey)は，@kodai_seto が担当します．