はじめての自作キーボードでコンセプト設計からしっかりやってみた

# 0. はじめに
今までキーボードは既製品(HHKB)を5年以上使っており、性能自体には満足しているつもりであったが、外見も自分好みにしたいという欲から、調べるにつれ自作キーボードという世界を知る。

この記事は、初めて完全オリジナルなキーボードを設計した際の、コンセプトの決定や具現化のための工夫を備忘録として残す目的で書く。
なお、ファームウェアの環境構築・詳細設定や、CADで電子回路・キーボードケース設計などは、本記事の趣旨と異なるので割愛する。

# 1. 成果物
![IMG_2951.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/f3914285-50e6-4cdb-bcfd-3a016aa01190.jpeg)

# 2. コンセプト
振り返れば、初めに作りたいキーボードのコンセプトを固めたことが、モチベーションを保ちつつ完成までスムーズに漕ぎつけた大きな要因のひとつだと思う。コンセプト設計では、いくつかの背反事項に注意しながら優先順位や程度のバランスをイメージして取捨選択を行う必要がある。

## 2-1. 利用シーン
初めてのオリジナルキーボードなので、仕事でも私用でも使いやすいものを目指した。

### 2-1-1. 仕事中の煩わしさを解消
仕事ではSimulinkをよく使うので、編集画面にてブロックを選択→削除、編集→決定でDeleteキーやEnterキーを頻繁に押下する（CADやExcel、PowerPointも同様の操作がある）。そのたびにマウスから手を放すのが煩わしかったので、左手に近い位置にこれらのキーを配置したかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/abca105f-6fe5-8a7f-1399-3634ba93ab1f.png)

### 2-1-2. 私用での快適性を向上
私用では動画や音楽をよく視聴するので、音量調節できるメディアキーも取り入れる方針にした（仕事上のオンラインミーティングでも便利）。動画を送ったり戻したりするために矢印キー欲しかったが、この時点では優先順位は低め。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/11c54e5b-90d9-7109-b46f-8eda3e8046bc.png)

:::note info
DeleteやEnterキー、メディアキーは、レイヤー機能を使うことなくワンタッチで操作したかったので、専用のキーを用意する方針にした。
:::

## 2-2. こだわりポイント
上記利用シーンを満足しながらも、**「場所を選ばず素早くタイピングできる」** ことが筆者の求めるキーボードであるので、この設計コンセプトを具体的に分解してみることを試みた。

まず「場所を選ばず」というのは手軽に持ち運びができて、ある程度のスペースがあれば設置することができることを意味する。したがって軽量・薄型で、大きさもコンパクトであることが望ましい。

次に「素早くタイピングできる」ことについてだが、基本的には手をあまり動かさずに打つことが重要であるので、これもコンパクトであることが望ましい。と同時に、レイヤー機能に頼りすぎると素早さが落ちてしまうので、ある程度のキー数は必要。つまり、手の届く範囲にできるだけキーがあることが望ましい。

また、手は常にホームポジション上にあるわけではない。両手がキーボードから離れている状態からでも素早く目的のキーを押下するには、キーの印字と実際の出力が一致していることが望ましい。

これらを踏まえて、設計コンセプトを**ポータブル性**・**キー密度**・**印字適合性**の3要素に分解した。以下詳細。

### 2-2-1. ポータブル性
仕事で出社・出張もあるので、持ち運びやすさは重視した。持ち運びの際ハードケース等に入れるのは手間が増えるのでNG。かといって基板むき出しは破損のリスクが高まる。この時点で一体型のキーボードケースを設計する覚悟を決めた。ケースが重くならないよう3Dプリント（樹脂）で作成する方針もすぐ固まった。

また、スッとカバンから出し入れできるように、薄型・コンパクトなものを目指した。利用シーンにあるような左手DeleteやEnterの追加はコンパクト化と背反の関係であるが、（個人的に）普段からあまり使わない（そのうえ横幅を占有する）右手のEnterやBackspaceを思い切って削ることで両立を目指した。

