コンパクトな親指シフトキーボードを作ってみる

## コンセプト

今までに65%キーボードをたくさん作ったが、隅々まで指の届く、小型キーボードに憧れがある。
富士通の開発した親指シフト配列は強力なツールで、少ないキー数で多数のかな文字を打鍵できる。この親指シフトの考え方を英数レイヤーに適用すれば、利便性を確保したままキーの数を大幅に減らせるのではないか。
本稿では、4段の50%キーボードのハードウェアとソフトウェア両面から設計・作成する。

![361936091_7082797725082151_7879227339821882334_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/b8b9746b-1f4a-a792-f25d-3c6c245803eb.jpeg)

## 物理配置の検討

今回は矢印キーを含めることとする。尊師スタイルを前提とするため横幅は多少広がっても問題ない。
以前公開した記事のキーボードでは、驚くべきことに作成報告をいただいた「全員」の方が矢印キーを装備していた。実際、物理的な矢印キーがあると何かと都合がよい。

## キー配列の検討

65%キーボードから数字行を省いた形になり、キー数は52（+RPG）。50%キーボードとなる。60%や65%キーボードと違い、F1〜F12キーだけでなく数字や記号の打鍵を考慮する必要がある。

![base_layer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/7fca2b53-af11-15fe-c7cf-2a5bd9d00f16.png)

単純なFnキー利用ではキー数が不足するし、Fnキー複数では頭が混乱して使いこなせそうにない。この問題を親指シフトの同時打鍵を用いて解決するのが、本キーボードのコンセプトである。

![thumb_shift.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/e0040ffc-1341-00ec-2ab2-0b090a5d9e88.png)

親指シフトを用いてF1〜F12と数字キーを全て割り当てることが可能となる。これらのキーは同側シフトで打鍵する。
小指シフト+1〜0で打鍵する!@#$%^&*()の記号は、クロスシフトのA〜'で打鍵することとする。
この配列だと通常のキーボードから移行してもほとんど違和感なくすぐに使用できそうだ。

## 回路の検討

