レトロでハードな物語

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

PC-9821Cr13にテンキーをつなげる

2018年12月13日 | 電子工作

前回までのArduinoを使ったPS/2のキーボード接続で、シリアル通信によるデバイス接続にだいぶ慣れてきました。そこで以前からどうしても試してみたかったことを実行してみることに。

それはこのPC-9821Cr13にテンキーをつなぐことです。


(詳しいスペックはこちらで)

この手持ちのPC98は液晶画面のバックライトが点かなかったり、ハードディスクとCD-ROMも故障したためIDEのものと交換したり、動作不安定になるので余計な拡張ボードも取り外したりとほぼジャンク品寸前のものです。でも幸いなことに外部モニター端子が付いているので、手持ちの古いけど24kHz対応の液晶モニターで利用することができていますし、OSもMS-DOSにダウングレードしたことで安定動作するようになったので今だに現役で使用できています。

このPC98はレトロゲームで利用することが多いのですが、そのとき問題になるのがテンキーなんです。見ての通りこの機種にはテンキーがありません。DOSの初期の頃やそれ以前のBASIC時代のゲームではテンキーの利用は当たり前なので、これは致命的です。
まぁ、エミュレーターでも遊ぶことはできるのですが、画面描画のスムーズさは(あたりまえですが)実機の方が良いので出来れば実機を使いたいのです。

この機種には一応Num Lockが付いています。でもキーピッチが狭く、ゲームで使うには指の置き場所が今ひとつしっくりきません。また、昔挫折して再チャレンジしたいマイト・アンド・マジックでは一部のコマンドがNum Lockで使えなくなってしまい、必要なときに一々Num Lockを外す操作が面倒すぎていまだにチャレンジ出来ていません。そんな訳でいつかArduinoでテンキーをつなげようという野望を抱いていました。

このキーボードの右側面にはテンキー接続のコネクタがあります。Arduinoでの電子工作の経験を積んだ今ならなんとかテンキーを接続出来そうな気がします。

キーボードに関して必要な情報はPC-9801の古いテクニカル本で確認できました。ただキーボードにつなぐテンキーの情報はなかったので、キーボードと同等に扱えるのかは不明でした。さすがにネットにも技術的な情報はなく、当然Arduinoによる接続事例も見つかりませんでした。

ということでやってみなければ分からないという状態でのスタートです。

まずは接続のためにミニDIN-8のオスコネクタが必要ですが、これはいつものようにハードオフでケーブルを調達し分解・配線して作りました。



次に接続するテンキーですが、とりあえず昔投稿したこれを使います。使用するArduinoはPro Microです。

必要なものがそろったのでスケッチの作成を開始したのですが、キーボードの技術情報を確認しながらArduinoとPC98キーボード間でシリアル通信を行おうとしてもまったく動作しません。何が問題なのかまったくわからないまま、手当り次第色々な処理をスケッチに書き込んでみたところでなにも起こりません。

しばらくはお手上げ状態でしたが、何かの拍子に突然PC98に文字が入力出来るようになりました。ただし文字化けしていましたが。
シリアル通信で送信ビットの取りこぼしが起きているようなので、あとはどこで問題が発生しているのか見つけるだけなのですが、これが思ったより大変でさらに試行錯誤の状態が続きました。

そんなこんなで苦労はしましたが最終的にはなんとか完成にたどり着くことが出来ました。
出来上がったスケッチはこちらです。

PC98TenkeyMatrix.ino

ただしこのスケッチは独自にカスタマイズしたテンキー専用なので、汎用的なものではありません。


そこで別のテンキーをつないでみることにしました。



エレコムのテンキーです。インターフェイスがPS/2となっている珍しいものですが、何故かハードオフのジャンク品売り場に幾つもありました。税込み¥108でした。

このテンキーをつなぐためのスケッチはこちらです。

PC98TenkeyPS2.ino

PS/2接続なのでこのテンキーだけでなく、普通のPS/2のフルキーボードをつないでもテンキー入力ができます。(テンキー以外のキー入力は面倒なので実装していません)

