前回USBキーボードにしたポケコンPC-E200ですが、Ubuntu環境のg800エミュレータでは使い物にならず残念な結果に終わりました。Windows10環境では使えましたが、普段エミュレータを動かしているのはUbuntu環境なのでなんとかしたいところです。
そこで今度はE200をPS/2キーボードにしてみます。PS/2ならシリアル通信ですので、PIC16F874Aを直接PCのPS/2インターフェースにつなげます。使用する部品はPS/2のコネクタです。普通はキーボード側がオスコネクタになるのですが、前に秋月電子で購入したPS/2メスコネクタのミニDINコネクタピッチ変換キット(AE-MiniDIN-6)が幾つもあるのでこれを使いました。そのため接続には両端がオスコネクタのPS/2ケーブルが必要なので、古くて使わなくなったPS/2マウスのケーブルを加工しました。
ミニDINコネクタをポケコンの拡張基板にハンダ付けして、PS/2コネクタの1番(DATA)をPICのRA1に、5番(CLOCK)をPICのRB0に、VCC・GNDもつなぎました。
プログラムですが、PS/2キーボードにはPCからコマンドが送られてくるのでそれを処理する必要があります。PCからのコマンドの数や種類はBIOSやOSなどによって多少異なってくるので、事前に確認しておいたほうがコーディングが楽です。
そこで、PS/2キーボードとPC間の通信データを拾うスケッチを書いてみました。デバイスにはArduino ProMiniを使いましたが、他のArduinoに実装するのは簡単でしょう。
配線は以下の通り。
キーボード ⇔ ProMini
1 DATA ⇔ 4
3 GND ⇔ GND
4 VCC ⇔ VCC
5 CLK ⇔ 2
PC ⇔ ProMini
1 DATA ⇔ 8
3 GND ⇔ GND
4 VCC ⇔ VCC
5 CLK ⇔ 7
PS/2のシリアル通信はPCの電源投入直後から始まるのでデータはメモリ上に保存しておき、OS起動後にF1キーを押したらシリアル端子(USART)からデータを吐き出す仕組みにしました。そのためProMiniのシリアル端子をPCのシリアルターミナル等につなぐ必要もあります。
スケッチはこちらになります。
ProMiniPS2Monitor.ino
市販のPS/2キーボードとProMini、ProMiniとPCをPS/2ケーブルでつなぎ、USART端子もPCにつないでPCの電源を入れるとPC・キーボード間でやり取りしたデータがProMiniのメモリに保存されます。大抵は数十バイトのメモリしか使わないでしょうが、エラーが発生したときに大量のやり取りが起こることがあるかもしれないので256バイトのメモリを確保しました。
OS(Ubuntuでしか試していませんが)が起動したら、シリアルターミナルを起動してF1キーを押します。するとメモリ上のデータを整形して出力します。
(最後のK:05はF1キーを押したときのキーコードです。)
出力データのP:XXはPCが出力したデータ、K:XXはキーボードが出力したデータです。データがないところは00のみ表示されています。
このデータを見ればPCから送られてくるコマンドが分かりますので、これらを処理するプログラムを書けばいいことになります。
このスケッチではPCからのデータとキーボードからのデータをポーリングで処理しているので(接続ピンの入出力を頻繁に切り替える必要があるので割り込みを使うのはややこしい)、転送タイミングがシビアで環境によってはデータを取りこぼすかもしれません。
これで処理すべきコマンドも分かったのでPICのプログラムを作成します。前回と違って、今回はキーリリースのコードも出力します。したがってSHIFTキーやキーリピートにも対応できます。
ただ、USBのコードは1バイトで済みましたがPS/2のコードは1バイトから4バイト(キーリリースのときは更に1または2バイト増える)なので、キーコードの出力処理はちょっと複雑になっています。
それと前回のDigisparkのキーボードライブラリは英語でしたが、今回は日本語キーボードのコードを出力します。
作成したプログラムはこちらになります。
newmain.c
g800エミュレータではポケコンのCAPSをPCのCapsLockに割り当てているので、キーを押したときにPCからLEDの点灯要求のコマンドが送られてきます。点灯させるLEDは無いのですが、アクノリッジは返す必要があります。
ところが、PCからのコマンド処理とE200のキーボードマトリックスのスキャンをポーリングで行うと、マトリックスの端子数が多くてPCのコマンドにすばやく答えることが出来ず(20ms以内に応答が必要という情報もあった)通信が途絶えてしまいます。(手持ちのPCではしばらく待つと通信が再開されるようになっていました)
そこで、このプログラムではマトリックスのスキャンを10ms間隔のタイマー割り込みで行うダイナミックスキャン方式にして、バックグラウンドで処理しています。これによりPCのコマンドにちゃんと応答できるようになりました。
完成したプログラムをPICに書き込んでE200キーボードをターミナルやテキストエディタで試してみたところ、レスポンスも良く普通のキーボードと全く同じように使用できました。
そこで早速、ポケコンエミュレータg800を起動してキー入力してみると何の問題もなく使えました。キー入力のレスポンスも良く、普通にポケコンを使っているような感覚です。SHIFTキーと他のキーの組み合わせも問題ありません。シューティングゲームもちゃんと遊べました。
今回は日本語キーボードのコードを出力するので、g800configファイルのkeyboardをjpにする必要があります。
それから、USBのときと同様にSHIFTキーとの組み合わせで入力出来ないキーもありますが、2ndFを使えば入力出来たので特に対処しなくてもよさそうです。
とにかく、Ubuntu環境のg800でE200キーボードが利用できるようになって満足です。楽しくてしばらく遊んでしまいました。
ひとつ問題なのがPS/2インターフェースにしてしまったので、普段使っているキーボードと同時に使えないことです。プログラム作成中とかにg800を起動しておいて、16進数演算とか電子回路の抵抗値計算とかに使えたらいいなと思ったのですが、いまのままだと使い慣れたキーボードでなく別のUSBキーボードを併用するしかありません。いつもの環境で利用するには、やっぱり最終的にUSBキーボードにするしかないようです。
そこで対策として思いついたことがあります。上手くいくか分かりませんが、次回試してみたいと思います。
最新の画像[もっと見る]
- M5Core2+ArduinoフレームワークでもLVGLを使う 17時間前
- M5Core2+ArduinoフレームワークでもLVGLを使う 17時間前
- M5Core2+ArduinoフレームワークでもLVGLを使う 17時間前
- M5Core2+ArduinoフレームワークでもLVGLを使う 17時間前
- M5Core2+ArduinoフレームワークでもLVGLを使う 17時間前
- M5Core2+ArduinoフレームワークでもLVGLを使う 17時間前
- M5Core2+ArduinoフレームワークでもLVGLを使う 17時間前
- ラスベリーパイのベアメタル環境でLVGLを使う 1週間前
- ラスベリーパイのベアメタル環境でLVGLを使う 1週間前
- ラスベリーパイのベアメタル環境でLVGLを使う 1週間前
※コメント投稿者のブログIDはブログ作成者のみに通知されます