【制作編】PS初期の電車でGO!専用コントローラーをArduinoで認識させてPS4で使おう!!

さて、お約束の通りデータの準備をしてまいりました。
珍しく有言実行。褒めてください。

さて前回の記事で紹介しました通り、PS1の専用コントローラーをPS4で使えるようにするデバイスの制作方法をご紹介します。

※電子工作やarduino関係にある程度知識がある人を対象にしています。
 ですので初歩的な説明などは割愛させていただきます。

※この記事内における説明はあくまで素人の個人が記載しているものです。
 このブログ記事で何らかの損傷や損害が出た場合、責任は負えませんので必ず自己責任でお願いいたします。

変換器の仕様・操作方法

変換器の仕様・操作方法を先に書いておきます。

・動作の確認はツーハンドルタイプの専用コントローラーでしか行っていません。
 ワンハンドルや豆コンなどは未確認です。
・搭載モード
 0.アーケードタイプの操作モード
   …アーケード版のようにマスコンで縦軸、ブレーキで横軸を操作するモード
    マスコンは3、ブレーキは7を基準位置(ニュートラル)として操作します。
 1.ワンハンドル車両操作モード
 2.ツーハンドル車両操作モード
 3.103系モード
・モード切替方法
 マスコン切位置で非常ブレーキの状態でセレクトを3秒以上長押し
 ブレーキを緩解し、上記モード番号にマスコンを合わせる(ワンハンドル車を運転するならマスコン1)
 再度セレクトを押す
 ※電源投入後(USB接続後)はモード0の操作モードとなります。
・専用コントローラーのボタン割当は下記の通りです。
 Aボタン:△ Bボタン:× Cボタン:○ セレクト+Aボタン:□
 ワイパー(デフォルト設定で□)は使用頻度が少ないので、Aボタン兼用となっています。
・PS4ゲーム側の操作設定下記のようにお願いします。
 操作タイプ:スタンダード
 入力タイプ:ダイレクト
 ボタン割当はデフォルト

準備するもの

Amazonとマルツオンラインで購入しました。
Amazon商品はアフィリンク失礼します。スケッチ等の使用料やと思ってリンク踏んでいただけると嬉しいです。

ArduinoボードやPSコネクタアダプターは他のものでも構いませんが、配布のケースを使用する場合は下記のものを使用しないとはまりません。
※各製品の仕様変更などでケースが使用できなくなることがあります。ご容赦ください。

使用部品

ELEGOO Arduino用 Nanoボード
 制御するのに用います。(Amazon)

PS2 to PS3/PCコントローラーアダプター
 PSコネクター部分をに使います。(Amazon)

ワイヤードコントローラーライト for PS4
 ホリ製のPS4コントローラーです。(Amazon)

リレー
 非常ブレーキ制御に使うリレーです。
 この商品は2チャンネルですが、1チャンネルの他の商品でも構いません。
 ケースを使用する場合はこれでないと、はまりませんのでご注意を。

抵抗詰め合わせ(Amazon)

IC DGTL POT 10KOHM 256TAP 16DIP(デジタルポテンショメータ)
 I2C通信に対応したデジタルポテンショメータです。アナログスティックに入力する信号を作る可変抵抗です。

トランジスタ
 ホリ製コントローラーのボタン操作に使用します。
 NPNトランジスタであれば何でもいいです。

ユニバーサル基板 片面 紙フェノール 72×47mm
 配線に使うユニバーサル基板です。
 ケースに収納しないのであればブレッドボードで配線しても大丈夫です。

ブレッドボードはあったら便利です。

データ類

 zipファイルにて圧縮されています。

PSX Library
 arduinoでPSコントローラーを認識させるライブラリです。

配線をしよう

まず、PSコントローラー各端子の役割を確認しましょう。
動画の切り抜きになりますが、オス側(コントローラー側)のコネクタで見ると下記のようになります。
使用するのは色がついている データ・コマンド・GND・3.3V・アテンション・クロックピンの計6ピンです。