接続ピンは以下のようになります。

PC98テンキーコネクタ(ミニDIN-8) → Arduino Pro Microピン

1 RST → 4
2 GND → GND
3 RDY → 5
4 RXD → 1 (TX ハードウェアシリアル)
5 RTY → 6
8 +5V → VCC

PS/2コネクタ → Arduino Pro Microピン

1 DATA → 8
3 GND  → GND
4 VCC  → VCC
5 CLK  → 2 (割り込みに使用)

Arduinoの1ピンはハードウェアによるシリアル通信で利用するので変更しないで下さい。今回、ハードウェアシリアル通信を使用することでPC98キーボードとの通信が非常にシンプルなものとなりました。ただし、LeonardoやPro Microではスケッチ書き込みに利用するUSBシリアルでもハードウェアシリアルを利用しているので、このスケッチを書き込んだ後はUSB接続後(またはリセット後)8秒以内にスケッチ書き込みを開始しないとうまく書き込めなくなると思います。

それとArduinoの2ピンは割り込み制御に使用するので、変更する際は割り込み機能のあるピンを選択して下さい。ここで2ピンを使用したのは、後でPro Miniで利用することを考え互換性を持たせるためです。

このスケッチはPC-9821Cr13のテンキーコネクタへの接続でのみ動作確認を行っているだけなので、他のPC98のキーボードコネクタに直接つないでも動作するかどうかは分かりません。残念ながらPC-9821Cr13のキーボードコネクタは他のPC98で使用していない独自のものなので確認できないのです。

また、PC-9801RAぐらいからキーボードへコマンドを送るようになったようですが、確認できた範囲ではテンキーには98起動時に送られるダミーコマンド(0が3つのはずですが何故か4つ送られてきます。テンキーは扱いが違う?)くらいしか送られてきていないので無視しています。
その他、キーコードの再送要求やリセットコマンドも専用線で送られてくる(かもしれない)のですがきちんと処理していません。今のところこれでも問題ないようです。旧モデルのテンキーとでも認識されているのでしょうか。

ところで、今回もPro Microにスケッチ書き込みした後はUSBを使うことはありません。なので前回使用しなかったPro Miniを使ってみました。

上記PS/2用のスケッチ先頭の

#define SERIAL Serial1

をコメントにして

//#define SERIAL Serial

のコメントを外せばPro Mini用のスケッチになります。

前回は割り込み処理でキーコードの取りこぼしが発生したので、今回試して見たところ2回ほど発生してしまいました。でもこれはテンキーをひたすら高速連打したときの話で、実際にゲームなどで利用したときに問題は発生していません。ということでこのまま使用してもよさそうです。仮にキー入力ができなくなっても、リセットボタンですぐに復旧しますし。



やっと念願のテンキー接続が実現でき、PC-9821Cr13もだいぶ使いやすくなりました。レトロゲームも快適に遊べるようになったので、マイト・アンド・マジックの再チャレンジも出来そうです。



最新の画像もっと見る

7 コメント

