ESP32の開発環境改善(ESP-IDFとEclipse導入)

今回は、開発の効率化として、ArduinoIDEからEclipseによる開発に切り替えたお話です。
(今回の記事は長いうえに、ドロイド君まったく登場しません。シクシク…)

ドロイド君のメインマイコンはESP32なのですが、今まではArduinoIDEで開発していました。

しかし、彼が成長するにつれ、ソースファイル数が増えてしまい、いつしかタブが画面からはみ出てしまいました。

結構、横長のディスプレイを使っているんですがね…。ArduinoIDEはタブを多段化する機能もなさそうだし…。

ということで、備忘録的な意味も込めて、Eclipse環境導入の流れをメモっておきます。

基本方針

ESP32の開発環境は色々とあるようですが、ここでは本家のESP-IDFを使った方式にします。

ESP-IDF Programming guideより

私の場合、以下のような環境構築を目指します。

【開発環境】
OS Windows10(64bit)
コード編集 Eclipse
コードビルド Toolchain(ESP-IDF)

補足として、Toolchainはコードをビルドするもので、これを設定するスクリプトやESP32向けのAPIを含めたものをESP-IDFと位置付けているようです。
(脱線しますが、コンパイルとビルドの違いはこちら)

makeの導入

Windowsには、makeのできる環境がデフォルトでは入っていません。

なので、こちらからWindows環境構築用として、msysをダウンロードしてきます(500MByte強あるよ)。

----
1. 展開してできたmsys32フォルダをCドライブ直下へ。
2. "C:\msys32\mingw32.exe"のファイルを実行し、shellを起動。
----

msysはUNIX風のシェル環境で、make等にも対応しています。(参考サイト)

ESP-IDFの導入

以下の感じで、esp開発フォルダを作成し、ESP-IDF環境を導入します。

$ mkdir -p ~/esp
$ cd ~/esp
$ git clone --recursive https://github.com/espressif/esp-idf.git

git cloneはネット環境によっては失敗することもあるようですが、何回かやれば成功するようです。

次に、パスを設定します。
まず、以下の内容を記載したファイルを作成(テキストエディタでもなんでも)。

export IDF_PATH="C:/msys32/home/(ユーザ名)/esp/esp-idf"

(ユーザ名)はmingw32.exeを実行した際、緑色で@前に表示されている部分です。

これを「export_idf_path.sh」のようなファイル名にして、「C:\msys32\etc\profile.d\」のフォルダに放り込みます。

一度シェルを終了し、再度mingw32.exeを起動すると、パスが適用されているはずです。

一応、確認するために、以下のコマンドを打ってみます。

$ printenv IDF_PATH
IDF_PATH=C:/msys32/home/(ユーザ名)/esp/esp-idf

以上のように、IDF_PATHが表示されればOKです。

試しにhello_world

次に、動作確認の意味で、ESP-IDFで用意されている「hello_world」を試してみます。

まずは、サンプルプロジェクトをコピーしてきます。

$ cd ~/esp
$ cp -r $IDF_PATH/examples/get-started/hello_world .

次に、ESP32の各種動作設定をするため、以下のコマンドを実行します。

$ cd ~/esp/hello_world
$ make menuconfig

わー、なんかエラーでたー。

0 [main] make 4164 child_info_fork::abort: C:\msys32\usr\bin\msys-intl-8.dll: Loaded to different address: parent(0x1D0000) != child(0xF0000)
make: C:/msys32/home/masato/esp/esp-idf/make/project.mk:230: fork: Resource temporarily unavailable
0 [main] make 14388 child_info_fork::abort: C:\msys32\usr\bin\msys-intl-8.dll: Loaded to different address: parent(0x1D0000) != child(0x26D0000)
make: C:/msys32/home/masato/esp/esp-idf/make/project.mk:490: fork: Resource temporarily unavailable
0 [main] make 13496 child_info_fork::abort: C:\msys32\usr\bin\msys-intl-8.dll: Loaded to different address: parent(0x1D0000) != child(0x1E0000)
make: fork: Resource temporarily unavailable

どうやら、forkが失敗する場合、ウイルス対策ソフトにブロックされている可能性があるらしいです。

なので、まずはウイルス対策ソフトを止めてみて、うまくいくかどうか試してみてください。

私は最終的に、C:/msys32/フォルダ以下をウイルス対策ソフトの対象外設定にしたところ、問題は発生しなくなりました。

さて、気を取り直してmake menuconfigすると、以下のようなメニューが表示されます。

ArduinoIDEと違って、色々と細かい設定をできるようです。

一応、いじったものだけ以下に挙げておきます。

SerialPortの設定

Serial flasher config->Default serial portから、以下のようにArduinoIDEで使っていたCOMポートを設定します。

ESP32設定

Component config->ESP32 specificから、CPUのクロックだったり、MainTaskのスタックだったりを設定できます。

周辺機器設定

Component configから、BluetoothやWifiの設定もできるようです。

Bluetooth設定下を見たら「Classic Bluetooth (NEW)」というものがあったので、ついに対応されたのかしら。

これでGoogleHomeにA2DP接続して、スピーカーとして音楽を流す、みたいなこともできるかも。わーい。

そしてSaveしてExitを選択すると、再びコマンドラインに戻ります。しばらく待つと、コンフィグ処理が完了して戻ってきます。

ビルド&書き込み

以下のコマンドで、ビルド&書き込みができます。

$ make flash

書き込みが完了し、ArduinoIDEのシリアルモニタなどで出力を見てみると、10秒カウントダウンして再起動、という挙動を示します。

Hello world!
This is ESP32 chip with 2 CPU cores, WiFi/BT/BLE, silicon revision 1, 4MB external flash
Restarting in 10 seconds...
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...
Restarting in 6 seconds...
Restarting in 5 seconds...
Restarting in 4 seconds...
Restarting in 3 seconds...
Restarting in 2 seconds...
Restarting in 1 seconds...
Restarting in 0 seconds...
Restarting now.

ここまでできていれば、ESP-IDFの導入は成功です!

Eclipseの導入

基本的に、こちらの情報をもとに導入します。

Eclipseの導入自体は端折りますが、こちらの本家サイトから「Eclipse IDE for C/C++ Developers」をインストールすればokのはず。
(ちなみに、私のEclipseはちょっと古いMarsなので、スクリーンショットが異なる可能性があります)

ESP-IDFプロジェクトのインポート

先ほどの「hello_world」を例にやってみます。

EclipseのFile->Importから、以下の感じでプロジェクトをインポートします。

プロジェクトの設定

生成されたプロジェクトを右クリック->Property->「C/C++ Build」のプロパティページを表示。

「Use default build command」のチェックを外し、Build commandに「python ${IDF_PATH}/tools/windows/eclipse_make.py」を入力。

次に、「Environment」プロパティを表示。

「Add」ボタンから以下を追加。

【Add内容(name, value)】
BATCH_BUILD 1
IDF_PATH C:/msys32/home/(ユーザ名)/esp/esp-idf
(\でなく/であることに注意)
PATH C:\msys32\usr\bin;C:\msys32\mingw32\bin;C:\msys32\opt\xtensa-esp32-elf\bin
(PATHが既に存在している場合は、これで置き換える)

次に、「C/C++ General」->「 Preprocessor Include Paths, Macros, etc.」プロパティを表示し、「Providers」タブを選択。

「CDT GCC Built-in Compiler Settings Cygwin」を選択し、「Command to get compiler specs」の${COMMAND}を「xtensa-esp32-elf-gcc」に置き換え。

また、「CDT GCC Build Output Parser」を選択し、頭に「xtensa-esp32-elf-」を追加。

プロジェクトのビルド

メニューのProject->Cleanで「hello_world」を一度クリア。

その後、Project->Build Projectでビルドを開始。

Eclipseから書き込み

プロジェクトを選択し、右クリック->MakeTargets->Create...
(私のEcpliseは古いので、最近のものはSelect Build Targets -> Create…かも)

「flash」と入力してOK。これ以降、Shift+F9で「flash」を選択すると、コンパイルから書き込みまでをEclipseが行ってくれます。
(一度Shift+F9をしておけば、以降F9だけでリビルド+書き込みが可能)

注意点

ここまでで、Eclipseでの開発環境が整いました。最後に、いくつか注意点を。

まず、他のソフトで書き込み対象のESP32のSerialPortに接続していると、EclipseからESP32に接続できず、結果エラーになります。(あたりまえですが)

また、ESP-IDFの導入で出てきた「make menuconfig」だけは、Eclipseからは実行できないようです。(シェルから実行する必要あり)

まあ、最初の一回だけなので、そんなに大きな問題ではないと思います。

最後に

いやー、結構長くなりました。(そして途中で飽きた…)

ESP-IDFを使うと細かい設定ができるし、Eclipseで開発できるので、効率は格段に上がるのではないかと思います。ドロイド君を育てるぞ~。