この各ピンを、スケッチで指定したarduinoピンと接続させます。
デフォルト設定では
・データピン:8番ピン
・コマンドピン:9番ピン
・アテンションピン:11番ピン
・クロックピン:10番ピン
3.3VピンとGNDピンはそれぞれarduinoの対応したピンへ接続します。

尚、データ線とアテンション線にはプルアップ抵抗を入れる必要があります。
私は10kΩの抵抗を入れています。

用意したPSコネクタ(メス側)を分解し、ハンダなどを使い基盤から剥離させます。
温めすぎると樹脂部分が溶けるので要注意。

メス側のコネクタにケーブルをハンダする際には、配列が正しいかしっかり確認しましょう。
私は最初、反転していることに気が付かず配線してしまい、いくらやっても通信しないので頭を抱えていました。

次に、arduinoにスケッチを書き込みます。
配布したスケッチを使用するにはPSX Libraryのインストールが必須になります。
インストールしておきましょう。
ライブラリのインストール方法などは、他のブログなどを参考にしてください。

スケッチを書き込んだら、コントローラーと通信させてみましょう。
上記の各ピンをarduinoに配線し、シリアルモニターで動作を確認してください。
正しく通信できれば左からカンマ区切りで
マスコン,ブレーキ,マスコンbit,ブレーキbit,ボタンbit,データ,ハンドル指令,モード番号,モードセレクト判定,判定時間,稼働時間となっています。

それぞれの意味合いは下記の通りです。
・マスコン,ブレーキ
  そのままのハンドル位置
  ブレーキは、非常ブレーキ帯にも接点が切ってあるので9以上は非常となります。
・マスコンbit,ブレーキbit,ボタンbit
  ハンドルのbit判定に使っています。(気にしなくて大丈夫です)
・データ
  PSX Libraryが返してくれるコントローラー情報(生値)です。
  10進数で表示されますが、2進数に変換するとコントローラーの情報が読み取れます。
  (PSX Libraryのサイトを参照)
・ハンドル指令
  最終的にハンドル操作に使うハンドル位置です。
  ブレーキとマスコン操作を同時にするとブレーキが優先されます。
  0がニュートラル、1 – 5がマスコン、6 – 14がブレーキ
・モード番号,モードセレクト判定
  現在のモード番号表示と、セレクト判定は0がデフォルトで1が切り替え待機モードを表します。
・判定時間,稼働時間
 スケッチ内で使用している値です。(気にしなくて大丈夫です)

配線作業

コントローラーとの通信が確認できたら次は配線ですね。
複雑になりますので、順を追って見ていきましょう。

1.デジタルポテンショメータとのI2C通信

エクセルで書いたので多少見にくいかもしれませんが・・・
デジタルポテンショメータと通信するためにI2Cの配線をします。

L側とR側のポテンショメータのアドレス指定のため、A0-A2をGNDにつないだり5Vにつないだりしています。(黒はGND・赤は5V)
詳しくはこのチップDS1803のデータシートを御覧ください。
SDAとSCLの通信線には1kΩ~10kΩのプルアップ抵抗を入れます。
画像では1kΩになっていますが、私は10kΩの抵抗を入れています。記載ミスです。

2.ホリ製コントローラーへの配線(ジョイスティック部分)

PS4との通信はソニーの認証を受けた製品でしか成立しません。
ArduinoとPS4の直接的な通信ができないか、色々調べましたが無理なようです。

なのでホリ製PS4コントローラーを乗っ取り、PS4と通信をします。
USB接続なので、同時に5Vを取得でき一石二鳥です。
※コントローラーの改造となりますので、メーカー保証外となります。
 重ねてですが、必ず自己責任の上でよろしくお願いいたします。

コントローラーを開けるとこの様になっています。
一番手前のジョイスティック用の小基盤はいらないので、接続されているケーブルは切っても大丈夫です。
※ケースを印刷される方はネジ類が後に必要になりますので、無くさないようにしておいてください。流用します。

