かつてキーボード・マウスのインターフェイスがPS/2からUSBに変わりつつある頃、PS/2→USB変換ケーブルなるものが販売されていました。こういうものです。
エレコムのPS/2→USB変換ケーブル USB-P2KM
長いこと利用することもなくほったらかしになっていましたが、先日別のケーブルを探している時にこの変換ケーブルが出てきました。その時にふとAVRのUSB接続に利用できるのではと思いついたのです。
PS/2インターフェイスはシリアル通信ですので、AVRと簡単に接続できます。PS/2→USB変換ケーブルを利用すれば、USBに直に接続できないAVRをUSBキーボードやマウスに出来るはずです。
そこでまずはこの変換ケーブルがどのような動きをするのか、Pro MiniにPS/2オスコネクターをつけキーボードに仕立てて確認してみました。キーコードや色々なコマンドを送ってみたところ、キーコードはそのままPCに送られ、コマンドは送っても何も帰ってきませんでした。
ただ、キーを連続して入力し続けているとたまに取りこぼしているように見えることがあり、その時に0xECというPS/2では未定義のコードが送られてきました。この変換ケーブル独自のエラーコードなのでしょうか。でもそのままキー入力を続けると、ちゃんとPCにキーコードを送り続けてくれるので、このコードは無視してもなんの問題もないようです。
どうやら変換ケーブルに一方的にキーコードのみ送れば、後のPCとのやり取りは勝手に行ってくれるようです。これならAVRを簡単にキーボードに出来そうです。使い道のないジャンク品だと思っていたケーブルが、まさにお宝デバイスだったわけです。
スケッチもシンプルな物に出来そうなので、フラッシュメモリの少ないATtiny13Aからでも使える可能性があります。早速、PS/2のオスコネクタとキーボードのキーに見立てたタクトスイッチ2個をATtiny13Aにつなげてテストしてみました。
結果、上手く動作しました。タクトスイッチを押すと割り当てておいた文字がきちんと入力されました。
ただし、問題もあります。タクトスイッチのオンオフに合わせてキーコードのオンオフを送ってみたところ、キーを押しっぱなしにしてキーリピートさせると、リピートが途中で停止してしまうのです。リピートされる文字数もその時々で変化し、まったく安定動作しませんでした。キーコード送信時のタイミングに問題があるのかもしれません。
今回使用したスケッチは以前にハッピーハッキングキーボード向けに作成したものがベースになっていたので、試しにこちらのPS/2ライブラリでも試してみましたがまったく同じでした。
データ送信のタイミングを色々調整してみましたが、上手く行きませんでした。仕方がないのでキーリピートはATtiny13A側で行うようにようにしたところ、とりあえずキーボードっぽく動きました。
このときのスケッチがこちらです。
ATtiny13KeyboardDevice.ino
使用したArduino IDE用のモジュールはbitDuino13です。
ピンアサインは以下のようにしました。
ATtiny13A → PS/2オスコネクタ
ピン3 → 1DATA
GND → 3GND
VCC → 4VCC
ピン4 → 5CLK
タクトスイッチにはピン0と1をつなげました。
キーリピート開始までのタイミングはタイマーなどは使わずに適当に決めています。必要に応じて#define TIMERの値で調整して下さい。
PS/2は電源を除いて2つのピンしか使用しません。なのでATtiny13Aではまだ3つのピンが利用できます。3つあれば色々なデバイスをつなげられそうです。なにか使えそうなデバイスを身の回りで探してみたところ、ありました。ファミコンのコントローラーです。電源除いて3ピンしか使わないので、今回の用途にぴったりです。
早速ATtiny13Aにつないでみました。
上下左右をテンキーの2468に各ボタンをx、z、スペース、Enterに割り当てたところ、キーボードとしては上手く動作しました。このキー割り当てにしたのはPC-8801のエミュレーターのゲームで使ってみたかったからです。実際にエミュレーターで使用すると、キーのオンオフとリピート間隔が実際のキーボードと違うためか、アクションゲームでキャラクターをスムーズに動かすことが出来ません。タイミングを調整すればなんとかなるのかもしれませんが、面倒くさいのでやめました。
このときのスケッチは次のようになります。
ATtiny13NESPad.ino
ピンアサインは次の通りです。
ATtiny13A → PS/2オスコネクタ
同上
ATtiny13A → NESコントローラー
ピン0 → 2DATA
ピン1 → 3LATCH
ピン2 → 4CLOCK
VCC → 6VCC
GND → 8GND
実用性はともかく、ATtiny13Aでここまで出来るのは素晴らしいですね。キーリピートの処理などを削れば使用メモリを減らせるので、もう少し複雑なことも出来そうです。
この変換ケーブルにはPS/2マウスも繋げるのですが、こちらはデータ投げっばなしとはいかないようです。そのうち必要になったら調べてみましょう。
※コメント投稿者のブログIDはブログ作成者のみに通知されます