2018年9月9日日曜日

NAOMIとセガサターンのコントローラを繋げる

今までNAOMI使う時は自作のJVS-JAMMA変換器を使ってたんですが、バーチャロンの入力に興味を持ったことがきっかけでサターンのコントローラを繋げる変換器を作る事に。

バーチャロンのツインスティックについては、とある魔術の〜でタニタさんのプロジェクトが話題でしたが、やはり目標が難しかった。残念……って事で実際にツインスティックの入力がどうなっていたのか調べ始めたのが発端。アナログかと思ってたけど実はデジタル入力だったんですね。そんなわけで、実際には(方向+2ボタン)×2で合計12ボタンってだけの簡単な装置でした。サターン用のツインスティックならヤフオクで1,000円前後で手に入りますので、今押さえておくのが吉かと判断しまして。サターンのコントローラは2bitの選択信号と4bitのデータ入力で4×4の16ボタンの入力が取れるようになっていて扱うのはかなり簡単な類いなんですね。

通常のサターンパッドだと入力の組み合わせはこんな感じ。データ側の信号はactive lowで、入力側でpull-upが必要です。sel[1:0] = b11の時にdata[2:0]が0b100の固定値を返すので、これでコントローラが刺さっているかどうか判断できます。

sel[1]sel[0]data[3]data[2]data[1]data[0]
00RXYZ
01StartACB
10
11L100

これがツインスティックだとこんな感じになる。わりとサターンパッドの物理的な配置が考慮されてて、ツインスティック向けの操作をパッドで遊んでもある程度なんとかなるようになっています。左スティックがそのまま方向ボタン、トリガーとボタンがL/Rに対応して、右スティックはサターンのXYZ/ABCボタン中央付近が上下左右に対応し、両端でトリガー、ボタンに対応しています。

sel[1]sel[0]data[3]data[2]data[1]data[0]
00L ButtonR →R ↑R →
01StartR TriggerR buttonR ↓
10L →L ←L ↓L ↑
11L Trigger100

あと、確認していて気づいたんですが、サターンのコントローラはGNDさえ通していれば動作しちゃうみたいです。あれ?って事は中でもpull-upされてて、pull-up経由で電源漏れてきてるのかな?ちょっと未確認です。まぁ、ロジックIC数個とスイッチだけで作れそうな構成ですしね。同時押しすると流石に黙るとは思いますが。

いずれにせよ、信号線が6本しかないのでJAMMAに変換するより配線が楽で助かります。今まで通りArduino Nanoベースで作るなら、今回はやらなかったけど、2P分のコネクタまで用意する事も可能ですね。

一方で、これをNAOMIに繋げようと思った場合、JVSの入力信号にどう対応させるか。JVSは入力信号の標準配置があって、2P対応してると基本こんな配置になります。

b7b6b5b4b3b2b1b0
B1TestTilt 1Tilt 2Tilt 3----
B21P Start1P Service1P ↑1P ↓1P ←1P →1P B11P B2
B31P B31P B41P B51P B61P B71P B8--
B42P Start2P Service2P ↑2P ↓2P ←2P →2P B12P B2
B52P B32P B42P B52P B62P B72P B8--

で、これがバーチャロンの場合には以下のような感じになっていて、1P/2Pそれぞれの方向+2ボタンが左スティック、右スティックそれぞれに対応しているようです。

b7b6b5b4b3b2b1b0
B1TestTilt 1Tilt 2Tilt 3----
B2StartServiceL ↑L ↓L ←L →L TriggerL Button
B3QM-------
B4--R ↑R ↓R ←R →R TriggerR Button
B3--------

ここまで分かればあとはちょろっと既存のコードをいじるだけです。ちなみにNAOMI側の配置は先に調べてあって、元のJVS I/Oボードの方にも方向+4ボタンの一般的なコントローラで無理やりバーチャロンを操作するための謎の修正を入れてあります。ボタンはL-Shot/Shift/Turbo/R-Shotみたいなアサインになっていて、Shiftを入れてると方向キーで旋回、ジャンプ、キャンセルができるようになる感じですね。

で、とりあえず作ってみたプロトタイプがこちら。


コントローラ用の端子は延長ケーブルを半分にして作りました。Amazonだと2,000円前後かなぁ。AliExpressで探せば300円くらいで見つかるはず。たぶんモノは同じで、少しサイズが甘い。コントローラによっては接触不良が出るので、その場合は間に1〜2mmの物を挟んで端子同士が密着するようにしてやればOKです。

そうそう、前回はたまたま気づかずに正しく間違えたんだけど、JVSの仕様書に書かれてるSeries Bコネクタの配列、間違ってますね。Zの順で1から4ではなく、左上から時計回りで1から4。USB Type Bと同じなのが正解です。


その後、基板に乗せて配線。ブレッドボードの実験からそのまま持ち込んだので、サターンのケーブルとかArduino Nanoなんかは下駄つき。これをいつものケースに入れてデコレーション。

という事で完成。JVSはUSBの電源相当の線がSense信号になってて、別口で電源用意しないといけないのが残念です。いや、他にも色々残念ですが。

ソースコードと回路の詳細についてはこちら。そうそう、僕が作っている物の改造や基板化などは、ご自由にどうぞ。質問があればTwitterとかで気軽に聞いて下さい。

Startをコインにして、L/Rを1P Start/2P Startにも配置。他の入力は1Pだけじゃなく2P側にも反映……とかやるのはありかも。JAMMAは同じような方法で1P/2Pを切り替えて遊べるようにしてます。コード的にはコイン入力SWは別口で入れてありますが、自分は面倒なので実装しなかったんですよね……でも、コイン入力ないと、まもるクンで隠しのふるるが出せない……。

0 件のコメント: