DualShock4のRスティックの左右反転/上下反転コンバータを作る

GIMXを使うと簡単に実現できる。以下ポイントだけ。

    • GIMX Adapterを準備する。購入してもよいし、自作してもよい。
    • 自作する場合は、公式の説明とか、日本語の分かりやすい解説ページ (こことかこことか)を参考に。
    • (要は、Arduino Leonardo のTX/RX/GNDと、シリアル変換のRX/TX/GNDをつなぐだけです)
    • ちなみに私は、USB直挿しタイプのATmega32U4に、シリアル変換CP2102を組み合わせて自作しました。また、GIMX AdapterにつなぐPCとしてRaspberry Piを使うならば、シリアル変換部を省いて、Raspberry PiのTX/RX/GNDとATmega32U4を直結することでも対応可能です。(実際に私は、Driving Force GTをPS4で使うときは、そのようにしてGIMXを使いました)
    • ホストPC (とでもいうのか? GIMX Adapterの接続先のPC) は、私はRaspberry Pi Zero WZero4U (USBハブ) + ケースを使いました。ただし、個人的には、慣れないうちはWindows PCを使うのが楽でいいと思います。またRaspberry Piを使うのにしても、USBハブが標準でついているRaspberry Pi 2B/3B/4B系統を使うのが楽だと思います。(私はどうしてもホストPCを小さくしたかったので、Raspberry Pi Zero Wを使いました)

  • GIMX AdapterのFirmwareとして、「firmwares-8.0\EMUPS4\atmega32u4.hex」をATmega32U4に書き込む。なお私のようにUSB直挿しタイプのATmega32U4を使う場合は、リセットボタンを自前で取り付けないと、書き込みができないので注意のこと。(リセットボタンを押した後の数秒間だけ、書き込み用のCOMポートが見えるようになる感じなので。)
  • なお、ATmega32u4へのfirmware書き込みは、ものすごくタイミング勝負なので注意のこと。私の場合は、Arduino Builderを使って以下のようにすることで書き込みに成功した。
    • Arduino Builderを起動して、Load Sketch/Binaryで書き込むファイル(EMUPS4\atmega32u4.hex)を選択し、TargetにArduino Leonardoを選択し、@の右横はDefaultのまま変更せず、Baudrateは115200bpsに変更。
    • デバイスマネージャーを開いて、ポート(COMとLPT)のところを開いておく。
      • ATmega32U4をPCに接続した状態で、ATmega32U4のリセットボタンを1回ないし2回押す (1回なのか2回なのかは、製品によって変わる)。するとしばらくの間ATmega32U4についているLEDが点滅して(bootloaderが動作して)、デバイスマネージャーのポートのところに、COMポートが出現する。数秒間放置すると、点滅がなくなり、COMポートが消える。
      • もう一度リセットボタンを1回(又は2回)押して、COMポートを出現させる。COMポートが出現している間に、Arduino Builderの3段目くらいのところのBuild, Refresh,...と並んでいるボタンの内、Refreshをクリックする。すると、Refreshボタンの右側に、出現しているCOMポートのボタンが現れる (私の環境では、COM7でした)。Refreshボタンのクリックが間に合わなかったら、もう一度リセットボタンを1回(又は2回)押すところからやり直せばよい。
      • ここからがタイミング勝負。Refreshを押して現れたCOMボタン (私の環境ではCOM7ボタン) をクリックして間伐入れずにATmega32U4のリセットボタンを1回(または2回)押す。
      • 上記取り消し線部分について、スイッチサイエンスさんのところで公開されているガイドにもっと簡便な方法が記載されていた。曰く以下とのこと。
        1. ATmega32U4のリセットボタンを押す(押したまま離さない)
        2. Arduino BuilderやArduino IDEの書き込みボタンを押す
        3. リセットボタンから指を離す
      • これでうまくいけば書き込みが始まってすぐに書き込み完了して円グラフのようなものが出る。うまくいってない感じだったら(Forcing reset using 1200bps open/close on COM(番号) から先に進まない感じだったら) しばらく待ってエラーが出るのを待って、タイミング勝負と書いたところからやり直し。
    • ホストPCで使うコンフィグは、Dualshock4.xmlを使う。ただし、このファイルを修正して、最後の方にある<axis_map>の3番目と4番目のmultiplierをマイナス倍すること。これでRスティックの入力が逆方向になる。
      • <axis_map>
      • <axis id="rel_axis_0" label="">
      • <device type="joystick" id="0" name="PS4 Controller"/>
      • <event type="axis" id="0" dead_zone="0" multiplier="0.004" exponent="1.00" shape="Circle"/> </axis> <axis id="rel_axis_1" label=""> <device type="joystick" id="0" name="PS4 Controller"/> <event type="axis" id="1" dead_zone="0" multiplier="0.004" exponent="1.00" shape="Circle"/> </axis> <axis id="rel_axis_2" label="">
      • <device type="joystick" id="0" name="PS4 Controller"/>
      • <event type="axis" id="2" dead_zone="0" multiplier="-0.004" exponent="1.00" shape="Circle"/>
      • </axis>
      • <axis id="rel_axis_3" label="">
      • <device type="joystick" id="0" name="PS4 Controller"/>
      • <event type="axis" id="3" dead_zone="0" multiplier="-0.004" exponent="1.00" shape="Circle"/>
      • </axis>
      • <axis id="abs_axis_13" label="">
      • <device type="joystick" id="0" name="PS4 Controller"/>
      • <event type="axis" id="4" dead_zone="0" multiplier="0.008" exponent="1.00" shape="Circle"/>
      • </axis>
      • <axis id="abs_axis_14" label="">
      • <device type="joystick" id="0" name="PS4 Controller"/>
      • <event type="axis" id="5" dead_zone="0" multiplier="0.008" exponent="1.00" shape="Circle"/>
      • </axis>
      • </axis_map>