XD60キットでMac用の親指シフトキーボードを作る


こちらの記事を発見して、Mac向けに親指シフトキーボードが欲しくなったので作ってみました。

https://qiita.com/sadaoikebe/items/c856c563a286c7f5b471

## やりたいこと

- NICOLA配列のキーボードが欲しい。
- ESCキーも"`"(バッククォート)も修飾キーなしで入力したい。HHKBのUS配列は素晴らしい。
- カーソルキーはHHKB方式とVI方式の両方に対応したい。HHKBは片手で操作できるし、VI方式はホームポジションを崩さなくても操作できる。
- 海外製のソフトウェアはUSキーボードだけ、日本製のソフトウェアはJISキーボードだけに対応していたりするから、キーボード側でUS/JISを切り替えたい。
- 将来は、Mac/Windows/Linuxすべて同じ日本語入力環境にしたい。今回はMacのみです。

## 配列

HHKBのUS配列に似た配列です。

**FN1キーを押した時の配列**
![keyboard-layout2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2461893/71e1b0e8-494a-b10d-6be5-e06b9c120f76.png)

**FN2キーを押した時の配列**
![keyboard-layout1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2461893/cd3f0840-19b6-9f74-daca-c3da6e4a36cd.png)

- バックライトについて  
  かなキーを押すと、NICOLA入力モードになって、バックライトが点灯します。<br>英数キーを押すと、通常モードになって、バックライトが消灯します。

:::note info
XD64はBACKLIGHTとRGBLIGHTの2種類のLEDを制御できます。BACKLIGHTはキーキャップの裏にあるLEDでご自身で取り付ける必要があります。RGBLIGHTはPCBボードの裏にあってあらかじめ取り付けられています。BACKLIGHTはNICOLA入力モードを表現し、RGBLIGHTは将来の拡張のため使っていません。Mac/Windows/Linuxなどの入力モードを表現するようにしたいと思っています。
:::

- FN1キー  
  FN1キーを押しながら、HJKLキーを押すことでカーソルを動かすことができます。viに慣れた人向け。左手小指の付け根あたりでFN1キーを押して、右手でHJKLキーを押すと便利です。

:::note info
Macの純正キーボードにあるFNキーとは別物です。QMKはそのFNキーをサポートしていないので、私のプログラムもサポートできていません。サポートするためのパッチを公開している人もいるので、興味がある人は試してみてください。
https://gist.github.com/fauxpark/010dcf5d6377c3a71ac98ce37414c6c4
:::

- FN2キー  
  HHKBのようにカーソルを動かすことができます。HHKBに慣れた人向け。
- FNキー+Qキー  
  US配列モードに切り替えます。USキー配列のキーコードをパソコンに出力します。パソコンはUS配列の設定にしてください。デェフォルトはUS配列です。
- FNキー+Wキー  
  JIS配列モードに切り替えます。物理的にはUS配列ですが、パソコンにはJIS配列のキーコードを出力します。パソコンはJIS配列の設定にしてください。
- 英数キー  
  英数キーを押しながら他のキーを押すと、Commandキーを押しながらそのキーを押したことになります。英数キー単体を押して離すと、英数キーを押したことになり、半角英数モードになります。SHIFTキーを押しながら英数キーを押す、または、かなキーを押しながら英数キーを押すと、全角英数モードになります。
- かなキー  
  かなキーを押しながら他のキーを押すと、Commandキーを押しながらそのキーを押したことになります。かなキー単体を押して離すと、かなキーを押したことになり、ひらがなモードになります。SHIFTキーを押しながらかなキーを押す、または、英数キーを押しながらかなキーを押すと、全角カタカナモードになります。
- 親指右キー  
  NICOLAモードのときは、親指右キーとして動作します。通常入力モードではスペースキーとして動作します。親指右キーを単体で押して離した場合もスペースキー(変換キー)として動作します。
- NICOLAモードのときは、親指左キーとして動作します。通常入力モードではスペースキーとして動作します。親指右キーを単体で押して離した場合は、全角カタカナ→半角カタカナ→全角英数→ひらがな→(全角カタカナに戻る)へ文字種を変換します。
- BSキー (Enterキーの隣のキー)  
  NICOLAのA型配列にはEnterキーの隣のBSキーは定義されていません。しかし、BSキーがあると便利なので、NICOLAモードのときに'(QUOT)キーを押すと、バックスペースの動作になるようにしました。通常、NICOLAモードではキーリピートしませんが、BSキーだけはリピートするようにしています。
- Menuキー  
  MacにはMenuキーがないですが、将来はWindowsでも使えるように改造しようと思っているためMenuキーを用意しました。Menuキーを単体で押して離すとMenuキーとして動作し、Menuキーを押しながら他のキーを押すとFN2キーとして動作するようにしています。

## 部品の購入

@sadaoikebe さんの記事を参考に部品を購入しました。

- 基板(PCB) XD60 Ver3.0
- プレート Carbon Fiber Plate for XD60
  - 2.25uのものを購入しました。
