FLATSTONE's Blog

ギター好き中年のモノローグ

キーボード変換機を自作する

自作キーボードは材料の仕入れを行ったものの、作業は停滞中。 PS/2-USB変換機をArduinoで実装するための実験を色々やっています。

f:id:hellslonghorn:20190322234707j:plain

PS/2-USB変換機なんて、300円位で入手できるものなのだから、本来はそれを使えばいいんだけど、 普通の変換機は普通のPS/2キーボードを変換するためのもので、特殊なキーボードではうまく行かない。 普通のPS/2キーボードというのはいわゆる「OADG106/109キーボード」か「US 101キーボード」を指します。 キーボードが出力するコード(スキャンコード)はコードセット2が使われます。このコードセットが 変換機を通ると、USB HIDデバイスクラスのUsage IDに変換され、PCに転送されます。

なので、PS/2-USB変換機はPS/2キーボードは「スキャンコードセット2」が前提なので、それ以外のコードセット では変換が出来ない、という事になります。実際に、変換できないコードはブランクキーとなり、何も入力が 出来ません。

じゃあ、その特殊なキーボードというのは何かというと・・・

f:id:hellslonghorn:20190322234713j:plain

これは見る人が見ればすぐに分かりますが、上が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 というプロジェクトがあり、これをベースにキーコードを変換すれば使えるんじゃないかと、算段をつけて コードを見てみました・・・が、一筋縄では行かなそう。