基盤にはサービス用だと思われる検電部分があります。
各々の配線はこの検電部分もしくは、対応する端子へはんだ付けします。

Arduinoとの通信線は省略しています。
デジタルポテンショメータとPS4コントローラーとの配線はこのようになります。

切ったケーブルを延長するように接続しましたが、直接はんだ箇所へはんだ付けした方がいいかもしれません。
負荷がかかると簡単に断線してしまいました。

また、PS4コントローラーへ給電される5VをArduinoにも供給するため、5VとGNDを引き出してそれぞれをArduinoのVINとGNDへ接続します。

3.ホリ製コントローラーへの配線(ボタン部分)

お次はボタン部分の配線です。
コントローラーのボタン認識ですが意外と簡単で、各ボタンに割り当てられたICピンがGNDに短絡されると押されたと認識されるようになっています。
なので、トランジスタを使ってボタンを押された状況を作ってあげればArduinoで電子的にボタンを制御(乗っ取り)できるという訳です。

今回乗っ取りするボタン類はスタート、サンカク、マル、バツ、シカク、L2です。
スタートと記号ボタンの5つは先程言ったようにGNDに短絡させてあげれば良いのでトランジスタを使用します。
図では省略してトランジスタ一つで書いていますが、各ボタンごとに必要になります。
今回の場合はトランジスタを5つ使用します。各々エミッタ・コレクタ・ベースに接続します。

【ベース抵抗】
ベース側にはベース抵抗を入れます。本来はコレクタからエミッタへ流れる電流値を考えてベース抵抗を決めますが、今回の場合はそんなに考える必要がないため、適当に動作する抵抗を入れています。(10kΩ)
【コレクタ側の抵抗】
コントローラーのボタンを押すと各ボタンIC端子からGND間が短絡され電気が流れるのですが、ボタンの特性上、ある程度の抵抗が乗ってきます。
本来ある程度の抵抗があるところにトランジスタのほぼ抵抗がない状態で導通させてしまうと、何かしらの不具合が出るかもしれません。そのための軽い抵抗です。

L2ボタン(非常ブレーキ)については他のボタンとGNDが別れている関係で、トランジスタでは制御できません。リレーを使います。
ノーマルオープン側に配線してください。

全体図を書いてみました。
抵抗は省略、配線は一本で書いています。
わかりにくい図で申し訳ありませんがなんとなくイメージできるとは思います。

ケース制作

さて、3Dプリンターをお持ちであれば配布したSTLファイルを印刷してみてください。

このような物が印刷できます。

PS4につなぐ前に一度PCにつないでみて、コントロールパネルのデバイスとプロパティーからの動作テストをするほうがいいかもしれません。

実際に運転してみよう

変換器ができたら実際に運転してみましょう!
何の問題もなく運転できればいいのですが、ポテンショメータの個体差などでゲーム上のハンドル状況が安定しないことがあるかもしれません。
そんなときは、Arduinoスケッチのこの部分を修正してみてください。

上3行、ワンハンドル、ツーハンドル1、ツーハンドル2になっています。
この配列内の数字が各ポテンショメータを制御する引数になっています。
左からN,P1,P2,P3,P4,P5,B1,B2,B3,B4,B5,B6,B7,B8,EBに対応します。
少し数値を変えてみて様子を見てください。

例えばツーハンドル車で専用コントローラーはB3状態なのに偶にB4になったりする場合は、TowHan1の配列内のB3に対応する192の値を少し下げてみる(190とかにしてみる)など
下げすぎると今度はB3状態でB2になったりします。

さいごに

さて、長々と専用コントローラーPS4変換器”専用換トローラー”の説明をさせていただきました。
なにか分からないことや、記事内のミスがありましたら教えて下さい。

配布したファイルを個人用途で改造する分には構いませんが、再配布や改造ファイルの配布はやめてくださいね。約束だからね!!


それでは、よき電GOライフを~!!