goo blog サービス終了のお知らせ 

レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

スマホで使えるBluetoothゲームパッドが簡単に作れた

2025年04月17日 | 電子工作

機種変更して電話として使わなくなったスマホがあるのですが、インターネットに繋ぐことも少なくなったのでセキュリティ面を気にすることなく(Google Playストアを通さない)野良アプリや野良エミュレータを入れて使っています。それらの中にopenMSXがあり、以前検証に使ったMSXPLAYerから吸い出したゲームROMを、スマホのopenMSXでも動かしていました。が、ほとんどのゲームがアクション系なのでタッチパネルでの操作では難しかったです。Bluetoothキーボードで遊ぶことも出来るのですが、キーボードは手に持って操作できないし場所をとるので遊びにくいんですよね。

なのでスマホで使えるBluetoothゲームパッドが欲しいと思いましたが、わざわざ市販品を購入するほど遊んでいる訳でもないので自作することにしました。ESP32のBluetoothで何とかなると思ったからです。

調べてみるとESP32-BLE-Gamepadという便利なライブラリがありました。このライブラリを導入するだけで簡単にBluetoothゲームパッドが作れます。

今回ゲームパッド本体にするのは、以前ESP32のゲームボーイエミュレータ向けに作ったI2C接続のゲームパッドです。スマホに合わせて小さなパッドにしたかったのと、配線が少なくて済むからです。

使用するマイコンはM5 StampS3です。小さくて扱いやすいですからね。

StampS3とゲームパッドの配線はI2Cをつなぐだけですし、電源はStampS3のUSBコネクタから供給します。

以下はPlatformIO向けのプログラムですが、Arduino IDEでも利用できると思います。(このブログでは行末に半角">"が入力できないので全角">"を使っています)

  • #include <Arduino.h>
  • #include <Wire.h>
  • #include <BleGamepad.h>
  •  
  • #define PAD_ADDR 0xF
  •  
  • BleGamepad blePad;
  •  
  • void setup() {
  •   Wire.begin();
  •  
  •   BleGamepadConfiguration config;
  •   config.setButtonCount(4);
  •   config.setHatSwitchCount(1);
  •   config.setWhichAxes(false,false,false,false,false,false,false,false);
  •   blePad.begin(&config);
  • }
  •  
  • void loop() {
  •   uint8_t padD;
  •  
  •   if(Wire.requestFrom(PAD_ADDR, 1) > 0)
  •   while(Wire.available())
  •   {
  •     padD = Wire.read();
  •     if((padD & 0b10000000) != 0)
  •       blePad.press(BUTTON_1);
  •     else
  •       blePad.release(BUTTON_1);
  •  
  •     if((padD & 0b1000000) != 0)
  •       blePad.press(BUTTON_2);
  •     else
  •       blePad.release(BUTTON_2);
  •     
  •     if((padD & 0b100000) != 0)
  •       blePad.press(BUTTON_3);
  •     else
  •       blePad.release(BUTTON_3);
  •     
  •     if((padD & 0b10000) != 0)
  •       blePad.press(BUTTON_4);
  •     else
  •       blePad.release(BUTTON_4);
  •     
  •     if((padD & 0b1000) != 0)
  •       blePad.setHat1(HAT_UP);
  •     else if((padD & 0b100) != 0)
  •       blePad.setHat1(HAT_DOWN);
  •  
  •     if((padD & 0b10) != 0)
  •       blePad.setHat1(HAT_LEFT);
  •     else if((padD & 1) != 0)
  •       blePad.setHat1(HAT_RIGHT);
  •     
  •     if((padD & 0b1111) == 0)
  •       blePad.setHat1(HAT_CENTERED);
  •   }
  • }

platformio.ini

  • [env:m5stack-stamps3]
  • platform = espressif32
  • board = m5stack-stamps3
  • framework = arduino
  • board_upload.flash_size = 8MB
  • board_build.partitions = app3M_fat5M.csv
  • lib_deps = lemmingdev/ESP32-BLE-Gamepad@^0.7.4

app3M_fat5M.csv

  • nvs, data, nvs, 0x9000, 0x5000,
  • otadata, data, ota, 0xe000, 0x2000,
  • app0, app, ota_0, 0x10000, 0x300000,
  • ffat, data, fat, 0x310000, 0x4E0000,
  • coredump, data, coredump, 0x7F0000, 0x10000,

上記のapp3M_fat5M.csvはお好みで変更してください。

使用方法は特に難しくありません。スマホでBluetoothを有効にしたらStampS3に電源を入れ、表示される"ESP32 BLE Gamepad"デバイスを選択するだけです。

後はエミュレータ側でコントローラーの設定を行います。openMSXの場合は何も設定せずに使えました。

ブレッドボードには回路と言えるほどのものは組んでいないので、ちっちゃな基板に納めれば邪魔になりません。

StampS3にバッテリーをつなげば持ち歩きも可能ですね。