ほぼNICOLA化プログラム hoboNicolaのページ

概要

hoboNicolaライブラリーは、ふつうキーボードをほぼNICOLAキーボード (親指シフトキーボード) のように使うためのプログラムです。プログラムは、Arduinoライブラリーの形態で公開しています。

hoboNicolaライブラリーは、市販や自作のキーボードとPCやスマホなどのUSBホストデバイスの間に接続するhoboNicolaアダプターのマイコンに組み込んだり、キーボード自体のファームウェアの一部として使うことを意図しています。

hoboNicola Adapter, Keyboard

現在までのところ、USBキーボードを接続するためのアダプター、PS/2キーボード用アダプター、および、hoboNicolaライブラリーを組み込んだ数種類の自作キーボードを作りました。アダプター用のマイコンは、安価でコンパクトなArduinoボードを用いることが多いですが、自作のマイコンボードでの実装例もあります。

このページは、hoboNicolaとはおおむねどういったものか、を紹介するために書いています。

ほぼNICOLAキーボードでの入力

キー入力時にほぼNICOLAキーボードだと感じるための要素として、以下を重視しました。

  1. キーの配列。配列の文字キー部分がNICOLAのそれと一致していること。記号についてはゆらぎを許容する。レイアウト(配列)については後述します。
  2. 同時打鍵の論理とタイミング。親指キーとの同時打鍵の入力感 覚が過去の親指シフトキーボードと近いこと。
    親指キーと文字キーの同時打鍵についての規格や論理は NICOLA配列規格書に掲載されています。この規格に基づく同時打鍵ステートマシンとその説明は別ページにまとめてあります。
  3. モード切替えがわかりやすいこと。IMEをオフにして英字や記号を入力している状態から、親指で操作しやすいキーによってIMEをオンにしてかな入力状態(NICOLAモード)とできること。このとき、文字種切り替えやIMEのオン/オフは、トグル操作ではなく一方通行の操作であること。
    画面を目でみて入力文字種を確認するのではなく、キーボードの特定のキーを押せば望みの入力状態になることを意図しています。キーボードを接続するホストの種類やIME設定による制約もあって悩ましい問題でもあります。

NICOLAモード

hoboNicolaはNICOLAモードのとき、配列を変更し同時打鍵処理を有効にします。NICOLAモードではないときは、基本的にはキーキャップに書いてある英数字記号に対応したコードを出力します。

NICOLAモードのオン/オフは、特定のキーの押下による方法と外部プログラムからの通知による方法があります。いずれもhoboNicolaの設定機能によって動作を許可するかどうかを選択できます。このページの下の方にある、動作設定を参照してください。

キー操作による方法

ひらがなキーや英数(CapsLock)キーなどの押下時にNICOLAモードをオン・オフできるようになっています。日本語入力IMEのカスタマイズによって、これらのキーでIMEオン/オフするようにしておけば、外部からの通知がなくても案外と快適に入力できます。先に書いた文字種切り替えが一方通行かつ分かりやすい、という条件を満たしますが、操作上の制約を感じる機能でもあります。

注意点としては、日本語入力IMEに対してたとえば変換キーで「ひらがな」入力に切り替えるような設定がなされていても、それはhoboNicolaとは無関係なので「う」を打ったつもりが「あ」(a を出力するから) になります。ただ動作設定機能により、ひらがなキーや無変換キーでhoboNicolaをNICOLAモードとすることができるので、IMEに対しても同様に設定しておけば、快適に操作できます。

外部からの通知による方法

キーボードLEDを使った通知

NICOLAモードの状態を、ScrLock LEDやNumLock LEDと同期させることもできます。この機能を支援するためのWindows用のプログラム (observe_ime) と組み合わせて使うことで、IMEのオン・オフや文字種変更に応じて、hoboNicola内部のNICOLAモードも自動的に変化します。observe_ime については後述します。

ScrLock の状態はExcelの挙動に影響しますし、NumLockはテンキー付きのキーボードを使っていると迷惑な話ではあります。個人的には60%やTKLのキーボードしか使っていないので、わりと便利に感じます。

MSC(Mass Storage Class)を使った通知

動作設定にてMSCを使った通知を許可してある場合、hoboNicolaアダプターやキーボードは、PCからUSB経由でアクセスするディスクドライブを作成します。observe_imeに対してMSCを使った通知を許可しておくと、observe_imeはIMEの状態や文字種に応じてこのディスクドライブ内のファイルを操作し、hoboNicolaにNICOLAモードのオン・オフを通知します。

