Arduino IDE で ESP-IDF の sdkconfig を変更する方法(v2.0.17版)
はじめに
Aruduino IDE では、ビルド済SDKをしようしているため、ESP-IDFの設定変更はAruduino IDE ではできません。ESP-IDFを取得し、設定変更したあとにビルドしてSDKを作成する必要があります。
v1.0.6版の時と同じように仮想Linuxを構築してSDKを作成しています。
👇v1.0.6版では内容はこちら👇
開発環境
OS : Windows 11 Pro
ESP32:ESP-WROOM-32
統合開発環境 : Arduino IDE 2.3.2
Arduino core for the ESP32:2.0.17
使用ライブラリ:なし
使用パーツ
ESP32開発ボード(38Pin)

作業内容
仮想Linux(Ubuntu)構築
ここは前回と同じため、省略します。
Arduino core for the ESP32 ビルド
ビルド準備
ビルドに必要なパッケージをインストールします。
sudo apt update
sudo apt-get install git wget curl libssl-dev libncurses-dev flex bison gperf python3 python3-pip python3-setuptools python3-serial python3-click python3-cryptography python3-future python3-pyparsing python3-pyelftools cmake ninja-build ccache jq
ソースファイル取得
esp32-arduino-lib-builder
まず、「esp32-arduino-lib-builder」という、ESP-IDF とその他のコンポーネントをビルドする環境を git から入手します。
git clone https://github.com/espressif/esp32-arduino-lib-builder
cd esp32-arduino-lib-builder
git switch release/v4.4
今回は、「Arduino core for the ESP32:2.0.17」の環境を構築しますので、「esp32-arduino-lib-builder」は v4.4 を使用します。
「esp32-arduino-lib-builder」は、初期状態では ESP-IDF やその他のコンポーネントを最新の状態で取得しようとします。
「Arduino core for the ESP32:2.0.17」の環境を構築するには、各バージョンを合わせる必要があるため、自動的に最新を取得するコードをコメントアウトしておきます。
vim build.sh
84 #echo "* Installing/Updating ESP-IDF and all components..."
85 # update components from git
86 #./tools/update-components.sh
87 #if [ $? -ne 0 ]; then exit 1; fi
「build.sh」の86行目から87行目の箇所です。
これで、自動的に取得しないようになったため、手動で ESP-IDF と Arduino core for the ESP32 を含むコンポーネントを取得していきます。
ESP-IDF
「Arduino core for the ESP32:2.0.17」に対応した「ESP-IDF v4.4.7」を取得します。
git clone -b v4.4.7 --recursive https://github.com/espressif/esp-idf.git
git -C ./esp-idf/ reset --hard 38eeba213a
配布されている状態と同じコミットの状態にしておきます。
Arduino core for the ESP32
「Arduino core for the ESP32 : 2.0.17」を取得します。
git clone -b 2.0.17 --recursive https://github.com/espressif/arduino-esp32 ./components/arduino
git -C ./components/arduino reset --hard d75795f5
配布されている状態と同じコミットの状態にしておきます。
esp32-camera
esp32-camera コンポーネントを取得します。
git clone --recursive https://github.com/espressif/esp32-camera ./components/esp32-camera
git -C ./components/esp32-camera reset --hard f0bb429
配布されている状態と同じコミットの状態にしておきます。
esp-dl
esp-dl コンポーネントを取得します。
git clone --recursive https://github.com/espressif/esp-dl.git ./components/esp-dl
git -C ./components/esp-dl reset --hard 0632d24
配布されている状態と同じコミットの状態にしておきます。
esp_littlefs
esp_littlefs コンポーネントを取得します。
git clone --recursive https://github.com/joltwallet/esp_littlefs.git ./components/esp_littlefs
git -C ./components/esp_littlefs reset --hard 41873c2
git -C ./components/esp_littlefs submodule update --init --recursive
配布されている状態と同じコミットの状態にしておきます。
esp-rainmaker
esp-rainmaker コンポーネントを取得します。
git clone --recursive https://github.com/espressif/esp-rainmaker.git ./components/esp-rainmaker
git -C ./components/esp-rainmaker reset --hard d8e9345
git -C ./components/esp-rainmaker submodule update --init --recursive
配布されている状態と同じコミットの状態にしておきます。
espressif__esp-dsp
espressif__esp-dsp コンポーネントを取得します。
git clone --recursive https://github.com/espressif/esp-dsp.git ./components/espressif__esp-dsp
git -C ./components/espressif__esp-dsp reset --hard 9b4a8b4
配布されている状態と同じコミットの状態にしておきます。
tinyusb
tinyusb コンポーネントを取得します。
git clone --recursive https://github.com/hathach/tinyusb.git ./components/arduino_tinyusb/tinyusb
git -C ./components/arduino_tinyusb/tinyusb reset --hard a0e5626bc
配布されている状態と同じコミットの状態にしておきます。
ビルド
環境は用意できましたのでビルドします。
./build.sh -t esp32
「out」というディレクトリが作成されていれば成功です。
farmsoft@MIRA:~/2.0.17/esp32-arduino-lib-builder$ ls
CMakeLists.txt build components dependencies.lock esp-idf managed_components patches tools
README.md build.sh configs dist main out sdkconfig version.txt
sdkconfig 設定変更
ここからが、sdkconfig の設定変更です。
. ./esp-idf/export.sh
idf.py menuconfig
1.0.6 では「idf.py menuconfig」を使用できませんでしたが、2.0.17 では使用できます。
が、この方法で変更しても設定は反映されませんのでご注意ください。ビルド後の設定確認に使用できます。
デフォルトsdkconfig からの差分を修正する必要があります。
標準の esp32 の場合は、「defconfig.esp32」を修正・追加します。
esp32c2,esp32c3 の場合は、「defconfig.esp32c2」「defconfig.esp32c3」になります。
farmsoft@MIRA:~/2.0.17/esp32-arduino-lib-builder$ vim configs/defconfig.esp32
今回は、アプリロールバックの機能をOFFにしてみます。
CONFIG_BTDM_CTRL_MODE_BTDM=y
CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE=20
CONFIG_BT_BTC_TASK_STACK_SIZE=8192
CONFIG_BT_BTU_TASK_STACK_SIZE=8192
CONFIG_BT_CLASSIC_ENABLED=y
CONFIG_BT_A2DP_ENABLE=y
CONFIG_BT_SPP_ENABLED=y
CONFIG_BT_HFP_ENABLE=y
CONFIG_BT_STACK_NO_LOG=y
CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY=y
CONFIG_ESP32_SPIRAM_SUPPORT=y
CONFIG_SPIRAM_OCCUPY_HSPI_HOST=y
CONFIG_ESP32_ULP_COPROC_ENABLED=y
CONFIG_ESP32_XTAL_FREQ_AUTO=y
# CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1 is not set
CONFIG_FREERTOS_FPU_IN_ISR=y
# CONFIG_USE_WAKENET is not set
# CONFIG_USE_MULTINET is not set
CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC=y
CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST=y
CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID=y
CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT=y
CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=y
CONFIG_APP_ROLLBACK_ENABLE=n
最終行に「CONFIG_APP_ROLLBACK_ENABLE=n」を追加しました。
再ビルド
1.0.6 では、以下のようにブートローダーのみをビルドするシェルが用意されていましたが、2.0.17 では用意されていませんでした。
./tools/build-bootloaders.sh
デフォルトsdkconfig を修正・追加し保存した後に、再度ビルドする必要があります。
./build.sh -t esp32
ビルド終了後、「menuconfig」で設定が変更されていれば、成功です。
. ./esp-idf/export.sh
idf.py menuconfig
Bootloader config —>
<<変更前>>

