Alternative Controller for HHKBのススメ

  • 35
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

概要

Alternative Controller for HHKBとは、Happy Hacking Keyboard(HHKB)のコントローラを入れ替えることで全てのキーをプログラマブルにできるコントローラのこと。
キーボード自体をプログラマブルにすることで、OSあるいはAutoHotkeyKarabinerなどのソフトウェアに依存せずどの環境でも同じ動作をさせることができるようになる。

Alternative Controller for HHKBには、HHKB Professional, Professional 2, Professional 2 Type-S, Professional JP, Professional JP Type-Sに対応するモデルがある。HHKB本体はいずれもBluetooth非対応モデルだが、いくつか制約事項はあるもののBluetooth対応させることもできる。なお、HHKB Professional BTとは違い、Bluetooth対応させた場合でもUSB接続に切り替えることができる。

購入方法

Topic: [TMK] Alt Controller Board for HHKBに書かれているのでしっかり読むこと。

2016/08/11時点で書かれている購入の流れをざっとまとめておくと、

  1. Hasu氏にgeekhackのPrivate Messageまたはメールで購入したいAlternative controller for HHKBのモデルと自分のメールアドレス(Paypalのアカウント)を連絡する。
  2. 連絡したメールアドレスにHasu氏からPaypalの請求書が届く。
  3. Paypalで3日以内にクレジットカードで支払いを済ませる。遅れた場合は注文がキャンセルされる。
  4. 日本郵便(追跡サービスあり)で郵送されてくる。

という感じ。Hasu氏は日本人で首都圏在住のようなので、本州なら数日で届くとみていい。

制約事項

Topic: [TMK] Alt Controller Board for HHKBに書かれているのでしっかり読むこと。
Hasu氏は日本人だし日本語で聞けば答えてくれる、とは考えないほうがいい。最低限ここに書かれている内容を理解できる英語力は必要だと考えるべき。

2016/08/11時点で書かれている重要そうな制約事項をざっとまとめておくと、

  • USB Hub機能なし
  • DIPスイッチなし(ファームウェアの機能で代替できる)
  • BT版はRN-42 Bluetoothモジュールの制約を受ける
    • Class 2 Bluetooth 2.1相当
    • HID Usage ID 0x65までしか送信できない
  • BT版はLiPoバッテリは同梱されていない(動作実績のあるものを別途購入する必要がある)

となっている。特にBT版は色々と気に留めておく事項があるので注意。

USB Hub機能のあるHHKB Professional 2/Type-SのUSB Hubのケースの穴は、USB版は空いたまま、BT版はUSB・BTの切り替えスイッチや状態を示すLEDが見える穴になる。基板部へのほこりの侵入を防ぐためにキャップを作成する場合は、3Dプリンタでキャップを作った人がCADデータを公開してくれていたりするようなので利用するといいだろう。
逆に、USB Hub機能のないHHKB Professional JP/JP Type-Sは、BT版の場合はケースに穴を開ける必要があるようだ。

コントローラの詳細

HHKBの内部には、静電容量無接点方式のキースイッチ部分の基板(ほぼ本体サイズ)と、そこからケーブルで接続されたコントローラ(本体の約1/4サイズ)の2つの基板があるが、この小さい方の基板をAlternative Controller for HHKBに差し替えることになる。

緑色の基板がHHKB(Pro2)、青色の基板がAlternative Controller for HHKB(Pro2 USB)。
HHKB Controller

差し替えるコントローラは、HHKB本体背面パネルの内側にネジ止めされている。HHKB本体背面のネジを外してフタを開け、背面パネル内側のコントローラのネジとコネクタを外せば取り外すことができる。ケーブルはそれほど長くないので、フタを開ける時は引っ張らないように注意。また、コネクタも若干外しづらいので無理に引っ張らないようにする。
コントローラを外したらAlternative Controller for HHKBを背面パネルにネジ止めし、コネクタを差して(BT版の場合はLiPoバッテリも)フタを閉めてネジ止めすれば差し替え完了。