この機能は、Adafruit_TinyUSBライブラリを用いているアダプター/キーボードでのみ有効です。つまり、SparkFun Pro MicroやArduino Leonrdo など、ATMega32U4を使った実装では使えません。

実現する配列

hoboNicolaアダプターは以下のような、ほぼNICOLAな配列を実現します。(hoboNicolaライブラリ 1.7.0版以降)

hoboNicola レイアウト基本形(1.7)

左右の親指キーに割り当て可能なキーは、日本語キーボードならば、無変換キー、空白キー、変換キーです。USキーボードの場合は F14、 F15および空白キーとなっています。

親指キーに割り当てるキーについては、プログラムの一部を書き換えると別のキーにすることもできます。個人的にUSBキーボードに改造したASKeyboardには、2つの親指キーと無変換/変換キーが独立していますが、こういったキーボードへの適用も容易です。

キーボード配列1行目の数字や記号は、NICOLAモードにおいても基本的にはキーキャップに印字されているのと同じになるようにしてあります (Shiftキー押下時)。同時打鍵時については、個人的な好みにしてあります。

NICOLAモードでの単独打鍵時、同時打鍵時に出力する文字(上図での、かな、記号、数字)はプログラム内にローマ字の文字列として書いてありますから、それを直せば別の出力とすることも可能です。

USキーボードでの親指キーについて

一般的な101/104キーボードには、親指キーとして打ちやすいキーがスペースキー以外は物理的に存在しません。ただ、市販のキーボードキットや自作キーボードには、USキーボードの大きなスペースキーが2つ以上に分割されていて、なおかつ、おのおのにユニークなキーコードを割当可能になっているものがあります。hoboNicolaライブラリーは、そういったキーボードを対象としています。

また日本語の漢字かな交じり分を入力するときには、NICOLAタイプの日本語キーボード入力で慣れている無変換キーによる半確定操作(ひらがな変換)や、半確定後のカタカナ変換操作などのため、独立した無変換キー相当のキーが必要です。

hoboNicolaライブラリーでF14キーやF15キーを親指キーとして用いるようにしたのは、これらのキーをよく使うアプリケーションは知らない、ということと、IMEのカスタマイズ機能によってこれらのキーを無変換キーや変換キー相当の(同一機能の)キーとして割り当てておけば、日本語キーボードを使っているときと、ほとんど同じような入力操作を実現できるからです。

MS-IMEとGoogle日本語入力において、F14やF15を無変換キーや変換キー相当の(同一機能の)キーとして割当できることを確認しています。MS-IMEで検証したとき、F17以降のキーにはIME操作のための機能を割り当てられませんでした。

シングル親指キーモード

空白キーのみを親指キーとして用いる動作モードも用意してあります。濁音にならない同時打鍵の場合は空白キーとの同時打鍵を行い、濁音を発生する場合は文字キーを長押しするようにしてあります。これについては、https://okiraku-camera.tokyo/blog/?p=12934 を参照。

ハードウェアについて

hoboNicolaライブラリーを組み込んだ、各種アダプターとキーボードを紹介します。

PS/2版アダプター

長いあいだ、東プレのRealForce91 というPS/2キーボードを使っていたので、これをPS/2インタフェースのないPCで使うために作りました。

hoboNicola PS/2
ps2_hobo_nicola

PS/2キーボード自体の電源や通信用の接続のためには+5V動作するマイコンが必要なので、SparkFun Pro Micro相当品(+5V, 16MHz版)を使っています。PS/2キーボードからのケーブルを接続するためのmini DIN 9ピンのソケット、ソケットとマイコンのI/O端子を直接接続する回路が必要になります。回路などの諸情報は、こちらの投稿を参照してください。

USB版アダプター

マイクロコントローラー(マイコン)として、ATMega32U4やSAMD21、RP2040など、コンパクトで安価なArduinoボードを使っていくつか作りました。

Pro Micro + mini USB Host Shield

最初に作ったUSB版アダプターです。マイコンは SparkFun Pro Micro (ATMega32U4 3.3V)です。mini USB Host Shieldには、USBホストコントローラーのMAX3421EEが実装されており、githubに公開されている USB Host Library for Arduino ver2 を利用しています。

Pro Micro + miniUHS
Pro Micro + miniUHSの2階建て版と日本語キーボード

RP2040 with PICO-PIO-USB

