DualSenseをArduino-ESP32でBT接続する方法を調査中【12/31記事目】

こんにちは。

本記事は、DualSenseのコントローラをロボットに応用すべく、Arduino ESP32で接続する方法を調査したことの備忘録です。Arduino-ESP32にこだわるべきでないかもしれませんが、今までESP-IDFで開発した経験がほぼなく、実装してきたプログラムをどの程度簡単に移行できるか不明なため、慣れ親しんだ環境のまま開発できる術を探しています。

ume-boshi.hatenablog.jp

DualSenseのハッキング情報

有線でのUSB HID操作

DualSenseのリバースエンジニアリングについては、発売されてからすぐに行われていました。しかし、基本的にはコントローラの分解とHW構成の調査、有線でのハッキングしか検証されていなかったようです。

検索して一番上に表示されるDualSenseのリバースエンジニアリングです。ここでは、DualSenseの分解と、有線でUSB HIDとしてのハッキングを行い、フルカラーLEDsを制御したものになります。

sensepost.com

Haptic Feedbackの素子

Haptic Feedbackの素子をハッキングして、「Doom」という音楽を再生した人もいます。USB HIDとして制御しているというよりは、PC接続時にスピーカーとして認識させられたので、単純に音源を送りつけているようです。そもそもHaptic Feedbackの仕組み自体がスピーカーの振動子部分を用いているので、このハッキング方法は理にかなっている気がしますね。
音源が振動パターンを作り出しているということは、BT接続で制御する際には音源をストリーミングせねばならないのかもしれません。BT接続でHaptic Feedbackをハッキングした前例がないのが頷けます。。。

www.reddit.com

youtu.be


ESP-IDFを用いた方法

私が確認した限りではESP32でBluetooth HIDを使用できているのは、Arduino IDE側のBluetoothSerialを用いたものと、ESP-IDF環境でのものだけでした。Blynkもあるか。 ESP-IDFのほうでは、BlueHackというライブラリがあるため、DualSenseにBT接続する術があるようです。私が既に見つけたESP-IDFでコンパイルする系のリポジトリは「Bluepad32」と「BlueRetro」の2つがあります。DualShockを接続した実例があるのはESP-IDF環境のみであり、どう接続しているか内容を見ていく必要があるかもしれません。。。

Bluepad32

Bluepad32のほうはDualShock系からNintendo系やらのコントローラを含み、14個のデバイスに接続対応しているようです。
Bluepad32のGitLabと動作動画 ↓

gitlab.com

youtu.be

BlueRetro

BlueRetroについては、レトロゲームの複数対戦をするための(?)ハブとして、これまた大量のコントローラに対応しているようです。もちろんDualSenseにも対応済みでした。
BlueRetroのGithubとHackaDay.io, 動作動画 ↓

github.com

hackaday.io

youtu.be


その他参考になりそうなもの

USB HIDのシールドとBluetoothドングルを使用している例がありました。これが案外楽に実装できるんじゃないかと思っていましたが、既に実装された方がいて驚きです。すばらしい。

youtu.be

DualSenseと接続しているわけではありませんが、この記事を参考にするのが一番Arduino-ESP32環境下での実装で成功しそうです。BluetoothSerial.hを用いて実装しておられます。ちょっと記事が古いのでバージョン違いで苦労するかもしれませんが。

qiita.com

個人的な妄想

私が考えるESP32以外での実装方法として簡単そうなのは2つあり、1つ目はDualSenseからの信号を受け取るためだけの基板を1つ作ってしまうことで、2つ目はRasPi Nanoとかを有線で一度介して実装することです。
1つ目の方法では、Bluepad32などに手を加えて、I2CやSPI通信などに対応させれば済みます。ただ、基板の領域がデカくなるのが難点。わざわざマイコンを分けるのはナンセンスな気もします。
2つ目の方法では、DualSenseに直接RasPi Nanoを有線接続して、USB HIDとしてデータ取得する方法です。有線接続するということは音源操作も可能であり、Haptic Feedbackのほうもうまく制御できる可能性があります。問題はケーブル接続部の耐久性とバッテリーの重さですかね。


既に試したこと

脳死プレイで既に試したこと ↓ です。

  • モケムギさんのBLE HIDでは接続できなかった。DualSenseはBluetooth Classicだから、当然のごとく無理なのか。その当然がわからない私は無能。。。
    qiita.com

  • PS3Controllerのライブラリを単純に使うだけでも不可でした。sixaxis pair toolもDualsenseを認識できませんでした。もうちょっと試すべきかもしれません。
    qiita.com

  • BluetoothSerial.hを用いて勝手に接続されないか試す → DualSenseが接続の意思を見せない。


おわりに

脳死状態で何かを成し遂げることは無理でした。今後は下記の項目について動作を試そうと考えています。

  • esp32_gamepad.hを試す(内部的にはBluetoothSerialを用いているっぽい)
  • BluePad32をArduino IDE仕様に移行してみる(しんどぴよ)