esp32とps3でリモコン戦車をつくる。

 

PS3コントローラとesp32はBLTを使って行う。

このため、ESP32のアドレスをPS3コントローラに書き込む必要がある。

1)ESP32のアドレスを取得する

2)PS3にESP32のアドレスを書き込む

3)PS3で動かすプログラムをESP32に書き込む

4)PS3をBLTでつなぐ

5)試運転

の順に作業を進める。

 

1)ESP32のアドレスを取得する方法

スケッチ例のPs3Addressをesp32で書き込んで実行するとアドレスがシリアルモニターに表示される予定だったのだけど。

今は使えなくなっていた。

 

Ps3Addressのプログラム

#include <Ps3Controller.h>

void setup()
{
    Serial.begin(115200);
    Ps3.begin();
    String address = Ps3.getAddress();
    Serial.print("The ESP32's Bluetooth MAC address is: ");
    Serial.println(address);
}

void loop()
{

}

 
代わりに「GetMacAddress」というサンプルプログラムが用意されていた。
これで確認できます。
#include "esp_mac.h"  // required - exposes esp_mac_type_t values

void setup() {

  Serial.begin(115200);
  while (!Serial) {
    delay(100);
  }

  Serial.println("Interface\t\t\t\t\t\tMAC address (6 bytes, 4 universally administered, default)");

  Serial.print("Wi-Fi Station (using 'esp_efuse_mac_get_default')\t");
  Serial.println(getDefaultMacAddress());

  Serial.print("WiFi Station (using 'esp_read_mac')\t\t\t");
  Serial.println(getInterfaceMacAddress(ESP_MAC_WIFI_STA));

  Serial.print("WiFi Soft-AP (using 'esp_read_mac')\t\t\t");
  Serial.println(getInterfaceMacAddress(ESP_MAC_WIFI_SOFTAP));

  Serial.print("Bluetooth (using 'esp_read_mac')\t\t\t");
  Serial.println(getInterfaceMacAddress(ESP_MAC_BT));

  Serial.print("Ethernet (using 'esp_read_mac')\t\t\t\t");
  Serial.println(getInterfaceMacAddress(ESP_MAC_ETH));
}

void loop() { /* Nothing in loop */ }

String getDefaultMacAddress() {

  String mac = "";

  unsigned char mac_base[6] = {0};

  if (esp_efuse_mac_get_default(mac_base) == ESP_OK) {
    char buffer[18];  // 6*2 characters for hex + 5 characters for colons + 1 character for null terminator
    sprintf(buffer, "%02X:%02X:%02X:%02X:%02X:%02X", mac_base[0], mac_base[1], mac_base[2], mac_base[3], mac_base[4], mac_base[5]);
    mac = buffer;
  }

  return mac;
}

String getInterfaceMacAddress(esp_mac_type_t interface) {

  String mac = "";

  unsigned char mac_base[6] = {0};

  if (esp_read_mac(mac_base, interface) == ESP_OK) {
    char buffer[18];  // 6*2 characters for hex + 5 characters for colons + 1 character for null terminator
    sprintf(buffer, "%02X:%02X:%02X:%02X:%02X:%02X", mac_base[0], mac_base[1], mac_base[2], mac_base[3], mac_base[4], mac_base[5]);
    mac = buffer;
  }

  return mac;
}
 
2)PS3にESP32のアドレスを書き込む

PS3にこのアドレスを下記のソフトを使って書き込む。

下記以外にも書き込みソフトはあるらしい。

 

①下記をにPCにダウンロードする。

Download SixaxisPairTool by Dancing Pixel Studios
https://sixaxispairtool.software.informer.com/download/

 

②PCとPS3のコントローラを有線でつなぐ。

③ダウンロードした書き込みソフトを実行する。

④入手したESP32のアドレスを書き込む

 

 

3)PS3で動かすプログラムをESP32に書き込む

動かすプログラムは下記。

だけど、前回のをそのままだとエラーになるので、変数の宣言とsetupは変更。

 

//*****************************************************

#include <Ps3Controller.h>

 

int RY,LY;

uint8_t LY1=14;

uint8_t LY2=27;

uint8_t RY1=25;

uint8_t RY2=26;

int R_SPEED,L_SPEED;

uint32_t freq=12800;

uint8_t res=8;
 

void  setup()

{

    pinMode(LY1,OUTPUT);

    pinMode(LY2,OUTPUT);

    pinMode(RY1,OUTPUT);

    pinMode(RY2,OUTPUT);

    Serial.begin(115200);

    Ps3.begin("*:*:*:*:*:*"); //1.でメモしたmac adresに修正

    Serial.println("Ready");

   

    ledcAttach(LY1, freq, res);//pwm信号 ledcSetup(ピン番号, 周波数, 分解能)

    ledcAttach(LY2, freq, res);//pwm信号

    ledcAttach(RY1, freq, res);//pwm信号

    ledcAttach(RY2, freq, res);//pwm信号  

}

void  loop()
{
  if  (Ps3.isConnected()){
    if (Ps3.data.button.ps){
    Serial.println("ps ボタン圧下");
    } 
    LY= Ps3.data.analog.stick.ly;
    RY= Ps3.data.analog.stick.ry;
    L_SPEED=map(LY,-127,127,-250,250);
    R_SPEED=map(RY,-127,127,-250,250);

//left speed
    if (abs(L_SPEED)<=50){
      ledcWrite(1,0); 
      ledcWrite(0,0);  
      Serial.print("L_SPEED1, ");
      Serial.print(L_SPEED);          
    }
    else if (L_SPEED>50){
      ledcWrite(1,0);  
      ledcWrite(0,abs(L_SPEED)); 
      Serial.print("L_SPEED2, ");
      Serial.print(L_SPEED);        
    }
    else {
      ledcWrite(0,0);  
      ledcWrite(1,abs(L_SPEED));
      Serial.print("L_SPEED3, ");
      Serial.print(L_SPEED);    
    }
    
//right speed    
      if (abs(R_SPEED)<=50){
      ledcWrite(2,0);    
      ledcWrite(3,abs(R_SPEED)); 
      Serial.print(",R_SPEED1, ");
      Serial.println(R_SPEED);
    }
    else if (R_SPEED>50){
      ledcWrite(3,0);    
      ledcWrite(2,abs(R_SPEED)); 
      Serial.print(",R_SPEED2, ");
      Serial.println(R_SPEED);
    }
    else {
      ledcWrite(2,0);
      ledcWrite(3,abs(R_SPEED));  
      Serial.print(",R_SPEED3, ");
      Serial.println(R_SPEED);    
    }
  }
}

 

4)PS3をBLTにつなぐ

PS3コントローラのPSボタンを押すと接続できる。

 

5)試運転

少し動かしたらバッテリーが過放電したみたいで使えなくなった。