Seeed Stduio XIAO RP2040ボードを使っています。緑色の基板は自作したものです。
RP2040のもつ、PIO機能によってUSBホストコントローラーを実現する、Pico-PIO-USBライブラリを用いた rp_hobo_nicolaアダプターです。この実装では、専用のUSBホストコントローラーが不要です。作成方法やビルド方法など詳しくは、こちらの投稿を参照のこと。

Pico pio usb hoboNicola (xiao rp2040)

nRF52840 + MAX3421EE

Seeed Stduio XIAO と、自作のUSB Host コントローラーボード (MAX3421EE) を組み合わせており、XIAOの下側の青い基板にMAX3421EEや必要なデバイスを実装しています。XIAO nRF52のほか、XIAO SAMD21やXIAO RP2040を使うこともできます。

XIAO nRF52840では、BLE通信を使ったキーボード入力を実現しています。

hoboNicola

ASkeyboard版

ASkeyboard sono1
ASkeyboard sono1

1988年製のASkeyboardという親指シフトキーボードの内部を改造し、USBの親指シフトキーボードとして使えるようにしました。キーボードの基板にPro Micro 5V,16MHz版を接続し、USB版やPS/2版と同じ同時打鍵ロジックを組み込んで実現しています。
USB版やPS/2版では、キーボードのスキャンやコード生成は既製のキーボードが行っているのに対し、ASkeyboard版ではその部分から実装してあるので、例えば自作のキーボードや他のキーボードを改造してhoboNicolaを利用する際の参考にできると思います。

askb-xiao-rev01 PCB

その後写真のような専用基板を作成し、マイコンも32bitのATSAMD21をのせたSeeed Studio XIAOに変更しました。これについては、こちらの投稿を参照

XD87キーボード版

1.5版から、XD87 PCBを用いた自作キーボードに対応するプログラムも公開しました。XD87 PCBにの概要、回路、制御方法などについては、ブログの投稿を参照してください。

XD64キーボード版

XD87 PCBと同じメーカーが作っている XD64 VER3 PCBを使ったNICOLA型のキーボードです。できあがりや概要については、この投稿を参照してください。

NK60 キーボード版

RP2040を使ったオリジナルのPCBを使った親指シフトキーボードです。ハードウェアやソフトウェアについては、こちらの投稿を参照してください。

開発環境、ライブラリ

hoboNicola一式は、Arduino IDEにインストール可能なライブラリ形式になっており、Arduino IDE 1.8.19版でビルドと確認を行っています。アダプターやキーボードなどの実装用のメインスケッチは、ライブラリのスケッチ例(examples)としてzipファイル内に格納しているので、そのままIDEに読み込んでビルドすることが可能です。

開発環境や必須ライブラリの導入方法については、別のページにまとめました。hoboNICOLAアダプタのプログラムのビルド方法 を参照してください。※ 内容は更新されていません。hoboNicola 1.1版をPro Microを使う場合に限定されていることに注意。

Microsoft VisualStudio 2017 Community版

Windowsでの快適な入力のため、日本語入力IMEの状態をハードウェアに通知するためのWindows用のプログラム observe_ime を用意しました。そのビルドにはVS2017を使っています。

GitHubで公開しているobserve_imeのリリースには、ビルド済のバイナリも含んでいるので、VisualStudio 2017はなくても問題ありません。

hoboNicolaプログラムの構成

アダプター用およびキーボード用のプログラムは、メインスケッチやハードウェア依存部分が異なるがその他は共通になっています。PS/2版ではUHSライブラリの代わりに、hoboNicolaライブラリ用に作成したps2_kbdクラスを使い、ASkeyboard版では、ASkeyboardクラスを使います。

hoboNicolaの構成

hoboNicolaライブラリーやメインスケッチのプログラムの中身についての記述は現在編集中。

以下、hoboNicolaのもついくつかの機能について。

Fnキーについて

兼用Fnキー

1.5版より 兼用Fnキー という概念を導入しました。アダプターに接続するキーボードの中の1つのキーを兼用Fnキーとして定義しておくことで、アダプターはそのキーを特殊な修飾キーとみなし別のキーとの組み合わせでキー入力以外の動作や、キーボードにないキーのコードの発生などを行います。

hoboNicolaアダプターやキーボードがもつ動作設定も兼用Fnキーを使ったキーコンビネーションで開始します。また、音量の上下、ミュート、システムスリープなどメディア制御やシステム制御用のコード発生などを行うことも可能です。

