2026年4月1日水曜日

ESP32 - Bluepad32 ロボカー PS4コントローラー操作

 Bluetooth (Classic / BLE)対応のBluepad32ライブラリー使用して、無印ESP32制御ロボットカーを純正PS4コントローラーで操作しました。
(Xboxコントローラーに入替て操作出来ます)














動画


参考サイト
●ESP32-C3をXBOXコントローラーから操作する
●M5Stack / ESP32とゲームコントローラの接続いろいろ


回路図


















純正PS4コントローラー
PSボタンを押してペアリング














PS4コントローラー
【MODEL CUH-ZCT2J】
技適製品





ESP-32開発ボード
●ESP32 NodeMCU開発ボード2.4GHz WiFi + Bluetoothデュアルモード(技適製品)
アマゾン購入


















ボードマネージャ
追加のボードマネージャー
【https://raw.githubusercontent.com/ricardoquesada/esp32-arduino-lib-builder/master/bluepad32_files/package_esp32_bluepad32_index.json】

【ツール】【ボード】【ボードマネージャ】【bluepad32】
















ボードマネージャ【ESP32 Arduino + Bluepad32】
ボード【ESP32 Dev Module】選択

プログラム Arduino IDE  【ESP32 Arduino + Bluepad32】【ESP32 Dev Module】
#include <Bluepad32.h>
ControllerPtr myControllers[BP32_MAX_GAMEPADS];

void onConnectedController(ControllerPtr ctl) {
 bool foundEmptySlot = false;
 for (int i = 0; i < BP32_MAX_GAMEPADS; i++) {
 if (myControllers[i] == nullptr) {
  Serial.printf("CALLBACK: Controller is connected, index=%d\n", i);
  ControllerProperties properties = ctl->getProperties();
  Serial.printf("Controller model: %s, VID=0x%04x, PID=0x%04x\n", ctl->getModelName().c_str(), properties.vendor_id, properties.product_id);
  myControllers[i] = ctl;
  foundEmptySlot = true;
  break;
  }
 }
 if (!foundEmptySlot) {
  Serial.println("CALLBACK: Controller connected, but could not found empty slot");
 }
}

void onDisconnectedController(ControllerPtr ctl) {
 bool foundController = false;

 for (int i = 0; i < BP32_MAX_GAMEPADS; i++){
  if (myControllers[i] == ctl){
   Serial.printf("CALLBACK: Controller disconnected from index=%d\n", i);
   myControllers[i] = nullptr;
   foundController = true;
   break;
  }
 }
 if (!foundController) {
   Serial.println("CALLBACK: Controller disconnected, but not found in myControllers");
 }
}
void processGamepad(ControllerPtr ctl) {
 if (ctl->a()) Back() ;
 if (ctl->b()) Right();
 if (ctl->x()) Left();
 if (ctl->y()) Go();
 if (ctl->dpad()& DPAD_UP) Go();
 if (ctl->dpad()& DPAD_DOWN) Back();
 if (ctl->dpad()& DPAD_LEFT) Left();
 if (ctl->dpad()& DPAD_RIGHT) Right();
}

void processControllers() {
 for (auto myController : myControllers) {
  if (myController && myController->isConnected() && myController->hasData()) {
   if (myController->isGamepad()) {
    processGamepad(myController);
   }
   else {
    Serial.println("Unsupported controller");
   }
  }
 }
}

const int motorR2 = 21;  //AI1
const int motorR1 = 22;  //AI2
const int motorRp = 23;  //PWMA
const int motorL2 = 17;  //BI2
const int motorL1 = 18;  //BI1
const int motorLp = 16;  //PWMB
const int STBY = 19;  //STBY

void Go() {
  digitalWrite( motorLp, HIGH );
  digitalWrite( motorL1, HIGH );
  digitalWrite( motorL2, LOW );
  digitalWrite( motorRp, HIGH );
  digitalWrite( motorR1, HIGH );
  digitalWrite( motorR2, LOW );
}
void Back(){
  digitalWrite( motorLp, HIGH );
  digitalWrite( motorL1, LOW );
  digitalWrite( motorL2, HIGH );
  digitalWrite( motorRp, HIGH );
  digitalWrite( motorR1, LOW );
  digitalWrite( motorR2, HIGH );  
}
void Stop(){
  digitalWrite( motorLp, LOW );
  digitalWrite( motorRp, LOW );
}
void Right(){
  digitalWrite( motorLp, HIGH );
  digitalWrite( motorL1, HIGH );
  digitalWrite( motorL2, LOW );
  digitalWrite( motorRp, HIGH );
  digitalWrite( motorR1, LOW );
  digitalWrite( motorR2, HIGH );  
}

void Left(){
  digitalWrite( motorRp, HIGH );
  digitalWrite( motorR1, HIGH );
  digitalWrite( motorR2, LOW );
  digitalWrite( motorLp, HIGH );
  digitalWrite( motorL1, LOW );
  digitalWrite( motorL2, HIGH );
}
 
void setup()
{  
 Serial.begin(115200);
 Serial.printf("Firmware: %s\n", BP32.firmwareVersion());
 const uint8_t* addr = BP32.localBdAddress();
 Serial.printf("BD Addr: %2X:%2X:%2X:%2X:%2X:%2X\n", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);

 // Setup the Bluepad32 callbacks
 BP32.setup(&onConnectedController, &onDisconnectedController);
 BP32.forgetBluetoothKeys();
  pinMode( motorL1, OUTPUT );
  pinMode( motorL2, OUTPUT );
  pinMode( motorLp, OUTPUT );
  pinMode( motorR1, OUTPUT );
  pinMode( motorR2, OUTPUT );
  pinMode( motorRp, OUTPUT );
  pinMode( STBY, OUTPUT );
   
  digitalWrite( motorL1, LOW );
  digitalWrite( motorL2, LOW );
  digitalWrite( motorLp, LOW );
  digitalWrite( motorR1, LOW );
  digitalWrite( motorR2, LOW );
  digitalWrite( motorRp, LOW );
  digitalWrite( STBY, HIGH );
  }
 
void loop()
{  
 bool dataUpdated = BP32.update();
 if (dataUpdated) processControllers();
   delay(200);
  Stop();
 
 
}
 



0 件のコメント:

コメントを投稿

ESP32 - Bluepad32 ロボカー PS4コントローラー操作

  Bluetooth (Classic / BLE)対応の Bluepad32ライブラリー使用して、 無印E SP32制御ロボットカーを純正PS4コントローラーで操作しました。 (Xboxコントローラーに入替て操作出来ます) 同ブログ【 ESP32 - Bluepad32 PS...