Arduinoを使って、ふつうのキーボードをほぼNICOLAキーボードとして使えるようにする

概要

Pro Micro + miniUHSにふつうの日本語USBキーボードをつないでPCにもつないでみたら、わずかな行数のスケッチでPC用のふつうのキーボードとして振る舞わせることができた。今回は難易度を上げて、NICOLA規格に基づいて和文入力時の図形文字配列と親指同時打鍵処理を実装し、ふつうのキーボードをほぼNICOLAキーボードとしてふるまわせるプログラムを作り、Pro Microのフラッシュメモリに入れてみた。

Pro Micro + miniUHS
Pro Micro + miniUHSの2階建て版と日本語キーボード
使い方
  • まず作る。
  • Pro MicroをUSBケーブルでPCにつなぐ。
  • mini USB ホストシールド(miniUHS)側にJIS配列のUSBキーボードをつなぐ
  • 必要なら、PCでIME状態をPro Microに通知する(ScrLock LEDと同期させる)プログラムを動かす。
  • IMEは「ローマ字かな」にしておく。
  • ふつうに入力する。

ハードウェアは前回記事と同じ配線のものを使い、リファレンスのキーボードとしては、富士通コンポーネント社のFKB8769-052という小型のものを使った。このキーボード、キーのストロークがちょっと浅く感じて好みではないのだが、NICOLAキーボードとして使うときに重要な親指周りのキー配置がよい。

ほぼNICOLAキーボードの個人的な使用感は悪くない。といっても伝わらないので、適当に入力しているところを動画にしてみた。ハードウェアはブレッドボード版を使ってます。

最初はIMEがオフで英数字入力、次に半角/全角キーを打って日本語入力にするとローマ字になっている。そして、前に作ったsend_keycode.exeでIMEの状態をScrLock LEDとしてアダプタに反映させるようにしている。
その後の和文入力時はほぼNICOLAキーボードとなるので、適当に懐かしの練習問題などを打っているところ。少ない手指の運動量で快適に入力できるのがNICOLA配列と親指同時打鍵のいいところだろう。

Pro Microの緑色のLEDのうち、上側に見える方が送信時(Pro Micro -> PC)に点灯するTXLEDなので、キー操作に応じて点滅している。下側はScrLock LEDとして使っているので、IMEが日本語状態にあるときは点きっぱなしになっている。

この動画は次のようにして作成した。

  • PCに接続したWebカメラを手元に向けて設置
  • Windows 10付属の「カメラ」アプリのプレビュー画面とメモ帳ウィンドウを並べる。
  • デスクトップ動画取り込みプログラム(AG-デスクトップレコーダー)を使い、余計なものが入らないよう範囲指定してキャプチャ。

プレビュー表示にちょっとタイムラグがあるから入力された文字の表示に比べ、指の動きがちょっと遅れて見える。

文字図形配列と同時打鍵処理

日本語入力コンソーシアムが制定したNICOLA ( Nihongo Input COnsortium LAyout ) 規格のうち、ふつうの日本語キーボード(JISキーボード)に近い、NICOLA-J型配列を目指すことにした。英字側の配列はJISキーボードと同じで、和文入力時は以下のような、ほぼNICOLAな配列の実現を目標とした。

ほぼnicola配列
ほぼnicola配列(和文)。クリックすると大きくなります。

一部の記号についてはローマ字かな変換を使う都合で配列できなかった(濁点、半濁点ほか)。各キーに配した文字は以下のような意味をもつ。

ほぼnicola配列
ほぼnicola配列付属図
  • 親指キーと同じ色の領域の文字キーを同時に打つなら同色またはストレート同時打鍵。
  • 親指キーと異なる色の領域の文字キーを同時に打つなら異色またはクロス同時打鍵。

図では緑色領域にある「は」のキーを例にしていて、水色の親指左キーと同時打鍵すれば「ば」に、緑色の親指右キーと同時打鍵すれば「み」が出てくることを表している。そして、Shiftキーを押しながら打てば「ぱ」になる。

親指キーについて

親指左、親指右の2つの親指キーの配置は、現実のキーボードで親指で打ちやすいキーのどれか、ということになる。今回の実装では、リファレンスのキーボードに合わせて親指左を無変換キー、親指右を変換キーとした。
プログラムを1,2行修正すれば変換キーと空白キーをいずれも親指左にするとか、空白キーだけを親指右にするとかも可能。自分で直せばよい。

