前回の続きです。
ArbotiX-M(Arduino)にフルカラーTFT液晶ディスプレイ(uLCD-43PT-AR)が接続できたところで、入力系に移ります。
SHARPの「CYBER STICK」(CZ-8NJ2)を、ArbotiX-Mに接続します。
CYBER STICKは、1989年発売(当時の標準価格:23,800円)とのことですから、もう30年も前の製品になります。
買ってはみたものの、当時の愛機は、NECの「PC-9801VX41」(当時の標準価格:630,000円)に、ジョイスティックポートが付いた「FMサウンドカード」(PC-9801-26K)の組み合わせ。
「いずれI/Oドライバでも作るか」と思っていましたが、けっきょく作らず仕舞い。箱に入れたまま、お蔵入りになっていました。
と、いうことで、ほぼ新品の状態です。
ところで、なぜいま、長期放置プレイ状態であったCYBER STICKを、引っ張り出してきたのかというと・・・。
それは、今回の「ペガソス計画」において、非常に重要な入力デバイスとなるためです。
#と、その前に、はたして、30年ぶりに、電源が入るのかどうか。0xF9C8
こちらは、米国海軍、タイコンデロガ級ミサイル巡洋艦、いわゆるイージス艦の「戦闘指揮所」(CIC; Combat Information Center)です。
火器操作要員が向かっているのは、Raytheon社(旧General Dynamics社)の「近接防御火器システム」(CIWS; Close In Weapon System)、「Phalanx」の制御台(コンソール)です。
もう少し分かりやすい画像が、こちらです。
利発そうなお姉様の前にあるのが、Phalanxの制御台。しっかりと、ジョイスティックが写っています。
微妙に形状は異なるものの、ほぼCYBER STICKと同じ。これを、入力に使わない手はありません。
そう、本物のPhalanxさながら、ジョイスティックを使って、砲台のパン(左右方向)、砲身のチルト(上下方向)を、操作しようという訳です。
と、いうことで、まずはハードの作製。
以前に少し紹介しましたが、ArbotiX-Mの入出力インタフェイスを集めた回路上に、実装しました。
#「インターフェース」と書かないところが、工学系。0xF9C7
CYBER STICKのケーブルは、D-Sub 9ピンの「メス」。よって、基板側は、D-Sub 9ピンの「オス」になります。
D-Sub 9ピンコネクタの足は、特殊なピッチのため、秋月電子の「DSUBコネクタDIP化基板(オス・メス兼用)」を使って、2.54mmピッチに変換しています。
ちなみに、オスの場合は、基板上にシルク印刷で書かれているピン番号が「間違っていました」と、コソッと書かれています。
#ハンダ付けしてから気付かないよう、注意しましょう。
ArbotiX-M側の信号線は、出力が1本、入力が6本の、計7本となります。
細かくは、データ要求(REQ)が1本、アクノリッジ(ACK)が1本、4bitデータ上位/下位表示(LH)が1本、4bitデータ入力(D3~D0)が4本です。
つづいて、制御ソフトの作成。
実は、当初はかなり難航するのかと思っていたのですが、意外にあっさり読み出しに成功してしまいました。0xF9CF
画像は、CYBER STICKの信号線を、ロジックアナライザでスヌープしたものです。
「REQ」に対する「ACK」と「LH」の動きを理解すれば、データを正しく読み出すことができます。
「REQ」を“立ち下げる”と、CYBER STICKは「データ転送要求」と理解し、1サイクル50μsの周期で、6サイクル分、データを吐き出します。
(正確には、REQを立ち下げている時間により、データの転送速度を4段階に指定(50 / 96 / 144 / 192μs)することができますが、ここでは「最速モード」(50μs)で読み出すことを前提とします)
1サイクルは、2回の「ACK」からなり、「ACK」の“立ち下がり”の時の「LH」を比較することにより、8bitデータの上位4bit/下位4bitを判定することができます。
(「CyberStick.c」)
CYBER STICKの読み込みルーチン(抜粋)です。
実行結果です。
ジョイスティックとスロットルの操作量は、分解能8bit、256段階(-128~127)で読み出すことができます。
2byte目(D1)がジョイスティックのY方向、3byte目(D2)がジョイスティックのX方向、4byte目(D3)がスロットルに、それぞれ対応します。
(5byte目(D4)は、「オプション」となっていますが、実質的には接続されていないため、表示していません)
また、ボタンの状態は、1byte目(D0)および6byte目(D5)で読み出すことができます。
AボタンおよびBボタンは、本体とジョイスティックにあり、どちらかのAボタンを押すと、1byte目(D0)の8bit目(b7)が、どちらかのBボタンを押すと、1byte目(D0)の7bit目(b6)が、立ちます。
(本体とジョイスティックを分けて読み込むには、本体側のAボタン(A')は、6byte目(D5)の6bit目(b5)、ジョイスティック側のAボタンは、6byte目(D5)の8bit目(b7)、本体側のBボタン(B')は、6byte目(D5)の5bit目(b4)、ジョイスティック側のBボタンは、6byte目(D5)の7bit目(b6)で、それぞれ見分けることができます)
なお、画像では、ジョイスティックとスロットルの操作量が、いずれも「0」となっていますが、これは、きちんと中立位置をキャリブレーションしてあるからです。
中立位置のキャリブレーションは、本体後面のボリュームで行います。
ただ、ドキュメントにも、「センター位置は、7Fhまたは80hとするが、±2の誤差をみておく」と書かれているとおり、ジョイスティックを戻したタイミングにより、必ずしも「0」にならない場合が多く、また、数値は状況によりフラつきます。
(電源を入れ直したタイミングでも、余裕で「±4」ぐらいズレます)
さらに、ジョイスティックやスロットルの操作量は、-128~127の間でリニアに変化するのかと思っていたのですが、実際に動かしてみたところ、上下(および左右)の傾きに対し、4分の3ぐらいの位置で、いきなり限界値(-128または127)になってしまいます。
よって、このCYBER STICKを、砲台や砲身の操作に用いる際には、中立位置の自動キャリブレーションや、フラつきに対するフィルタリングなどの付加処理が、必要となりそうです。
(つづく)
〔参考情報〕
・アナログジョイスティック(サイバースティック)関連 (X68000 LIBRARY)
・サイバースティックでアフターバーナーを遊びたい(3)まとめ(CHILDHOOD'S END)
Post Comment