Raspberry Pi ESP32開発環境(ESP-IDF – Arduino IDE)

Raspberry PiにArduino core for the ESP32を導入してもコンパイル時にxtensa-esp32-elf-xxxが無いよと怒られて失敗してしまいます。
Arduino core for the ESP32導入時get.py(windowsではget.exe)を実行してもxtensa-esp32-elfがダウンロードされません。これはARM用のバイナリが配布されていないことに起因します。
最新のxtensa-esp32-elfを導入するためにはcrosstool-NG,toolchainをコンパイル、インストールする必要があるようです。
xtensa-esp32-elfはESP-IDFでも使われており折角なのでまずはESP-IDF環境を構築してみました。

Raspberry PiのESP-IDF導入については下記の記事があるのでそのまま実行させてもらいました。
RaspberryPiでESP-WROOM-32開発環境の構築

作業マシンはraspberry pi3

ESP-IDF環境

必要なパッケージ

git wget make libncurses5-dev flex bison gperf python python-serial
gawk gperf grep gettext python python-dev automake bison flex texinfo help2man libtool libtool-bin

以上から当サイトのPiに未インストールの以下のパッケージをインストールしました。
インストール済のパッケージはdpkg -l | grep パッケージ名で調べます。インストール済でもパスされるだけですが。

# apt install gperf libncurses5-dev libtool-bin texinfo help2man

crosstool-NG
作業ディレクトリ ~/esp

$ mkdir ~/esp
$ cd ~/esp
$ git clone -b xtensa-1.22.x https://github.com/espressif/crosstool-NG.git
$ cd crosstool-NG
$ ./bootstrap && ./configure --enable-local && make install

toolchain

$ ./ct-ng xtensa-esp32-elf
$ ./ct-ng build
$ chmod -R u+w builds/xtensa-esp32-elf

# ディスク領域は約4GB専有します。充分な空き領域が必要です。
# ビルドには約3時間
# pi3は作業前に再起動して不要なアプリケーションは起動しない

esp-idf

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

# esp-idf本体はダウンロードするだけ(約300MB)

.basrcに追記

export IDF_PATH=$HOME/esp/esp-idf

$ source ~/.bashrc

確認、実行
参考記事ではHello Worldを実行しているので当サイトではblinkを実行してみたいと思います。

$ cd ~/esp
$ mkdir esp-idf_sample && cd esp-idf_sample
$ cp -r ~/esp/esp-idf/examples/get-started/blink ./
$ cd blink

デフォルトのビルトインLEDはGPIO5になっているようです。当サイトではGPIO2に接続しているので./main/blink.cを編集します。

// #define BLINK_GPIO CONFIG_BLINK_GPIO
#define BLINK_GPIO 2


$ make menuconfig
デフォルトのシリアルポートは/dev/ttyUSB0になっているはずです。変更したい場合はこの画面から変更します。
変更したら Save -> Exit -> Exit
ほかにもいろいろ設定項目が有りますが取り敢えずデフォルトのままでもOK

それでは実行してみます。初回のコンパイルは少し時間がかかります。(下記は最後の書き込み部分だけ)書き込みはesptool.pyが使われています。

$ make flash
Flashing binaries to serial port /dev/ttyUSB0 (app at offset 0x10000)...
esptool.py v2.3.1
Connecting....
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0220
Compressed 20768 bytes to 12244...
Wrote 20768 bytes (12244 compressed) at 0x00001000 in 0.2 seconds (effective 904.0 kbit/s)...
Hash of data verified.
Compressed 144480 bytes to 70284...
Wrote 144480 bytes (70284 compressed) at 0x00010000 in 1.4 seconds (effective 807.8 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 103...
Wrote 3072 bytes (103 compressed) at 0x00008000 in 0.0 seconds (effective 4677.6 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...

LチカOKですね。xtensa-esp32-elfも正常にインストールされています。

Arduino IDE環境

ESP-IDFと比べると一般的にはarduino環境が使いやすいと思います。
xtensa-esp32-elfが正常にインストール、実行できればディレクトリの階層が少々違うだけでwindowsなどとほぼ同様の方法で導入できます。

現時点ではボードマネージャからはインストールできないのでArduino IDE本体に直接組み込むことになります。
Arduino IDEは~/Applications/arduino-1.8.5にあるものとします。
まずは適当なディレクトリで

$ git clone https://github.com/espressif/arduino-esp32
$ unzip arduino-esp32-master.zip
$ mkdir -p ~/Applications/arduino-1.8.5/hardware/espressif/esp32
$ cd arduino-esp32-master
$ cp -rp * ~/Applications/arduino-1.8.5/hardware/espressif/esp32
$ cd ~/Applications/arduino-1.8.5/hardware/espressif/esp32/tools
$ python get.py

get.py(get.exe)した時点でlinux(win)はxtensa-esp32-elfを導入してくれるのですがpiには無いので先にビルドしたxtensa-esp32-elfにリンクを貼ってやります。

$ ln -s ~/esp/crosstool-NG/builds/xtensa-esp32-elf

ディスクの無駄ですがxtensa-esp32-elfディレクトリをコピーしてもOK(約140M)

ここでArduino IDEを起動

esp32関連のボードがずら〜と並びます。

ESP32 BLE for Arduinoの導入

Arduino core for ESP32にはBLE関連のライブラリが入っていません。
ESP32 BLE for ArduinoのページからDownload ZIPしておきます。

$ unzip ESP32_BLE_Arduino-af865a916795289c8e7e09b091ff2140c33fc3fe.zip
$ cd ESP32_BLE_Arduino-af865a916795289c8e7e09b091ff2140c33fc3fe/
$ cp * ~/Applications/arduino-1.8.5/hardware/espressif/esp32/libraries/BLE

実行してみる
スケッチ例から01.Basics – Blinkを書き込んでみます

LED_BUILTIN関数は使えないので2(GPIO2)を指定しています。

下側のウインドウを見てわかる通りコンパイルにはxtensa-esp32-elfが使われています。

ライブラリに関しては8266と比べるとまだこれからといったところでしょうか。

cp2102のUpload Speedも1.5M OKです。