ただ、既存のキーを兼用Fnキーとして利用するため、そのキー本来の機能をなるべく損なわないようにしました。現在の実装ではAppキーを兼用Fnキーとしており、タイムアウト時間 (約200msec) 以内にAppキーのストローク (押して離す) が完了すれば、キーを離した時点でAppキーとして機能し、タイムアウト後も押されていれば、アダプター内で Fnキー有効状態となります。

兼用Fnキーのタイミング

兼用Fnキーに割り当てるキーは、hobo_nicola.h 内で以下のように定義しているため、各実装のinoファイルで上書きできます。


Appキーはあまり使わないキーなのでまず弊害はないと思いますが、何かの都合でよく使うようなら変更してください。

固定Fnキー

hoboNicolaライブラリーの1.7版から、固定Fnキーも使えるようにしました。文字通りFnキーとして固定的に使うキーを定義できるというもので、hoboNicolaライブラリーを組み込んだキーボード用です。

hoboNicolaキーボードでも兼用Fnキーを使うことはできますが、兼用Fnキーと他のキーの組み合わせを編集操作キー (Home, Endなど) とする場合、Fnキーが有効になるまでのタイムアウト時間によって誤操作が生じイライラするので固定Fnキー用の仕組みを追加しました。

ImeOnキー、ImeOffキーについて

hoboNicolaLibraryを使ったアダプターやキーボードは、ImeOnキー(HID Lang1, 0x90)ImeOffキー(HID Lang2 , 0x91) という2つのキーを実装することができます。これらのキーは、WindowsのMS-IMEにも取り入れられており、おもに日本語入力IMEのオンおよびオフに使われています。MS-IMEでの取り扱いについては、 https://learn.microsoft.com/ja-jp/windows-hardware/design/component-guidelines/keyboard-japan-ime を参照のこと。

また、MacOS用のJISキーボードにはスペースキーの左側に英数キー、右側にかなキーがありますが、これらのキーが出力するコードもそれぞれ ImeOffおよびImeOn です。MacOSでは、かなキーを押すとIMEがオンとなり英数キーを押すとIMEがオフになる、という挙動が決まっているため、キー操作によるNICOLAモードの開始/終了とうまくマッチしています。

hoboNicolaLibrary 1.7.5版以降を使ったキーボードおよびアダプターは、MacOS用のJISまたはANSIキーボード (いずれも英数キー、かなキー有効) とすることができるので、Mac用のおおむねNICOLAキーボードとして利用することができます。

設定モード

hoboNicolaの動作を設定するための機能です。プログラムを書き換えることなく、キーボードとしての動作中に動作を許可/禁止したり、一部のキーのコードを変更するなどできます。

以下の設定オプションは、設定モード中に「キー」を押下することで選択できます。設定モードの開始方法は後述しています。

キー 内容 備考
1 空白キーを左親指キーにする
2 空白キーを右親指キーにする (1と2はいずれかのみ有効)
3 空白キーの親指キー設定を解除。
(空白キーを親指キーとして追加した場合も、無変換と変換キーは左右の親指キーのまま)。
4 シングル親指キー動作とする。1 – 3の設定内容は無視する。
5 リピート動作を許可/禁止する NICOLAモード時のみ
6 ScrLock LEDがオンのときNICOLAモードとする。
7 英数キーまたはImeOffキーを押したとき、NICOLAモードをオフにする。
8 ひらがなキーまたはImeOnキーを押したとき、NICOLAモードをオンにする。
9 半角/全角キーを押したとき、NICOLAモードをトグルする。
0  半角/全角キーを押したとき、NICOLAモードをオフにする。
即時文字出力動作を有効/無効。
A 右Altキーをひらがなキーに変更する。
C 英数キーまたはImeOffキーと、左Ctrlキーを入れ換える。
H 変換キーまたはF15キーを空白キーに変更する。
U USレイアウトモードとする。
M Mass Storage Class経由の状態通知を有効にする (AVR以外で有効)
N NumLock LEDがオンのときNICOLAモードとする。
I (アイ) USレイアウトモードのとき、CapsLockキーをImeOffキーに変更する。 1.7.1版より
S 空白キーを無変換キー(USのときはF14キー)に変更する。 1.7版より
B 無変換キーまたはF14キーが押されたとき、NICOLAモードとする。 1.7.2版より
F 無変換キーおよびF14キーをImeOffキーに変更する。 1.7.2版より
O ひらがなキーを常にImeOnキーに変更する。設定UでUSレイアウトを有効にしている場合は、この設定が無効でもImeOnキーに変更される。 1.7.3版より
X 外部通知やキー操作によるNICOLAモードへの変更を行わない。
配列変更や同時打鍵処理をホスト側で処理するためのオプション。
1.7.3版より
J 変換キーおよびF15キーが押されたとき、NICOLAモードとする。 1.75版より
R キーボードから文字コードを出力するときの遅延時間を短くする。 1.7.5版より
Z 無変換キーはF14キーとして、変換キーはF15キーとして出力する。
MacOSで無変換/変換キーのあるWindows用の日本語キーボードを使うときのオプション。
1.7.5版より
Y 無変換キーまたはF14キーをEnterキーに置き換える。このオプションを有効にすると、左親指キー単独時にEnterキーを出力する。非NICOLAモードのときも同様。 1.7.6版より
BackSpace

