見出し画像

ArduinoでPS4コントローラーを作る 基礎編

結論から言うと、Arduinoをキーボード化させてコンバーターを経由してPS4に認識させます

なぜ結論から言ったかというと、国内の情報だけでは足らず海外のフォーラムまで散々調べたものの方法が見つからず、結局こんな単純な方法で解決できたのに、どこにもキーボード→コンバーターのPS4コン自作の記事が無かったからである。誰も試してないんか
「PS4 arduino コントローラー」で検索すると、PS4のコントローラー(DUALSHOCK 4)でArduinoを操作する情報ばかりで、肝心のArduino→PS4に接続する方法は無く、PS4コンの自作はDUALSHOCK 4やサードパーティ製コントローラー基板の乗っ取りが主流となっている
それもそのはず、PS4はコントローラー接続のセキュリティが厳しく、公式コンもしくは認証を受けた一部のサードパーティ製しか入力を受け付けない仕組みのようだ
そのため、海外フォーラムでもArduinoをPS4コントローラーとして偽装する方法は諦めムードとなっている。Arduino以外で偽装する基板はあるものの、Pro Microと比べると高価で、汎用性も怪しい
そこで、「キーボードをDUALSHOCK 4の入力として変換するコンバーターなら、キーボード化したPro Microでコントローラーを自作できるんじゃないか?」という考えに至り、結果成功。方法を当記事に記しておく


1,コンバーターの選定

コンバーターにはいくつか種類がある。マウスとキーボードを使用可能にするものと、他機種のコントローラーを使用可能にするものだ。今回の記事で使用するのは前者だが、後者は比較的偽装がしやすい他機種のコントローラー(PS3、Switch)などにPro Microを偽装してからコンバーターで入力を変換する。ただし後者の方法はPID/VIDの書き換えが必要な場合もあり、法的にはあまり良くない。筆者はコントローラーの販売も行っているので、販売するうえでホワイトな状態で出荷しなければならない。なのでキーボード→コンバーターの方法を取ることにした(購入者の手元に届けばあとはファームウェア変更もID書き換えも自己責任だし)
PS4で使えるキーボード変換コンバーターはたくさんある。というのも、FPSの競技化が盛んになり、CS版特有のエイムアシストの恩恵を受けながらマウスとキーボードで操作をする、俗に言うハードウェアチートを使う輩が後を絶たないからだ。一部のタイトルでは規制されているものの、コンバーター自体に違法性は無い 多分。競技性の無いゲームでやるなら何も問題は無いし、「ラブライブ!スクールアイドルフェスティバル」「シアトリズム ファイナルバーライン」といった、ACから移植された音ゲーをAC感覚のコントローラーで遊びたいという人は多いはず。特に上記タイトル2つはどちらもサ終してるので

筆者が今回PS4用コントローラーを作ろうと思い立ったのも、上記2つのタイトル用の専コンを作ってほしいとオーダーがあったからだ。当記事は基礎編としているので、詳しい制作方法は別記事にまとめることにする

筆者が購入したコンバーターはこちら。比較的新しい商品で(2024年4月現在)キーマッピングにも対応している。右スティックの操作がマウスで固定されてるコンバーターも多いので、一部のタイトルでキーボードオンリーでは操作できない場合もある。これはマウス操作に当てられている入力もキーボードで扱える

また、別機種のコントローラーをPS4用コントローラーとして認識させる方法についても、ラズパイでPS3コンを作ってからコンバーターを通すやり方を教えてもらった。この手のコンバーターも種類があるものの、中でもMAGIC-S PRO2は音ゲーをやる上でも遅延が無いようだ。情報提供のそこぬけまりん氏に感謝

2,Arduinoをキーボード化するスケッチを書く

普段からArduinoに触れている人なら造作も無いことだろう。コンバーターにも依るのかもしれないが、上記コンバーターはNKRO(Nキーロールオーバー)クラスが使用できない。素直にKeyboardクラスで書いていく。
以下は至極単純な、2ピンから適当なキーをアサインしたスケッチ(ポップンコンスケッチの流用。適当とは言ったが、上記コンバーターを使用してスクフェス用にアサインしたもの)

#include <Keyboard.h>
#include <Arduino.h>

//ピン番号 0は欠番
int button[12] = {
  0, 2, 3, 4, 5, 6, 7,
  8, 9, 10, 14, 15
};
int key[12] = {
  0, 'k', 'q', '1', '2', '3', 0x20, 'c', 'e', 'g', 'h', 'j'
};
int i;

void setup() {
  for (i = 1; i < 12; i++) pinMode(button[i], INPUT_PULLUP);
  Keyboard.begin();
}

void loop() {
  for (i = 1; i < 12; i++) {
    if (digitalRead(button[i]) == LOW) {
       Keyboard.press(key[i]);
    }
    else {
       Keyboard.release(key[i]);
    }
  }
  //Keyboard.write();
}

上記のコンバーターではL2とR2がマウスクリックに割り当てられているため、キーマッピングで変更する(k→L2、g→R2)
そしてプレイしてみた動画はこちら(4ボタン)

遊んでるやつが下手くそなのは置いといて特に問題無くプレイできることが確認できた。このように、Arduinoを使用した自由なボタンレイアウトのPS4コントローラーが安価に作れるという実例を示したのである
PS4コントローラーを自作したい人の参考になれば幸いです

スクフェス専コン編、シアトリズム専コン編に続く