回路基板設計にはKiCadを用いる。 [TS52K CAD File](https://github.com/sadaoikebe/ts52k)

### MCU

サプライチェーンの関係から本来RP2040を使用するのが望ましいが、開発速度を重視して今回は過去に使用したことのあるmega32u4を用いる。

### キーマトリックス

配線の本数を節約するために、あぷろさん考案のDuplex Matrixを使用する。このことでMCU周りの配線がしやすくなる。 [Duplex-Matrixを自作キーボードで使う方法](https://e3w2q.github.io/8/)

![matrix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/50be36e4-3044-db9b-cc68-e3b4e1f99c2d.png)

物理的には15x4のキーボードであるが、配線は12x5(Duplex Matrixであるため6x5)で行う。これにRPGの2本を加えてGPIOは13本使用となる。

### その他

発振にはムラタのセラミック発振子CSTNE16を用いる。キャパシタ外付け不要、省スペースで、混雑するMCUの周辺を整理しやすい。ESD保護にTPD4E1U06を用いる。生産手順を簡略化するためMCUのプログラム端子にポゴピン接触用パッドを出す。

## アートワーク

配線はできるだけ片面にまとめて、MCU周り以外ではFレイヤーを用いない。

キーの信号線はデジタルなので、隣接させてまとめて引き回すことで場所を節約する。キーマトリックス用のダイオードなど、SMD部品を用いれば他の配線を飛び越すことができる。SMD部品を便宜的な第3のレイヤーとして考えることで、ほとんどBレイヤーのみで配線を完成させた。

![artwork.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/c0457ea5-fd8b-4e58-6624-666d969d9c70.png)

Fレイヤーはほぼ完全なベタGND。BレイヤーでGNDが分断された箇所にビアを打っておくことにする。

USBコネクタ付近にMCUを配置し、周辺にセラミック発振子と電源のデカップリングキャパシタを置いてキースイッチの配線を引き込む。ここでもSMD部品の足の間に配線を通して、Fレイヤーはできるだけ使わない。

![artwork2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/c32e23e5-83f3-d4af-8ae9-475dad3c9803.png)

## 機械設計の検討

一般的な中華60%キーボードはトレイマウントという構造。

キースイッチと基板全体を筐体に直接取り付けてしまうため、打鍵感が非常に硬く、底打ちすると手が痛いほどである。また、キーの場所とネジ穴との距離により打鍵感が変わってしまう。

![traymount.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/ac752722-4e6b-3be2-0910-c96e7bb94f7c.jpeg)

RealForceなどの高級なキーボードの構造はこのような構造とは一線を画す。キースイッチと基板は重厚な金属板に緊結される。しかしこの重厚な構造体は、筐体の端に軽く乗っているだけである。いわば「浮いた」構造となっている。

![gasketmount.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/010759b1-3b7e-ac5e-544a-9eb041e8a56d.jpeg)

スイッチと金属板の剛性で打鍵を均一に受け止めるが、全体はキーボード筐体の中で浮いている構造のため硬すぎない。
RealForceはキー＋金属板の構造が筐体にそのまま載っているが、50%キーボードのような小さな構造体は剛性が高くなりやすい傾向にある。したがってキー＋金属板の構造はさらにクッション（ガスケット）を用いて筐体から浮かせることとする。これが自作キーボード界隈で多用される「ガスケットマウント」という構造である。

実際の筐体の断面図は以下の通り。

![crosssection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/f4d99f95-3c80-75e9-d92e-28b075446d39.png)

筐体はFreeCADで設計して、FDM式3Dプリンタで出力する。

![case_freecad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/0c32c464-cb20-11c0-ea9f-dfce81029901.png)

この向きで出力すると、サポート材は不要となる。

![case_slicer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/59693b92-4f42-11bd-ac39-ccf621eadb2b.png)

## 部品の調達

基板はJLCPCBに発注。アセンブリもお願いする。KiCadからガーバーとピック＆プレースファイルをワンタッチで出力できて非常に便利。QFNならmega32u4の在庫も復活したようだ。でも今後はRP2040のほうがいいだろう。

![jlc_order.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/740a4f22-f425-442f-23ed-ee534fa3374c.png)

基板が届いたらポゴピンでファームウェアを書き込み。ポゴピンはこれを使った [ポゴピン](https://item.taobao.com/item.htm?spm=a1z09.2.0.0.5e922e8dS870Qr&id=643410167426)

![362225236_7085672101461380_2155972912850778985_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/cb92d8e7-616f-c710-b17d-8651897d1e0d.jpeg)

プレートはできる限り重い金属を使いたいのでt=1.5の真鍮板をレーザーカットしてもらうことにする。淘宝でこちらにお願いすると真鍮板一枚2500円前後でカットしてもらえるようだ。大口割引あり。

![Screenshot_2023-10-21-12-53-55-19_090d9ae461b065ca11c329abb9cd0d70.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/4f7f1d92-863c-5f54-25cc-10d62a6cb0af.jpeg)

まず淘宝のチャットで連絡をとってから、微信で図面を送ると一瞬でカットしてもらえる。難しい中国語は一切使用しない。

![Screenshot_2023-10-21-12-55-41-98_e39d2c7de19156b0683cd93e8735f348.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/e627d1ce-2c3a-9714-ef66-519fa6b7d036.jpeg)

## ファームウェアの検討

今回もQMKを用いる。 [ts52k firmware](https://github.com/sadaoikebe/qmk_firmware/tree/master/keyboards/ts52k)

### Press/Releaseを分離

今回は英数レイヤーに親指シフトが適用されることになる。英数キーは長押しなどに配慮する必要があるため、Press/Releaseの正確な取り扱いが重要となる。親指シフトキーの場合、かな入力を行ったらその場でキーをReleaseしても問題とならなかったのとは少し事情が異なる。

### Modifier制御

上記のPress/Releaseを考慮したファームウェアを使っていてすぐに違和感を覚えたのが、英文タイプで大文字がときどき入力できないことである。親指シフトの状態遷移図の特性上、実際の打鍵から、キーコード確定までに少しタイムラグがある。大文字のAを打鍵するため小指シフト+Aを打鍵しても、Aキーが確定した頃にはすでに小指シフトを離している、といったことが起こりうる。（下図）

![pinkyshift_gantt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/972009d8-fe7e-6dd3-313f-f2460631a0d0.jpeg)

Alt+Tabを素早く押してもウィンドウが切り替わらずただのTab入力になってしまうなど、非常に深刻な不具合である。

この問題を解決するにはいくつか方法がありうるが、親指シフト状態遷移に小指シフトが関係するような変更を入れると打鍵感が変わってしまう・状態遷移が複雑になる可能性があるため問題が大きい。親指シフト状態遷移やタイミングには手を入れないこととする。
ここではA打鍵時のModifier状態を覚えておき、キーコード確定時に一時的にModifier状態を戻すことにする。

![autopress_gantt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/8f6d9e25-c839-3589-ad11-49679de2358a.jpeg)

Modifier状態保存はAltやCtrlなども対象となる。この機能の導入により、少なくともキー入力の面で思った操作ができないといった問題は発生しなくなった。

### クロスシフトで小指シフト

記号入力に非常に有用なのが、クロスシフトを用いることで小指シフトの記号を生成する機能である。例えば同側シフト+Aは1であるが、クロスシフト+Aは小指シフトの1であり、すなわち！記号となる。上記のModifier制御アルゴリズムを用いて、クロスシフト時に小指シフトコードを生成する。

### かな入力時の小指シフトの扱い

かな入力時は小指シフトを用いて直接英数入力する機能がIMEに用意されている。これは本キーボードで数字入力やFキー入力する場合にも非常に有用な機能である。例えばかな入力状態で、直接1を入力したい場合は小指シフトを用いながら、親指シフト＋A（=1）を打鍵する。全角！記号はクロスシフトとなる。

カタカナ変換（通常「F7」キーを用いる）をする場合に、かな入力状態でFキーを入力する必要がある。これも上記と同じく、小指シフトを用いて英数モードに入った状態で、親指シフト＋U（＝F7）を打鍵することで実現できる。

![keyboard_sonshi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543598/7691f843-8834-438b-103c-2ee5f64800ab.jpeg)