メガドライブミニ を ジョイスティック で遊ぶ ジョイスティックアダプターの作成
メガドラミニをジョイスティックで遊びたいが、対応するコントローラーにジョイスティックがなく非常に残念。 だが、ネットで調べると、どうやらArduino Leonardoをうまく使うとメガドラミニのコントローラーを作れるらしい。
早速付け焼き刃な知識で、ジョイスティックアダプターを自作してみることにする。
参考
以下の情報を参考にさせていただきました。ありがとうございます。
「3日でできたメガドライブミニ 徹底解析・ハック 最速本」
http://honeylab.hatenablog.jp/entry/2019/09/24/001058
こちらによれば、USBはあらかじめ決まった機器しか認識しないように作られているらしい。
JoystickMD
https://github.com/NibblesLab/JoystickMD
Arduino Leonardoを用いたジョイスティックアダプターの実例。 今回は、この JoystickMD ライブラリを使わなくてもできたのでライブラリは未使用だが、中身は大いに参考にさせていただいた。
材料
- Arduino Leonardo
- だいたい3000円前後
- USBケーブル
- type A - micro B ArduinoとPCやメガドラミニとの接続用
- ジョイスティック
- この例ではシグマ電子のΣ6000TBを利用
- 8方向スティック+7ボタン ボリューム連射装置つき
- アーケード基板のコントロールボックス用やATARI仕様のものなら同じように作れるだろう
- ジョイスティックのケーブル
- Σ6000TB用ケーブルを途中で切断して使用
- 用意するジョイスティックによって適宜考慮が必要
- ブレッドボード用ジャンパーワイヤー(オスーオス)
- 最低10本(GND1本、スティック部で4本、ボタンで5本。XYZボタンは使わない)
- XYZボタンも使いたいならさらに3本追加
- ジョイスティックが電源も必要とするなら、さらに1本追加
作り方
Arduino IDEをインストール
こちらから、Arduino IDEをダウンロードしてPCにインストール。
https://www.arduino.cc/en/Main/software
Arduino用Joystickライブラリをインストール
こちらから、Arduino Joystick Libraryを入手。
https://github.com/MHeironimus/ArduinoJoystickLibrary/tree/version-2.0
zipファイルをダウンロードして、適当なディレクトリに展開。 その中の Joystick ディレクトリを、arduino の libraries ディレクトにコピー。
Macの場合は以下の場所となる。
~/Documents/Arduino/libraries
Arduino IDEを再起動し、ライブラリが認識されているか確認。 メニューの スケッチ>ライブラリをインクルード を選び、Joystick が出てくれば良い。
VID/PID 変更
Arduino Leonardo のUSBのVID/PIDを、メガドラミニが認識する値に変更する。
こちら( https://forum.arduino.cc/index.php?topic=532127.0 )を参考に、手順をまとめると以下のようになる。
- boards.txt を探す
- 探し方は、ファイル>スケッチ例 で、Leonardo用の物を選んで開く
- スケッチ例のウィンドウで スケッチ>スケッチのフォルダを開く を選んでFinderを開く
- Finderで開いたフォルダから、上のフォルダをたどっていくと boards.txt がある
- 今回は次の場所であった ~/Library/Arduino15/packages/arduino/hardware/avr/1.8.1/boards.txt
- boards.txt を開き、以下の箇所を書き換える
- leonardo.build.vid=0x2341 ←0x2341 を 0x0079 に変更
- leonardo.build.pid=0x8036 ←0x8036 を 0x0011 に変更
- Arduino IDEを再起動
- スケッチをArduinoに書き込む
- ツール>ボード情報の取得 で確認。変更できていればOK
スケッチ
ピンの状態を読み取り、対応するボタンの状態をJoystickライブラリで設定するだけの簡単な内容。 USB関係のことはライブラリに隠蔽されているので、まったく知らなくても良い。
ピンとボタンの対応
ピンとジョイスティックのボタンの対応は好きなように決めればよく、 このスケッチでは、以下のような対応付けとしている。 やりたいゲームでは必要としないのでX,Y,Zボタンは対応してないが、拡張するのは簡単だろう。
ピン | ポートレジスタ | ポートレジスタのビット | 機能 | ボタン番号 |
---|---|---|---|---|
0 | D | 00000100 | ||
1 | D | 00001000 | ||
2 | D | 00000010 | Aボタン | 1 |
3 | D | 00000001 | Bボタン | 2 |
4 | D | 00010000 | Cボタン | 4 |
5 | C | 01000000 | ||
6 | D | 10000000 | STARTボタン | 9 |
7 | E | 01000000 | ||
8 | B | 00010000 | 左 | |
9 | B | 00100000 | 右 | |
10 | B | 01000000 | 上 | |
11 | B | 10000000 | 下 | |
12 | D | 01000000 | MODEボタン | 8 |
13 | C | 10000000 | ||
- | - | - | Xボタン | 0 |
- | - | - | Yボタン | 3 |
- | - | - | Zボタン | 5 |
ピンの読み取り
ピンの状態を読み取るのに、一般的には digitalRead()
を用いる。
しかし、これは指定したピン番号の変換などをしているため、若干遅いらしい。
なるべく高速化してタイムラグを減らしておきたいため、ピンの読み取りは、ポートレジスタを直接読み取るものとする。
欠点はArduino Leonardo(ATmega 32U4)専用で移植性がなくなることだが、そこは仕方がない。
ピンとポートレジスタの対応は表のとおりだが、詳細はこちらを参照。
https://www.arduino.cc/en/Hacking/PinMapping32u4
スケッチを単純化するために、ポートはDとBのものに収まるように用途を決めた。 例えば、ポートDの右から2ビット目が 1 ならAボタンは離され、0 なら押された、という扱いにすればよい。
ボタンが押されたときの処理
この表のボタン番号は、Joystickライブラリの pressButton()
, releaseButton()
で指定する値。
USB機器によって番号とボタンの配置が異なるらしいのだが、DragonRise製の場合は表の番号を指定すればよいらしい。
(参考)https://github.com/NibblesLab/JoystickMD
ボタン番号は、Joystickライブラリで指定するIDである。 例えばAが押されたときは(ピン2がLOW)
Joystick.pressButton(2);
離されたときは(ピン2がHIGH)
Joystick.releaseButton(2);
となる。
スティックが倒されたときの処理
スティックの状態は Joystick.setXAxis()
(横方向)/ Joystick.setYAxis()
(縦方向)で設定する。
値はアナログが前提になっているらしく、 setXAxisRange(min,max)
で値の範囲を設定しておく。
左右の場合、 setXAxis()
でminをセットすれば左に、maxなら右に、中間値なら停止、ということになる。
上下も同様である。
Joystick.setXAxisRagne(0,511); //値の範囲
Joystick.setXAxis(0); //左移動
Joystick.setXAxis(255); //ニュートラル(左右には動かない)
Joystick.setXAxis(511); //右移動
最初は max=0xff にしていたのだが、これだとニュートラルで右に入りっぱなしになってしまう。 max=0x1ff にしてみたら、意図通りの動きに。 この辺りは、メガドラミニの内部仕様によるものかもしれないが、詳細は不明である。 動けばいいので深くは追求しない(^^)
ジョイスティックとArduino Leonardoを接続
ジョイスティックから出ている電線を、Arduino Leonardoの対応するピンに配線する。
シグマ電子のΣ6000TBの場合、標準ケーブルの色とピンは以下のように配線すればよい。
Arduino ピン | 機能 | Σ6000TB ケーブル色 | Σ6000TB コネクタ番号 | Σ6000TB ボタン |
---|---|---|---|---|
2 | Aボタン | 空 | 12 | α |
3 | Bボタン | 桃 | 11 | β |
4 | Cボタン | 紫 | 7 | γ |
6 | STARTボタン | 黄 | 4 | START |
8 | 左 | 青 | 6 | 左 |
9 | 右 | 黒 | 10 | 右 |
10 | 上 | 白 | 9 | 上 |
11 | 下 | 赤 | 2 | 下 |
12 | MODEボタン | 橙 | 3 | SFC START |
GND | GND | 茶 | 1 | (GND) |
- | - | 緑 | 5 | φ |
- | - | 灰 | 8 | SELECT |
- | +5V | 黄緑 | 13 | (+5V) |
(参考)シグマ電子 配列表
Σ6000TBはボタンが7つしかないため、メガドラミニコントローラーのすべてのボタンを割り当てられない。 将来XYZボタンを使いたくなったら、ピン配置を見直し、MODEボタンを別に用意するしかないだろう。
配線ができれば、もう使えるはずだ。
テスト
意図通りに動くかどうかテストしたい場合、ぷよぷよ2の INPUT TEST を利用するとよい。
完成図
そんなこんなで、できあがりはこのように。
Arduino Leonardoとジョイスティックの配線の間にコネクタが挟まっているが、 これはジョイスティック側のケーブルを他の用途にも使いたいためにこうしているだけで、必須ではない。
これでめでたくダライアスをジョイスティックで遊べて、感激もひとしお。 連射もジョイスティック側で制御できるので、超高速連射も可能。 でもダライアスは連射が早すぎると隙ができやすいので、調整が難しい。