IoT菜園活用レシピ

M5StackとESP-NOW連携による分散型IoT菜園システム構築:無線センシングと自動制御の実践

Tags: IoT菜園, M5Stack, ESP-NOW, 分散システム, 自動制御

はじめに:次世代IoT菜園へのステップ

家庭菜園におけるIoT技術の導入は、栽培プロセスの効率化と最適化を大きく進めます。特に、市販の単機能デバイスでは実現が難しい、複数のセンサーデータに基づいた統合的な環境制御や、広範囲にわたる菜園のモニタリングは、自作のIoTシステムによってその可能性を広げることができます。

本稿では、M5StackシリーズとESP-NOWプロトコルを活用し、分散型IoT菜園システムを構築する具体的な手法について解説いたします。このシステムは、無線による柔軟なセンシングノード配置と、セントラルノードでのデータ集約・自動制御を可能にし、より高度な菜園管理を実現します。

M5StackとESP-NOWによる分散型システムの利点

従来のIoT菜園システムでは、Wi-Fiを介してクラウドにデータを送信し、クラウド側で制御判断を行う、あるいは単一のコントローラーで全てのセンサーとアクチュエーターを管理する形式が一般的でした。しかし、これらの方式には以下のような課題も存在します。

これらの課題に対し、ESP-NOWプロトコルとM5Stackの組み合わせは有効な解決策を提供します。

M5Stackシリーズの特性

M5Stackは、ESP32をベースとしたモジュール型開発ボードです。小型でありながら、ディスプレイ、ボタン、Wi-Fi、Bluetooth、そして多数のGroveコネクタを標準搭載しており、プロトタイピングから実運用まで幅広く対応できます。シリーズには、ディスプレイ付きのM5Stack Core、極小サイズのM5Stack Atom、様々な機能を持つM5Stack Unitなどがあり、用途に応じた選択が可能です。

ESP-NOWプロトコルの概要

ESP-NOWは、Espressif Systemsが提供するステートレスなコネクションレス通信プロトコルです。Wi-FiのMAC層上で動作し、アクセスポイントを介さずにデバイス間で直接データを送受信できます。このプロトコルの主な利点は以下の通りです。

ESP-NOWを用いることで、各センシングノードは必要な時にのみデータを送信し、セントラルノードがそれらを受信・集約する、効率的な分散型システムを構築できます。

システムアーキテクチャの設計

本システムは、主に以下の2種類のノードで構成されます。

  1. センシングノード(リモートノード):

    • M5Stack Atom LiteまたはM5Stack Unitシリーズをベースとします。
    • 土壌水分センサー、温度湿度センサー、照度センサーなどを接続します。
    • 定期的にセンサーデータを取得し、ESP-NOWを介してセントラルノードへ送信します。
    • 可能な限りスリープモードを活用し、バッテリー寿命の最大化を図ります。
  2. セントラルノード(コントローラー):

    • M5Stack Core(Core2など)をベースとします。
    • 複数のセンシングノードからESP-NOWでデータを受信し、処理します。
    • 受信したデータに基づいて、自動給水ポンプや換気ファンなどのアクチュエーターを制御します。
    • ディスプレイに現在の環境情報やシステムの稼働状況を表示します。
    • (オプションで、ローカルネットワーク内のWebサーバー機能や、簡易的なデータロギング機能を実装することも可能です。)
graph LR
    subgraph 菜園エリア
        SN1[センシングノード1 (M5Stack Atom + センサー)] -- ESP-NOW --> CN(セントラルノード M5Stack Core)
        SN2[センシングノード2 (M5Stack Atom + センサー)] -- ESP-NOW --> CN
        SN3[センシングノード3 (M5Stack Unit + センサー)] -- ESP-NOW --> CN
    end
    CN -- 制御信号 --> AP1[アクチュエーター1 (例: 給水ポンプ)]
    CN -- 制御信号 --> AP2[アクチュエーター2 (例: 換気ファン)]
    CN -- ディスプレイ --> User[ユーザー]

センシングノードの構築

部品選定例

回路設計の考え方

M5Stack Atom LiteはGroveコネクタを搭載しているため、対応するセンサーは基本的にプラグアンドプレイで接続できます。 静電容量式土壌水分センサーはアナログ入力、DHTシリーズはGPIO、BH1750はI2Cバスに接続します。

M5Stack Atom Lite
- Groveポート (G26/G32, G33/G27など)
  - 土壌水分センサー (ADC入力)
  - DHTxx (GPIO)
  - BH1750 (I2C)
- USB-Cポート (給電、書き込み)

ファームウェア開発:ESP-NOWによるデータ送信

Arduino IDEまたはESP-IDF環境を用いて開発します。ESP-NOWを使用するには、esp_now.hをインクルードし、初期化、送信先MACアドレスの登録、コールバック関数の設定が必要です。

