見出し画像

FMV-KB611用hoboNicolaアダプター



1. はじめに

PS/2接続のFMV-KB611用hoboNicolaアダプターを製作した記事です。オリジナルのPS/2用hoboNicolaにキーボードをJIS109キーボードに設定するコマンド送信を追加しています。

かな入力に関連したキーマップは以下の通りです。英字かな入力(Rかな)ですので、ローマ字入力の制約があります。親指キーの動作は、慣れの問題でB割れUSキーボードに合わせています。

hoboNicolaに設定したキーマップ

ソースコードは以下に置いています。

【ソースコード】の利用はあくまでも自己責任で行って下さい。

2. PS/2用hoboNicolaの変更点

2.1 ps2_hobo_nicola_KB611.ino

raw_key_event() でスリープ解除のときのキーボードリセットは後述する reset_KB611() に変更しています。

void raw_key_event(uint8_t key, bool released = false) {
	if (is_usb_suspended()) {
		usb_wakeup();
		//ps2->kbd_reset();
		ps2->reset_KB611();
		return;
	}
};

setup()でkbd=jis109()を実行してKB611をJIS109キーボードに設定します。

void setup() {
	hobo_device_setup(false);
	HoboNicola::init_hobo_nicola(&hobo_nicola);
	ps2 = ps2_kbd::getInstance();
	if (!ps2->begin(new ps2_event, LED_BUILTIN_RX))
		hobo_nicola.error_blink(400);

	ps2->kbd_jis109();    //KB611の親指シフト動作を無効にする
	delay(500);
}

スリープからの復帰でキーボードからの反応が無くなることがあったので、念のため定期的にリセットをかけるようにしました。取り敢えず10分毎。

void loop() {
	static uint16_t i = 0;
	if (is_usb_suspended() ) {
		ps2->task(0);
		all_led_off();
		//KB611がハングしないように10分毎にリセットしてみる。
		i++;
		if (i == 1200) {
			i = 0;
			ps2->reset_KB611();
		}
		enter_sleep(500);
	} else {
		ps2->task(hobo_nicola.get_hid_led_state());
		hobo_nicola.idle();
		enter_sleep();
	}
}

2.2 ps2_kbd.cpp

KB611はリセットに失敗することがあるので reset_KB611() ではキーボードリセットを何度か試します。リセット後に念のためJIS109モードに設定しています。リセットに失敗するのはKB611のリセット回路の時定数が大きすぎるのかもしれません。

bool ps2_kbd::reset_KB611() {
	bool ack = false;
	for(int8_t i = 0; i < 8; i++) {
		delay(500);
		ack = kbd_reset();
		if (ack)
			break;
	}
	kbd_jis109();
	delay(500);
	return ack;
}

kbd_jis109() でKB611にコマンドを送り、JIS109キーボードとして動作するようにします。

bool ps2_kbd::kbd_jis109() {
	send_command(0xf0);				// スキャンコード変更コマンド
	bool f = send_command(0x8c);	// コマンドの引数、ACKが返ればKB611
	if (f) {
		send_command(0x09); // 親指シフト動作を無効
	} else
		kbd_reset();
	return f;
}

PS/2キーボードのスキャンコードを table[] でUSBキーボードのHIDに変換します。KB611特有のキーはここで相当するHIDにします。

static const uint8_t table[] = {
//0     1     2     3     4     5     6     7     8     9     a     b     c     d     e     f
  0,    0x42, 0,    0x3e, 0x3c, 0x3a, 0x3b, 0x45, 0x29, 0x43, 0x41, 0x3f, 0x3d, 0x2b, 0x35, 0,
  LOYA, LALT, LSFT, 0x88, LCTL, 0x14, 0x1e, 0,    ROYA, 0,    0x1d, 0x16, 0x04, 0x1a, 0x1f, 0,
  0,    0x06, 0x1b, 0x07, 0x08, 0x21, 0x20, 0,    0,    0x2c, 0x19, 0x09, 0x17, 0x15, 0x22, 0,
  0,    0x11, 0x05, 0x0b, 0x0a, 0x1c, 0x23, 0,    0,    0,    0x10, 0x0d, 0x18, 0x24, 0x25, 0,
  0,    0x36, 0x0e, 0x0c, 0x12, 0x27, 0x26, 0,    0,    0x37, 0x38, 0x0f, 0x33, 0x13, 0x2d, 0,
  0,    0x87, 0x34, 0,    0x2f, 0x2e, 0,    0,    0x39, RSFT, 0x28, 0x30, 0,    0x32, 0,    0,
  0,    0,    0,    0,    0x8a, 0,    0x2a, 0x8b, 0,    0x59, 0x89, 0x5c, 0x5f, 0,    0,    0,
  0x62, 0x63, 0x5a, 0x5d, 0x5e, 0x60, 0x29, 0x53, 0x44, 0x57, 0x5b, 0x56, 0x55, 0x61, 0x47, 0,
};