\

設定内容を出力する 以下の備考を参照。

設定可能な内容は、hoboNicolaライブラリのバージョンアップごとに増減します。ビルド時にソース内容を確認してください。

各設定内容について

親指キー関係(1 ~ 4)

  • 何も設定していない場合、左親指キーは無変換キー、右親指キーは変換キーです。設定3を選択した場合も同様。
  • 設定1で空白キーを左親指キーとした場合、右親指キーは変換キーとなります。USレイアウトの選択時は右親指キーはF15キーです。
  • 設定2で空白キーを右親指キーとした場合、左親指キーは無変換キーとなります。USレイアウトの選択時は左親指キーはF14キーです。
  • 設定4でシングル親指キー動作とした場合、親指キーは空白キーです。設定1~3の内容は無視されます。

IME状態通知関係 (設定6,  N, M)

  • Scroll Lock LEDとNICOLAモードを同期させる場合は設定6を選択しておきます。
  • NumLock LEDとNICOLAモードを同期させる場合は設定Nを選択しておきます。
  • いずれも選択していない場合、外部通知によるNICOLAモードの変更は行いません。
  • MSC通知を使う場合は、設定Mを選択しておきます。MSC通知を有効にしているとき、ロックキー(キーボードLED)による通知は無視されNICOLAモードに反映されません。

NICOLAモード操作関係 (設定7, 8, B, X,J)

  • 設定7が有効のとき、ひらがなキーまたはImeOnキーでNICOLAモードとなります。
  • 設定8が有効のとき、英数キーまたはImeOffキーでNICOLAモードを解除します。
  • 設定B が有効のとき、無変換(F14)が押されたときNICOLAモードとします。
  • 半角/全角キーによる操作もいくつかありますが、廃止していく予定。
  • 設定Xが有効のとき、外部からの通知やキー操作によるNICOLAモードへの変更を行いません。NICOLA配列化や同時打鍵処理はホスト側プログラムが処理するときのためのオプションです。
  • 設定J が有効のとき、変換(F15)が押されたときNICOLAモードとします。右親指キーを変換(F15)としているとき、単独打鍵でIMEオンさせているようなときに使います。

キーの配置換え関係 (設定U, A, C, H, I, S, F,O,Z,Y)

  • 設定Uが有効のとき、USレイアウトモードとします。Windowsのキーボードレイアウトを英語101/102としているときに選択しておきます。
  • 設定Cが有効のとき、英数(CapsLock)キーと左Ctrlキーの場所を入れ替えます。各設定に登場する英数キーやCapsLockキーは配置換え後のキーが対象です。
  • 設定Aが有効のとき右Altキーをひらがなキーとします。USレイアウトの選択時はImeOnキーとなります。ひらがなキーが小さい日本語キーボード対策です。
  • 設定Hが有効のとき、変換(F15)キーを空白キーとします。
  • 設定Sが有効のとき、空白キーを無変換キーまたはF14キーとします。設定Sは設定Hよりも優先されるので、いずれも有効にしたとき、設定Hで空白キーとなった変換キーが無変換キーとなることはありません。
  • 設定Iが有効のとき、CapsLockキーをImeOffキーとします。(Windowsの)USレイアウトを選択しているとき、日本語入力IMEがCapsLockキーと英数キーを異なるキーとして扱うためです 。
  • 設定Fが有効のとき、無変換(F14)をImeOffキーに変更します。
  • 設定Oが有効のとき、ひらがなキーをImeOnキーに変更します。USレイアウトを有効にしているときは、このオプションに関わりなく、ImeOnキーとなります。JISキーボードのときにImeOnでIMEを有効化するホストのためのオプションです。
  • 設定Zが有効のとき、USレイアウトが設定されていなくても、無変換キーをF14キーとして、変換キーをF15キーとして出力します。MacOSでWindows用の日本語キーボードを使うためのオプション。F14/F15を使わない場合は不要。
  • 設定Yが有効のとき、無変換キーまたはF14キーが押されたとき、Enterキーに置き換えます。左親指キーが無変換またはF14だった場合、このオプションによりEnterキーが左親指となります。