コメント日が  古い順  |   新しい順
PC98で (pH)
2022-09-25 15:19:04
初めまして。
PC98にUSBコントローラーを繋げたくて、情報収集をしていたところ、こちらのサイトを拝見して、思わずArduinoを(UNOですが)購入してしまいました。
私の方は基礎からですが、もし機会があったらブログで98にUSBコントローラの接続を取り上げていただけたら、あらがたく思います
返信する
RE:PC98で (naoki_sgc)
2022-09-25 22:49:43
Arduinoデビューおめでとうございます。マイコンの世界にどっぷりハマってください。
PC-9801とUSBデバイスですが、ワンチップマイコンにUSBデバイスをつなぐにはUSBホスト機能というものが必要になります。Arduino UNOだとこの機能がないので、このようなデバイス(https://ht-deko.com/arduino/shield_usbhost.html)が必要になります。
Arduinoと比べて開発の敷居はかなり高くなりますが、PIC32MXを使ってPC-9801にUSBデバイスをつなぐ事例がこちらにあります。(http://www.suwa-koubou.jp/micom/)
この事例のようにキーボードやマウスなら変換コネクタの制作だけですみますが、もしそれ以外のデバイスを考えているならPC-9801側に接続インターフェイスを用意するのと、デバイスを使うためのドライバソフトウェアも作る必要があるので大変な手間になります。
たまたま私もUSBホスト機能があるマイコンが欲しくて、秋月電子通商でPIC32MX250F128Bを購入したところです。PIC16シリーズは扱ったことがありますが、32ビットPICは初めてなのでこれから勉強といったところです。将来的にはFM-TOWNSにUSBメモリをつなぎたいと考えていますが、まだまだ先のことになりそうです。
返信する
RE:PC98で (pH)
2022-09-26 19:31:09
コメントありがとうございます。
やりたいことは、USBパッドAボタンを”Z”と定義したときにAボタンを押す→Arduino内で入力をキーコード”Z”に読み替える→PC98のキーボードコネクタの信号線を経由して”Z"をPC98にねじ込む
なんです。
ネットを俯瞰しているとArduino Leonardoがあればなんとかなるんじゃないかと思っていますが・・
こんだけお手軽にマイコンが楽しめるのでまずは勉強から始めたいと思います。
返信する
RE:PC98で (naoki_sgc)
2022-09-27 21:26:32
なるほど、ジョイスティック入力をキーボード入力に変換できれば古いゲームもジョイスティックで遊べていいですねぇ。
ただ残念なことにLeonardoやPro MicroにUSBジョイスティックを直接つなぐことはできません。LeonardoなどをUSBジョイスティックにするのは簡単ですが、USBジョイスティックをつなぐにはこちらの記事 https://qiita.com/MergeCells/items/e19b0f93459fe2daf661 のようにUBSホストシールドが必要になってしまいます。USBには"ホスト"と"デバイス"の2つの機能があって、Leonardoとかは"デバイス"機能しかないんです。
USBにこだわらなくていいのなら、リサイクルショップで手に入るファミコンやスーファミなどのコントローラーをArduino UNOにつなげて98のキーボードにするのは割と簡単に出来ます。(接続コネクタの入手という課題はありますが)
ちなみにこのプログのスケッチは古くて、今はPS2キーボードで98を利用しています。 https://blog.goo.ne.jp/naoki_sgc/e/8287cc0050c4faf5ca573b8fbf88e039 これでレトロゲームを楽しんだりしているのですが、かわりにジョイスティックを接続するのも面白そうですね。
返信する
RE:PC98で (pH)
2022-09-30 21:51:48
こんにちは
平日はバタバタしてて・・
ずっと考えていてLeonardoは手元にあるので、まずはnaoki_sgc様が扱っておりますPlaystationのコントローラを使ってみようかなと思っています。入手性も良いし。
コントローラの入力を取り出す手続きは分かっているので、あとはPC98との通信ができれば大丈夫かなと楽観的に考えていますが、どうなるかなと思案しています
返信する
こんばんは (pH)
2022-10-09 19:06:18
以前お伺いしたUSBホストシールドですが、これが届くのが11月下旬みたいなので、まずは手頃となコネクタを使って作ってみようと思います。
質問ですが、コネクタに接続するケーブルとピンコネクタですがどの様に制作されていますか?もし良かったらご教示いただけないでしょうか。
アマゾンで購入しても狙い通りのものと違っていて困っています。
返信する
コネクタの入手 (naoki_sgc)
2022-10-11 23:18:09
コネクタ類の入手ですが、一般に流通している物は秋月電子の店舗に直接出向いて購入しています。普通に手に入らない特殊なコネクタはハードオフのジャンクパーツ売り場で必死に探します。ゲーム機関連はジャンク中古や周辺機を購入・分解して入手します。どうしても入手できないときは、接続対象の筐体を分解してコネクタ等の配線を引き出します。筐体を壊しかねない行為なので行うときはくれぐれも慎重に。
返信する

コメントを投稿