例えば Aキーのスキャンコードは 0x1C なのでテーブルの当該位置のHID 0x04 になります。KB611固有の親指左キーのスキャンコードは 0x10、親指右キーのスキャンコードは 0x18 です。

2.3 hoboNicolaLibrary_KB611

hoboNicolaライブラリの変更はキーマップとnicolaシーケンスです。状態遷移は nicola_state.cpp で以下の遷移表に従って実装しました。B割れUSキーボードで実装した親指キー単独の長押しもここで入れています。

nicola状態遷移表

3. ビルドとファームウエアの書き込み

アダプターで使っているMCUはATmega32u4なのでボードの選択はArduino Leonardoです。Arduino IDEでビルドする方法はネットにいろいろ載っていますのでGoogleって下さい。

hoboNicolaアダプターを数種類作成する場合、ライブラリを分けたほうが都合がよい場合があります。 このときはキーボードの種類毎にディレクトリを分けたほうが都合が良く、Arduino IDEの設定でスケッチの保存場所を指定します。

作業ディレクトリの指定

ツールの設定と作業ディレクトリの構成は以下の通りです。 間違えるとビルドエラーになります。

********************************************************
*** CPU Arduino Leonardo (Arduino AVR Boards)        ***
********************************************************

\作業ディレクトリ--+---\ps2_hobo_nicola_KB611---+---ps2_hobo_nicola_KB611.ino
                   |                            |
                   |                            +---ps2_kbd.cpp
                   |                            |
                   |                            +---ps2_kbd.h
                   |
                   +---\libralies---+---\Adafruit_TinyUSB_Arduino-3.4.1
                                    |
                                    +---\hoboNicolaLibrary_KB611

ファームウエアの書き込みはArduino IDEでシリアルポートの指定を行えば自動で書き込んでくれます。

4. MS-IMEの設定

MS-IMEは日本語モードでキーボード・レイアウトはJIS109キーボードです。キーボードはローマ字に変換してPCに出力します。 無変換/変換キーの動作を設定するには「以前のバージョン」のMS-IMEにする必要があります。 この変更のしかたはネットにいろいろ書いていますので検索してください。

変換中の無変換キーは確定に設定してしまうと、カタカナ入力に不便です。 MS-IMEはF7を押すとカタカナに変換してくれます。 Shift+無変換をカタカナ変換に設定することも出来ます。

MS-IMEのカスタマイズ

詳細設定→全般にある「直接入力モードを使用しない(U)」にチェックを入れておきます。また、Japanist2003などを使用していた場合は、色設定をATOKにしておくと変換時の違和感が少ないです。

直接入力モードと色設定

5. hoboNicolaアダプターの設定

右親指をスペースにして使うためにhoboNicolaアダプターで設定します。メモ帳を起動して右CTRLキーとMENUキーを200ms以上押して、Sキーを押すと、LEDが点滅して設定モードに入ります。 何かキーを押すと設定がトグル(完了)して通常モードに戻ります。 BACKSPACEを押すと設定一覧が出ますから、以下のように設定されているか確認します。

hoboNicolaの設定

6. Observe IMEの設定

本キーボードはhoboNicolaで使用している"observe_ime"を使うことを想定しています。 Windowsのアプリ毎のIME状態がキーボードに反映されるので、いわゆるモードずれを気にする必要がありません。 入手先は情報元に記載しています。

  • 無変換キーでMS-IMEは"IME on"、CAPSLOCKで"IME off"に切り替える。

  • "observe_ime"はIMEの状態からキーボードにScrLockで通知する。

  • hoboNicolaアダプターはScrLockの状態に従ってNicolaモードをon/offする。hoboNicolaアダプターの設定でNumLockに変更することも出来ます。

"observe_ime"はスタートアップに入れておいて、以下のように設定しておきます。

obseve_imeの設定

7. 既知の問題点

7.1 PCがスリープしている状態からの復帰

キーを押してもスリープが解除しません。マウスなどで復帰させます。

7.2 長時間PCをスリープさせた場合

スリープ状態で数時間放置した場合、ログイン画面でキーボードが反応しなくなる現象がありました。スリープ中にKB611を定期的にリセットすることで無反応の症状はなくなりましたが、原因はわかっていません。

8. 情報元


いいなと思ったら応援しよう!