2022年10月30日日曜日

ESP32でDUALSHOCK3を使ってみた

 というわけで前回修理したPS3コントローラをESP32で使ってみた。

PS3コントローラはBluetoothなんだけど、PS3本体とペアリングするときはUSBで本体に接続してペアリングされる。どうやらコントローラ内部にホストのMACアドレスを記録させてるみたい。

ESP32とペアリングするときも同様でESP32のBluetoothのMACアドレスとPS3コントローラ内部に登録されているMACアドレスが同じにならないといけない。というわけでPS3コントローラをUSBでPCに繋いでMACアドレスを登録、もしくは確認する必要があるっぽい。

そこで必要なツールがSixaxisPairTool 0.3.1
PS3コントローラ自体結構古いのでリンクが切れていることが多かったのでこちらからダウンロードさせてもらった。

インストールしてSixaxisPairToolを起動してPS3コントローラを差し込むと自動でドライバがインストールされてMACアドレスの表示、書き換えが可能になる。

Current Masterが現在コントローラに登録されているマスターのMACアドレス。ESP32のMACアドレスをこれに変更してもいいし、Change MasterにESP32のMACアドレスを入れてUpdateしても良い。どっちもやってみたんだけど、ESP32を変えるたびにこのツールで書き換えるのも面倒なので適当なMACアドレスを書き込んでおいてESP32側のMACアドレスを変更したほうが便利かも。unicast MACじゃないとESP32側で怒られるので適当なMACアドレスを作りたい場合はRandom MAC Address Generatorとかを使うといいかも。

とりあえず上記の様な適当なMACアドレスを書き込んだらArduino IDE側の設定。今回はESP32 Arduino Core 2.0.5を使用した。(Arduino IDEはWindows Store 1.8.57)
スケッチ→ライブラリをインクルード→ライブラリマネージャーを開いて
PS3 Controller Hostを検索してインストールする。
これでArduino IDE側の準備は完了。とりあえずサンプルスケッチのPS3Demoを動かしてみる。
Ps3.begin("01:02:03:04:05:06");
のところをさっきコントローラーに書き込んだMACアドレスに変更する。(大文字小文字は関係ない)
ちなみにこの01:02:03:04:05:06はunicast MACじゃないのでSixaxis Pair ToolでこのMACアドレスを書き込んでもペアリング出来ないとおもう。

今回は1a:3c:13:00:21:c2をコントローラに記録したので
Ps3.begin("01:02:03:04:05:06");
Ps3.begin("1a:3c:13:00:21:c2");
に変更した。

Sixaxis Pair ToolでESP32のBluetoothのMACアドレスを書き込む場合はサンプルスケッチの中にPs3Address.inoがあるのでそれをESP32に書き込んでシリアルコンソールからESP32のBluetooth MACアドレスが確認できる。そのMACを先程のSixaxis Pair Toolでコントローラに登録すればオッケー。
その場合はESP32のMACアドレスを書き換えなくて良いので
Ps3.begin("01:02:03:04:05:06");
のところを
Ps3.begin();
のように変更する。

変更したサンプルスケッチをESP32に書き込んで、PSボタンを押すと接続されてコントローラのLEDが変化するはず。
もしLED4個が同時に点滅してなかなかつながらない場合はツールのボード設定のところの"Erase All Flash Before Sketch Upload"をEnableにすると良い。自分はここでハマった。ESP32 Arduino Coreのバージョンを1.0.4とかに下げるとうまくつながるんだけど2.0.4とか2.0.5で接続できなくて、いろいろ試していた結果一旦すべてのFlashをクリアすると治るっぽい。2.0.5の状態でいろいろ試してみたが、一回接続されるとFlashをクリアしない設定でもちゃんと繋がるようになった。
それでもつながらない場合は多分MACアドレスの設定をミスっている。(unicast MACじゃないとか)

とりあえず今回はPS3コントローラがESP32で使えるようになった。BLEファームにアップデートしたXbox OneコントローラをBLEで接続するよりも断然ペアリングが早い。コントローラの4つのLEDもESP32側から設定できるっぽい。

