Raspberry Pi ESP32,ESP8266開発環境(PlatformIO)

PlatformIOは組み込み系によく使われるクロスコンパイル環境です。特にESPシリーズに限った訳では無いのですが前回からの流れとした内容になっています。

Raspberry Pi + Arduino IDEは非力なpiにとっては起動に時間がかかったり動作も重く感じてしまいます。その点PlatformIOはCLIで開発が可能でArduino IDEと使い分けることによりかなり快適な環境を構築することが可能になるものと思います。

PlatformIOの特長としてライブラリやコンパイラは必要に応じて自動でダウンロードしてくれます。
当サイトで試してみるとESP32も問題なくコンパイル、書き込みも実行してくれます。
そこでコンパイラは?ということで調べると~/.platformio/以下に必要なものがダウンロードされています。コンパイラは~/.platformio/packages/toolchain-xtensa32にあります。
やはりxtensa-esp32-elfが使われています。
Arduino IDEからこのディレクトリにリンクを張り直してみます。

$ cd ~/Applications/arduino-1.8.5/hardware/espressif/esp32/tools
$ rm xtensa-esp32-elf
$ ln -s ~/.platformio/packages/toolchain-xtensa32 xtensa-esp32-elf

Arduino IDEからも問題無いですね〜。前回は時間を掛けてソースからビルドしましたがpi+Arduino IDEでESP32環境を導入するにはPlatformIOを利用するのが早そうです。

PlatformIOを使ってみる

インストール

$ pip install platformio

実行コマンドは~/.local/binに保存されます。パスが通って無い場合は.bash_profileを作成して登録します。

今回はPlatformIO Coreのみ使用するのでターミナルやエディタは自分の使いやすいものを使用します。

端末にはgnome-terminal
# apt install gnome-terminal
gnome-terminalはシェアNo1とあって今回の目的にはやはり使いやすいと思います。
エディタはGeany raspbianデフォルトでインストール済

作業ディレクトリの作成

$ mkdir -p ~/platformio/project && cd ~/platformio/project

ESP32(ESP-WROOM-32)で試してみる

$ pio boards | grep -i esp32


ボードを選択
この中からモジュールesp32devを選択

arduinoのスケッチ例からSimpleWiFiServerを試してみます。

$ mkdir SimpleWiFiServer && cd SimpleWiFiServer
$ pio init -b esp32dev

platformioコマンドはpioで置き換えできます。実行すると以下のディレクトリ、ファイルが作成されています。

-rw-r--r-- 1 pi pi   21  6月 26 13:52 .gitignore
drwxr-xr-x 3 pi pi 4096  6月 26 15:28 .pioenvs/
-rw-r--r-- 1 pi pi 1553  6月 26 13:52 .travis.yml
drwxr-xr-x 2 pi pi 4096  6月 26 13:52 lib/
-rw-r--r-- 1 pi pi  485  6月 26 14:00 platformio.ini
drwxr-xr-x 2 pi pi 4096  6月 26 15:28 src/

platformio.iniの編集

[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
upload_speed = 1500000
upload_port = /dev/ttyUSB2

upload_speedを追記しています。
usbシリアル接続がttyUSB0以外の時はupload_portの指定が必要です。

arduino IDEからスケッチ開いてファイルを保存、SimpleWiFiServer.inoをsrc以下にコピー

以上で準備が整いました。
ESP-WROOM-32にuploadしてみます。

$ pio run -t upload


Arduino IDEと比べると小気味よくかなり早い印象を受けます。

やはりpiにはコマンドラインが似合います。


ブラウザからも正常にLチカOKですね。


シリアル接続はターミナルから
$ pio device monitor -p /dev/ttyUSB2 -b 115200

ESP8266(ESP-WROOM-02)で試してみる

ESP8266では以前作成したwebサーバーのスケッチを使用します。

$ pio boards | grep -i esp8266


モジュールESP-WROOM-02があります。

$ cd ~/platformio/project && cd ~/platformio/project
$ mkdir esp8266 && cd esp8266
$ pio init -b esp_wroom_02

作成したesp8266.inoをsrc/にライブラリNTP,Timeをlib/にコピー
まずはシリアル接続でuploadします。
platformio.ini (シリアル接続)

[env:esp_wroom_02]
platform = espressif8266
board = esp_wroom_02
framework = arduino
upload_speed = 961200
upload_port = /dev/ttyUSB2
$ pio run -t upload


シリアル upload OK
作成したesp8266.inoにはOTA,SPIFFSが含まれています。
以降はOTAでアップロードが可能になります。

OTA upload
platformio.ini (OTA)

[env:esp_wroom_02]
platform = espressif8266
board = esp_wroom_02
framework = arduino
upload_speed = 961200
;upload_port = /dev/ttyUSB2
upload_port = 192.168.0.225
$ pio run -t upload


OTA upload OK
upload_port = /dev/ttyUSB2はコメントアウト

data upload
platformio.ini (OTA data)
index.html,画像ファイルはsrc/dataにコピー

[env:esp_wroom_02]
platform = espressif8266
board = esp_wroom_02
framework = arduino
upload_speed = 961200
;upload_port = /dev/ttyUSB2
upload_port = 192.168.0.225

[platformio]
data_dir = src/data
$ pio run -t uploadfs


ファイルシステムのアップロードはuploadfsです。dataファイルのみアップロードします

再度シリアル接続でアップロードするには追記した(OTA data)設定をコメントアウトする必要があります。

当面、基本はarduinoのスケッチを利用することになると思いますがうまく使い分けることでRaspberry Pi + PlatformIOはかなり快適な開発環境になると思います。