<<変更後>>

Arduino IDE へ反映
最後に、作成したファイルをWinsowsの Arduino IDE へ反映します。
「xxxxxxxx」は、ご自身の環境に合わせて変更してください。
cp -r ./out/tools/sdk/ /mnt/c/Users/xxxxxxxx/AppData/Local/Arduino15/packages/esp32/hardware/esp32/2.0.17/tools/
動作確認
作成したカスタムSDKを使用して設定変更されているか確認してみます。
void setup() {
Serial.begin(115200);
#ifdef CONFIG_APP_ROLLBACK_ENABLE
Serial.println("CONFIG_APP_ROLLBACK_ENABLE");
#else
Serial.println("CONFIG_APP_ROLLBACK_DISABLE");
#endif // CONFIG_APP_ROLLBACK_ENABLE
}
void loop() {
}
動作するとログに出力される内容が変化しますので、設定変更されていることがわかります。
<<変更前>>

<<変更後>>

おわりに
1.0.6 の方法がわかっていたので、容易にできるだろうと思っていましたが、sdkconfigの変更方法がわからず、つまづいてしまいました。
コメントにて、Masa様より「デフォルトsdkconfig」の存在をご教授いただき、設定変更した状態でビルド済SDKを作成することができました。ありがとうございました。
コメント
とても分かりやすい手順の展開ありがとうございます。
いつも参考にさせて頂いています。
>全ビルトすると、sdkconfig もデフォルト状態に戻ってしまいます
については
https://docs.espressif.com/projects/esp-idf/en/v5.2.2/esp32/api-guides/build-system.html#custom-sdkconfig-defaults
が参考になるかと思います。
私はターゲットはesp32c3ですがsdkconfig実施後の差分を
configs\defconfig.esp32c3
に定義しカスタムSDKをビルドしています。
しかし ./tools/build-bootloaders.sh ってどこにいったんでしょうね?
私も調べているのですが、情報がなかなか見つからず、また何かわかればこちらにコメントしますね。
こんなサイトに来ていただいてありがとうございます。
そして、ご教授ありがとうございます。
私の方でも教えていただいた内容でカスタムできることを確認できました。
しっかりとプログラミングガイドに記載されているんですね。勉強になります。
手順を更新させていただきます。
少しずつではありますが、ESP32関連で充実させていきますのでまたお立ち寄りください。
コメントありがとうございます。返信遅くなりました。
上手くカスタムSDKビルドできたようで良かったです。
「sdkconfig実施後の差分を configs\defconfig.esp32c3 に定義」という手順がちょっと面倒ですね。
今後、menuconfigからconfigsフォルダに反映できるようになることに期待。
(以下全くの別件になりますが)
ESP32のペリフェラルに赤外線送受信用のRMTペリフェラルがあることを知り触って遊んでいます。
CPUが張り付いて送受信データの解析・送出をしなくてよいので、非常に便利ですね。もしよければ記事の候補にでも!
無事、カスタムSDKビルドができ、手順にも反映させていただきました。
再ビルドしなくてはいけないのがモヤモヤしますね…。私もmenuconfig期待します。
RMTペリフェラル。面白そうですね!やってみたいことが山積み状態ですが、参考にさせていただきます!
安価なのにまだまだESP32を使いこなせていなくて新しい発見が続いて面白いです。
./tools/build-bootloaders.sh
が削除されたコミットは以下
https://github.com/espressif/esp32-arduino-lib-builder/commit/71de5299df86a1b629a6cd51dce2cb8cae0cef37
コミットコメントに記載されていたissuesは以下でした
https://github.com/espressif/arduino-esp32/issues/6187
こちらも確認させていただきました。
情報ありがとうございます!