センシングノードの基本的な処理フローは以下の通りです。

  1. M5Stackの初期化とセンサーのセットアップ。
  2. ESP-NOWの初期化と送信先(セントラルノード)MACアドレスの登録。
  3. 定期的に(例:5分ごと)センサーからデータを読み込む。
  4. 読み込んだデータを構造体に格納。
  5. esp_now_send()関数を用いてデータをセントラルノードへ送信。
  6. 指定時間スリープモードに入り、消費電力を抑える。

データ構造体例:

typedef struct struct_message {
    uint8_t sensorId;
    float temperature;
    float humidity;
    int soilMoisture;
    int lux;
} struct_message;

送信処理の概念:

// ESP-NOW初期化
esp_now_init();
esp_now_register_send_cb(OnDataSent); // 送信結果コールバック

// ピア登録(セントラルノードのMACアドレス)
uint8_t broadcastAddress[] = {0xXX, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX}; // セントラルノードのMACアドレス
esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_CONTROLLER, 0, NULL, 0);

// センサーデータ取得と送信
void sendSensorData() {
    // センサーからデータ読み込み
    // ...
    myData.sensorId = 1; // このノードのID
    // ... データをmyDataに格納

    esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
}

// 送信後コールバック
void OnDataSent(uint8_t *mac_addr, esp_now_send_status_t status) {
    // 送信結果のログ出力など
}

// ループ内で定期的にsendSensorData()を呼び出し、その後スリープ

セントラルノード(コントローラー)の構築

部品選定例

回路設計の考え方

M5Stack Core2は、内蔵バッテリーと電源管理チップを搭載しており、安定した運用が可能です。アクチュエーターの制御には、リレーモジュールを介してM5StackのGPIOピンを利用します。

M5Stack Core2
- GPIOピン (例: G26, G32, G33など)
  - リレーモジュール (信号線) --> DCポンプ電源
  - リレーモジュール (信号線) --> DCファン電源
- ディスプレイ
- USB-Cポート (給電、書き込み)

ファームウェア開発:ESP-NOW受信と自動制御ロジック

セントラルノードのファームウェアは、複数のセンシングノードからのデータ受信、データの解析、閾値に基づく制御判断、そしてアクチュエーターへの出力が主な役割です。

受信処理の概念:

// ESP-NOW初期化
esp_now_init();
esp_now_register_recv_cb(OnDataRecv); // 受信データコールバック

// 受信データコールバック
void OnDataRecv(uint8_t *mac_addr, uint8_t *incomingData, int len) {
    memcpy(&receivedData, incomingData, sizeof(receivedData));
    // 受信したデータを処理 (例: LCD表示、制御ロジックへの入力)
    processSensorData(receivedData);
}

// 受信データ処理と制御ロジック
void processSensorData(struct_message data) {
    // センサーIDごとにデータを管理 (配列やマップなど)
    // 例えば、soilMoistureが閾値以下なら給水
    if (data.sensorId == 1 && data.soilMoisture < 300) {
        controlWaterPump(true); // 給水開始
    } else {
        controlWaterPump(false); // 給水停止
    }

    // 温度や湿度に基づいて換気ファンを制御
    if (data.temperature > 28.0 || data.humidity > 80.0) {
        controlFan(true); // 換気開始
    } else {
        controlFan(false); // 換気停止
    }

    // LCDに表示更新
    M5.Lcd.setCursor(0, 0);
    M5.Lcd.printf("ID:%d Temp:%.1f Hum:%.1f Soil:%d Lux:%d\n",
                  data.sensorId, data.temperature, data.humidity, data.soilMoisture, data.lux);
}

// アクチュエーター制御関数
void controlWaterPump(bool state) {
    digitalWrite(PUMP_RELAY_PIN, state ? HIGH : LOW);
}
void controlFan(bool state) {
    digitalWrite(FAN_RELAY_PIN, state ? HIGH : LOW);
}

具体的な応用事例とデータ活用の深化

1. トマト栽培における水分管理の最適化

2. 小規模ビニールハウス内の環境制御

システム構築における課題と解決策

1. ESP-NOWの通信安定性

2. 電源管理

3. センサーのキャリブレーション

まとめと今後の展望

M5StackとESP-NOWを組み合わせた分散型IoT菜園システムの構築は、市販のソリューションでは得られない柔軟性と制御精度を家庭菜園にもたらします。各ノードが独立して機能し、無線でデータをやり取りすることで、設置場所の制約が少なく、大規模な菜園にも対応可能です。

本システムを基盤として、以下のようなさらなる発展が考えられます。

これらの技術的な探求は、家庭菜園を単なる趣味の領域を超え、データに基づいた科学的なアプローチへと進化させる契機となるでしょう。