@ukkz さんが作った「USB木魚」。
うちのUSB木魚、パソコンに接続するとキーボードとして認識されて、叩くと煩悩みたいな発光しながら般若心経が入力できるようになりました。 pic.twitter.com/KuI7bshXTZ
— うこ (@ukokq) May 12, 2021
HIDデバイスにして、あらかじめ学習させたうえで漢字の入力をかな漢字変換キーで行うらしい。
ユーザー辞書を用意するのがめんどくさくなりそうで、刺すだけで般若心経が入力するようにできないでしょうか? HIDデバイスから、日本語を入力する方法を考えてみました。
キーコード
HID持つキーボードは、文字を送る時に ASCII コードなどではなく、キーボード上のキーに対応したコードで送られています。
Arduino で HID キーボードを作る場合は以下のようなライブラリ(libraries/Keyboard/src/Keyboard.cpp)をつかっていて、
"a" は 0x04,"b"は 0x05、 "V" は 0X19+ SHIFT キーとして定義されていることがわかります。
これは正確には、
「HID Usage Tables FOR Universal Serial Bus (USB) Version 1.22」
https://www.usb.org/document-library/hid-usage-tables-122
の「10 Keyboard/Keypad Page (0x07)」
で定義されています。
太古の昔、IBM PC の キーボードインターフェースにおいてもASCIIコードとは違う専用のコードを送受信していましたが、そこで使われていたコードはこの表の AT-101 として書かれていて、HID デバイスで使っているものとは別のコードとして定義されているのがわかります。
cf.,「スキャンコード - Wikipedia」
https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%AD%E3%83%A3%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89
Unicode を送るには?
HID デバイスのキーコードは基本的にキーボードのボタンに対応するものなので、Unicode のキャラクタを直接送るようなことはできません。一方、キーボードのボタンなので、文字に対応していないキー、すなわちCtrl や Alt,Windows キー などの 押した/離した の情報が送信できます。
込み入った操作をするには、例えば Windows で Exlorer を開くなら、 "Windows キー" + "E" として、"0x7F" + "0x08" を送るなどすることで、人間が操作するように PC の機能を呼び出すことができます。
なので Unicode を送って日本語を入力するには、そのようなキー操作と共に Unicode を送ればいいことになります。
Windows の場合
MS-IME の場合は 文字コード(ex,611b・・・「愛」の Unocode)+F5でコード入力できるっぽいですね。
(2021/05/18追記:@IkadzuchiPleistより以下コメントをいただきました。)
Windowsでは、UnicodeでなくShift_JISでよければデフォルト状態でIMEに依存せず入力できますね。
Altを押しながら、テンキーで10進数の文字コードを入力です。
また、レジストリで「EnableHexNumpad」を設定すれば16進数のUnicodeも使えるようになります。
Altを押しながら、「+」に続いて16進数のUnicode番号を入力です。
Linuxの場合
Ubuntu Linux 20.04 LTS では、IME として Mosc が標準ですが Mosc には Unicode コード入力は無いみたい。あれれー? と思って調べてみたら、 IME OFFの状態でできました。
- CTRL+SHIFT押下
- "u"
- CTRL+SHIFT 開放
- 文字コード(ex,611b)
- スペース
OSX の場合
Mac を持っていないのでスミマセン! しかしながらかるく調べた限りでは標準設定のままでは無さそう?
部分的にマルチプラットフォームで Unicode を送るキー操作
上記のことをまとめて、 OSX を除き、Windows と Linux で共通で使えるキー操作を考えてみました。( Mac OSX に対応できていないのが悔しいところ。 )
- CTRL+SHIFT押下
- "u"
- CTRL+SHIFT開放
- 文字コード(ex,611b)
- F5
- CTRL+ALT+スペース
- "a"
- BackSpace
解説
-
あらかじめ、WindowsはMS-IMEをON,Ubuntu Linux では IMEをOFFいただきますにしておく。
-
CTRL+SHIFT押下 → "u" → CTRL+SHIFT開放
Ubuntu Linux での文字コード入力PREFIX。 Windowsでは無視される
- 文字コード(ex,611b)
16進数で入力
- F5
Windowsでの文字コードからの変換動作。Ubuntu Linuxでは無視される
- CTRL+ALT+スペース
Linuxでの文字コードからの変換、確定動作。Windows で無視するために CTRL+ALT をつけている。
- "a" → BackSpace
Windowsでの確定動作。エンターだとLinux側に入ってしまうため、適当な文字を入力して削除することで代わりにしている。