2012-02-04

最新版Quckey2はこちら

概要

キーボードのプロパティ遠い昔、いにしえのPC-9800シリーズが日本を席巻していた頃、jfkeyというプログラム(手前味噌^^;)がありました。これはキーボードの操作性を細かくカスタマイズするデバイスドライバで、その目玉機能としてキーのオートリピートを高速化することができました。時は過ぎ、PC/AT(互換機)の時代になりましたが、いろいろ面倒くさいPS/2キーボードの仕様に圧倒され(ちょっと誇張)、BIOSを乗っ取って実装するだけの技量を欠いており、さらには、Windows時代の到来についていけず、VxDの学習もままならず、PC/AT版jfkeyを作ることはできませんでした。それでもやはり、キーリピート速度の高速化の野望は持ち続けていました。今となっては、DOS/Win95系/WinNT系/Linux/BSD/Solaris等々OSの選択肢も多岐にわたり、ソフトウェアで実現するには無理な状況になってしまいました。そこで、ワンチップマイコンを使ってハードウェアキーボードアクセラレータを作ることにしました。

言うまでもないかもしれませんが、オートリピートについて一応おさらいしておきます。キーを押しっぱなしにして少し待つと、その文字が連続して入力される仕組みです。IBM用語で「タイプマチック」とも呼ばれます。オートリピートの速度は、Windowsではコントロールパネルのキーボードのプロパティで設定できます。Linuxならkbdrateコマンドで設定できます。

リピート速度を決定する値にはディレイレートがあります。ディレイは1文字目が入力されてから2文字目が入力されるまでの待ち時間で、単位はms(ミリ秒)です。250msから1000msの範囲で4段階で指定します。レートは2文字目以降が入力される速度で、単位はcps(毎秒n文字)です。2cpsから30cpsの範囲で32段階で指定します。PC-9800シリーズでは、ディレイは500msレートは25cpsに固定されており、設定を変更することはできません。

PC互換機のキーボードにおける最高速設定にしても250ms/30cpsしかありません。PC-9800の標準より速いとはいえ、私個人的には超高速リピートが好きなので、200ms/75cpsくらいが理想ですので、まだまだもの足りません。今回制作したQuckey!はPC本体とキーボードを仲介し、キーボードが生成したオートリピートを無視し、Quckey!が内部でリピート処理を行います。

概要

IBM 5576-002 → 106キーボードエミュレーション機能

Quckey!のハードウェアキーボードアクセラレータの特性を生かして、もう一つの目玉機能として、「IBM 5576-002 → 106キーボードエミュレーション」があります。詳しくはこちらをお読みください。

設計

マイコンは日立H8/3664を使用します。その他、主な部品は、ミニDIN6ピンコネクタ、キーボード延長ケーブル(のオス側)、NPNトランジスタ4個、抵抗4.7kΩ8本、発光ダイオード(お好み)、470Ωなどです。

回路図

制作

H8/3664

H8/3664キットを組み立てます。と言っても、基板は完成品ですので、ピンヘッダをハンダ付けするだけです。親基板には裏返して装着しますので、ピンヘッダは部品面に取り付けます。

h8/3664

基板

親基板の加工は少し面倒です。ケースにあわせて不要な部分をハンドニブラで切除します。キーボードコネクタの取り付け穴は電動ルータやダイヤモンドヤスリを使いました。

baseboard

配線

配線図 (PDF)
(Revision 2)

ちなみに古い設計は参考までにこちらに置いてあります。rev.1とrev.2の違いは、配線を見直して、ウレタン線の使用を極力減らしたことです。rev.2の方が、ほとんどの部分を錫メッキ線だけで配線できます。また、rev.2ではリセットスイッチを省略しました。

topbottom

ケーブルはナイロン結束バンドで基板にしっかり固定します。

ps2wire

transistor

ケーブル

ケーブルの基板用コネクタはシングルラインICソケットにハンダを流し込んで作った、お手軽コネクタです。

connectorケーブルの末端処理

ケースの板厚が3mmもあるので、これにぴったり合うゴムブッシュが入手困難かもしれません。2010/01現在、千石電商で入手できます。

bush

ケース

タカチ電気工業製のSS-90(SS-N90)がちょうどいい大きさです。

ss-90case

完成例

組み上がった様子です。

internal

ファームウェア

quckey.zip (2010-01-10)

旧バージョン

quckey/quckey.motというファイルがコンパイル済みファームウェアです。これをH8/3664に書き込んでください。改造する場合には再コンパイルのためにh8300-hms-gcc一式が必要となります。同梱のMakefileはDebian GNU/Linuxでコンパイルする場合しか考慮していませんので、それ以外では修正が必要だと思います。Debianなら binutils-h8300-hms と gcc-h8300-hms と、関連パッケージをインストールしておけばコンパイルできると思います。

開発環境はLinuxを使用します。コンパイルと書き込みに使う開発用PCのほかに、書き込み中に電源を供給するため、PS/2コネクタを有したPCが必要です。1台しか無い場合は別途電源を用意する必要があります。

serialfirmware

ファームウェアの書き込み時に、ジャンパピンをショートするのを忘れずに。書き込み終わったら、ジャンパピンを外すのを忘れずに。

参考:LinuxでH8開発に関する情報

解説

初めて使うと、猛烈な違和感を感じると思いますが、1~2時間も使っているうちに、これ無くては生きていけない体質になってしまいます。とても中毒性が高いので、自宅用と会社用の2台を作らざるを得なくなります。それが嫌ならこんなものはに手を出すべきではありません。(笑)

とりあえず現バージョンのファームウェアでは、ディレイ200msレート77cps固定になっています。ファームウェアを再コンパイルして書き込まない限り、リピート速度を変更することはできません。コントロールパネル等で設定した値を(例えば)3倍するなどして、ホストPCから24cpsにするという要求を受け取ったとき72cpsで処理するといった方法も考えましたが、しばらく使ってみた結果、速度を可変にする必要を感じないという結論に達しました。

活線挿抜も何とか動いているようですが、たまに動かなくなることもあります。こればかりは本物のキーボードでも時々動かなくなることがあるので、仕方ないのかもしれません。

それにしてもPS/2インターフェース。どんな歴史的事情があったのか知りませんが、過剰にインテリジェント化されていて面倒臭すぎます。可変長スキャンコードのデコードやエンコード、制御コマンドのハンドリングなど。まぁ、適当に手を抜く実装はできるんですが、少しでも本物のキーボードの動きに近づけたいと思ったので、プログラムやテーブルが長めになってしまいました。クロック線とデータ線で半二重通信する方式も、賢いと言えば賢いのかもしれないけど、PC-9800やSunのように調歩同期式シリアル通信のほうが制御は簡単です。これではマザーボードやBIOSやキーボードの相性問題が発生しそうな予感がします。実際にキーボードやマウスの切り替え機で問題を抱えたものが結構あるようで、開発者の皆さん苦労しているのかもしれません。過去の遺物との互換性を保つのも大変です。