初心者がESP32同士でBluetoothによるワイヤレス通信頑張ったお話

:::note warn
## この記事は全くもっての初心者が書いたものとなります
あまりにも拙い表現、見にくすぎるデザイン、酷すぎるプログラム
などが出てきます。
それでも気分を害されないよ、見てもいいよって方は、温かい目で見てください
また、当初自分は記事を書くとは思ってもいなかったので画像が
圧倒的に少ないです。
:::
## 挨拶
おはようございます。もしくはこんにちは。こんばんはの人もいると思います。
初めてQiitaで記事を書くPols128bと申します。
タイトルにもある通り、ESP32というマイコンボードをArduinoIDEでプログラムいじってBluetooth通信させました。
詳しく書くと、メカナムホイールという特殊な車輪を搭載した自作の電気自動車のコントローラー、レシーバーをプログラムしたESP32で動かしてラジコン作りましょうね〜っていうことをキャンパスフェスティバルの展示に向けてやりました。
## この記事で書くこと
1\. 3Dプリンターによるモデリング
2\. ESP32に記入したプログラム
3\. 実際の制作
4\. 動作確認
5\. 振り返り
6\. 参考にしたサイト、および動画
## 1\. 3Dプリンターによるモデリング
> **利用させていただいたソフトウェア**
Fuison360無料ライセンス

モデリングしたとか大層なこと言ってますけど、結局やったのは仕切りとちょっとタイヤをつけられるように横に穴空いた小っちゃい箱作っただけです。

![スクリーンショット 2024-12-21 235710.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930054/72e18d0b-3720-5ac7-e7bb-49649215694c.png)

## 2\. ESP32に記入したプログラム
> **利用させていただいたソフトウェア**
Arduino IDE

:::note warn
見てられないようなコードですがお許し下さい
:::
プログラム
```C#:Arduino IDE
int LXpin;
int LYpin;
int RXpin;
int RYpin;
int TLX;
int TLY;
int TRX;
int TRY;
char data[32];

#include "BluetoothSerial.h"

//#define USE_NAME  // Comment this to use MAC address instead of a slaveName

// Check if Bluetooth is available
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

// Check Serial Port Profile
#if !defined(CONFIG_BT_SPP_ENABLED)
#error Serial Port Profile for Bluetooth is not available or not enabled. It is only available for the ESP32 chip.
#endif
BluetoothSerial SerialBT;

#ifdef USE_NAME
String slaveName = "ESP32-BT-Slave";  // Change this to reflect the real name of your slave BT device
#else
String MACadd = "ec:c9:ff:e2:cc:06";                        // This only for printing
uint8_t address[6] = {0xec, 0xc9, 0xff, 0xe2, 0xcc, 0x06};  // Change this to reflect real MAC address of your slave BT device
#endif

String myName = "ESP32-BT-Master";

void setup() {

  bool connected;
  Serial.begin(115200);

  SerialBT.begin(myName, true);
  //SerialBT.deleteAllBondedDevices(); // Uncomment this to delete paired devices; Must be called after begin
  Serial.printf("The device \"%s\" started in master mode, make sure slave BT device is on!\n", myName.c_str());

//#ifndef USE_NAME
  //SerialBT.setPin(pin);
  //Serial.println("Using PIN");
//#endif

// connect(address) is fast (up to 10 secs max), connect(slaveName) is slow (up to 30 secs max) as it needs
// to resolve slaveName to address first, but it allows to connect to different devices with the same name.
// Set CoreDebugLevel to Info to view devices Bluetooth address and device names
#ifdef USE_NAME
  connected = SerialBT.connect(slaveName);
  Serial.printf("Connecting to slave BT device named \"%s\"\n", slaveName.c_str());
#else
  connected = SerialBT.connect(address);
  Serial.print("Connecting to slave BT device with MAC ");
  Serial.println(MACadd);
#endif

  if (connected) {
    Serial.println("Connected Successfully!");
  } else {
    while (!SerialBT.connected(10000)) {
      Serial.println("Failed to connect. Make sure remote device is available and in range, then restart app.");
    }
  }
  // Disconnect() may take up to 10 secs max
  if (SerialBT.disconnect()) {
    Serial.println("Disconnected Successfully!");
  }
  // This would reconnect to the slaveName(will use address, if resolved) or address used with connect(slaveName/address).
  SerialBT.connect();
  if (connected) {
    Serial.println("Reconnected Successfully!");
  } else {
    while (!SerialBT.connected(10000)) {
      Serial.println("Failed to reconnect. Make sure remote device is available and in range, then restart app.");
    }
  }
  pinMode(36,ANALOG);
  pinMode(39,ANALOG);
  pinMode(34,ANALOG);
  pinMode(35,ANALOG);
}

void loop() {
  LXpin = analogRead(36) - 1730;
  LYpin = analogRead(39) - 1730;
  RXpin = analogRead(34) - 1750;
  RYpin = analogRead(35) - 1762;

if (LXpin >= -100 && LXpin <= 100){
    TLX = 0;
  } else if(LXpin >= 2048){
    TLX = 2048;
  } else if(LXpin <= -2048){
    TLX = -2048;
    }else{
    TLX = LXpin;
    }

     if (RXpin >= -100 && RXpin <= 100){
    TRX = 0;
  } else if(RXpin >= 2048){
    TRX = 2048;
  } else if(RXpin <= -2048){
    TRX = -2048;
    }else{
    TRX = RXpin;
    }
      if (LYpin >= -100 && LYpin <= 100){
    TLY = 0;
  } else if(LYpin >= 2048){
    TLY = 2048;
  } else if(LYpin <= -2048){
    TLY = -2048;
    }else{
    TLY = LYpin;
    }
      if (RYpin >= -100 && RYpin <= 100){
    TRY = 0;
  } else if(RYpin >= 2048){
    TRY = 2048;
  } else if(RYpin <= -2048){
    TRY = -2048;
    }else{
    TRY = RYpin;
    }

    sprintf(data, "%d:%d:%d:%d", TLX, TLY, TRX, TRY);

    Serial.println(data);
    SerialBT.println(data);

  if (SerialBT.available()) {
    Serial.write(SerialBT.read());
  }
  delay(100);
}
```
## 3\. 実際の制作
さて、３Dプリンターで印刷して、マイコンにプログラム書き込んでも組み合わせて車両として成立させなければ意味がありません。実際に作ってみましょう。

