トホホな疑問(42) ESP32-IDF、Hello world!でチョイとハマる

Joseph Halfmoon

1か月以上前にESP-EYEというAIカメラ的デバイスを手に入れたのに全然進んでおらなかったのが、その活用の前提となるESP32-IDF環境をセットアップするのを躊躇していたためであります。ハマりそうな予感がして逃げてたのですが、ようやく本日セットアップ。とりあえずDevkitCでHello worldできました。チョイとハマったけれども。

1か月くらい前の飲み会(まだオンラインだったです)で、MおじさんにESP-EYEもちゃんと調べておいてね、と言われたのにやっておらなかったので気になってはいたのです。とはいえ、ESP-EYE(というかESP-WHO)を活用するためには、ESP32-IDF環境を使えるようにしておくことが必須。

正直、ESP32、Arduino環境でもMicroPythonでも使えるし、軽いし、それでいいじゃない。イカにも重そうなESP32-IDF使わないで避けていたです。ようやく本日、ちょいと時間があったので、ESP32-IDFでビルドできるところまでやっておこう、と重い腰を上げた次第。

とりあえずESP-EYEではなく、「標準的な」ESP32-DevkitC用に サンプルのHello worldをビルドして、書き込んで、動作確認するところまで済ませました。

ESP32-IDF、インストールに関わるドキュメントとだいたいの手順

ESP-EYEのGetting Started Guide、英文版も記述が増えて良かった(以前は英文版は尻切れで中文版見るしかなかった)とおもったのです。しかし、そこからESP-IDFのGet Startedへのリンクをたどると切れていて、最初からプチなトホホです。別にESP-IDFを検索すれば以下のページに行き着くことはできます。

Get Started

当方、Windows10機にインストールしたいので、そこからさらに

Standard Setup of Toolchain for Windows

を参照してインストール手順をあらためました。昔見たときより、良くなっている?と思ったのが以下のところ。一か所 Noteから引用させていただきます。

Previous versions of ESP-IDF used the Legacy GNU Make Build System and MSYS2 Unix compatibility environment. This is no longer required, ESP-IDF can be used from the Windows Command Prompt.

以前の版は MSYS2(私も時々お世話になっております)必須だったのが、最近のESP-IDFは、普通にコマンドプロンプトから動作できるようになったみたいです。今回はコマンドプロンプトでやることにいたします。

Windows版のESP-IDF環境は、Installerでセットアップしてくれるので、個別にgit cloneすることも必要ないみたいです。インストーラには2種類あり、オンラインでチマチマとダウンロードする小さいやつ、と最初に一気にダウンロードしてしまう巨大なやつです。どうせダウンロードするのだし、一気、ということでOffline版のダウンロードにカカリました。1.6GBほどあります。しかし当方には「chrome 拡張、高速ロード」という武器?があるので、万が一途中で失敗しても再開できるから1.6GBなどなんでもあるまい、と。

しかしダウンロード3分の1で失敗しました。理由は不明。いたしかたないので都度都度ダウンロードをする、小さい方のOnline インストーラを使うことにいたしました。こちらだと、結構するするとダウンロードができて必要なものが皆そろったみたいです。ううむ。

サンプルプロジェクト hello_world にチョイとハマる

インストーラにより、必要なファイルがダウンロードでき、環境変数などもセットアップされたみたいなので、その確認のためダウンロードしたexamplesディレクトリの中にある hello_world をビルドし、DevkitCに書き込んで正常に動作することを確認しようとしました。手順的には以下のようです。

  1. 適当な場所に hello_world ディレクトリをコピー
  2. ESP32-DevkitCをPCに接続し、COMポートの番号を確認
  3. idf.pyツールにより set-target esp32
  4. idf.pyツールにより menuconfig
  5. idf.pyツールによりbuild
  6. idf.pyツールによりDevkitCのフラッシュにオブジェクト書き込み
  7. 適当な仮想端末でCOMポート出力を確認

4のところの menuconfig、キャラクタディスプレイ上ですが、キーを使ってコンフィギュレーションを設定できるようになっているのです。しかし設定項目大量にあります。ESP-IDF素人には皆目見当がつきません。

