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. 一応、他のエディタにもある程度対応はしている様子。

ESP-WROOM-02 DIP化キットで実験用ボードを作る

この前の記事で触れた『超特急Web接続!ESPマイコン・プログラム全集』という本を読んだ。もともとやりたかった、電池駆動の方法も載っている。原理というよりも、実際の利用例が回路図やサンプルコードとともにたくさん掲載されている。自分のような素人でも、とりあえず真似をすればすぐに作れそうな感じ。サポートページと GitHub リポジトリは以下の通り。

第1章では、ESP-WROOM-02 書き込み用・実験用のボードをブレッドボード上に実装する。初心者なので、まずはこれに従ってそのまま作ることにした。

ちなみに、今まで違いがよく分かっていなかったが、

ということらしい。なるほど。

はんだ付け

ブレッドボードを使うので基本的にははんだ不要だが、ESP-WROOM-02 DIP化キットと、USB シリアル変換モジュール AE-FT234X のピンヘッダははんだ付けをする必要がある。はんだ付けに必要な道具を持っていなかったので、ネット上の情報を参考にしつつ、適当に一式買い揃えた。今後どこまで使うかまだ分からないので、手頃なものを。

セラミック式の方が温度の立ち上がりが良くて使いやすいとのことだったので、ハッコーDASH FX650-81 にした。温度調節可能なものの方がおすすめらしいが、そこまでいくと数千円高くなってしまう。こて先は C2 型が使いやすいとのこと。それに加えて、安定感のあるほどほどのこて台を。

鉛入りのはんだと、不要なはんだを取り除くための吸い取り線。

このあたりの動画を参考にしてピンヘッダをはんだ付けした。

www.youtube.com

ブレッドボードに実装

部品は秋月電子で注文。全部で2,000円弱で、それに送料が500円。ちなみに、ESP-WROOM-02 DIP化キット自体は650円。サポートページにレギュレータの代替品についての参考資料という PDF があったので、それを参考にしてレギュレータを TA48033Sに置き換えた。一緒に使う電解コンデンサ・セラミックコンデンサも買ったのだが、秋月電子の TA48033S にはそれらが同梱されていたので、別で買う必要はなかったようだ。

f:id:mimikakimemo:20210206190551j:plain

14行目右から (-) に伸びている緑の線は不要な気がするが、何か意味があるんだろうか?

タクトスイッチは Osoyoo のキットに入っていたものを使い回せばいいかと思っていたが、いざ組んでみると一回り大きかった。なので、本で紹介されている実験用ボードの配線とは若干ずれている。

レギュレータと USB シリアル変換モジュールを差し込めば、こんな感じ。

f:id:mimikakimemo:20210206232858j:plain

ちなみに、最初は試したときは次のシリアル通信ができなくて焦った。テスターで電圧を調べたら、レギュレータの向きが逆だったことが発覚。正しい向き(刻印面が左を向く。ピンは上から入力、GND、出力の順)に差し直したら正常に動くようになった。

Mac からシリアル通信をする

USB シリアル変換モジュール AE-FT234X を、USB ケーブルで MacBook に接続。すると、USB シリアル変換モジュールの青い LED が点灯した。かなりまぶしい。Mac の System Information を開いてみると、FT230X Basic UART としてちゃんと認識されている。自分の環境では、ドライバのインストールは不要だった。

f:id:mimikakimemo:20210206191741p:plain

