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

書籍IoT開発スタートブック─ESP32でクラウドにつなげる電子工作をはじめよう!刊行にあわせて著者の下島健彦氏にマイコン「ESP32」を使ったIoTデバイスの開発について寄稿いただきました。

 近年注目されてるIoTについて、みずからデバイスを開発してみたいという方も多いのではないでしょうか。通信モジュールがはじめから搭載されている「ESP32」というマイコンを使えば、電子工作の入門者でも簡単にIoTデバイスの開発をはじめることができます。

 本稿では、まずIoTシステムの構造とIoTデバイスの制御用マイコンに求められる要件を整理し、次にESP32の構造とIoTデバイスの制御用マイコンとして見たときの特徴を解説します。最後にESP32を使ったIoTデバイスの事例を紹介します。

IoTシステムの構造(IoTデバイス・ネットワーク・クラウドサービス)

 IoTシステムといっても、国や自治体が管理する河川の水位監視システムや、世界中で稼働している工作機械の状態を監視してメンテするような大規模なシステムから、ペットのいる部屋の温度、湿度をモニタリングするといった個人で開発できるようなシステムまで、いろいろなものがあり、規模や複雑さ、求められる信頼性などはさまざまです。

 さまざまなバリエーションのあるIoTシステムですが、非常に単純化すると、その構造は図1のようなものと捉えることができます。

図1 IoTシステムの構造
図1 IoTシステムの構造

 主な構成要素は外界との接点となるIoTデバイス、IoTシステムの中心になるクラウドサービス、IoTデバイスとクラウドサービスをつなぐネットワークの3つです。

IoTデバイス

 IoTデバイスは、IoTシステムにおいて、外界との接点になるものです。IoTデバイスは工作機械などのモノに組み込まれたものや、センサ端末のように独立したものなど、形状や機能はさまざまですが、共通する主な構成要素にはセンサやモーターといったデバイス、通信モジュール、マイコンがあります。

 センサやモーターが外界の状態をデータ化して取り込んだり、外界を制御したり、外界との具体的な接点になります。通信モジュールがネットワークに接続するインターフェースです。

 マイコンがIoTデバイス全体を制御し、センサデータを取得してネットワーク経由でクラウドサービスに送ったり、クラウドサービスからの指示を受けてモーターを動かしたりします。

ネットワーク

 IoTネットワークはIoTデバイスとクラウドサービスをつなぐものです。IoTデバイスからクラウドサービスまでのルートとしては、主に次のようなバリエーションがあります。

  • IoTデバイス→有線LAN→ルーター→
     インターネット→クラウドサービス
  • IoTデバイス→無線LAN(Wi-Fi⁠⁠→Wi-Fiルーター→
     インターネット→クラウドサービス
  • IoTデバイス→Bluetooth→Bluetoothゲートウェイ→
     インターネット→クラウドサービス
  • IoTデバイス→3G/LTE→携帯ネットワーク→
     インターネット→クラウドサービス
  • IoTデバイス→sigfox/LoRaWAN→ゲートウェイ→
     インターネット→クラウドサービス

 どのネットワークを利用するかは、IoTデバイスを設置する場所で利用可能なネットワークによって決まってきます。なかでもWi-Fiは家庭、オフィス、工場などさまざまな場所にWi-Fiルータが設置されているため、IoTネットワークとしても使いやすいネットワークです。

クラウドサービス

 IoTクラウドサービス表1は、河川の水位監視システム、工場の機械の稼働状態監視システムなど、個別に作り込まれた専用のサービスと、特定のサービスに依存しない汎用のプラットフォームサービスがあります。

表1 主なIoTクラウドサービス
表1 主なIoTクラウドサービス

 汎用プラットフォームサービスには、IoTデータの収集・可視化、分析、制御といったといった機能が含まれます。そして、これらの機能をすべて含んだリッチ系のサービスと、データの収集・可視化に特化したシンプル系のサービスがあります。どのサービスを選択するかは、IoTサービスとして何を実現したいかによりますが、多くの場合、IoTサービスの第一ステップが対象システムの見える化であることから、シンプルなサービスから使い始めるのがよいでしょう。

IoTデバイスの制御マイコンに求められる要件

 IoTシステムの構造を概観したところで、IoTデバイスを制御するマイコンに求められる要件を考えてみます。

 IoTデバイスはアプリケーションによってさまざまなバリエーションがありますが、共通する機能として、センサやモーターなどのデバイス制御、クラウドサービスとの通信、そして電源の管理があります。

デバイス制御

 センサやモーターなどのデバイスを制御するインターフェースは、アナログ電圧によるもの、デジタル信号によるもの、デジタル信号によるものでは、I2C通信、SPI通信、シリアル通信、パルス幅(PWM)制御など、デバイスごとにさまざまな制御方式があります。

 使おうとするデバイスが決まっている場合は、マイコンもデバイスの制御方式に対応している必要があるのはもちろんですが、汎用のIoTデバイス制御マイコンとしては、幅広い制御方式に対応したものが求められます。

ネットワーク

 ネットワークは、IoTデバイスを設置する場所で利用可能なものを使うことになります。家庭やオフィスでは、Wi-Fiルーターが設置されていることが多いので、IoTネットワークとしてもWi-Fiを選択することが多くなります。山中や水田の真ん中など、近くにインターネット回線がない場所では、3G/LTEやsigfox/LoRaWANといったネットワークを選択することになります。

 マイコンに外付けする通信モジュールを使う場合は、マイコンとのインターフェースはI2C通信やシリアル通信などなので、マイコンはそれらの制御方式に対応している必要があります。

 マイコンによってはいくつかの通信モジュールを内蔵しているものがあり、このようなマイコンはIoTデバイスの制御用としては使いやすいものになります。

電源管理

 ネットワークと並んで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開発スタートブック』も合わせてご覧ください。

おすすめ記事

記事・ニュース一覧