レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

ハッピーハッキングキーボード(PS/2→USB)を(PS/2→PS/2)に変更する

2018年12月01日 | 電子工作

以前、PS/2インターフェイスの英語キーボードHappy Hacking Keyboard Lite(以後HHKB)をArduinoに接続してUSBキーボードにしましたが、いくつか問題がありました。

  1. PCの起動直後はキーボードとして認識されずBIOSの設定が出来ない。
  2. Ubuntuでは問題ないが、Windowsを起動した直後はキーボードが正しく認識されておらず、Arduinoのリセットを行わないとキーボードが使用できない。


1.のBIOS設定はめったに行わないので大きな問題ではないのですが、いざ必要というときにわざわざ別のキーボードをつなぐのはちょっと面倒です。
2.についてですが、Windows10使用時にうっかりリセットを忘れたままエクスプローラーを起動してキーボードを使ってしまうと、何故かコントロールキーを押した状態になってしまい、マウスのクリック操作がまともに行えなくなってしまいます。この状態になるとArduinoのリセットでは復旧できず、コントロールキーを押しながらのマウスクリックを適当に何度も繰り返しながらゴチャゴチャ操作しないと正常に戻りません。これがとっても煩わしく不便です。

この問題を回避する方法を探っていたのですが、良い方法は見つかりませんでした。
仕方がないので最終手段として、現在HHKBとPCをUSBで接続しているところをPS/2接続に変更してみることにしました。PS/2なら多分PC起動時からキーボードとして認識されると思ったからです。

そこでまずは既存のライブラリで使えそうなものを探してみたのですが、PS/2からPS/2に変換するようなArduinoのライブラリは見つかりません。PS/2キーボードをArduinoにつなぐためのライブラリとArduinoをPS/2デバイスに見せかけてPCにつなぐためのものはあったのですが、これらを組み合わせて利用するには無駄な処理が多すぎました。

そこでスケッチを自作することにしたのですが、これが思った以上に大変でした。
PS/2キーボードとの通信手順については様々なサイトで解説してくれていましたが、それぞれ手順やタイミングの記述が微妙に異なっていて、どれを参考にしたらいいのか迷いました。結局このサイトの情報をベースにして、他のサイトの内容も確認しながら試行錯誤でプログラミングすることとなりました。

前回同様、いきなりHHKB向けのスケッチを作るのは大変なので、まずはキーボード←→Arduino←→PC間でデータ通信を行うだけのスケッチを作成しました。

PS2Skeleton.ino

手持ちのPS/2日本語キーボードをこのスケッチを書き込んだArduino経由でPCにつないでみたところ、PC起動時からキーボードとして認識されBIOSの設定が可能になり、Windowsでも起動直後からキーボードを使用することが出来るようになりました。

このスケッチはキーボードのCaps Lockを左Ctrlキーにするだけのものです。スケッチ内のキー変換部分を書き換えれは好きなようにキーボードをカスタマイズすることが出来ます。
キーボードのスキャンコードはこちらを参考にするといいでしょう。通常、使用するのはScan Code2です。

配線は以下のようになります。(PS/2のコネクタについては上記サイトかこちらで)

キーボード側(PS/2メス) → Arduino Pin
1 - 6 Pin
3 - GND
4 - VCC
5 - 7 Pin

PC側(PS/2オス)→ Arduino Pin
1 - 8 Pin
3 - GND
4 - VCC
5 - 9 Pin



キーボード側で使用する7Pinだけは割り込み処理で利用するので変更しないでください。

PS/2はシリアル通信になっていて、キーボードとArduino間の通信で使用するクロックはキーボード側が生成します。そこでキーボード側のクロックタイミングに合わせてデータを取得するため、ArduinoはクロックがLOW(HIGHでクロックなしLOWでクロックありです)になったら割り込みを発生させてデータを取り込みます。
逆にArduinoとPC間はArduinoがキーボードとして振る舞うので、クロックを生成するのはArduino側です。そのため通信のタイミング制御はソフトウェアだけで行っています。手元のPCではうまく動作しているようですが、もしかすると使用するPCによってはタイミングが合わず動作しないかもしれません。

また、エラー処理もほとんど行っていません。動作がおかしくなったら、大抵の場合Arduinoのリセットで復旧するので面倒なエラーリカバリーは省きました。(手抜きとも言う...)

ところで今回、スケッチ書き込み後はArduinoがUSBを使用することがありません。つまりArduino LeonardoやPro Microでなくてもいいはずです。

そこでこれを購入してみました。



HiLetgoのArduino Pro Mini互換機です。Amazonで三個入り¥1,000でした。安いですねぇ。
書き込み装置が内蔵されていないので別途書き込み装置を購入する必要があるのですが、Leonardoなどからスケッチ書き込みが出来るので購入しませんでした。


こんな感じです。

上記スケッチでは7ピン(INT6)の外部割り込みを使っているのですが、Pro Miniには2ピン(INT0)、3ピン(INT1)しか割り込みがありません。しかたがないので割り込みピンを変更して動作確認したところ、キー入力時のデータの取りこぼしが頻繁に発生してしまいました。
念の為にPro MicroでINT0やINT1を使用してみたところ、まったく同じだったのでPro Mini固有の問題というわけではないようですが、う~ん残念。INT6と何が違うのかまだ調べていませんが、とりあえずHHKB用のスケッチ作成を優先したいのでPro Miniの利用は見送りです。

さて、気を取り直してHHKB用のスケッチ作成と行きたいところですが、まだ長くなりそうなのでそれは次回で。



最新の画像もっと見る

コメントを投稿