Arduino STM32 USARTを使ってPC-9801でPS/2キーボードを使う(+テンキーをスーファミのコントローラーで操作)


今PC-9801FXで使っているキーボードは他人様の回路を使ったPS/2キーボード変換機です。
いつものように基板むき出しで脆弱なのと、母親ならポテトサラダ、いやエンジニアなら変換機ぐらい作ったらどうだ、ということでSTM32を使って自作してみます。

X68000の時ではdelay関数でタイミングを調整しましたが、STM32にはUSART機能があるのでこれを使えば調歩同期式のキーボードでdelayによるウェイトを入れなくても良くなります。
ところが、ここで問題発生。
PC-9801などはキーボードが非同期式ですが、PS/2キーボードは同期式です。
しかし、Arduino STM32は非同期式のUSARTには対応しているのですが、同期式のUSARTには対応していませんでした。
※純正STM32のHALライブラリなら同期式のUSARTに対応しています。

まあ悩んでいても仕方がないので、まずはUSARTを使わずにdelay関数で動作するか確認してみます。

はい、サクッと作りました。
19200bpsなのでちょっと通信速度が厳しいのですが、何とか文字が出ました。
ついでに、いつものようにテンキーをスーファミのコントローラーで操作できるようにしました。
これがなかなか大変で、待ち行列を用意してボタン入力をさばいています。

delay関数ではうまくいったので、次はPC-9801へのキーデータ送信の調歩同期をSTM32のUSARTでやってみます。

ところが、どうやってもうまく行きません。
色々調べてみた結果、TX1/RX1はPA9/PA10の他、PB6/PB7も重複して使っているようです。
PB6~PB9は5Vトレラントで扱いやすいので真っ先に割り当てるピンなのですが、まさかシリアル通信で使っているとは。
とりあえずPB6/PB7を使わないように別のピンにすることで、無事USARTでもキーボード入力&コントローラー操作できました。

あとはオートリピートなのですが、どうやっても何文字か打つと暴走するので結局諦めました。
...と思ったら、PS/2キーボード側でやってくれるので、結局コンバータ側では不要でした。

それでは、PB6/PB7問題とオートリピート問題で無駄が時間を使ってしまいましたが動作確認を行います。

キーボード入力は問題ありません。
次はスーファミのコントローラーですが、これも問題ありません。
まるでジョイスティックポートに繋いだかのごとく、スーファミのコントローラーで操作できます。
本当にキーボード操作を代理入力しているとは思えません。

最後にPC-9801で最も激しい某シューティングをプレイしてみます。
これで完全に操作できれば成功です。

...
あ~駄目ですね。
30秒ほど操作するとBreakを取りこぼすのか、勝手に進んでしまうことがあります(何回か操作すると戻る)。
これはシューティングでは致命的です。
もしかすると私の実装が悪いのかもしれないので、今度はUSARTを無効にして元のdelay関数で操作してみます。

...
お~! 完璧に操作できます。
まるでジョイスティックポートで操作しているみたいにレスポンスも良く、入力の取りこぼしもありません。

これはちょっとSTM32のUSARTには問題がありますね。
やはり中華STM32のせいなのか?
それとも私の実装が悪いのか?
Arduino STM32 Mapleライブラリの問題か?

とりあえず、PC-9801のPS/2キーボードコンバータ、およびテンキーをスーファミのコントローラーで操作するという目的は達成したので終了です。
















戻る