Alternative Controller for HHKBの詳細を知りたい場合はKeyboard Controller Board for HHKBを参照すること。PCBのレイアウトやハンダ付けされている部品のリストがある。なお、PCBレイアウトはKiCadで閲覧できる。

BT版もUSB版と同じPCBを用いているようなので、USB版を購入しても後で必要な部品をハンダ付けすればBT版になると思われるが、表面実装基板であることや部品のサイズを十分考慮し、それでもできる知識と自信がある人は挑戦してみてもいいと思う。

ファームウェア

Alternative Controller for HHKBはファームウェアを書き換えることでHHKBのキーマップを自由に変更することができる。

対応しているファームウェアとしてTopic: [TMK] Alt Controller Board for HHKBに書かれているのはTMK Keyboard Firmware Collectionだが、TMK Keyboard Firmware Collection(TMK)から派生したQuantum Mechanical Keyboard Firmwareでも動作する。

Quantum Mechanical Keyboard Firmware(QMK)の方が色々と機能拡張されているので、キーマップの定義で少しだけ楽をしたかったり凝ったことをしたいのであればQMKを使うといいと思われる。QMKは機能拡張されている分、作成されるファームウェアのサイズも大きくなるため注意が必要だが、サイズが問題となることはおそらくない。

ファームウェア機能紹介

ファームウェアの機能をいくつか紹介しておく。キーマップの定義方法は各Readmeやサンプルを参照。

キーマップの切り替え

複数のキーマップ(32レイヤー)が定義でき、一時的に他のレイヤーを有効することができる。これにより、US配列やDvorak配列など配列自体を変更したり、DIPスイッチで行っていたようなキーの入れ替え、Fnキーを押しながら入力するF1〜F12キーやカーソルキーなどの定義ができる。

マウスキー

使い勝手はあまりよくないが、マウスカーソルやマウスのボタン、ホイールが操作できるマウスキーが使用できる。

メディアキー

OSがサポートしているメディアキー(音量操作、再生、停止、早送り、巻き戻し)が使用できる。

システムキー

OSのスリープやシャットダウンなどの制御ができるシステムキーが使用できる。

ファンクションキー

定義したアクションやマクロを割り当てたり、自分で書いたコードで制御できるキー。32キーまで定義できる。レイヤーを切り替えたりするのにも必要となる。
TMKではファンクションキーを定義しなければできないことでも、QMKならC言語マクロを使ってキーマップを定義できるように拡張されているため、基本的な機能ならファンクションキーを使わずに同等機能を実現できる。万一32キーでは足りない場合はQMKを使用するとよい。

NKRO

複数キーを同時に押しても押したことを認識させられるn-key rolloverに対応。Alt、Ctrl、Shift、Meta(WindowsキーやCommandキー)のModifier Key(修飾キー)左右含めて8キー以外に、標準では6キーまで(7キー目以降は無視)認識されられるが、ビルドオプションNKRO_ENABLEyesにすると120キーまで拡張できる。
128キーも同時に押せないし、押せたとしても何に使うのかは不明だが。

2016/09/11追記

NKRO_ENABLEyesにした時のHIDレポートサイズのデフォルト値が32byteに変更されたため、現在は248キーまでの同時押しが理論上可能になっている。

Magic Commands

特定のキーの組み合わせで実行できるコマンド。hid_listenerを使ったデバッグ時に有用なコマンドや、一部のレイヤーへの切り替えができるコマンドがある。ビルドオプションによっては意味のないコマンドもある。

Boot Magic Configuration

キーボードの電源ON時(USB接続ならUSB接続時)に特定のキーが押されていると実行できるコマンド。キーマップの変更なしで特定のキーを入れ替えたりもできる(Virtual DIP Switch)。

キーアクション

1つのキーでCtrl+Alt+Deleteを押したようにするといったように、複数の修飾キーと1つの通常キーを組み合わせたアクションや、一定時間内にキーを押して離した時とそうでない場合とで違うキーになる(Dual role)キーを定義できる。

