一般記事

ESP32ではじめるIoTデバイス開発

この記事を読むのに必要な時間:およそ 4 分

電源管理

 ネットワークと並んでIoTデバイスの共通課題は電源です。IoTデバイスを制御するマイコンやセンサなどの多くは1.8Vから5V程度の電圧で動作します。IoTデバイスを設置する場所で100Vの商用電源が使えれば,ACアダプタで必要な電圧を作り,IoTデバイスを安定して動作させることができます。しかし,山中や水田の真ん中など近くに商用電源がない場所や,家庭やオフィスのように商用電源があっても美観上の観点でデバイスをワイヤレスにしたい場合は,IoTデバイスをバッテリーあるいは太陽電池のような発電デバイスと蓄電池の組み合わせで動作させる必要があります。

 IoTデバイスをバッテリーや発電デバイスで動作させる場合,IoTデバイス自体を低消費電力にすることはもちろんですが,IoTデバイスの動作特性に合わせた省電力化が必要です。

 IoTデバイスは,周期的にデータを測定してクラウドサービスに送信し,送信が終わると次の測定まで待機するという動作をするものが多くあります。あるいは何かの変化があるまではずっと待機し,変化があるとIoTデバイスが動き出して,データを測定したり,変化に対応するものもあります。いずれの場合も,待機中の消費電力を通常よりも下げることで,バッテリーの消耗を抑えることができます。

 IoTデバイスの制御マイコンとしては,マイコン自体の消費電力が低く,さらに待機中の消費電力を下げられる機能が必要とされます。

ESP32の構造と特徴

 前節で整理したIoTデバイスの制御マイコンに求められる要件を踏まえて,ESP32写真1の構造と特徴を見ていきましょう。

写真1 ESP32

写真1 ESP32

ESP32の仕様

 ESP32の仕様を,ポピュラーなマイコンであるArduino UNO,Raspberry Pi 3B+と比較したのが表2です。ESP32はマイコンモジュールの仕様なのに対し,Arudino UNOとRaspberry Pi 3B+はボードの仕様なので,きちんと対応した比較にはなっていませんが,ESP32がこれだけの機能をマイコンモジュールに搭載していることが分かります。

表2 主なマイコンの仕様

表2 主なマイコンの仕様

 ESP32はSRAM520kB,フラッシュメモリ4MBと比較的大きく,センサなどの周辺デバイスとのインターフェースも充実しています。また,Wi-FiとBluetoothの通信モジュールを内蔵しているのがESP32の特徴です。消費電流も平均80mA程度,後で説明するDeep sleep時には10〜150マイクロAと低消費電力です。

 Arduino UNOはメモリも小さく,通信モジュールもありません。Wi-FiやBluetooth通信は,ボードを追加すれば可能ですが,追加するボードに合わせたライブラリーを選ぶ必要があるなど,プログラミングには注意が必要です。

 Raspberry Pi 3B+はメモリも1GBと大きく,Wi-FiとBluetoothの通信モジュールや映像入出力インターフェースを持つなど,非常に強力なボードコンピュータですが,消費電流がアイドル時で459mA,最大で1.13Aと大きく,バッテリーで駆動するのは無理があります。

 このようにESP32はデバイス制御や通信機能などの豊富な機能を持ちながら,消費電力が低く,IoTデバイス制御に適したマイコンと言えます。

ESP32の内部構造と省電力機能

 ESP32の内部は図2のような機能ブロックで構成されています。

図2 ESP32の機能ブロック

