【ESP32】Bluetooth対応無線ゲームコントローラーの作り方

マイコン/Arduino

以前、Arduino互換ProMicroを使ってゲームコントローラーを作る方法を紹介しましたが、今回はESP32のBluetooth機能を使って無線式のゲームコントローラーを自作する方法を紹介します。今回は1ボタンのみの簡単なものです。

用意するもの

ESP32開発ボード、スイッチ、電線等が必要です。

現状ではお勧めのLOLINのESP32開発ボードが長期にわたって欠品しているようです。自分で試していないので強くお勧めはできませんが、以下の商品であればリチウムイオンバッテリーの充放電回路まで1ボードに乗っているようです。
https://amzn.to/46C19V4
また、海外通販に抵抗のない方であれば以下のリンク先の商品は動作を確認しています。
https://ja.aliexpress.com/item/1005005327112225.html
ただし、2つあるGNDのうち、1つが繋がっていないなどちょっとアヤシげではあります。

ArduinoIDEの準備

ボード追加

[ファイル]-[環境設定]で、追加のボードマネージャーに以下のURLを追加

https://dl.espressif.com/dl/package_esp32_index.json

ESP32ボードマネージャー設定

ボードの設定

ESP32_ボード設定

ライブラリ追加

ArduinoIDEのライブラリ管理で”ESP32-BLE-Gamepad”を検索して、インストールします。

ESP32BLEライブラリ

回路図

こんな感じでボタンを接続してください。(ボードによって形状やピン配置が異なるので適宜)

今回の例では押ボタンスイッチを12番ピンとGNDに接続しています。

ESP32とボタンの配線図

スケッチ

細かい設定は抜きにして、これでとりあえず動くはずです。

#include <Arduino.h>
#include <BleGamepad.h> // https://github.com/lemmingDev/ESP32-BLE-Gamepad

#define numOfButtons 1
BleGamepad bleGamepad("GamePad01");
const int InputPin=12;

void setup()
{
 //ピン設定
  pinMode(InputPin, INPUT_PULLUP);

 //ゲームパッド設定
  BleGamepadConfiguration bleGamepadConfig;
  bleGamepadConfig.setAutoReport(false);
  bleGamepadConfig.setControllerType(CONTROLLER_TYPE_MULTI_AXIS);
  bleGamepadConfig.setButtonCount(numOfButtons); 
  bleGamepad.begin(&bleGamepadConfig);
}

void loop()
{
  if (bleGamepad.isConnected())
  {
    if (digitalRead(InputPin) == 0 ) bleGamepad.press(1);
    else
    {
      bleGamepad.release(1);
    }
    bleGamepad.sendReport();
  }
  delay(1);
}

 

接続設定、動作確認

Windowsの場合、[bluetoothデバイスの追加]で新規デバイスを検索すれば、”GamePad01″というデバイスが見つかるはずです。

デバイスの追加

正常に接続できれば、”USBゲームコントローラーの設定”の中にでてきます。

プロパティをクリックして動作確認ができます。

接続が完了しても”USBゲームコントローラーの設定”の中に表示されないことがあります。
この場合は以下のリンク先を参照してレジストリを削除するか、”CONTROLLER_TYPE_MULTI_AXIS”の部分を別のタイプのコントローラーに変更すると改善されることがあります。ただ、この画面で認識されていない場合でも実際のゲーム上では認識されていることがほとんどです。
Arduinoでゲームコントローラーのデバイス名を設定する
Arduinoでゲームコントローラーを作るときのデバイス名設定方法とはまりやすいポイントを説明します。

おすすめの開発ボード

Bluetoothを使った無線式ゲームコントローラーなので、電源も内蔵式にしたいところです。先に紹介したESP開発ボードは、ピン数は少ないもののコンパクトでリチウムイオンバッテリーの充放電制御回路まで内蔵されています。以下のバッテリーならばESP32基板上のコネクタにそのままさせます。(ただし、極性の入れ替えが必要なので要確認!)

コメント