Potewoのブログ

電子工作が好きな学生の書く技術系のブログです。

ESP32でBluetoothのペアリングをしたときにすぐに接続が切られてしまう場合の対処法

ESP32とMac/Ubuntuの間でシリアル通信をしようとしたとき、ペアリングまではうまく行ってもすぐに「切断」や「未接続」になってしまったときの対処法。

結論

そういうものかもしれない。 Macなら気にせずそのままシリアル通信をする。Ubuntuは設定が必要。

環境

Ubuntuの自作デスクトップとMacbook(2017)の両方で試した。

  • Ubuntu
    • OS: Ubntu20.04
    • CPU: Ryzen2600
    • メモリ: 16GB
    • グラフィックボード: GTX1650
    • Bluetoothドングル: IO-DATA USB-BT40LE
  • Macbook(2017)
    • Core m3
    • メモリ8GB

プログラム

ESP32 Bluetooth Serial Test

gist2e5972077dc5fd1e141f78aa7c59b306

上のプログラムをplatformioで書きこんだ。

問題

ペアリングは成功して、ペアリングしたデバイス一覧には出てくるが、ペアリングした2秒後くらいにはすぐにBluetooth接続が切断されてしまう。 ペアリングはUbuntuは「Settings」アプリの「Bluetooth」の項目から自分のデバイス名を選んでペアリングした。Macは「システム環境設定」の「Bluetooth」の項目から同様にやった。UbuntuではPINの確認Windowが出てくるが気にせずそのまま「OK」を押すことでペアリングできる。

やったこと(プログラム側)

pio updateでライブラリのバージョンをあげたり、platformioplatform = espressif32platform = espressif32@<3.2にしてバージョンを落としたり、名前が衝突したりしているのかと思ってBTSerialSerialBTに変えたりしてみた。

余談

platformのバージョン、1.0.6みたいなバージョンと3.3みたいなバージョンの2通りの表され方?があるようで、調べたときに1.0.6から1.0.5に落としましょうみたいなことが書いてあって、platform = espressif32@<1.0.6とかって書いてもそんなバージョンありませんとか言われて結局3.x.xとかで指定すると結果的に1.0.5になったりした。よくわからないけどわかりにくい。

やったこと(接続する側)

miyutomori.com

Ubuntuでは上のリンクの記事と同じ手順を踏んだ所、/dev/rfcomm0を通してシリアル通信できるようになった。
このとき、Bluetoothが「切断」の状態になっていても/dev/rfcomm0を使ってシリアル通信を始めると勝手に「接続」状態になった。このことからMacでも「未接続」と表示されていてもシリアル通信を始めれば勝手につながるのではないかと思って/dev/cu.デバイス名-ESP32SPPでシリアル通信を始めたところ、シリアル通信ができた。(デバイス名はプログラム内で指定した名前。上のプログラムの場合はESP33SerialTest。)
シリアル通信はUbuntuMacminicom -o -b 115200 -D /dev/シリアルポートとターミナルでやって確認した。(シリアルポートは適宜置き換え)

結論

Macでは「未接続」と表示されていてもそのままシリアル通信を始めれば「接続済み」になる。

miyutomori.com

Ubuntuは↑の記事通りにやれば使えるようになる。