Dual roleの例としては、SpaceFNのようにスペースキーを押しながらIJKLキーを押すとカーソルキーになったり、Space Cadet Shiftのように、左右のShiftキーを一定時間内に押して離すと小括弧が入力され、押し続ければShiftキーとなるといったもの、KarabinerにあるようにUS配列のMacで左右のCommandキーを英数・かなキーとしても使えるようにする、といったものがある。

レイヤーアクション

一時的あるいは永続的に(キーボードの電源が落ちるまで)レイヤーを切り替えることができる。
キーを押すと指定したレイヤーに切り替えるほか、HHKBのFnキーのようにキーを押している間別のレイヤーに切り替えたり、キーを次に押すまで違うレイヤーに切り替える、といったことができるキーを定義できる。

マクロ

"Hello, world!"と順に入力するマクロを定義しておき、ファンクションキーに定義したマクロを割り当てることで、1つのキーで"Hello, world!"と入力させるようなことができる。

ファンクションアクション

自分で定義したファンクション(メソッド)を実行するキーを定義できる。コードで書いた通りに実行できる一番汎用的なもの。

タップダンス(QMKのみ)

一定時間内にキーを1回押して離した時と、一定時間内にキーを押して離すのを2回繰り返した場合とで違うキーになるようなキーを定義できる。

リーダーキー(QMKのみ)

リーダーキーという特殊なキーを使って、リーダーキーに続けて特定のキーを一定時間内に押した場合に別の動作をさせるようなことができる。

ファームウェアのビルド環境

Windows(cygwin)、OSX、Linuxの各環境のツールチェーンがある。Linuxは各パッケージマネージャ、OSXはHomebrewを使って環境構築できるので便利。また、QMKはDockerやVagrantを用いたビルドもできるようなので、環境的な問題がある場合は試してみてもいいだろう。

環境構築手順はTMK、QMKそれぞれのReadmeに書いてあるので参照すること。TMK、QMKのいずれかの方法で環境構築すれば、後で使用するファームウェアを変更しても同じ環境をそのまま利用してビルドできるはず。

OSXの場合、QMKではAVR toolchainをソースコードをビルドしてインストールする手順になっているため時間がかかる。時間がかかるのが嫌で少し古いバージョンでもいいのであれば、TMKで示されている通りCrossPack for AVR Developmentを利用するとよい。

CrossPack for AVR Developmentをインストールする場合は、homebrew-caskを使って

brew cask install crosspack-avr

とインストールするとアンインストールも簡単にできて便利。

ファームウェアのビルド方法

TMKの場合

keyboard/hhkbのパスに移動して

make -f Makefile.<variant> KEYMAP=<yourkeymap>

でビルドできる。

variantはHHKB JP用なのか、BT用なのかで対象のMakefileを変更する。
Pro/Pro2 USBならばデフォルトのMakefileを使用するので、単に

make KEYMAP=<yourkeymap>

でよい。

KEYMAPに指定する値は、コンパイルするkeymap_xxx.cのxxxの部分に該当する値。省略するとkeymap_common.cがコンパイルされる。

QMKの場合

keyboards/hhkbのパスに移動して

make KEYMAP=<yourkeymap>

または

make keymap=<yourkeymap>

でビルドできる。KEYMAPは大文字でも小文字でもいいようだ。
KEYMAPに指定する値は、keyboards/hhkb/keymaps以下のフォルダ名になる。フォルダ名を指定する代わりに、コンパイルするファイル名はkeymap.c固定となる。
makeを実行するパスを変えて、ビルドするキーボードとキーマップを指定する方法もある。

2016/09/11追記

Makefileの構造の改修が入ったため、現在は上記以外にもQMKのルートフォルダで

make <yourkeyboard>-<yourkeymap>

と実行することでもビルドできるようになった。

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

Alternative Contoller for HHKBにある赤いスイッチ(DIPスイッチのあったところにある)を押してATmega32U4のブートローダを起動し、

make KEYMAP=<yourkeymap> dfu

