#これまでのあらすじ
Arduino-ESP32 のプログラムを ESP-IDF でビルドするために、以下の2つの記事のような準備をしてきた。
- ESP-IDFをセットアップ& Arduino-ESP32 で使っている ESP-IDF SDK のバージョンがいつのものなのか調べ、合わせる
- Aruino IDE で作成した .ino ファイルを、C++コンパイラでコンパイルできる .cpp ファイルに
いよいよ本番です。
#ESP-IDF の component として Arduno-ESP32 を入れる
ESP-IDFは、「使っている Arduino-ESP32 がコンパイルされた時点のバージョンのもの」が ~/esp/esp-idf/
に入っている前提で。
(執筆時点では、ESP-IDF が master branch の commit id = abea9e4c02bb17e86298aec4e299780399e4789f、
Arduino-ESP32 が master ブランチの commit id = 5af03361775e78fc7a0721ceec198663d2f1db44 でやってます。)
###1. hello_world プロジェクトをコピーして流用 myproject とする。
$ cd ~/esp
$ cp -r $IDF_PATH/examples/get-started/hello_world ./myproject
$ cd myproject/
$ perl -pe 's/hello-world/myproject/g;' -i Makefile
$ perl -pe 's/hello-world/myproject/g;' -i CMakeLists.txt
$ rm main/hello_world_main.c
perl の2行はファイルの中身を読んで、hello-world を myproject に置換して上書きするワンライナーです。
中身は cat Makefile
などで確認できます。そしてプログラムは別途用意するので hello_world_main.c は削除(rm)しておきます。
###2.コンパイルしたい .ino.cpp ファイルと必要な関連ファイル(ライブラリなど)を main/ の中に置く
「コンパイルしたい .ino.cpp ファイルと必要な関連ファイル(ライブラリなど)」の用意の仕方は別の記事 でまとめてあります。
###3.project のディレクトリの下に components ディレクトリを掘って Arduino-ESP32 のソースを git clone で入れる
$ mkdir -p components
$ cd components
$ git clone --recursive https://github.com/espressif/arduino-esp32.git arduino
$ cd ..
###4.project のディレクトリの sdkconfig を Arduino-ESP32 で使っていたものにあわせる。
Windows で Arduino-ESP32 (1.0.1)使っていれば
C:\Users\username\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\tools\sdk\sdkconfig とかにあるので
これを myproject/ にコピーします(既にあるのを上書き)
###5.myproject/partitions.csv を、Arduino-ESP32 で指定していたパーティションに対応する csv で上書き
Arduino IDE では画像のようにパーティションスキームを指定していますが、スキームに対応するパーティション定義の csv ファイルが
Windows であれば C:\Users\username\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\tools\partitions\
にあります。
どれがどの csv に対応しているかは、 boards.txt を No OTA (Large APP) とかで検索すれば解ります。
conf項目 | Arduino IDE項目名 | 使う csv |
---|---|---|
あり | Default(初期値) | default.csv |
あり | Minimal (2MB FLASH) | minimal.csv |
あり | No OTA (Large APP) | no_ota.csv |
あり | Huge APP(3MB No OTA) | huge_app.csv |
あり | Minimal SPIFFS (Large APPS with OTA) | min_spiffs.csv |
16MB Fat | ffat.csv | |
Default (2 x 6.5 MB app, 3.6 MB SPIFFS) | default_16MB.csv | |
Large SPIFFS (7 MB) | large_spiffs_16MB.csv |
自分が使ってるパーティションスキームに対応する csv ファイルが解ったら、myproject/partitions.csv にコピーして上書きします。
なお、conf 項目ありというのは、後の make menuconfig で設定出来る奴です。が、項目がない 16MB の奴をつかってる(らしい)M5Stack-FIRE などではどうなるのか?(持ってないので試せない)
とりあえず、自分はいつも No OTA でやってたので、それで。
###6. make menuconfig で設定画面開いて COMポート指定する。また、前述パーティション設定も確認する。
make menuconfig は sdkconfig を設定するためのツールを起動するコマンドです。
sdkconfig がある場所(この場合 myproject/ ) で実行します。確認/設定は3カ所。
1つめは、カーソルキー上下で Serial Flasher Config を選んで Enter おすと、先頭に Default serial port とあるので設定します。Windows なら COM1 とか。
で、Save して Exit で最初のメニューまで戻って、
2つめは Arduino Configuration。4つめにUsed partition scheme とあるので、Arduino IDE で指定していたパーティションスキームを指定します。自分は No OTA 3MB。ですが、ここ、前項で「conf項目あり」とした5種類しか選択肢がないので、それ以外の奴でやりたい場合は……わかりません!ごめんなさい!(Flash 4MB の DevKitC しか持ってないので試せない)
また、Save して Exit で最初のメニューまで戻って、
3つめは Partition table。ここは一番上のを Custom partition table にして、その次が partitions.csv になっていることを確認。
また、Save して Exit くりかえして終了。
###7. いよいよ make
コンパイラのバージョンやオプションが違うので Arduino IDE で通った書き方が ESP-IDF で通らないものがあります。
たとえば、 sprintf( str, "%d", long_int_var )
とかは %ld
じゃないと怒られます。自分が書いてた範囲ではそれくらい。
エラーを排除したら無事 build/myproject.elf が出来ているはず。 make flash で書き込めます。
いろいろ苦労してここまで来たのだけど、記事は最短コースを書くので意外と大変じゃなさそうな感じにまとまった、気がしています。
#その他
sdkconfig や project file を書き換えない限り、最初からリビルドにならないので、ちょっと修正即ビルドってやる分には Arduino IDE よりかなり速いです。Arduino IDE は AVR の Arduino のビルドをする場合もあり、その後 ESP32 に戻ったらやっぱりフルリビルドなので、時間かかるけど、ESP-IDFと分けてるだけでリビルドが減りますね。
HDDに余裕があるなら、ESP-IDF を別々のフォルダに、1プロジェクトごとに1つ用意すれば時間効率良いかも!?(2つのESP32 で BLE通信するようなときは2つ欲しいと思ってた~)