$ ls -l /dev/*usbserial*
crw-rw-rw- 1 root wheel 18, 5  2  6 19:09 /dev/cu.usbserial-DM02NA6M
crw-rw-rw- 1 root wheel 18, 4  2  6 19:09 /dev/tty.usbserial-DM02NA6M

Mac からシリアル通信をしたい場合は、screen コマンドを使えばいいらしい。

$ screen /dev/tty.usbserial-DM02NA6M 115200

最初は何も表示されないが、リセット(上のタクトスイッチ)を1秒程度押して離すと、再起動されて ready と出る。購入直後の ESP8266 では、AT コマンドというものが使えるらしい。試しに AT と入力してみると、OK という応答が返ってくる。

f:id:mimikakimemo:20210206235724p:plain

AT の後の改行は、Enter を押してから Ctrl+J も入力する必要があるので注意。ESP8266 は CR+LF を期待しているようだ。

AT+GMR コマンドを使うと、バージョン情報が表示される。

AT+GMR
AT version:1.6.2.0(Apr 13 2018 11:10:59)
SDK version:2.2.1(6ab97e9)
compile time:Jun  7 2018 19:34:26
Bin version(Wroom 02):1.6.2
OK

ただしこの AT コマンド、Arduino IDE でプログラムを書き込むと使えなくなる。ということで、深入りはしないことにする。

Osoyoo のキットに入っている I2C 1602 LCD モジュール を使う

先月買った Osoyoo のキットに 2 行の液晶ディスプレイ、I2C 1602 LCD モジュールが入っていたので、使ってみる。1602 は 16文字×2行 という意味らしい。Osoyoo 公式のドキュメント(あまり親切ではないが)は以下の通り。

LCD モジュールからは4本の端子 VCC, GND, SCL, SDA が出ている。SCL, SDA は I2C というインターフェイス規格で定義されているらしい。SCL がクロック、SDA がデータで、この2本の信号線があれば、まとめて複数のデバイスと通信できるのだとか。『超特急Web接続! ESPマイコン・プログラム全集』の Appendix 4 に解説があった。NodeMCU の場合、

LCD NodeMCU 備考
VCC VIN 3V3 だと電圧不足だった
GND GND
SCL D1 ESP8266 の IO5 に繋がっている
SDA D2 ESP8266 の IO4 に繋がっている

のように接続すると動かすことができる。

ライブラリは、Osoyoo のサイトから LiquidCrystal_I2C.zip がダウンロードできる。こういったライブラリのインストールのお作法がまだ良くわかっていないが、とりあえず LiquidCrystal_I2C.cppLiquidCrystal_I2C.h をそのままスケッチの隣につっこんだらコンパイルできた。

この前試した温湿度センサー DHT11 の値を LCD に表示してみた。

f:id:mimikakimemo:20210124223812j:plain

#include "LiquidCrystal_I2C.h"
#include "DHT.h"

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

LiquidCrystal_I2C lcd(0x27, 20, 4);
DHT dht(DHTPIN, DHTTYPE);

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

  lcd.init();
  lcd.backlight();

  dht.begin();
}

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

  // 1行目に温度を表示
  lcd.setCursor(0, 0);
  lcd.print("Temp:     " + String(t, 1) + char(0xdf) + "C");
  // 2行目に湿度を表示
  lcd.setCursor(0, 1);
  lcd.print("Humidity:    " + String(h, 0) + "%");

  delay(2000);
}

Arduino の文字列の扱いについては、まだいまいちよく把握していない…。この LCD は HD44780 互換というものらしく、半角カナや ASCII に無い記号も表示できた。温度記号 ℃ は無かったので、上のコードでは半角カナの半濁点 ゚(0xdf)を使って表示している。

参考サイト

ESP8266 を WiFi につなげる

超特急Web接続! ESPマイコン・プログラム全集』を読んで、製作のための部品を手配中。その間に、WiFi 接続を試したい。現状だとまだ電源が必要なので、ワイヤレスにはならないが…。

WiFi を使うための機能は最初にインストールした ESP8266 Arduino Core に入っているので、追加でインストールする必要はない。公式サイトに WiFi クライアントを使うための quick start があったので、それを参考にした。

#include <ESP8266WiFi.h>

const char *ssid = "my-ssid";
const char *password = "my-password";

WiFiClient client;

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

  // WiFi に接続する
  WiFi.begin(ssid, password);

  // 接続完了まで待つ
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());

  // WiFi の状態をシリアルモニターに表示
  WiFi.printDiag(Serial);
}

実行結果。ルータの DHCP から IP アドレスが割り当てられている。

f:id:mimikakimemo:20210124154015p:plain

Arduino のスケッチ(.ino ファイル)に自分の SSID とパスワードを書いてしまうと、Git/GitHub での管理が面倒そうなので、本当は環境変数で外から設定できるようにしたい。が、Arduino IDE からではできないっぽい…?

PlatformIO を使えば簡単なのかな? あとで試してみる。

You can inject system environment variable using sysenv as a section. For example, ${sysenv.HOME}.

この前買った ESP8266 開発ボードを電池で動かしたかった

最近触っている ESP8266 の話続き。これを電池で動かすにはどうしたらいいのか?

ESP8266 で検索すると、ESP-WROOM-02開発ボード(ESPr Developer)の情報がよく出てくる。

ESPr Developer(ピンソケット実装済)

ESPr Developer(ピンソケット実装済)

  • メディア: おもちゃ&ホビー

この場合は、単3電池3本をそのまま VIN と GND に繋げばいいらしい。

ただ、今回のキットに入っていた開発ボードは NodeMCU なので、ちょっと違う。ネット上の情報を調べてみたところ…

The best battery for ESP8266 microcontrollers

The NodeMCU has a build in AMS1117 3.3V voltage regulator that transforms the input voltage from the 5V USB connection as well as the voltage of the VIN pin to the stable 3.3V output voltage.

ESP32を電池で動かしてみる (その1) / kghr IT備忘録

その後ネットでいろいろ読んでたら、この”DOIT ESP32 DEVKIT V1 Board” に使われている1117系レギュレータはドロップアウトが1V近くあるのだとか。こちらのデータシートを見てみると、「Operates Down to 1V Dropout」と書いてあり、乾電池で動かすには向いてないのではと思った。

esp8266 - How to power nodemcu devkit using battery - Stack Overflow

The easiest would be to NOT use that devkit but use one with a LiPo connector instead e.g. https://www.adafruit.com/product/2821. An alternative would be to use WeMos D1 minis with a LiPo/battery shield.

If you want to stick to your devkit you "just" have to make sure you feed 3.3V to the 3.3V pin. Since batteries deliver no stable voltage over time you need to place some kind of buck/boost converter (step-down/step-up) between the battery and the module.

You could of course also target the VIN pin which expects 5V but that would be less efficient if you used a LiPo battery. First, the external converter would boost from the LiPo's ~3.7V to 5V. Then the devkits internal converter would have to bring this down to 3.3V again.

Furthermore, if you feed the ESP8266 from batteries you want to pay attention to any power that'd be lost along the way. With the L7805 voltage regulator for example there is a constant 'quiescent' current draw of 6mA. That may be ok if your source is a power adapter but less ideal when it's a battery. Buck/boost converters are more efficient.

うーん…。そもそも NodeMCU の開発ボードは、電池駆動に向いていなかったらしい。

かと言って、ESPr Developer は税込み1,980円なので、少々値段が張ってしまう。複数個作ろうと思うとさらに。以下の記事を参考にしてライターを作れば、ESP-WROOM-02 DIP化キット(650円)に USB 経由でプログラムを書き込めてお手頃になりそう。

DIP というのは Dual Inline Package の略で、IC の両側に脚が出ている形のことだとか。なるほど。

電子工作初心者で分からないことだらけなので、ついでに『超特急Web接続! ESPマイコン・プログラム全集』という本も注文してみた。