:::note info
標準のUS配列キーボードはとにかく右手小指の役割が多すぎる。筆者はHHKBや別のカスタムキーボード（60%キーボード）を愛用する中で、親指Enterや別レイヤーへのBackspaceの配置に慣れていたため、この決断はほぼ無負担で自然な選択だった。
:::

### 2-2-2. キー密度
コンパクトな自作キーボードといえば数字キーのない40%キーボードが人気だが、仕事・私用ともにプログラムをよく書くので数字キーは省かない方針とした（学習コストも高そうだし…）。数字キー行を残す代わりに、60%配列から1列削って40%～60%の間を狙いつつ、キー配列もオーソリニア型（格子状で配列効率が最も良い）を採用することで、コンパクト性とキー数の両立を目指した。

:::note info
詳細には、右端を2列削ったが左端に1列追加（DeleteやEnterなど）したので、トータルで1列削る計算となり、55%キーボードとでもいうべき大きさに落ち着いた。
また、この配列の隠れたメリットは、ホームポジションがキーボードに対して左右対称となり、見た目に美しいことではなかろうか…
:::

### 2-2-3. 印字適合性
先述の理由以外にも、印字と出力が違うのは（単に慣れの問題かもしれないが）何か気持ち悪く感じるし、一致しているほうが覚えやすく学習コストがかからないと思うのである。今回はコンパクトなキーボードを目指しているので、流通している薄型のキーキャップを事前に下調べして、キーの大きさや印字が適合するように基板設計に反映させた。

:::note info
[薄型キーキャップの第1候補](https://www.amazon.co.jp/XVX-%E3%83%AD%E3%83%BC%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-Gateron-%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E7%94%A8-%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%EF%BC%8F%E3%82%B0%E3%83%AC%E3%83%BC%EF%BC%8F%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88/dp/B0C8CVL445/?_encoding=UTF8&pd_rd_w=N2g2I&content-id=amzn1.sym.820ffd5a-47c7-4dc9-ba02-e139685ec907%3Aamzn1.symc.573c83ff-b207-408b-b0c7-3d92bb6b7d04&pf_rd_p=820ffd5a-47c7-4dc9-ba02-e139685ec907&pf_rd_r=XCREQ4KKB6YG6THJ439T&pd_rd_wg=BitwH&pd_rd_r=0aea7e4c-8cfb-46c7-b5ad-1e34f7780b48&ref_=pd_gw_ci_mcx_mr_hp_atf_m)
このキーキャップセットを第1候補とした理由は、入手のしやすさに加えて豊富なキーキャップオプションにある。1UのAltやCtrl、2UのShiftキーだけでなく、音量調整用のメディアキーも付属していることも魅力的だった。
成果物の写真は別のキーキャップを装着しているが、このシリーズ（XVX）も1セット購入した。
:::

# 3. 具現化
長々と設計コンセプトを書いたが、具現化のための具体案をまとめると以下である。

|設計コンセプト|具体案|背反事項|
|---|---|---|
|左手Enter・Delete|テンキーのEnter（縦2U）を利用し、Deleteも含めて左端に1列分追加。|1列増えるので、コンパクト性と両立する工夫が必要。|
|メディア・矢印キー|タッチタイピングで使わない最下段（5行目）の両端に配置。|タッチタイピングで使うキーとの干渉がないように工夫が必要。|
|薄型化|Gateronのロープロファイルスイッチを採用（打鍵感の好みからKailhのChocシリーズは見送り）。キーキャップもCherry互換の薄型を採用。|前例が少なく回路設計が不安だった（なんとかなった）。通常のキースイッチと比べると打鍵感が悪化する可能性がある。|
|コンパクト化|幅をとる右手Enter・Backspace・Shiftを思い切って削り（右端約2列分削減）、スペースバーを分割して、削減したキーの役割を左右の親指に割り当てた。|Backslashなど一部キーはレイヤー機能で実現する必要があるが、前述のとおり今までも似たようなことをしていたので負担なし。|
|高密度化|さらに左手Tab・Ctrl・Shiftも1Uにしたオーソリニア型で配列効率を向上。親指のキーは2Uにとどめ、押しやすさを確保した。結果的に60%キーボード（5x15）から1列削った55%キーボード（5x14）となった。|今までのロウスタッガードからオーソリニアへの移行コストがかかる（結構すぐ慣れた）。|
|印字適合|薄型キーキャップ（CherryMX互換）をある程度下調べして、適合するか確認しつつレイアウト決めを行った。|Tabキーのみ1Uで揃えられなかったが、予備の矢印キーや図柄キーで対応できそうだったので良しとした。|


 手前みそではあるが、利用シーンを満たしつつ背反事項をうまくケアし、こだわりをギュッと詰め込んだキーレイアウトができた。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/d2d76f72-51d4-40db-6a7b-754d1b57c2df.png)

