■
キーボード変換機を自作する
自作キーボードは材料の仕入れを行ったものの、作業は停滞中。 PS/2-USB変換機をArduinoで実装するための実験を色々やっています。
PS/2-USB変換機なんて、300円位で入手できるものなのだから、本来はそれを使えばいいんだけど、 普通の変換機は普通のPS/2キーボードを変換するためのもので、特殊なキーボードではうまく行かない。 普通のPS/2キーボードというのはいわゆる「OADG106/109キーボード」か「US 101キーボード」を指します。 キーボードが出力するコード(スキャンコード)はコードセット2が使われます。このコードセットが 変換機を通ると、USB HIDデバイスクラスのUsage IDに変換され、PCに転送されます。
なので、PS/2-USB変換機はPS/2キーボードは「スキャンコードセット2」が前提なので、それ以外のコードセット では変換が出来ない、という事になります。実際に、変換できないコードはブランクキーとなり、何も入力が 出来ません。
じゃあ、その特殊なキーボードというのは何かというと・・・
これは見る人が見ればすぐに分かりますが、上がIBM 5576-002、下が5576-001です。両方とも同じスキャンコードセット なのですが、何かという情報がナカナカ無かったため、入手してから暫くは不明でした。 しかし、下記の方のページから、スキャンコードセットが「0x82」である事が分かりました。
当然、標準の「2」では無く「0x82」なので、ブランクキーが複数ある状態だし、日本語キーボードとして入力できない 文字があるため、普通に使用できないという事になります。
ネットを検索してみると、有志による変換機の作成記事や同人ハードウェアとして販売されていたりと、手段が無いわけでは 無いのですが、一方で、PS/2の仕様そのものは単純なシリアル通信であるため、Arduinoを使えばシリアル変換は可能じゃないかと 考えました。
これが、泥沼の始まりなんですが・・・
スキャンコードセット82hのコード表なんぞどこを探しても見当たらない、このページを見る限り、 かなり特殊なコードを使っているみたいです。0x80以上の値は8bitコードになるため、そのままのコードとは考えづらいです。 これは直接スキャンコードをダンプしてみるしかない、と、 Arduinoにキーコードをダンプさせてみました。
#include <stdio.h> #include "ps2.h" #include <Keyboard.h> // 中略 void loop() { char buf[24]; unsigned char code,code2,code3; int i = 1; Serial.print(i,DEC); Serial.print(" "); i++; for ( ; ; ) { code = kbd.read(); if(code == 0x5a){ Serial.println(""); Serial.print(i,DEC); Serial.print(" "); kbd.read(); kbd.read(); i++; } else { Serial.print(code, HEX); Serial.print(","); } } }
ArduinoにはPS/2の通信ライブラリがあるため、割と簡単にダンプを出せました。 で、ダンプ結果を見てみると、やっぱり、0x80以上のコードはF7だけで、後はE0が追加されています。 実際にコードセット2の出力コードとほぼ一緒で、一部無効キーはコードセット2には無いということが分かりました。
で、どうするかというと、自作キーボード作成の際にお世話になっているqmk_firmwareの派生プロジェクトとして、 tmk keyboard というプロジェクトがあり、これをベースにキーコードを変換すれば使えるんじゃないかと、算段をつけて コードを見てみました・・・が、一筋縄では行かなそう。