2021/12/24(金)ESP32 SDKのカスタムビルドを使った開発環境作り

BluetoothSerialのWindowsのCOMポート接続不良問題

※この問題は、Arduino IDEの「ESP32モジュール Ver2.0.5」、PlatformIOの「Espressif 32 Ver5.2.0」にて解決しました。


ESP32標準SDKのBluetoothには、WindowsのBluetooth 5.0以降のアダプタから接続したとき、うまく接続されない不具合があります。

BluetoothSerial(SerialBT)ですと、Windows側から接続を開始したときに

ASSERT_WARN(103 23), in lc_task.c at line 8775

というエラーが表示され、接続に失敗します。これを解決するために、SDKをリビルドし、リビルドした開発環境を構築することを目的とします。

SDKをリビルドする

ESP32いじりメモで触れたとおり、Arduino IDEやPlatformIO(VScode)は「ビルド済SDK」を内蔵しています。このSDKのビルドは、次のソースを使って行うことができます。

https://github.com/espressif/esp32-arduino-lib-builder/

少し工夫すればWindowsでもビルドできるかと思いますが、リンク先に書かれている通り、Linux(Debian または Ubuntu)でビルドを行います。

この中で使用するESP-IDFやコンパイル環境はビルド時に更新されるのですが、タイミングよってはビルドに失敗することがあるので注意してください。

SDK configを編集する

sdkconfig.esp32がESP32のSDKコンパイルオプションです。

Bluetoothの問題に対処する場合、次の部分を変更します。

変更前。

# CONFIG_BTDM_CTRL_MODE_BLE_ONLY is not set
# CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY is not set
CONFIG_BTDM_CTRL_MODE_BTDM=y

変更後。

# CONFIG_BTDM_CTRL_MODE_BLE_ONLY is not set
CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=y
# CONFIG_BTDM_CTRL_MODE_BTDM=y

この情報はこの記事に書かれていました

SDK build

方法はREADMEに書かれているとおりです。

標準ですと、ESP32 / ESP32S2 / ESP32C3 の3種類のSDKを生成しますが、一つで良い場合は、次のようにしてください。

TARGETS=esp32 ./build.sh

ビルドに成功すると out/ 以下にSDKが生成されます。

build.sh を使用すると、都度全コンパイルされてしまうので、TARGETSをひとつ指定した状態で build.sh を一度走らせ、次からは以下のようにすると sdkconfig を調節しつつ必要な部分のみ再コンパイルできます。

vi sdkconfig
idf.py build
./tools/build-bootloaders.sh

Arduino IDEのSDKを差し替える

まずは一度、Arduino IDE上で、ESP32の開発環境を導入します。

  1. 追加のボードマネージャー : https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
  2. ボードマネージャーからSDKのVersionと対応する「ESP32ライブラリ」を導入します。

使用しているESP-IDFはsdkビルド環境の esp-idf/ 内で確認できます。

$ git status
On branch release/v4.4
Your branch is up to date with 'origin/release/v4.4'.

ESP-IDFのVer4.4の場合、対応する Arduino-ESP32 は Ver2.01 になります。

SDKとFramework(BluetooshSerialやSPIFFS等の上位のライブラリ)のバージョンが一致しないと正しくコンパイルできないため、必ずESP-IDFのバージョンを合わせる必要があります。

正しく、ボードマネージャが導入されると、「C:\Users\(UserName)\AppData\Local\Arduino15\packages\esp32\hardware\esp32\(Version)\tools\sdk」にSDKが入ります。このSDKをビルドしたもの(out/tools/sdk)と入れ替えます。上書きコピーで問題ありません。

これにて作業は完了です。ボードマネージャーから Arduino-ESP32 のバージョンを変更すると、SDKが上書きされてしまいますので、変更しないように注意してください。

カスタム環境ごと開発環境をまとめる

Arduino IDEは、ボード情報などを「C:\Users\(UserName)\AppData\Local\Arduino15」に導入するため、開発環境をコピーする際は面倒です。

これについは、arduino.exeのあるフォルダに「portable」というフォルダを作成すると、「...\Arduino15」の代わりに「.\portable」を参照するようになります。こうすると、コピーが簡単なカスタム開発環境を作成することができます。

VScodeのSDKを差し替える

VScodeの開発環境は、執筆時点で ESP-IDF Ver3.3 のためより面倒です。

そこで VScode で一度環境を構築してから、Arduino IDE で構築した環境をFrameworkを含め上書きコピーしました。

  • コピー元: C:\Users\(UserName)\AppData\Local\Arduino15\packages
  • コピー先: C:\Users\(UserName)\.platformio\packages
  • esp32\hardware\esp32\(ver) → framework-arduinoespressif32
  • esp32\tools\xtensa-esp32-elf-gcc\gcc8_4_0-esp-(date) → toolchain-xtensa32

まとめ

  • Bluetooth 5.0 と Windows の相性問題を解決するため、SDKを再構築
  • 既存開発環境を書き換えて、カスタムSDKを使用する方法

もっと良い方法がありましたらご教授ください。

関連記事