一般的な日本語キーボードの一番下の行は、[無変換] [空白] [変換][ひらがな] という並びになっていますが、[空白]を左親指キー、[変換]を右親指キーとして割り当てた場合、左親指で空白を入力することになります。

個人的な好みになりますが、特にプログラミングをするとき左親指で空白を入力するのに違和感があって、右親指側にするために設定のHとSを付けました。IME操作のためにひらがなキーは残しています。

設定S, B, Fについて

無変換(F14)に関する各設定は一見矛盾しているように見えますが、プログラムの内部では以下のように処理されます。

無変換またはF14キーを検出したとき、設定Fならば、ImeOffキーに変更するので以降の処理は行われません。設定Fが無効ならば、以下の設定Bのための検出に影響します。

空白キーを検出したとき、設定Sならば、オン/オフされたキーは無変換キーまたはF14キーに変更されます。 設定B に関する処理はその後に行われるため、設定Bが有効でこの時点で無変換またはF14キーを検出すれば NICOLAモードがオンになります。s

設定モードへの入り方

プログラム内に定義されているキー操作によって設定モードを開始します。設定モードに入ると、NICOLAモードLEDが約3Hzで点滅します。

設定モードを開始するためのキー操作は、アダプターやキーボード用のメインスケッチ(usb_hobo_nicola.inoなど)内の、 static const uint16_t fn_keys[]  内で FN_SETUP_MODE に割り当ててあり、多くの場合、 右Ctrl + Fn + S としています。fn_keys[] には以下のように書いてあります。

これを変更する場合、たとえば 右Ctrlではなく 左Ctrl + Fn + S とするならば、

と記述することになります。S  以外の文字キーを使うこともできますが、hoboNicolaLibrary の更新により別の機能とバッティングするかもしれません。

なお、左親指+Pauseキーの同時打鍵による設定モードの開始は、1.7.0版より廃止しました。

設定内容の出力

上記のオプションの有効/無効の切替えは、各オプションの先頭に書いた数字キーや文字キーを押下します(テンキーは無効)。設定が完了すると、設定モードを終了します。何もせずに設定モードを終了する際には、Escキーを単独で押下します。

設定モード中にBackSpaceキーや¥キーを押すと、その時点での設定内容をキーボードからの入力として出力します。大量の文字を一気に送るので、メモ帳など軽いエディタを開いてから表示するようにしてください。

このように、選択していたり有効にしているオプションの先頭に、* を表示するようにしています。

設定内容は、EEPROMやフラッシュメモリ内に記憶するので、電源を切っても覚えています。

※ Atmel SAMD21 をマイコンとして使っている場合、ファームウェアの更新時に設定の記憶内容が初期化されます。ATMega32U4, RP2040, nRF52840では、ファームウェアを更新しても設定内容は記憶されています。

即時文字出力動作

聖人さんが開発し公開中の親指の友 Mk-2 キーボードドライバ  が備えている、文字キー出力零遅延モード に倣った機能です。具体的な動作や、同時打鍵ステートマシンへの組み込みについては、NicolaKeyboardクラスの同時打鍵ステートマシンの説明 を参照してください。

文字キーを押下した瞬間に画面に文字がでるので、NICOLA(親指シフト)キーボードに慣れている人ほど新鮮かもしれません。親指と文字の同時打鍵によって表示される文字については、親指キーを先にうつことが多い人にはほとんど違和感はなく、文字キー先行が多い人には、一瞬表示された文字が本来の文字に化けていくのが見えて、これはこれで面白いと思います。

今のところ、facebookの投稿フィールドでは即時出力後に次の文字を打つと、最初の文字が消えるという現象があります。なにかfacebook のJavaScript と相性のようなものがあるのでしょう。

Windows用のIME状態通知プログラム

アダプターやキーボード内部のNICOLAモードと、ホストデバイス側のIMEと状態が一致していないと「う」と打ったつもりなのに u が入力されたりします。これをなるべく防ぐため、observe_ime.exe というプログラムを用意しました。

