整理をしていたら懐かしいコントローラーがでてきたので、動かしてみました。
ハード作成
プレステのコントローラーを接続するためのコネクタを作成します。
今回は、以下のソケットを使用しています。
配線
ソケットとM5Stack Core2との配線はこんな感じにします。
上記のソケットだと、8番は端子がありません。
3番は、振動用の電源で、7~9Vの入力が必要ですので、今回は使っていません。
1番と、6番は、1kΩのプルアップ抵抗を入れてます。
- Data
- Command
- Vibration
- GND
- 3.3V
- Attention
- Clock
- Unkown
- Acknowledge
くみ上げるとこんな感じ
不格好ですが、配線するとこんな感じです。
ソケットは、グルーガンで固定しています。
ソフトウェア
今回使用するライブラリはこちら。
ちょっと修正
このライブラリそのまま使用すると動作しないので、少し修正します。
ESP32環境向けの修正
PS2X_lib.h
と、PS2X_lib.cpp
で以下のESP8266
と指定されている部分に、ESP32
を追加します。
#ifdef ESP8266
#if defined (ESP8266) || defined(ESP32)
アナログ接続時の処理を追加
このライブラリは、アナログでの通信が前提となっているようです。
デジタルで動作する機器(今回だとBMコントローラー)の場合、取得データの確認処理に時間がかかる現象が発生していました。
そこで、デジタル機器の場合は、チェックを無効にする処理を追加します(一応動いてます)
通信に関して詳しく調べたい方はこちらをどうぞ
データのチェックで、デジタル(0x40)の場合も、終了対象とする処理を追加します。
変更箇所
if ((PS2data[1] & 0xf0) == 0x70 || (PS2data[1] & 0xf0) == 0x40)
break;
次に、アナログではない場合、取得の速度調整する処理があるので、デジタルの場合は、無効にします。
変更箇所
if ((PS2data[1] & 0xf0) != 0x70 && (PS2data[1] & 0xf0) != 0x40) {
if (read_delay < 10)
read_delay++; // see if this helps out...
}
関数の戻り判定にも追加します。
変更箇所
return ((PS2data[1] & 0xf0) == 0x70 || (PS2data[1] & 0xf0) == 0x40);
PS2X_Libについて
ボタンの取得
read_gamepad
で、現在のボタンの情報を取得します。
※上記のデジタル対応をしないと、500msくらい処理時間がかかります。。
void read_gamepad();
各ボタンの状態を取得する方法は4種類あります。
// 現在ボタンの状況を取得することができます。
boolean Button(uint16_t);
// ボタンの状態が変化したかどうかを取得することができます。
boolean NewButtonState(unsigned int);
// ボタンが押されたかどうかを取得することができます。
boolean ButtonPressed(unsigned int);
// ボタンが離されたかどうかを取得することができます。
boolean ButtonReleased(unsigned int);
引数は、確認したいボタンの種類です
#define PSAB_PAD_RIGHT 9
#define PSAB_PAD_UP 11
#define PSAB_PAD_DOWN 12
#define PSAB_PAD_LEFT 10
#define PSAB_L2 19
#define PSAB_R2 20
#define PSAB_L1 17
#define PSAB_R1 18
#define PSAB_GREEN 13
#define PSAB_RED 14
#define PSAB_BLUE 15
#define PSAB_PINK 16
#define PSAB_TRIANGLE 13
#define PSAB_CIRCLE 14
#define PSAB_CROSS 15
#define PSAB_SQUARE 16
サンプルを動かす
PSX2Libのサンプルを修正して、動作を見てみます。
GPIOを、M5Stack Core2用に変更します。
#define PS2_DAT 27
#define PS2_CMD 19
#define PS2_SEL 32
#define PS2_CLK 33
動かすと、こんな感じでログが出力されます。
BMコントローラーを動かしているので、Unknown Controller Type
と出力されてますが、動作はします。
活用してみる
BMコントローラの配置
BMコントローラの配置はこんな感じです
ターンテーブル部分は、右周りで、上ボタン、左回りで下ボタン入力として認識されます。
- L1ボタン
- R1ボタン
- □ボタン
- ×ボタン
- 〇ボタン
- 右回りが上ボタン、左回りが下ボタン
- SELECTボタン
- STARTボタン
toioと連携
折角なのでSONYさんのtoioを動かしてみました。
操作は、6番のターンテーブルを右に回すと前進、左に回すと後進です。
1番のボタンを押すと、左に、2番のボタンを押すと右に曲がります。
3~5番のボタンは、曲がるときに角度が変化し、すべて押すとスピンします。
操作するとこんな感じに。
※【ご注意】Twitterで投稿した使用ライブラリが違ってました。。
まとめ
プレステ用のソケットを手に入れることができれば、あとは簡単にできるかなと思います。
今回は、BMコントローラーを使いましたが、ほかにもあるので機会があれば活用してみようと思います。