mimikakimemo

自分用メモ。

PlatformIO IDE を使って ESP-WROOM-02 の開発をする

昨日作った ESP-WROOM-02 の実験用ボードを使って、温湿度センサー DHT11 からデータを取得したい。以前 NodeMCU で DHT11 を使ってみた記事はこちら

これまでは、Visual Studio Code extension for Arduino を使って VS Code 上で開発していた。しかし、

  • 依存ライブラリの管理が Arduino IDE まかせ
  • 機密情報を環境変数として外出しするのが面倒そう
  • ビルドのたびに Arduino IDE のスプラッシュスクリーンが表示されて邪魔

というような不満があった。そこで、今回は PlatformIO を使ってみる。

platformio.org

PlatformIO のデスクトップ IDE は、VS Code拡張機能として動く1

VSCode — PlatformIO 5.1.1a1 documentation

インストールとプロジェクト作成

ということで、VS Code 上で拡張機能「PlatformIO IDE」と検索し、インストールした。しばらく時間がかかるが、完了すると「Finish! Please restart VSCode.」というメッセージが出てくるので、VS Code を再起動する。

f:id:mimikakimemo:20210207151234p:plain

右下の 🏠 アイコンをクリックすると PlatformIO のホーム画面が開く。[New Project] をクリック。

f:id:mimikakimemo:20210207153640p:plain

プロジェクト作成のウィザートが開くので、適当な名前をつける。Board は ESP-WROOM-02 (Espressif) を選択。下図のようなファイル構成のプロジェクトが作成された。

f:id:mimikakimemo:20210207154701p:plain

ビルド・書き込み

src/main.cpp に簡単なプログラムを書く。初期状態で補完も効いていて使いやすい。

f:id:mimikakimemo:20210207171320p:plain

画面下部の ✔️ アイコンをクリックするとビルドが走る。ショートカットキーは Ctrl+Opt+B。

f:id:mimikakimemo:20210207160723p:plain

また、➡️ アイコンをクリックすると(ビルド+)書き込み(upload)が行われる。ショートカットは Ctrl+Opt+U。

f:id:mimikakimemo:20210207161849p:plain

しかし、自分の場合は上のように OSError: [Errno 16] Resource busy: '/dev/cu.usbserial-2' というエラーが出てうまく行かなかった。別のポートが選択されている様子。自分の場合は、前の記事でシリアル通信を試したように、ESP-WROOM-02 には /dev/tty.usbserial-DM02NA6M でアクセスできる。そこで、プロジェクトの設定ファイル platformio.ini を編集して upload_port を明示的に指定した。

--- a/platformio.ini
+++ b/platformio.ini
@@ -12,3 +12,4 @@
 platform = espressif8266
 board = esp_wroom_02
 framework = arduino
+upload_port = /dev/tty.usbserial-DM02NA6M

再度書き込みを試したら成功。

f:id:mimikakimemo:20210207163311p:plain

ちなみに、前回作成した実験用ボードでは、

  1. ファームウェア書き込みボタン(下のタクトスイッチ)を押しっぱなしにする
  2. そのまま、リセットボタン(上のタクトスイッチ)を押す
  3. リセットボタンを離す
  4. ファームウェア書き込みボタンを離す
  5. 書き込みを行う

というボタン操作をする必要があるので注意。

シリアルモニター

こちらも、monitor_portmonitor_speed をあらかじめ指定しておく。

--- a/platformio.ini
+++ b/platformio.ini
@@ -13,3 +13,5 @@ platform = espressif8266
 board = esp_wroom_02
 framework = arduino
 upload_port = /dev/tty.usbserial-DM02NA6M
+monitor_port = /dev/tty.usbserial-DM02NA6M
+monitor_speed = 115200

画面下部の 🔌 アイコンをクリックするとシリアルモニターが開く。ショートカットキーは Ctrl+Opt+S

f:id:mimikakimemo:20210207170054p:plain

自分の場合、一度ブレッドボード上のリセットボタンを押して再起動しないと、出力が表示されなかった。

ライブラリを依存関係に追加して使う

次に、温湿度センサー DHT11 を使うためのライブラリを追加する。ちなみに、以前 VS CodeArduino 拡張機能で開発していたときは、Arduino IDE のライブラリマネージャーからインストールする必要があった。

PlatformIO では、Libraries のページから検索できる。dht11 を検索窓に入力すると、DHT sensor library が出てくるので、クリック。

f:id:mimikakimemo:20210207172046p:plain

ライブラリの詳細画面が表示されるので、そこから [Add to Project] をクリック。

f:id:mimikakimemo:20210207172410p:plain

インストール先のプロジェクトを選択して [Add] で追加する。

f:id:mimikakimemo:20210207172543p:plain

platformio.inilib_deps に依存が追加された。

--- a/platformio.ini
+++ b/platformio.ini
@@ -15,3 +15,4 @@ framework = arduino
 upload_port = /dev/tty.usbserial-DM02NA6M
 monitor_port = /dev/tty.usbserial-DM02NA6M
 monitor_speed = 115200
+lib_deps = adafruit/DHT sensor library@^1.4.1

バージョンも指定されているので、他のプログラミング言語の依存管理みたいに、再現性のあるビルドができる。

しかし、このライブラリを使ったコード(後掲)をビルドしようと思ったら、Adafruit_Sensor.h: No such file or directory というエラーが出た。

f:id:mimikakimemo:20210207173953p:plain

依存の依存 Adafruit Unified Sensor も自分でインストールする必要があるらしい。先ほどと同じく、GUI から検索して追加した結果。

--- a/platformio.ini
+++ b/platformio.ini
@@ -15,4 +15,6 @@ framework = arduino
 upload_port = /dev/tty.usbserial-DM02NA6M
 monitor_port = /dev/tty.usbserial-DM02NA6M
 monitor_speed = 115200
-lib_deps = adafruit/DHT sensor library@^1.4.1
+lib_deps =
+       adafruit/DHT sensor library@^1.4.1
+       adafruit/Adafruit Unified Sensor@^1.1.4

これでビルドができるようになった。

完成

DHT11 は以下のモジュールを使った。モジュール上に抵抗も実装されている。

この DHT11 モジュールの出力を、ESP-WROOM-02 の IO4 ピンに接続した。

f:id:mimikakimemo:20210207181111j:plain

プログラムは、先日 NodeMCU で使ったものDHTPIN 以外は同様。

#include <Arduino.h>
#include "DHT.h"

#define DHTPIN 4      // IO4 ピンからセンサーの値を得る
#define DHTTYPE DHT11 // DHT 11 を使う

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  dht.begin();
}

void loop() {
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  Serial.println("Temperature: " + String(t, 1) + "°C\tHumidity: " + String(h, 0) + "%");

  delay(2000);
}

取得した値がシリアルモニターに無事表示されている。

f:id:mimikakimemo:20210207182348p:plain


  1. 一応、他のエディタにもある程度対応はしている様子。