などとコンパイル時のオプションにdfuを追加することでファームウェアが書き込める。

ブートローダを起動するとHHKBはキーボードとして使用できなくなるので、コマンドを実行するには別のキーボードかソフトウェアキーボードを使用する。ファームウェアを書き込むと自動的に再起動され、再びキーボードとして使用できるようになる。
誤ってブートローダを起動した場合は、単にHHKBのUSBケーブルを抜くなどして電源を入れ直すか

dfu-programmer atmega32u4 reset

とコマンドを実行して再起動すると再びキーボードとして使用できるようになる。

2016/09/11追記

Makefileの構造の改修が入ったため、現在は上記以外にもQMKのルートフォルダで

make <yourkeyboard>-<yourkeymap>-dfu

と実行することでもファームウェアの書き込みができるようになった。

動作確認・デバッグ

ビルドオプションでCONSOLE_ENABLEyesにしてビルドし、The HID Listen Programを使うことでdprint()dprintf()などで出力したデバッグメッセージが確認できる。押されているキー情報となるHIDのレポートも表示されるので非常に便利。

ちなみに、hid_listen(Windowsならhid_listen.exe、OSXならhid_listen.mac)を実行しただけではダメで、ファームウェアに実装されているMagic CommandsでデバッグONに切り替えなければならない。
Magic Commandsを実行するには、Magicキー(デフォルトでは左Shiftと右Shift)と対象のコマンド(デバッグのON/OFF切り替えの場合はd)の3つのキーを同時に押す。デバッグのON/OFF切り替え以外のコマンドはTMKのReadme参照。

HIDレポート

hid_listenを使用してデバッグモードで見ることができるHIDレポートはNKRO_ENABLEyesかどうかでレポートのサイズが変わる。

6KROの場合

byte 0 1 2 3 4 5 6 7
内容 Modifier 0x00(固定) キー1 キー2 キー3 キー4 キー5 キー6

Modifierの値は以下の通り。

bit 0 1 2 3 4 5 6 7
内容 左Ctrl 左Shift 左Alt 左Gui 右Ctrl 右Shift 右Alt 右Gui

従って、左Ctrlと左Shiftを同時に押した場合、0x03となる。

各キーには、HID Usage Tables 1.12の10章Keyboard/Keypad Page (0x07)にあるUsage IDの値が設定される。

NKRO(NKRO OFF)の場合

byte 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
内容 Modifier 0x00(固定) キー1 キー2 キー3 キー4 キー5 キー6 キー7 キー8 キー9 キー10 キー11 キー12 キー13 キー14

NKRO_ENABLEyesにするとHIDレポートサイズが倍になるため、同時押しを認識させられるキー数が増える。Magic CommandでNKROの設定をOFF(Magic Command+sで確認できるkeyboard_nkroの値を0)にした場合は、6KROと同じ方式で値が設定されるため14キーまでの同時押しになる。

NKRO(NKRO ON)の場合

byte 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
内容 Modifier Usage ID 0x00〜0x07 0x08〜0x0F 0x10〜0x17 0x18〜0x1F 0x20〜0x27 0x28〜0x2F 0x30〜0x37 0x38〜0x3F 0x40〜0x47 0x48〜0x4F 0x50〜0x57 0x58〜0x5F 0x60〜0x67 0x68〜0x6F 0x70〜0x77

Magic CommandでNKROの設定をON(Magic Command+sで確認できるkeyboard_nkroの値を1)にした場合、Modifierの値は同じだがキーの値の設定方法が変わり、押されたキーのUsage IDのbitが1に設定される。
従って、1bitあたり1キーで8bit✕15byte=120キーの同時押し(厳密にはUsage ID 0x77までのキーの同時押し)が可能になる。

2016/09/11追記

NKRO_ENABLEyesにした時のHIDレポートサイズのデフォルト値が32byteに変更されたため、8bit✕31byte=248キーの同時押し(厳密にはUsage ID 0xF7までのキーの同時押し)が可能になる。Usage ID 0xE8以降は予約済みにはなっているものの未使用のため、理論上全キーの同時押しが可能となっている。

