esp32とps3でリモコン戦車をつくる。
PS3コントローラとesp32はBLTを使って行う。
このため、ESP32のアドレスをPS3コントローラに書き込む必要がある。
1)ESP32のアドレスを取得する
2)PS3にESP32のアドレスを書き込む
3)PS3で動かすプログラムをESP32に書き込む
4)PS3をBLTでつなぐ
5)試運転
の順に作業を進める。
スケッチ例の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()
{
}
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;
}
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)試運転
少し動かしたらバッテリーが過放電したみたいで使えなくなった。