図2 ESP32の機能ブロック

 中央にあるCPU,ROM,RAMがプログラムを実行するマイコンの処理本体です。その上にあるのがWi-FiとBluetoothの処理モジュールで,その右側にWi-FiとBluetoothで共通に使う無線モジュールがあります。CPUモジュールの右側はRSAなどの暗号化をおこなうモジュール,左側にはSPI,I2Cなどを扱う周辺I/Oモジュールがあります。CPUモジュールの下にあるRTCと書かれたモジュールがリアルタイムクロックとULP(Ultra-Low-Power Co-processor⁠⁠,リカバリメモリなどが含まれるモジュールで,マイコンの消費電力を管理するモジュールです。

 ESP32はこの機能ブロック単位で機能をオフにすることができ,それによってマイコンの消費電力をコントロールできます。RTCモジュール以外の機能ブロックをすべてオフにするDeep sleepモードでは,ESP32の消費電力が10〜150マイクロA程度まで下げられます。IoTデバイスが周期的にセンサでデータを測定してクラウドサービスに送信し,送信が終わると次の測定まで待機するような動作をする場合,待機中はマイコンをDeep sleepモードに移行させることにより,マイコンの消費電力を大きく下げることができます。

ESP32を使ったIoTデバイスの事例

 最後に,ESP32を使って周期的に温度と湿度を測定し,クラウドサービスに送信する具体的な事例を見てみましょう。前節で紹介したように,データを測定・送信した後はESP32をDeep sleepモードに移行させ,待機中の消費電力をさげるようにします。

温湿度センサデバイスのハードウェア

 ESP32を使った温湿度センサデバイスは写真2のようなものです。

写真2 ESP32を使った温湿度センサデバイス

写真2 ESP32を使った温湿度センサデバイス(⁠⁠IoT開発スタートブック」より)

 温度,湿度センサはSi7021というデジタル温湿度センサを使いました。回路図は図3のようになります。

図3 温湿度センサデバイスの回路図

図3 温湿度センサデバイスの回路図

 デバイスは単3乾電池3本で駆動します。電池電圧を抵抗で分圧してESP32のADコンバータ(SENSOR_VNピン)に加え,温度,湿度と合わせて測定するようにしました。

温湿度センサデバイスのソフトウェア

 温湿度センサデバイスのプログラムは次のようになります。

#include 
#include "Adafruit_Si7021.h"
#include 

#define TIME_TO_SLEEP  60           // 測定周期(秒)

const char* ssid = "ssid";          // Wi-FiルーターのSSID
const char* password = "password";  // Wi-Fiルーターのパスワード

WiFiClient client;
Ambient ambient;

unsigned int channelId = 100;       // AmbientのチャネルID
const char* writeKey = "writeKey";  // ライトキー

Adafruit_Si7021 sensor = Adafruit_Si7021();

#define BATTERY 39                  // バッテリー電圧を測るピン

void setup(){
    unsigned long starttime = millis();
    Serial.begin(115200);
    while (!Serial) ;

    WiFi.begin(ssid, password);  // Wi-Fiネットワークに接続する
    while (WiFi.status() != WL_CONNECTED) {  // 接続したか調べる
        delay(500);
        Serial.print(".");
    }

    ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化

    sensor.begin();

    pinMode(BATTERY, INPUT);  // バッテリー測定ピンをINPUTモードにする

    float temp = sensor.readTemperature();
    float humid = sensor.readHumidity();
    float vbat = (analogRead(BATTERY) / 4095.0 * 3.3 + 0.1132) * 2.0;
    Serial.printf("temp: %.2f, humid: %.2f, vbat: %.1f\r\n", temp, humid, vbat);

    ambient.set(1, temp);  // Ambientのデータ1に温度をセットする
    ambient.set(2, humid);  // データ2に湿度をセットする
    ambient.set(3, vbat);  // データ3にバッテリー電圧をセットする
    ambient.send();  // Ambientに送信する
    delay(1000);

    // Deep sleepする時間(マイクロ秒)を計算する
    uint64_t sleeptime = TIME_TO_SLEEP * 1000000 - (millis() - starttime) * 1000 - 1000000;
    esp_deep_sleep(sleeptime);  // DeepSleepモードに移行
    // ここには戻らない
}

void loop(){
}

 プログラムの大まかな流れは,次のようになります。

  1. Wi-Fiネットワークに接続する
  2. Ambientの初期設定をおこなう
  3. 温湿度センサSi7021の初期設定をおこなう
  4. Si7021から温度,湿度を取得する
  5. Ambientにデータを送信する
  6. Deep sleepモードに以降

 esp_deep_sleepというシステム関数を呼ぶと,ESP32は引数で指定された時間Deep sleepモードに移行します。指定した時間が経過すると,ESP32がリセットされ,プログラムの最初から実行が繰り返されます。

 Wi-Fiに接続して温度,湿度を測定し,データをクラウドサービスに送信するまでは5秒程度です。仮に測定周期を5分(300秒)とすると,周期の98%の時間は待機しています。待機中にマイコンをDeep sleepに移行させることで,IoTデバイスの消費電力を大きく下げています。

 このように,ESP32はWi-FiとBluetoothの通信モジュールが搭載されていて,インターネットに簡単に接続ができ,消費電力も低く,さらに待機中の消費電力を下げる機構も組み込まれていて,まさにIoTに適したマイコンです。

 ESP32を使った電子工作のさらなる実例やプログラムの詳細な解説が知りたいという方におすすめなのが『IoT開発スタートブック』です。⁠IoT開発スタートブック』では温度,湿度を測定するだけの簡単なセンサデバイスから始めて,センサデータをクラウドサービスに送信する,デバイスを省電力化する,と順を追って機能強化し,解説をしています。興味を持たれた方は『IoT開発スタートブック』も合わせてご覧ください。

著者プロフィール

下島健彦(しもじまたけひこ)

NECで組込みシステム向けリアルタイムOSの開発,米スタンフォード大学計算機科学科への留学を経て,インターネットプロバイダ事業BIGLOBEの立ち上げからメディア事業を担当。2015年ごろから個人でIoTデーター可視化サービス「Ambient(https://ambidata.io)」を開発,運営。現在,アンビエントデーター株式会社代表取締役。日本のM5Stackユーザーグループ主催。趣味はお茶とツール・ド・フランス観戦。

バックナンバー

IoT

  • ESP32ではじめるIoTデバイス開発