しかし、画像がございません。申し訳ないです。
動作確認に一応全体像がございます。

ステップ1
3Dプリントしたボディとプログラミングしたマイコンがあっても合体させなければ意味がありません。てことで電子工作の時間じゃい。って思います。
ステップ2
買ってきたギヤードモーターとモータドライバーをワイヤーで繋げます
ステップ3
モータドライバーとマイコンをワイヤーで繋げます
ステップ4
グルーガンでギヤードモーターなど全てを3Dプリンターの造形物に貼り付けます。
ステップ5
メカナムホイールをグルーガンではっつけます。

完成!!
## 4\. 動作確認
実際に動かしてみましょう！コントローラーと車体のマイコンスイッチ入れて...
スイッチオン！
![PXL_20241221_005425326.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930054/162f0b8a-9bd5-3629-30e6-0ef9f25d52dd.jpeg)
ここから先またしても画像がなく、言葉だけですがイメージしながらお楽しみください

えちょっと待って、なんか甲高い音すんだけど...
えちょっと待って電池あっつ！すぐ取らないと。
待って待ってなんかICから煙が出てきた！！！！
やばいやばい電池があっつ！
ふ、ふぅ、危なかった。

そんなことが起こりました。
## 5\. 振り返り
期日が短かったのもあり、プロトタイプも作らず一発勝負で作ったため、結果はぶっ壊れて大失敗でした。
具体的に述べると、モータドライバがESP32のPWM制御に対応していなかったことによるICチップの焼き切れが原因で回路がショートし、電池に無限大の電流が流れ、ホクホクになったと考えられます。焦っていたこともあり、急遽anyazonで購入したものを使っていました。次は対応しているものを調べて買います。

もっと勉強します。そして来年にはもっと質の良いものを質の良い記事とともにお送りしたいと考えております。
## 6\. 参考にしたサイト、および動画
今回制作する上で参考にさせていただいたサイト、及び動画です。感謝申し上げます

ESP32同士をBruetoothでペアリング
> https://www.youtube.com/watch?v=78d0ZjPRK5A

ESP32でBluetooth相互無線通信(Arduino互換機)
> https://rcj-lightweight.hateblo.jp/entry/try_esp32