Shiftキーの扱い

図には「Shift 同時打鍵」とあるが、今回の実装ではShiftキーによる同時打鍵は採用しておらず、普通のシフト操作のみできるようにした。つまり、「は」を押してからShiftを押しても「は」のままだが、Shiftを押しながら「は」を押せば「ぱ」になる、ということ。
NICOLA方式の元祖ワープロ専用機OASYSでは、Shiftキーに「半濁音」と印字してあり、親指キーと同様の同時打鍵ができるようになっていたように記憶している。

記号について

IME(MS-IMEとGoogle日本語入力)をローマ字かなで使う都合で、濁点と半濁点を一発で入力する方法や、/と・(スラッシュと中黒)や[と「(大括弧とカギ括弧)を一発で出し分ける手段に思い当たらず、目をつぶることにした。
NICOLA配列ではこれらの記号を和文側でも個別に入力できる必要があるので(濁点と半濁点を除き)配列図に示したが、/(2の親指キーの同時打鍵)を打ったのに・(中黒)が出てしまうかもしれない(IMEの設定による)。

なお、Google日本語入力専用なら記号はオーケーにできる

Google日本語入力では、あるローマ字シーケンスから任意の記号を発生させることができるようだ。最初から定義済みの例として、”z/” で「 ・」(中黒)を出したり、”z[ “で「『」を出すことができる。
言語バーから開けるプロパティ/ローマ字テーブルを編集することでユーザーが拡張することも可能。例えば、”xm”で「々」を出すとか、”xs”で「§」を出すなどが登録できた。なので、配列図にある記号はすべてカバーできるだろうし、今回見送った濁点や半濁点も配列できるだろう。

IME側を拡張して使う場合、プログラム内のローマ字シーケンスもあわせて書き換えてやればいい。記号にこだわりたい場合もなんとかなりますよ、という話。

同時打鍵処理

NICOLAキーボードらしくするためには、配列だけではなく規格に含まれている同時打鍵処理を実装する必要がある。今回は、Windows用親指シフトエミュレータとして90年代半ばからある「親指ひゅんQ」リビジョン4.30付属ドキュメントの「同時打鍵ステートマシン」に基づいて実装した。
このステートマシンには、「文字-親指-文字による3キー判定」や「親指キーと図形文字キーの重なりが薄い場合の同時打鍵未成立」を処理するためのロジックも含まれているから、NICOLA規格での同時打鍵処理規定は満足できる(はず)。今回実装した同時打鍵処理の詳細については、話が長くなるのでこちらのページに載せた

実装について

今までの投稿と重複する部分もあるが、以下のようにした。

  1. Pro MicroをPCにHIDキーボードとして見せるため、Arduino標準のHIDライブラリを使う(LEDレポートのための変更が必要)。
  2. (物理的な)HIDキーボードをPro Microに接続するため、ミニUSBホストシールド(miniUHS)を加工したうえでPro Microに接続する。そして、miniUHSをコントロールするUSB Host Shield Library 2.0(以下、UHSライブラリ) を使う。
  3. Arduino標準のKeyboardライブラリは使わない。Keyboardクラスを参考に、HIDキーボードとしての基本機能をもつ BaseKeyboardクラスを新たに作成。
  4. BaseKeyboardクラスを派生し、同時打鍵ステートマシンや配列変換機能をもつ、NicolaKeyboardクラスを新たに作成。
  5. Arduinoのメインスケッチでは、各クラスのインスタンスをもつとともに、UHSライブラリとNicolaKeyboardクラスの橋渡しをする。
  6. Windows側のIMEの状態を通知するため、send_keycode .exeという小さなプログラムを走らせておく。
  • 1.  については、こちらを参照。また、Pro Microというマイコンボードについてはこちらを参照
  • 2. については、こちらこちらを参照。作り方が書いてある。
  • 6. については、こちらを参照。
  • おのおのの投稿に、もととなる技術情報へのリンクも載せた。
  • 今回作成したソースファイル一式のダウンロードは、文末のリンクを参照のこと。
  • 開発環境(Arduino IDEとVisualStudio 2017 Community)は無償、利用するライブラリやハードウェアもオープンソース、今回作成したソフトウェア一式もオープンソースである。
Pro Micro + miniUHS
Pro Micro + miniUHSとキーボード

ブレッドボード版でも当然ながら同じように動く。ただ、ちょっと動かすたびにジャンパワイヤが緩んだりするのが難点。

動作状況および注意点

この投稿はほぼNICOLA化したキーボードで書いているが順調に入力できている。現在わかっている注意点は以下の3つになる。

USBケーブルの接続先

Pro MicroからのUSBケーブルは、PC本体またはセルフパワーのUSBハブに接続した方がよさそうである。バスパワーのハブを使っていると、まれにキーボードでキーを打ってもPCに届かないことがあった。ケーブルを刺しなおせば治っていたが、セルフパワーのハブに接続してからは再現しなくなった。

これは明らかに電源の問題と思われる。消費する電流は、Pro Micro + mini UHS + USBキーボードの合計で200mAにも満たないと思われるのだが、今回のキーボードは+5V電源を要求しているので、たまに電圧が降下してストールしているのかもしれない。

BIOS操作

HIDBootKeyboardとしてふるまえているようなのでBIOS操作も可能だが、たまに反応しないことがある。起動のためにBIOSパスワードが必要だったりブートするパーティションを選択する必要があるなど、キーボードが必須の状況ならばUSBポートに別のキーボードもつないでおいた方がいいだろう。

ScrLock LED

安易な実装が好みなので、ScrLock LEDを使ってIMEと状態を同期しているが、Excelというソフトを使うときにスクロールロックが入っていると、矢印キーを操作したとき注目セルが固定されてシート自体がスクロールしてしまう。
Excelを使って入力していてちょっと戸惑ったのだが、半角/全角キーを叩いてから矢印キーを操作することにすぐ慣れ、困らなくなった。

もっとも、技術的にはScrLock LED以外の方法でIME状態を通知すればいいだけのことなので、気が向いたら変更する予定。

Androidにも接続できた

Androidスマホ(8.0.0)にOTGケーブルでつないでみたら、あっさり動いてほぼNICOLA配列で入力できた。接続時の最初の配列選択の画面では、ちゃんとSparkFun Pro Microと認識されていた。

Androidの画面
Androidのキーボード選択

キーボードのScrLockキーで和文と英文を切り替える必要があるものの、かなの入力についてはほぼNICOLAになった。問題は記号で、「日本語109A配列」と表記されているのに、USキーボードと同様の記号が入力された。
このあたりについてはすでにワークアラウンドがあるようなので、大した問題ではないだろう。Android内で、和英切り替え操作(全角/半角キーとか英数キーとか)の押下を検出してキーボードのScrLock LEDを制御しつつ、内部の和英切り替えをするようなプログラムを書いてやればよいと思う。

今までAndroidスマホにキーボードをつないだことなどなかったのだけど、ちょっと入力してみたところを動画にした。


かな1文字ごとにローマ字のシーケンスを送りつけているので、画面を見てるとまるでローマ字入力しているように見えてしまう。

注意点というか当然なのだが、Pro Microやキーボードの電源をスマホ本体がまかなうことになるから、バッテリがすぐに減ってしまう。本気で使うなら、Pro MicroのRAW端子に別途+5Vを与えるようにしておいた方がいいだろう。給電用のMicro Bコネクタを増設してモバイルバッテリを接続するとか。

きょうのまとめ

今回のスケッチおよびソースファイル一式の説明やダウンロード用のリンクは、こちらのページに置きました。もしも変更するようなことがあれば、更新内容を記録していきます。

キーボード本体に組み込んで直接マトリックススキャンを行うようにすれば、miniUHSは不要になる。92キーならば10×10程度のキーマトリックスになるので、デコーダーICが別途必要になると思うのだが、いい素材があったら試してみたいところ。ただ、キーボード本体がローマ字出してくるって、ちょっと気持ち悪いですね。

PS/2キーボードのRealforce91というキーボードがお気に入りでもう10年以上使っている。ミニDINコネクタを買ってきてPro Microにつなげてやれば、PS/2キーボードもほぼNICOLA化できるかもしれないから、次にやるならこれかな。