このプログラムは、IMEが有効で「かな・カナ・カナ」のとき、アダプターやキーボードにNICOLAモードとして動作してよいことを通知します。このプログラムのソースおよびバイナリの一式はGitHubに公開しています。プログラムの中身や使い方などについては、GitHubを参照してください。

注意点
  1. アダプターがNICOLAモードのとき、Windows Explorer のコンテキストメニュー(右クリックメニュー)を開いても、アダプタはNICOLAモードのままです。このため、ショートカットの文字が期待どおりには入力できません。IMEがオフになってくれればいいのですが、Explorerではそうなりません。
    次善の方法として、Ctrlキーを押しながらショートカットキーを入力するとうまくいきます。
  2. アプリケーションによっては、IME の状態が正しく把握できないものがあるようです。MS-IMEではダメだがGoogle日本語入力ならばオーケーというケースもありました。特に対応はありません。
  3.  ブラウザのHTML入力Formにおいて、特にユーザー名やパスワードを入力する際には、IME状態の取得ができなくなっており、状態を通知できない場合が多いようです。そのため、パスワードを入力しようとしても、アダプターがNICOLAモードのままで、余計なローマ字文字列を出してしまうことがあります。おそらく、対応できません。
    次善の策として、動作設定の 7. 英数キーでNICOLAオフ を常に有効にしておけば、英数キーを叩くことでNICOLAモードを強制的にオフにできます。

改版履歴

ライブラリの改版履歴です。もともとこのページに書いていた内容とは、変わってきていることも多々ありますので、各版についてのブログ投稿もあわせて参照してください。

hoboNicola1.7版について

1.7.6版
  • 設定Y を追加。左親指キーとして配置されている無変換キーまたはF14キーが押されたとき、Enterキーに置き換えて出力する。IMEで入力中の文字列を確定させるために使う。おもに、無変換操作という概念のないスマホやMacなどで使うためのもの。
  • 設定のセット(設定オプション全体)を3つまで保存したり有効にしたりできるようにした。接続するホストを変更するときにいくつかの設定オプションを変更しているような場合や、いくつかの設定オプションを試すときに使う。
  • AVR (ATMega32u4) は利用可能なフラッシュメモリが小さく usb_hobo_nicola ではメモリに余裕がない。そのため、ライブラリ内部のコーディングを変更して、すこし空きメモリを増やしたりした。
1.7.5版
  • USレイアウトが有効のとき、上矢印キーの左隣のキーをShiftキーとするように基本レイアウトを修正。
  • 設定オプションをいくつか追加。
  • https://okiraku-camera.tokyo/blog/?p=16453 を参照のこと。
1.7.4版
  • NICOLAモード時にShiftキーを押しながら英数記号を入力することができるが、+ (プラス) の位置が間違っていたので修正。
  • hoboNicolaキーボードのnk60、nk80用のPWM LEDについての修正。
  • 1.7.4版での、nk60, nk80キーボードの基本レイアウトについては、https://okiraku-camera.tokyo/blog/?p=16363 を参照のこと。
1.7.3版
  • 「ひらがな」キーをImeOnキーとするオプションを追加。これは、JIS配列のキーボードだが、ImeOn, ImeOffによって日本語入力IMEを操作するホストのためのオプションです。
  • 設定Xは、アダプターやキーボード内部での同時打鍵、配列変更を行わないためのオプションです。xd64やnk60キーボードのような、親指で操作しやすい親指シフトキーを備えたキーボードを使いたいが、同時打鍵などは本体側のソフトウェアに任せたい、といったときに使います。
  • AVR版のusb_hobo_nicolaアダプターをビルドするときのために、フラッシュ領域(TEXTエリア)のメモリの節約を行いました。
1.7.2版
  • RP2040ベースのNK60キーボード用のメインスケッチをexamples内に追加し、ライブラリにサポートファイルを追加。
  • 無変換キーまたはF14キーが押されたとき、NICOLAモードとするオプションを追加。
  • 無変換キーおよびF14キーをImeOffキーに変更するオプションを追加。
  • 2番目のオプションは、空白キーを無変換(F14)に変更するオプションと併用することを意図しています。
