2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

M5StackでBMコントローラーを動かしてみる

Last updated at Posted at 2021-06-30

整理をしていたら懐かしいコントローラーがでてきたので、動かしてみました。

ハード作成

プレステのコントローラーを接続するためのコネクタを作成します。

今回は、以下のソケットを使用しています。

配線

ソケットとM5Stack Core2との配線はこんな感じにします。

配線図

上記のソケットだと、8番は端子がありません。
3番は、振動用の電源で、7~9Vの入力が必要ですので、今回は使っていません。
1番と、6番は、1kΩのプルアップ抵抗を入れてます。

  1. Data
  2. Command
  3. Vibration
  4. GND
  5. 3.3V
  6. Attention
  7. Clock
  8. Unkown
  9. Acknowledge

くみ上げるとこんな感じ

不格好ですが、配線するとこんな感じです。
ソケットは、グルーガンで固定しています。

DSC_2388.JPG

ソフトウェア

今回使用するライブラリはこちら。

ちょっと修正

このライブラリそのまま使用すると動作しないので、少し修正します。

ESP32環境向けの修正

PS2X_lib.hと、PS2X_lib.cppで以下のESP8266と指定されている部分に、ESP32を追加します。

変更前
#ifdef ESP8266
変更後
#if defined (ESP8266) || defined(ESP32)

アナログ接続時の処理を追加

このライブラリは、アナログでの通信が前提となっているようです。
デジタルで動作する機器(今回だとBMコントローラー)の場合、取得データの確認処理に時間がかかる現象が発生していました。
そこで、デジタル機器の場合は、チェックを無効にする処理を追加します(一応動いてます)

通信に関して詳しく調べたい方はこちらをどうぞ

データのチェックで、デジタル(0x40)の場合も、終了対象とする処理を追加します。
変更箇所

PS2X_lib.cpp(122行目)
if ((PS2data[1] & 0xf0) == 0x70 || (PS2data[1] & 0xf0) == 0x40)
  break;

次に、アナログではない場合、取得の速度調整する処理があるので、デジタルの場合は、無効にします。
変更箇所

PS2X_lib.cpp(131行目)
if ((PS2data[1] & 0xf0) != 0x70 && (PS2data[1] & 0xf0) != 0x40) {
    if (read_delay < 10)
        read_delay++;	// see if this helps out...
}

関数の戻り判定にも追加します。
変更箇所

PS2X_lib.cpp(161行目)
 return ((PS2data[1] & 0xf0) == 0x70 || (PS2data[1] & 0xf0) == 0x40);

PS2X_Libについて

ボタンの取得

read_gamepadで、現在のボタンの情報を取得します。
※上記のデジタル対応をしないと、500msくらい処理時間がかかります。。

PS2X_lib.h
void read_gamepad();

各ボタンの状態を取得する方法は4種類あります。

PS2X_lib.h
// 現在ボタンの状況を取得することができます。
boolean Button(uint16_t);

// ボタンの状態が変化したかどうかを取得することができます。
boolean NewButtonState(unsigned int);

// ボタンが押されたかどうかを取得することができます。
boolean ButtonPressed(unsigned int); 

// ボタンが離されたかどうかを取得することができます。
boolean ButtonReleased(unsigned int);

引数は、確認したいボタンの種類です

PS2X_lib.h
#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用に変更します。

PS2X_Example.ino(9行目)
#define PS2_DAT        27    
#define PS2_CMD        19
#define PS2_SEL        32
#define PS2_CLK        33

動かすと、こんな感じでログが出力されます。
BMコントローラーを動かしているので、Unknown Controller Typeと出力されてますが、動作はします。
ログ

活用してみる

BMコントローラの配置

BMコントローラの配置はこんな感じです
ターンテーブル部分は、右周りで、上ボタン、左回りで下ボタン入力として認識されます。
配置

  1. L1ボタン
  2. R1ボタン
  3. □ボタン
  4. ×ボタン
  5. 〇ボタン
  6. 右回りが上ボタン、左回りが下ボタン
  7. SELECTボタン
  8. STARTボタン

toioと連携

折角なのでSONYさんのtoioを動かしてみました。

操作は、6番のターンテーブルを右に回すと前進、左に回すと後進です。
1番のボタンを押すと、左に、2番のボタンを押すと右に曲がります。
3~5番のボタンは、曲がるときに角度が変化し、すべて押すとスピンします。

操作するとこんな感じに。
※【ご注意】Twitterで投稿した使用ライブラリが違ってました。。

まとめ

プレステ用のソケットを手に入れることができれば、あとは簡単にできるかなと思います。
今回は、BMコントローラーを使いましたが、ほかにもあるので機会があれば活用してみようと思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?