とりあえず Hello world だし、全デフォルトのままでいいんじゃね

などと勝手解釈で、buildに進みました。途中まで快調にビルドできていたのですが、あと一歩(ほんとか?)のところで落ちました。こんな感じ。

[663/966] Generating x509_crt_bundle
FAILED: esp-idf/mbedtls/x509_crt_bundle
cmd.exe /C "cd /D C:\FR\esp\hello_world\build\esp-idf\mbedtls && C:\Users\Izumida\.espressif\python_env\idf4.3_py3.8_env\Scripts\python.exe C:/Users/Izumida/Desktop/esp-idf/components/mbedtls/esp_crt_bundle/gen_crt_bundle.py --input C:/Users/Izumida/Desktop/esp-idf/components/mbedtls/esp_crt_bundle/cacrt_all.pem -q"
gen_crt_bundle.py: Invalid certificate in C:/Users/Izumida/Desktop/esp-idf/components/mbedtls/esp_crt_bundle/cacrt_all.pem
Invalid certificate
ninja: build stopped: subcommand failed.
ninja failed with exit code 1

いや~ Examplesの中の Hello worldを1行も変えず、所定の手順通りにビルドしているのにエラーで落ちるとダメージ大きいです。どうしたら良いか途方にくれました。トホホ。。。

しかし、検索してみると「同じ問題に遭遇している人々多数」みたいでした。

https://github.com/espressif/esp-idf/issues/5322

なにやらズラズラと多数の方が書きこまれていたのですが、私が一番腑に落ちたのは、miLORD1337様の以下の記述です。引用させていただきます。

You can do it with idf.py menuconfig as follows:
Navigate to Component config –> mbedTLS –> Certificate Bundle –> Default certificate bundle options and choose use only most common certificates, then build again. Good luck!

menuconfig の中の、かなり深い深い階層なのですが、そこを1か所変更せよ、とのお教えであります。

menuconfig に戻って、設定を1か所だけ変更(かなり深いところなので探すのがちと苦労)、えいとばかりに再build。build成功しました。miLORD1337様ありがとう。こんな感じ。

Project build complete. To flash, run this command:
Hello World動作確認

idf.pyツールを使えば作成したオブジェクトファイルの書き込みは簡単、ただPORT名を指定するのみ。当方の場合はこんな感じ。

idf.py -p com15 flash

これでEPS32-DevkitCのフラッシュに書き込まれていきます。その様子の最後の方が以下に。

Writing at 0x00008000... (100 %)
Wrote 3072 bytes (103 compressed) at 0x00008000 in 0.1 seconds (effective 485.4 kbit/s)...
Hash of data verified.
Compressed 25168 bytes to 15449...
Writing at 0x00001000... (100 %)
Wrote 25168 bytes (15449 compressed) at 0x00001000 in 0.8 seconds (effective 262.0 kbit/s)...
Hash of data verified.
Compressed 163104 bytes to 85536...
Writing at 0x00010000... (16 %)
Writing at 0x0001ad2a... (33 %)
Writing at 0x000204df... (50 %)
Writing at 0x00025caf... (66 %)
Writing at 0x0002f4ef... (83 %)
Writing at 0x0003670b... (100 %)
Wrote 163104 bytes (85536 compressed) at 0x00010000 in 2.2 seconds (effective 591.1 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
Done

よい響きです。Done!

書き込めた後は、適当な端末ソフトで該当のCOMポートに接続(ボーレートは115200の筈)してやれば、ずらずらと起動メッセージが大量に出力された後、肝心のHello worldが登場します。こんな感じ(伝統のTeraterm使用。)

IDF_HelloWorldその後は、再びRestartがかかって再起動いたします。

なんとか、ESP-IDFのセットアップは完了。次回こそESP-EYEに戻れるか?

トホホな疑問(41) ラズパイmicroSDのバックアップ、リストアの落とし穴? に戻る

トホホな疑問(43) ヤバいよ、TX/RX逆刺し。自分の書いたラベルに騙された。へ進む