レトロでハードな物語

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

Playstation ClassicでPSコントローラーの振動機能を使う

2021年02月10日 | 電子工作

前にPlaystation Classicにプレイステーションのアナログコントローラー(デュアルショック SCPH-1200)やネジコン等をつなげてから、時々プレステのゲームで遊んでいます。所持しているゲームも結構有りますが、Playstation Classic内蔵のゲームだけでも沢山あるので、これらを遊び尽くすのは大変です。

そんな折、内蔵の鉄拳3で遊んでいたのですが、なにか今ひとつ迫力がないような、なんだか物足りない感じがしました。



よくよく考えてみると、技が決まった時にコントローラーが振動しないのが原因のような気がします。やっぱり格闘ゲームではコントローラーが振動した方が迫力が増しますよね。

Playstation Classicのhackに利用したRetrobootのPSエミュレータの設定項目を見ると、振動機能をサポートしているようです。これならコントローラーが対応していればなんとかなるような気がします。そこで、アナログコントローラーの振動機能を使えるようにしようと思い立ちました。

前回Arduino XInput Libraryを使ってSparkFun Pro Micro(互換機 3.3V 8MHz)をXbox360コントローラーにしてPlaystation Classicに接続しました。実はこのXInputライブラリは振動機能をサポートしています。
でもプレイステーションのアナログコントローラーで振動機能を利用するには、コントローラーの電源3.3V以外にモーター駆動のための外部電源7.2V〜9V(サイトによって電圧の情報が異なる)が必要なので、以前はそこまで手を付けませんでした。
ハードウェア的には、外部電源にACアダプターを使うだけで済みそうな話なのですが、ソフトウェア側がちゃんと機能するかどうかは分かりません。

そこでまずはソフトウェアの検証作業から行うことにしました。現在Playstation Classicに導入済してあるRetrobootは最新のものより少し古くなっていたので、まずはバージョンアップから行いました。バージョンアップのパッチもあるようですが、余計なトラブルを減らすためにも新規にインストールして、セーブデータだけ手作業で移行することにしました。

インストールは簡単です。

1.このサイトからDownload Retroboot 1.2.1 Standalone.zipをダウンロード
2.ダウンロードファイルを解凍したら、空のUSBフラッシュメモリにコピー(安物の32GBの物を使用した)
3.手持ちのゲームイメージはromsの下の各ゲーム機用のフォルダーにコピー(自分で作ったフォルダーでもかまわない)
4.実機吸出しのBIOS等はretroarc/systemの下にコピー(プレステのBIOSは内蔵されているので必要ありません)
5.コントローラーとUSBメモリをPlaystation Classicに差し込んで電源を入れる

Playstation Classicの設定項目は沢山ありますが、個人的にインストール直後に行う設定はこれだけです。

1.Setting→User→LanguageでJapanese-日本語を選択(以後日本語メニューで説明)
2.設定→入力→メニューコントロール→OK/キャンセルボタン入れ替えをOFF
3.メインメニュー→メイン設定ファイル→現在の設定を保存

あとはデフォルトのままでゲームを遊べる環境になっているので、ここから振動機能の検証を行います。

まずはArduino XInput Libraryの振動機能が、エミュレータの振動命令をちゃんと拾ってくれるのか確かめてみます。テストは簡単に済ませたかったので、Pro MicroにLEDをつないで振動命令が来たら点灯するようにしてみました。テストに使用したスケッチは以前作成したものに振動確認の関数とLチカの処理を加えただけです。

Retroboot側では設定→入力→振動フィードバック→(対応コアで)デバイスの振動を有効→オンにします。

鉄拳3を起動したら(Playstationのコアは4つありますが、個人的な好みで[NEON Xtrme]のコアを使用)ゲームのメニュー画面からOPTION MODEでVIBRATIONをYESにします。



するとテスト用のLEDが点滅しました。ゲームをプレイして攻撃がヒットするときもLEDが点滅します。Arduino XInput Libraryちゃんと機能しているようです。素晴らしい。

これで安心してハードウェアを改良できます。

まずは、モーターを動作させる外部電源が必要です。
今回選んだのは6V 600mAのACアダプターです。卓上小型スピーカーの電源です。



重い上に音響機器のアダプターなので、多分トランスタイプのものです。トランスタイプだと、このACアダプターの場合600mA使った時に6Vになるように設計されているはずです。測ってみると負荷のない状態の電圧は8.8Vありました。PSのアナログコントローラーの消費電力は不明ですが600mAも必要ないと思うので、このアダプターなら8V付近で利用できると考えました。PSコントローラーの外部電源は7.2Vとか9Vとか(多分この範囲ならいいのでしょう)なので、このACアダプターならバッチリでしょう。

ACアダプターのメスコネクタを基板にハンダ付けして、+側をPSコントローラーの3ピンにつなぎ、−側をPro MicroのGNDにつなぎました。


向かって右側から3番目につなぎます。





スケッチも振動対応に書き換えました。

ProMicroPS2XinputRumble.ino

XInputライブラリの振動機能は左右2つのモータを制御できるようですが、今回使用したデュアルショックは従来のアナログコントローラーと互換のモードで動かしているのでモーターは1つしか回りません。そこでスケッチでは、左右どちらの振動ONでもモーターが回るようにしています。(実際はプレステのエミュレータからは左側モーターの回転指示だけが送られてきていました)

このスケッチを書き込んでACアダプターをつなげた状態で鉄拳3をプレイしてみたところ、見事にコントローラーが振動してくれました。攻撃がヒットする(される)たびに手にビンビンひびきます。



やっばり振動する方が楽しいですね。ちなみに内蔵ゲームで振動対応しているゲームはこんなにありました。

RIDGE RACER TYPE 4
Gダライアス
鉄拳3
ミスタードリラー
METAL GEAR SOLID

ちゃんと機能するかどうか分かりませんが、Retrobootに搭載の他のエミュレータでも振動対応しているものがあるようです。

今回使用したアナログコントローラー(デュアルショック)以外にPS2のデュアルショック2なども振動機能がありますが、この回路とスケッチではデュアルショック2を利用することは出来ません。通信速度が上がった分、シビアなタイミングが要求されるみたいです。Arduinoとの接続端子にちゃんとプルアップ抵抗を付ければ、SPIでつなぐPS2コントローラーライブラリは色々あるので、これらとArduino XInput Libraryを使って振動機能を実現することは可能なはずです。



最新の画像もっと見る

コメントを投稿