前回、PS/2インターフェイスの日本語キーボードをArduinoに接続してUSBキーボードにしました。いよいよ今回はPS/2の英語キーボードHappy Hacking Keyboard Lite(以後HHKB)を接続して、日本語キーボードとして使えるようにしようと思います。
HHKBの利点はそのコンパクトさで、机の上の作業スペースが広くなるだけでなくキーボードの隅から隅まで指が届くので、常に指をホームポジションに置いたままで作業が行えるのです。LinuxのコンソールのようにCUI環境で使用するときには、キーボードから手を離さずに作業できるのでとても快適です。でも、最近の日本語GUI環境では色々使いにくい点があります。
手持ちのHHKBは英語キーボード+若干の日本語キーという構成になっていて、記号の配置が日本語キーボードとは異なっています。そのためOS側のキーボード設定を英語にするのですが、そうすると一部の日本語キーが入力できなくなります。仕方ないのでキーの割当変更を行うのですが、1台のPCで複数のOSを切り替えて使用していると設定作業が煩わしいですし、ちょっと日本語のキーボードが使いたいというときに一々設定を戻すのも不便です。
また、英語環境ではかな文字の位置も一部異なっていたりするので、日本語をローマ字では無くかな入力する者としては不便なのです。
それと、このキーボードには独立したカーソルキーがありません。UNIXで昔から使われているviエディター(今はvim)などでは、カーソル移動にHJKLキーを使うのです。今の時代では考えられないような独特なエディターですが、慣れるとこのカーソル移動はホームポジションから手を離すことがなくとても使い勝手がいいのです。HHKBもこの仕様に合わせてあるのでしょう。通常のカーソルキーは、機能キー+一部のキーで使用できるようになっています。しかし、最近のエディタはカーソル移動にHJKLキーは使えないので、常に機能キーを押しながらカーソル移動するのは苦痛でしかありません。
これらのことを踏まえて、HHKBをUS接続するときには以下の仕様を満たすようにしたいと思います。
- OSのキーボード設定は日本語のままでもHHKBのキートップに書かれている記号がそのまま入力される。
- 日本語入力時のかなキーの位置はできるだけ日本語キーボードと同じ位置に配置する。
- カーソル移動キーはHJKLキーに割り当て、機能キーに相当するキーで通常の文字入力とカーソルキーを切り替える。
- 上記3.の機能キーはトグル動作にする。
- キー割り当てを自由に行え、機能キーで切り替えられるようにする。
仕様1.は簡単そうで意外に面倒です。記号文字の変換のパターンは、
PS/2スキャンコード → USBコード
PS/2スキャンコード → SHIFT + USBコード
SHIFT + PS/2スキャンコード → USBコード
SHIFT + PS/2スキャンコード → SHIFT + USBコード
この4パターンあります。変換テーブルなどでの対応は複雑になりそうなので、入力されたスキャンコードを見て対象のキーコードか判別し、キーコード別に処理ルーチンを記述するのが良さそうです。これに仕様2.を加えるとさらにややこしくなりますが、頑張って一つ一つ記述していくしかないようです。
仕様3.〜5.はカスタマイズしたキーテーブルを別に用意して、機能キーで参照するテーブルを切り替えれは実現できそうです。
それでは、これらの機能を盛り込んでスケッチ作成に取り掛かりましょう。上記の仕様を実現していくと、入力モードによって同じキーでも異なるキーコードに変換する必要があるため、プログラムはif文とswitch文の羅列になってしまいました。デバッグのしにくい美しくないプログラムですが、なんとか完成させることが出来ました。
HHKBLite.ino
Keyboard.h
Keyboard.cpp
※前回のKeyboard.hとKeyboard.cppでは日本語キーボードで追加されている一部のキーが入力できなかったので、もし利用している方がいらっしゃったらこちらのKeyboard.*と差し替えてください。
日本語入力の「半角/全角」キーはスペースキー右側の◇キーに、HJKLキーをカーソルキーにするモード切り替えのキーをスペースキー左側の◇キーに割り当てました。また、FとBのキーをPage UP/DOWNキーに割り当てました。これ以外のHHKBに足りないキーは、必要に応じてカスタマイズ用のキーテーブルで追加していくことにします。
それと、HHKBにはLEDがないので、◇キーを押した時のインジケーター用にLEDも追加しました。こういったことが簡単に出来るArduinoは本当に素晴らしいですね。
実際に使ってみると非常に快適です。自分の望むようにカスタマイズしたキーボードですから当たり前ですが。
昔、HHKBを専用ケースに入れて持ち歩いている人がいましたが、その気持ちが分かるような気がします。このキーボードに慣れてしまうと、普通のOADG109キーボードは使えなくなりそうです。
しかし、動作にまったく問題がないわけではありません。日本語入力モードのとき、インプットメソッドがアプリケーション別に日本語入力のオン・オフを管理してしまうとHHKBの入力モードとアプリケーションの入力モードが合わなくなり、キートップと異なる記号やカナが入力されることになってしまいます。キーボードの入力モードをArduino側で保持してしまうことで起きる弊害ですね。
幸いメインで利用しているUbuntuのibus-mozcでは、全てのアプリケーションで入力モードが共通なので問題ありません。最悪なのはWindows10で、IMEのオン・オフを全てのアプリケーションで共通にできる設定があるのに、設定してもこの機能が有効にならずアプリケーション毎にオン・オフがコントロールされてしまいます。
対処法は日本語入力をオンにしたアプリケーションで日本語オフにしてから別のアプリケーションを使用するか、Windows側の入力モードが直接入力の状態でArduinoをリセットするしかありません。Windowsはキーボードの利用開始前にArduinoをリセットしないとキー入力が出来なくなる問題もあり、本当にトラブルの多く発生するOSです。
まあ、個人的にWindowsでの日本語入力はあまり行わないので(実はこのブログもUbuntuで書いています)大きな問題ではないのですけど。
そんな訳でいろいろ問題はありますが、カスタマイズしながらこのHHKBを使い続けてみようと思います。以前ArduinoでPCと接続できるようにしたMACのテンキーと組み合わせれば、無敵の入力デバイスになりそうです。
※コメント投稿者のブログIDはブログ作成者のみに通知されます