1.7.1版
  • USレイアウトモードとしているとき、CapsLockキー(HID_CAPS)をHID_IME_OFF (HID 0x91) に変更して出力する。
  • CapsLockがなくなっても困るので、Fn + ImeOffキーのときCapsLockキーのコード(HID_CAPS)を出力できるよう、メインスケッチのFnキーテーブルに追加。実際にはなくても困らないが。
  • AVR版のusb_hobo_nicolaアダプターをビルドするとフラッシュメモリ不足となっていたので、使っていないコード、機能を削除することでメモリを確保。
  • ソース一式は、GitHUBにリリース171として登録してあります。
1.7.0版

NICOLAモード時のレイアウトを変更しました。おもに、USレイアウトのための変更ですが、JPレイアウト側も若干の変更を行っています。

  • アダプターではなく、キーボード内に組み込んで使うときの実装用に、固定的なFnキーについての取り扱いを追加しました。
  • ImeOnキー、ImeOffキーを扱えるようにしました。
  • このバージョン以降、ソースのバージョンの公開や変更などはGitHubにて公開していきます。ブログではトピックス的なことや詳細情報などを書いていくことになると思います。
  • USレイアウトへの対応をちゃんとしました。

hoboNicola1.6版について

1.6版から、対応するマイコンボードとして ATSAMD21を載せたSeeeduino XIAO-m0 や Adafruit QT Py SAMD21、nRF52840(ISP1807)を載せたスイッチサイエンス ISP1807マイクロボードを追加しました。

Adafruit TinyUSBライブラリを使うSAMD21およびnRF52に対応したことで、ScrLock LEDによるIME状態通知以外のオプションを追加。Windows用のIME状態通知プログラム (observe_ime) も改版しました。

1.6版についてはこちらの投稿を参照してください。

Seeeduino XIAO-m0 (Seeed Studion SAMD21)をビルドする際には、コアパッケージとしてSeeed Studioのものではなく Adafruit SAMD Board を用います。このパッケージでSeeed XIAO を扱うための方法についても上記投稿を参照のこと。

1.6.2版
  • RP2040を使ったマイコンボードに対応。
  • XIAO nRF52840 への対応を追加。
  • CH9350LをUSBホストコントローラーとして使う実装を追加。
1.6.3版

RP2040のPIO機能を利用する PICO-PIO-USBライブラリを使った、rp_hobo_nicolaを追加しました。rp_hobo_nicolaを使うアダプターには、USBホスト用のデバイス (MAX3421EEやCH9350Lなど)が不要です。

hoboNicola1.5版について

hoboNicola1.5版は、ファイル構成やクラス構成を変更しています。そのため、以下に書かれている1.2版までの内容とは若干異なっていますのでご注意ください。

1.5版については、こちらの投稿を参照してくたさい。

  • 2018/12/8  1.21版
    • USBキーボードに改造したASkeyboard用のライブラリファイルを追加し、他のファイルについても修正を行った。
    • 専用の親指キーをもつASkeyboardへの対応のため、 同時打鍵ステートマシンを若干変更した。共用親指キーが前提の、usb版やPS/2版への影響はありません。
    • ESP32を使ったBluetooth版のため、全体的な構成変更を行った。ESP32版用のライブラリファイルは入っているが暫定的なもの。
    • observe_imeの実行中にWindowsがスリープ(サスペンド)しスリープから復帰したとき、ScrLock をオフにするようにした。アダプタがNICOLAモードのままスリープして復帰したとき、復帰時にNICOLAモードに戻るため、サインイン画面でのパスワード入力が正しく行えなかったため。
  • 2018/11/1  1.11版
    • Arduinoのライブラリ形式に変更し、hoboNicolaLibrary111.zip としました。
    • USBキーボードのLEDをホスト側と同期するように修正。
    • PS/2キーボード用のps2_kbdクラスを追加。
    • NICOLAモード時のShiftキー押下中のキー割り当てを追加。
    • オプション設定を行うための、設定モードを追加。
    • 即時文字出力(零遅延出力)動作を選択可能に。
    • 空白キーを左右いずれかの親指キーとして割当可能に。
    • 文字単独や同時打鍵時のリピート出力動作を選択可能に。
    • 即時文字出力やリピートの関係で、同時打鍵ステートマシンを変更。
    • 英数キーでScrLock(NICOLAモード)をオフ、ひらがなキーでオンにするオプションを追加(IME状態の通知ができないときに使う)。
    • PS/2キーボードで、Alt + PrintScreenやると全く違うスキャンコード(0x84)が上がってくるのね。これにも対応。
  • 2018/10/9 初版(1.00版)リリース。