キーボードをつくろう

こんにちは！　[42tokyo Advent Calendar 2022](https://qiita.com/advent-calendar/2022/42tokyo)の11日目を担当するosshoです。

42tokyoとはフランス発祥となるソフトウェアエンジニア養成機関の東京校です。42自体については[別のアドベントカレンダーで書いた](https://25keys.com/2022/12/08/42tokyo/)ので、そちらもぜひ読んでください。

単刀直入に、このエントリは42生をターゲットとしてキーボードを作ろうというお誘いです。

# エンジニアとキーボード
42の課題はソフトウェアのコーディングを主としています。もちろん、ソフトウェアの開発環境に密接に結びつくネットワーク周りなど一部ハードウェアに近いレイヤーについてもカリキュラムがありますが、基本はソフト。実際に42生の就職先のほとんどはソフトウェアエンジニアのポストではないかと思います。
とはいってもソフトはハードウェアがあって初めて成り立つものです。ハードウェアについてもなんかしらの課題があってもいいのではないかと個人的には思ってもいます。

また、そもそもキーボードはエンジニアにとって手足のような存在です。文筆家が万年筆を選ぶように、あるいは画家が筆を選ぶように、コード書きもまたキーボードにこだわりを持ってもよいのではないか。そう考えるエンジニアの人々の間でここ数年流行しているのが自作キーボードやカスタムキーボードと言う世界です。分割キーボードを始めとする自由な物理レイアウトや、それぞれのキーをどのキーコードに結びつけるのかを決める論理レイアウトを操り、好みのスイッチに好みのキーキャップを組み合わせる自分だけのキーボードづくりです。自分もかれこれ5年ほどはまっています。

# 自作キーボードは設計のトライアスロン
自作キーボードと一口に言っても様々な楽しみ方があります。ソケットにスイッチをはめ込んでキーキャップを載せたら終わりのほとんど完成品のキットもあれば、はんだごてを手に基板にすべての部品をはんだ付けしなければならないキットもあります。本来は工場で行われる表面実装部品を手はんだでこなさなければならないハードコアなものもあったりします。 
とはいえ、究極の自作といえば自身による設計製作になるでしょう。　
自作キーボードの設計は、トライアスロンに喩えることができます。　
多くの場合、キーボード設計には次のフェイズがあります。　

### 物理レイアウト設計
まず、はじめにどんなレイアウトにしたいのかを検討していきます。キーボードの物理レイアウトには、フルキーボード、テンキーレス（TKL）、60%、50%、40%などがあります。60%というのはテンキーレスからアロークラスタやナビゲーションキー、ファンクションキーなどを除いたものです。HHKBがこのサイズになります。

40%になると数字行がなくなります。！？　そうです、数字キーがありません。数字キーなしじゃ数字打てないのでは？とわたしも最初は思いました。しかしそこはファームウェアでどうとでも出来ます。具体的には、親指部分に来るキーを押しながらQWERTYUIOPを押すと、それぞれ1234567890を出すのです。つまり別のシフトキーがあるようなもの。指を伸ばさなくていいという理由から、こうした40%を好むエンジニアもいます。

また、肩こり予防にいいという噂から人気に火のついた分割キーボードにも多種多様なレイアウトが考えられます。完全な格子状のレイアウトを持つ分割キーボードから、カラムスタッガードと呼ばれる列方向にずれのあるレイアウトも人気です。
![keyboard-layout.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958172/6500e63e-88dd-95d5-45d7-f7f830025ffb.jpeg)
[著名なErgodoxのレイアウト例]


### 回路設計
必要なキー数などが決まれば回路設計に入ります。　
回路設計といっても、通常のキーボードは大量のスイッチが付いた単純なデジタル回路となるため、モジュール形式として販売されているマイクロコントローラを使えばそこまでの難しさはありません。下記はわたしが設計した分割キーボードの回路図です。とてもシンプルなことがわかると思います。
ちなみにこれが片手分ですので、両手だと2つ必要となります。左右間の通信には多くの場合シリアル通信が用いられます。42生でしたらminitalkっぽいといえばわかってもらえるでしょうか（厳密には違います）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958172/1b07697c-17c9-30da-24d0-11ab6eaabbde.png)
[古典的な40%分割キーボードの回路図]

### 基板設計
回路図を実際の基板のレイアウトに配線していくのが基板設計です。上記の回路設計とともにKiCadというOSSの基板CADがよく使われます。具体的な作業としては部品の配置と配線作業です。物理レイアウト設計通りにキースイッチを配置し、すべての配線を正確に繋いでいきます。
![2022-12-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958172/061d8dc0-46cb-7998-af72-4e1745070f01.png)
[Attack25基板設計]


### 筐体設計
自作キーボード界では古くから簡易的なケースとして、アクリルをサンドイッチにした構造が用いられてきました。この方式は安価で軽く、また、基板が覗けるために自作ガジェット感を周囲に見せつけることが出来ます。アクリルではなくプリント基板そのものを機構部品にしてしまうことも多いです。　
また、最近ではよりコストをかけた金属ケースや3Dプリントによる樹脂ケースを設計する人も増えています。この場合は3D CADを用いて細部を設計します。
![2022-12-10 (24).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958172/b5f432e4-610a-c084-6eaa-738e518c616e.png)
[Aleth42 ケース設計]

### ファームウェア設計

いよいよソフトウェアの出番です。キーボードのファームウェアなんて書けない、と心配することはありません。多くのキーボードへの使用実績を持つファームウェアqmkを使えば、少ない労力で自設計の回路を動かす事ができます。qmkは常に200以上のPRが立ち続ける巨大なコミュニティで、そのほとんどがCで書かれています。もちろん、コードをかける42生であれば自分だけの機能を付加することも出来ます。
https://github.com/qmk/qmk_firmware

qmkファームウェアと組み合わせ、キー割り付けなどをWebからリアルタイムに変更できる[Remap](https://remap-keys.app)というサービスも便利です。こちらは日本人エンジニアによって開発されています。下記のスクショはわたしが設計したAleth42というキーボードを実際にRemapで変更しようとしているところです。この体験はほんとうに素晴らしいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958172/d6eed889-0124-07d5-20c7-e3322116aeac.png)
　
qmkのほかにもラズパイPicoなどRP2040を対象に、Rubyでキーマップを書ける自作キーボード用ファームウェアフレームワークとして人気のPRK Firmwareなど複数のキーボードファームウェアがありますので、親しみやすいものを選ぶことが可能です。　

# 最後に 
これらの設計をすべて自身でこなすのはとてもエキサイティングな遊びです。自作キーボードの界隈には著名なIT系企業にお勤めのエンジニアさんも珍しくありませんし、つよつよな方がたくさんいらっしゃいますが、彼らがキーボードづくりに夢中になるのもうなずけるところです。　

そういえば校舎のあるDMMでは自作キーボードのイベント会場として数回利用させていただいていました。また、DMM.makeのクリエイターズマーケットにはキーボード関連の出品がそれなりにあって（[わたしもお世話になってもいたりして](https://make.dmm.com/shop/220980/)）、42とキーボード界隈は意外と近い距離にあるのではないかと思っていました。なにか企画できないかなと思って入学したところ、アソシエーションに42make_labを発見。速攻入部？です。

ほぼ活動なしなのが寂しいのでぜひキーボードを作りましょう。その他、自作キーボード関係のご相談などありましたらいつでもお知らせください。
DMM.makeでケースの3Dプリントをしてもらえたらなどという甘い期待を寄せてこの記事を終わります！
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958172/33a311a0-f109-0c24-61c8-242a06d7ee32.png)
こんなキーボードで書きました