ArduinoをPS/2キーボードとして振る舞わせる

Arduino (Pro Mini) からPS/2キーボードの信号を送り、PCにキー入力ができないかやってみました。

PS/2端子

キーボードやマウス用の端子であるPS/2端子。今時は搭載していないPCも多いですが、例えばASRockのマザーボードには今でも搭載されているようです。ゲーム用に多数のキーを同時押しできるロールオーバー対応するためでしょうか。ただし、キーボード・マウスにそれぞれ独立の端子ではなく一体となっているタイプで、2つ繋ぐならY字型のスプリッタケーブルで分離して繋ぐようになっています。


ピン配置はこんな感じ。元々のPS/2では2, 6ピンは未接続のピンでしたが、一体型ではここにClockとDataをもう一系統割り当てています。



1 Keyboard Data
2 Mouse Data
3 GND
4 +5V
5 Keyboard Clock
6 Mouse Clock

Arduino Pro Miniとの接続

今回はキーボードとして接続するので、PS/2の1, 3, 4, 5ピンと接続します。(写真だと電源はシリアルアダプタから取っているため4ピンは未接続)
Arduino側は GPIO 2ピンをData, GPIO 3ピンをClockに接続。


プログラム

ArduinoPS/2エミュレーションをするライブラリとしてps2devというものがあります。
ライブラリマネージャで見つかるものはキーボードのサンプルもなく、色々組んでみてもタイミング等の相性が厳しくうまく動作しませんでした。
これを拡張してキーボード用の各種機能を実装したライブラリとして、下記が公開されています。今回はこれを使用しました。
github.com

ライブラリをダウンロードして~/Documents/Arduino/libraries/ に導入すると、Arduino IDE内にサンプルスケッチとして ps2dev > ps2_keyboard が現れます。
これをArduino Pro Miniに書き込み、PCに接続した状態で再起動すると、 1秒ごとに「1」が入力されるようになりました。
キー入力自体は

  keyboard.keyboard_mkbrk(PS2dev::ONE);  // 数字の1

と書けば、指定キーを押下後、直ちに離したことになります。簡単ですね。
対応しているキーの一覧はヘッダファイルにあります。
あとは、プログラム次第でシリアルやボタン、タイマー等でタイミングを決めて好きなキーを入力できるようにすればOKです。


(実は今回の目論見としては、今のPCではUltra Fast Bootモードにしていると電源投入時にUSBキーボード等のデバイスが初期化されずにOS起動に入ってしまうのでキー押下でUEFIメニューに入ることができないところ、PS/2接続なら入れるのではと思ったのがきっかけでした。が、PS/2接続でもどんなに素早くキー押下してもOS起動前には反応してくれず、結局諦めることとなりました。残念。)