Usage IDとキー

OSやキーボードの配列とキーの対応は以下の通り。空欄は未確認または無効キー。キーマップを定義して調べれば分かるはずだが面倒なので放置。

Usage ID Usage Name Windows(JIS配列) Windows(US配列) OSX(JIS配列) OSX(US配列)
0x04 Keyboard a and A a A a A a A a A
0x05 Keyboard b and B b B b B b B b B
0x06 Keyboard c and C c C c C c C c C
0x07 Keyboard d and D d D d D d D d D
0x08 Keyboard e and E e E e E e E e E
0x09 Keyboard f and F f F f F f F f F
0x0A Keyboard g and G g G g G g G g G
0x0B Keyboard h and H h H h H h H h H
0x0C Keyboard i and I i I i I i I i I
0x0D Keyboard j and J j J j J j J j J
0x0E Keyboard k and K k K k K k K k K
0x0F Keyboard l and L l L l L l L l L
0x10 Keyboard m and M m M m M m M m M
0x11 Keyboard n and N n N n N n N n N
0x12 Keyboard o and O o O o O o O o O
0x13 Keyboard p and P p P p P p P p P
0x14 Keyboard q and Q q Q q Q q Q q Q
0x15 Keyboard r and R r R r R r R r R
0x16 Keyboard s and S s S s S s S s S
0x17 Keyboard t and T t T t T t T t T
0x18 Keyboard u and U u U u U u U u U
0x19 Keyboard v and V v V v V v V v V
0x1A Keyboard w and W w W w W w W w W
0x1B Keyboard x and X x X x X x X x X
0x1C Keyboard y and Y y Y y Y y Y y Y
0x1D Keyboard z and Z z Z z Z z Z z Z
0x1E Keyboard 1 and ! 1 ! 1 ! 1 ! 1 !
0x1F Keyboard 2 and @ 2 " 2 @ 2 " 2 @
0x20 Keyboard 3 and # 3 # 3 # 3 # 3 #
0x21 Keyboard 4 and $ 4 $ 4 $ 4 $ 4 $
0x22 Keyboard 5 and % 5 % 5 % 5 % 5 %
0x23 Keyboard 6 and ^ 6 & 6 ^ 6 & 6 ^
0x24 Keyboard 7 and & 7 ' 7 & 7 ' 7 &
0x25 Keyboard 8 and * 8 ( 8 * 8 ( 8 *
0x26 Keyboard 9 and ( 9 ) 9 ( 9 ) 9 (
0x27 Keyboard 0 and ) 0 0 ) 0 0 )
0x28 Keyboard Return (Enter) Return Return Return Return
0x29 Keyboard Escape Escape Escape Escape Escape
0x2A Keyboard Delete (Backspace) Backspace Backspace Backspace Backspace
0x2B Keyboard Tab Tab Tab Tab Tab
0x2C Keyboard Spacebar Spacebar Spacebar Spacebar Spacebar
0x2D Keyboard - and (underscore) - = - _ - = - _
0x2E Keyboard = and + ^ ~ = + ^ ~ = +
0x2F Keyboard [ and { @ ` [ { @ ` [ {
0x30 Keyboard ] and } [ { ] } [ { ] }
0x31 Keyboard \ and | ] } \ | ] } \ |
0x32 Keyboard Non-US # and ~
0x33 Keyboard ; and : ; + ; : ; + ; :
0x34 Keyboard ' and " : * ' " : * ' "
0x35 Keyboard Grave Accent and Tilde 半角/全角 ` ~ ` ~ ` ~
0x36 Keyboard , and < , < , < , < , <
0x37 Keyboard . and > . > . > . > . >
0x38 Keyboard / and ? / ? / ? / ? / ?
0x39 Keyboard Caps Lock Caps Lock Caps Lock Caps Lock Caps Lock
0x3A Keyboard F1 F1 F1 F1 F1
0x3B Keyboard F2 F2 F2 F2 F2
0x3C Keyboard F3 F3 F3 F3 F3
0x3D Keyboard F4 F4 F4 F4 F4
0x3E Keyboard F5 F5 F5 F5 F5
0x3F Keyboard F6 F6 F6 F6 F6
0x40 Keyboard F7 F7 F7 F7 F7
0x41 Keyboard F8 F8 F8 F8 F8
0x42 Keyboard F9 F9 F9 F9 F9
0x43 Keyboard F10 F10 F10 F10 F10
0x44 Keyboard F11 F11 F11 F11 F11
0x45 Keyboard F12 F12 F12 F12 F12
0x46 Keyboard PrintScreen PrintScreen PrintScreen
0x47 Keyboard Scroll Lock Scroll Lock Scroll Lock
0x48 Keyboard Pause Pause Pause
0x49 Keyboard Insert Insert Insert
0x4A Keyboard Home Home Home Home Home
0x4B Keyboard PageUp PageUp PageUp PageUp PageUp
0x4C Keyboard Delete Forward Delete Delete Delete Delete
0x4D Keyboard End End End End End
0x4E Keyboard PageDown PageDown PageDown PageDown PageDown
0x4F Keyboard RightArrow RightArrow RightArrow RightArrow RightArrow
0x50 Keyboard LeftArrow LeftArrow LeftArrow LeftArrow LeftArrow
0x51 Keyboard DownArrow DownArrow DownArrow DownArrow DownArrow
0x52 Keyboard UpArrow UpArrow UpArrow UpArrow UpArrow
0x53 Keypad Num Lock and Clear Num Lock Num Lock Clear Clear
0x54 Keypad / / / / /
0x55 Keypad * * * * *
0x56 Keypad - - - - -
0x57 Keypad + + + + +
0x58 Keypad Enter Enter Enter Enter Enter
0x59 Keypad 1 and End 1 1 1 1
0x5A Keypad 2 and Down Arrow 2 2 2 2
0x5B Keypad 3 and PageDn 3 3 3 3
0x5C Keypad 4 and Left Arrow 4 4 4 4
0x5D Keypad 5 5 5 5 5
0x5E Keypad 6 and Right Arrow 6 6 6 6
0x5F Keypad 7 and Home 7 7 7 7
0x60 Keypad 8 and Up Arrow 8 8 8 8
0x61 Keypad 9 and PageUp 9 9 9 9
0x62 Keypad 0 and Insert 0 0 0 0
0x63 Keypad . and Delete . . . .
0x64 Keyboard Non-US \ and \
0x65 Keyboard Application Application Application
0x66 Keyboard Power Power Power Power Power
0x67 Keypad = = = = =
0x68 Keyboard F13 F13 F13 F13 F13
0x69 Keypoard F14 F14 F14 F14 F14
0x6A Keyboard F15 F15 F15 F15 F15
0x6B Keyboard F16 F16 F16 F16 F16
0x6C Keyboard F17 F17 F17 F17 F17
0x6D Keyboard F18 F18 F18 F18 F18
0x6E Keyboard F19 F19 F19 F19 F19
0x6F Keyboard F20
0x70 Keyboard F21
0x71 Keyboard F22
0x72 Keyboard F23
0x73 Keyboard F24
0x74 Keyboard Execute
0x75 Keyboard Help
0x76 Keyboard Menu
0x77 Keyboard Select
0x78 Keyboard Stop
0x79 Keyboard Again
0x7A Keyboard Undo
0x7B Keyboard Cut
0x7C Keyboard Copy
0x7D Keyboard Paste
0x7E Keyboard Find
0x7F Keyboard Mute
0x80 Keyboard Volume Up
0x81 Keyboard Volume Down
0x82 Keyboard Locking Caps Lock
0x83 Keyboard Locking Num Lock
0x84 Keyboard Locking Scroll Lock
0x85 Keypad Comma
0x86 Keypad Equal Sign
0x87 Keyboard International1 \ _
0x88 Keyboard International2 ひらがな カタカナ
0x89 Keyboard International3 ¥ | ¥ |
0x8A Keyboard International4 変換
0x8B Keyboard International5 無変換
0x8C Keyboard International6
0x8D Keyboard International7
0x8E Keyboard International8
0x8F Keyboard International9
0x90 Keyboard LANG1 かな カナ
0x91 Keyboard LANG2 英数
0x92 Keyboard LANG3
0x93 Keyboard LANG4
0x94 Keyboard LANG5
0x95 Keyboard LANG6
0x96 Keyboard LANG7
0x97 Keyboard LANG8
0x98 Keyboard LANG9
0x99 Keyboard Alternate Erase
0x9A Keyboard SysReq/Attention
0x9B Keyboard Cancel
0x9C Keyboard Clear
0x9D Keyboard Prior
0x9E Keyboard Return
0x9F Keyboard Separator
0xA0 Keyboard Out
0xA1 Keyboard Oper
0xA2 Keyboard Clear/Again
0xA3 Keyboard CrSel/Props
0xA4 Keyboard ExSel
0xB0 Keypad 00
0xB1 Keypad 000
0xB2 Thousands Separator
0xB3 Decimal Separator
0xB4 Currency Unit
0xB5 Currency Sub-unit
0xB6 Keypad (
0xB7 Keypad )
0xB8 Keypad {
0xB9 Keypad }
0xBA Keypad Tab
0xBB Keypad Backspace
0xBC Keypad A
0xBD Keypad B
0xBE Keypad C
0xBF Keypad D
0xC0 Keypad E
0xC1 Keypad F
0xC2 Keypad XOR
0xC3 Keypad ^
0xC4 Keypad %
0xC5 Keypad <
0xC6 Keypad >
0xC7 Keypad &
0xC8 Keypad &&
0xC9 Keypad |
0xCA Keypad ||
0xCB Keypad :
0xCC Keypad #
0xCD Keypad Space
0xCE Keypad @
0xCF Keypad !
0xD0 Keypad Memory Store
0xD1 Keypad Memory Recall
0xD2 Keypad Memory Clear
0xD3 Keypad Memory Add
0xD4 Keypad Memory Subtract
0xD5 Keypad Memory Multiply
0xD6 Keypad Memory Divide
0xD7 Keypad +/-
0xD8 Keypad Clear
0xD9 Keypad Clear Entry
0xDA Keypad Binary
0xDB Keypad Octal
0xDC Keypad Decimal
0xDD Keypad Hexadecimal
0xE0 Keyboard LeftControl Left Ctrl Left Ctrl Left Ctrl Left Ctrl
0xE1 Keyboard LeftShift Left Shift Left Shift Left Shift Left Shift
0xE2 Keyboard LeftAlt Left Alt Left Alt Left Option Left Option
0xE3 Keyboard Left GUI Left Windows Left Windows Left Command Left Command
0xE4 Keyboard RightControl Right Ctrl Right Ctrl Right Ctrl Right Ctrl
0xE5 Keyboard RightShift Right Shift Right Shift Right Shift Right Shift
0xE6 Keyboard RightAlt Right Alt Right Alt Right Option Right Option
0xE7 Keyboard Right GUI Right Windows Right Windows Right Command Right Command

My Keymap

QMKで作成したキーマップをPRしたらマージされた。My Keymap
Windows環境でレジストリをいじってもUS配列として認識されない環境があったため、JIS配列として認識されてもUS配列と同じ文字が入力できるレイヤーを作成している。

まとめなど

HHKB以外にも、FilcoのMajestouchやCoolerMasterのQuick Fireといった既成品のキーボードのコントローラを差し替えてフルプログラマブルにするCostar replacement controllersがある。

TMKやQMKは汎用キーボードファームウェアなので、Alternative Controller for HHKB以外にも、一部界隈で流行りのErgoDox Ez、DIYの省スペースキーボードであるClueboardGH60Planckといったキーボードのファームウェアとしても使える。