# 4. 類似品について
キーレイアウトを固めながら、似たコンセプトのキーボードがないかを並行して調査していた。良いアイデアがあれば積極的に取り入れたかった。
|キーボード名|魅力を感じたポイント|
|---|---|
|NuphyAir60|2UのSpaceキーを用いることで、60%キーボードながら矢印キーを搭載していた。独自規格のGateronロープロファイルスイッチを採用しており、スイッチ単体で市場流通していたおかげで、筆者の選択肢も広がった。|
|Teihai70H|上述のスイッチを使った薄型キーボードで、RP2040 Zeroという小型・高性能のマイコンを搭載。スイッチ・マイコンともに採用例が少なく、筆者が最も参考にさせていただいたキーボードである（調査のため購入済み）。|
|On the 15|コンパクトなオーソリニアで、1Uと2Uを統一することでタイル壁のようなオシャレさを感じて取り入れさせていただいた。以前、作者の他のマクロパッドを購入していたので、こだわりポイントが近いのではないかと勝手に思っている。|

# 5. 設計と発注、組み立て
類似品の魅力的な点を取り入れつつ、オリジナルのコンセプトも具現化できたので、基板・ケースの設計・発注に取り掛かった。ここからは作業的なところが多く、また本記事の趣旨とも逸れていくので組み立てまでの工程は割愛する（別の機会に書くかも）。

基板を組み立て、キーキャップ（XVXシリーズ）を装着した状態。かなりの薄型化に成功している。
![IMG_2927.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/d177fbb7-c7d0-e2d5-8703-19c885351cb1.jpeg)

3Dプリントのケースを取り付けた状態で、愛用の60%キーボードと厚み比較。体積比で半分以下（？）に小型化し、ポータブル性が向上している。
![IMG_2938.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/f723ddcf-4fe7-b2a7-786a-4526b21cf996.jpeg)

大きさも比較。1列分コンパクトになっているのがわかるが、キー数は1つしか減っていない。
![IMG_2940.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/6e54e3ec-65d8-6046-9810-890991f14f49.jpeg)

一目ぼれしたキーキャップに取り換えた（完成品、再掲）。
![IMG_2951.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/3e670e72-3c24-93b9-ba38-0d8578c72b2a.jpeg)


# 6. 【おまけ】動作確認とファームウェア設定
## 6-1. 試し打ちには何を使う？
新しい筆記具を買ったら試し書きするように、新しいキーボードを組んだら試し打ちしたくなるのは人の性だと思う。寿司打などの王道タイピングゲームもいいが、プログラムをよく書く人なら、[typing.io](https://typing.io/)がおすすめ。

## 6-2. SandSを快適に利用するための設定
当初SandS（Shift & Space）のようなダブルロールキー（タップとホールドで挙動が変わる）を早打ちすると、暴発することが多かった。筆者の場合以下の設定で思い通りに打てるようになった。
`config.h`に`#define PERMISSIVE_HOLD` （またはお好みで `#define HOLD_ON_OTHER_KEY_PRESS`）と`#define QUICK_TAP_TERM 0`を追加。
これらの詳細設定は[公式ドキュメントの該当箇所](https://github.com/qmk/qmk_firmware/blob/master/docs/tap_hold.md)を参照のこと。