- ケース
  - XD60キット付属のプラスチックケース、$5程度のショボいものを購入しました。
  - 組み立てに失敗しても惜しくないから・・・。意外と満足しています。
  - ケースが汚くなったらもっといいものを買おうと思います。
- スタビライザー
  - 私の配列だと、2uのものが3個、3uのものが2個必要なので購入しました。
- スイッチ
  - 純正親指シフトキーボードは富士通製のキースイッチで35gだったらしく、いまは、そのキースイッチの入手ができないので、同じ重さのgatronの白軸(5ピン仕様)にしました。
  - 純正キーボードのキータッチに近い気がします。昔すぎて記憶が曖昧ですが・・・。
  - 親指シフトでは、同時にキーを押すことが多いので、騒音も2倍です。静かなものがいいと思いました。
- キーキャップ
  - DSAプロファイルのものにしました。
  - DSAプロファイルはどの列も同じ高さです。
  - 3uのキーキャップを探すときは、色とプロファイルに注意しましょう。
- バックライト用のLED
  - 単色白色のものを50個まとめて購入しました。
  - キースイッチに取り付けるものです。
  - TABキーの位置に取り付けるLEDはCAPSLOCKに対応しています。
  - ほとんどの取り付け位置は同じ向きですが、一部、逆向きに取り付ける必要があったりして、注意しながら取り付ける必要がありました。
  - わたしは、NICOLAモードになっているか否かをバックライトの点灯で示すことにしました。
  - すべてのキーに取り付けるのは面倒なので、TABキーと一番右上のキーの2つだけでも良かったと思っています。
- USBケーブル (Type-C)
- 半田ごて、半田

## ファームウェア

@sadaoikebe さんのプログラムを参考に作りました。

1. [QMKのセットアップガイド](http://docs.qmk.fm/#/newbs_getting_started)の通りに開発環境を導入する。Windows、Mac、Linuxのどれかが必要。私はubuntuでやりました。
2. [リポジトリ](https://github.com/rsa21272/qmk_firmware)をクローン  
   `git clone --recurse-submodules https://github.com/rsa21272/qmk_firmware`
3. ビルド  
   `qmk compile -kb xiudi/xd60/rev3 -km nicola_a`
4. DFUで書き込み  
   ファームウェアを書き換えるには、キーボードをDFU状態で接続しておく。(Space + B を押しながらUSBケーブルを挿す)  
   `qmk flash -kb xiudi/xd60/rev3 -km nicola_a`

## 開発者向け情報
   カストマイズしやすくするため、[keymap.c](https://github.com/rsa21272/qmk_firmware/blob/master/keyboards/xiudi/xd60/keymaps/nicola_a/keymap.c)の最初の方にカストマイズ用の関数を用意しました。ご自身の環境に合わせて出力するキーコードを変更することで、快適な環境になると思います。


| 関数 | 説明 
|-----|-----
| send_eisu | 英数キーを押した時に呼び出される関数です。CTRL+SHIFT+'(QUOT)を出力して、半角英数モードにします。 
| send_shift_eisu | SHIFTキー＋英数キー、または、かなキー＋英数キーを押した時に呼び出される関数です。CTRL+SHIFT+Lを出力して、全角英数モードにします。
| send_kana | かなキーを押した時に呼び出される関数です。CTRL+SHIFT+Jを出力して、かなモードにします。
| send_shift_kana | SHIFTキー＋かなキー、または、英数キー＋かなキーを押した時に呼び出される関数です。CTRL+SHIFT+Kを出力して、全角カタカナモードにします。
| send_right_spacebar | NICOLAモードのときに親指右キーを押した時に呼び出される関数です。スペースキーを出力して、変換の動作をします。
| send_right_spacebar | NICOLAモードのときに親指左キーを押した時に呼び出される関数です。押されるたびに、CTRL+K, CTRL+;, CTRL+L, CTRL+Jを次々に出力して、全角カタカナ、半角カタカナ、全角英数、かなに文字種を変更します。
| send_zen_eisu<br>send_zen_kana | NICOLAモードのときに、"，．／〜［］"などの文字を入力するためには、一時的に英数モードに切り替えて、対象の文字を入力して、再び、かなモードに戻す必要があります。英数モードにするときにsend_zen_eisuを呼び出し、かなモードに戻すときにsend_zen_kanaを呼び出します

:::note info
かなキーや英数キーのキーコードではなく、CTRL+SHIFT+'やCTRL+SHIFT+Jを出力しているのは、Parallels Desktopの環境設定で仮想マシンのショートカットを設定するとき、かなキーや英数キーを指定できないからです。次のスクリーンショットのようにMacからCTRL+SHIFT+Jを押した時、VM上のWindowsに対して変換キー押下を出力できる設定ができます。
:::
![スクリーンショット 2022-01-08 15.43.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2461893/58457a9b-c8b4-d31c-50d1-ce557ad4caf5.png)