Wiiのヌンチャクもi2c接続なので便利なんだけど、550円でBluetoothとバッテリ搭載されててESP32とそのまま通信できるならPS3コントローラのほうがコスパいいかもしれない。

メカナムラジコンの改造さっさと完成させてこのコントローラで遊んでみたいな。

2022年10月29日土曜日

ジャンクなDUALSHOCK3を修理してみた

 ESP32でXbox OneコントローラをBLEでつなぐとやっぱり接続までの時間がかかるのでPS3とかPS4のコントローラを試したくて探していたんだけど、550円でジャンク品のPS3コントローラを見つけたので買ってみた。

数件回ってみたけど、PS3コンが1000円ぐらい、PS4コンが2200円ぐらいが最安な感じだった。(スティックが中心に戻らないやつとかボタンの感触が悪いやつでも)
そんな中で見つけた550円のジャンク品。○と✕ボタンが多少削れているし、ハウジングに隙間が開いている。
R側にかなり隙間が開いている。ケースが噛み合ってないみたいで押しても閉まらない。ボタンやスティックの感触は悪くなかったので買ってきてみた。

早速分解。すげー汚いので動作確認よりも前に分解してしまった。
中身も結構汚いけど分解した形跡はなさそう。ゴムはボロボロになっていなかったけどだいぶ力強く押されていたのか、ボタンとかスティックのヘリ具合がやばい。白く粉が出ているぐらいだし。ケースが噛み合っていないのもぶん投げたんじゃないのかな…?
とくに左スティックの摩耗が激しかった。スティックの摺動部分はすげーことになってるのにトップのゴムはヘタっていなかったり、使い方が荒いだけで結構新しい感じ。
スティックの摺動部分には溝ができるぐらい削れていた。

一通り洗浄して仮組みの状態でUSBに繋いでみた。まさかのうんともすんとも言わないパターン…
もちろんバッテリは完全放電してそうだったがまさかの充電すらされないとは。バッテリはPHコネクタで、ピン配置もSkyfight Xのバッテリと同じだったのでSkyfightの充電器で充電してみた。(容量が540mAhだったので1C充電未満なので行けるでしょうということで)
バッテリのコネクタめっちゃ硬いのでコネクタの根本をラジペンでこじるようにして外さないとケーブル壊れそう。

バッテリをある程度充電して3.6Vぐらいになって繋いでみるとPSボタンを押すと全部のLEDが点滅するようになった。(10回ぐらいで消える。)基板は生きてそう。
ちなみに基板は小さいタイプだった。スティック部分がフレキになっているタイプ。
VX7なのでだいぶ新しい方かな。
そんでもって基板を外してみると実はMini USBが剥がれかかっていた…
この基板が小さいタイプ、Mini USBが面実装タイプなんだよなぁ…
MSU_VX7_0.04
基板を外して、USB端子の剥がれていた部分(左側のシールド部2箇所)をハンダしてみたけど改善されず。どうやら信号線まで剥がれていそう…
しかし信号線のところはジャイロセンサが垂直に付いてるので一旦外さないとはんだ付けできない。
このそびえ立つジャイロセンサを斜めカットはんだごてで慎重に取り外してみた。
意外と簡単に外れたけどこれ取り付けるの大変そう。
そんでもってMini USB端子の根本のハンダを付け直してまたジャイロセンサをハンダする。
取り付けのほうが難易度たけぇ。ジャイロセンサなのでちゃんと直角を出してハンダしないといけないし。浮いてると曲がってしまうのでちゃんと吸い取り線で平面を出してからハンダしてみた。

組み立ててUSBに繋いでみるとPCでもデバイスとして認識されるし、全部のLEDがゆっくり点滅するようになった。PCにドライバを入れてみるとLEDが消灯して一応ボタンもちゃんと動いていそうだったので無事修理完了。
ケースが浮いていた部分も分解した状態でマイナスドライバーで押したりして修正してはめ直したらある程度ちゃんと戻った。

とりあえず動く様になったので次回は本題のESP32で使用できるか試してみよう。