メインコンテンツまでスキップ

自動植物灌水

このレッスンの概要を示すスケッチノート

スケッチノート: Nitya Narasimhan. 画像をクリックすると大きなバージョンが表示されます。

このレッスンは、Microsoft ReactorIoT 01 for Beginners Project 2 - Digital Agriculture seriesの一環として教えられました。

IoTによる自動植物灌水

講義前のクイズ

講義前のクイズ

はじめに

前回のレッスンでは、土壌の湿度を監視する方法を学びました。今回は、土壌の湿度に応じて反応する自動灌水システムのコアコンポーネントを構築する方法を学びます。また、センサーが変化に反応するのに時間がかかることや、アクチュエーターがセンサーで測定される特性を変えるのに時間がかかることについても学びます。

このレッスンでは以下の内容をカバーします:

低電力IoTデバイスから高電力デバイスを制御する

IoTデバイスは低電圧を使用します。これはセンサーやLEDのような低電力アクチュエーターには十分ですが、灌漑に使用される水ポンプのような大きなハードウェアを制御するには不十分です。観葉植物に使用する小さなポンプでさえ、IoTデバイスキットには電流が多すぎて、ボードが焼けてしまいます。

🎓 電流(アンペア、A)は、回路を流れる電気の量です。電圧が押し出す力を提供し、電流は押し出される量です。電流についての詳細はウィキペディアの電流ページで読むことができます。

この解決策は、ポンプを外部電源に接続し、アクチュエーターを使用してポンプをオンにすることです。これは、ライトをオンにするためにスイッチを入れるのと同様です。指でスイッチを入れるのに必要な電力はごくわずかで、これにより110V/240Vの家庭用電気がライトに接続されます。

ライトスイッチがライトに電力を供給する

🎓 家庭用電気は、多くの地域で家庭や企業に国のインフラを通じて供給される電気を指します。

✅ IoTデバイスは通常、3.3Vまたは5V、1アンペア(1A)未満の電流を供給できます。これを家庭用電気と比較すると、家庭用電気は通常230V(北米では120V、日本では100V)で、30Aの電流を供給できます。

これを行うアクチュエーターは多数あり、既存のスイッチに取り付けて指でオンにするのを模倣する機械装置もあります。最も一般的なのはリレーです。

リレー

リレーは、電気信号を機械的な動きに変換してスイッチをオンにする電磁機械スイッチです。リレーのコアは電磁石です。

🎓 電磁石は、コイルに電気を通すことで作られる磁石です。電気がオンになると、コイルが磁化されます。電気がオフになると、コイルは磁力を失います。

オンのとき、電磁石が磁場を作り、出力回路のスイッチをオンにする

リレーでは、制御回路が電磁石に電力を供給します。電磁石がオンになると、レバーを引っ張ってスイッチを動かし、接点のペアを閉じて出力回路を完成させます。

オフのとき、電��磁石は磁場を作らず、出力回路のスイッチをオフにする

制御回路がオフになると、電磁石がオフになり、レバーが解放されて接点が開き、出力回路がオフになります。リレーはデジタルアクチュエーターであり、高信号がリレーをオンにし、低信号がリレーをオフにします。

出力回路は、灌漑システムのような追加のハードウェアに電力を供給するために使用できます。IoTデバイスはリレーをオンにして灌漑システムに電力を供給し、植物に水を供給します。次に、IoTデバイスはリレーをオフにして灌漑システムへの電力を切り、水を止めます。

リレーがオンになり、ポンプがオンになり、植物に水を送る

上のビデオでは、リレーがオンになります。リレーのLEDが点灯してオンであることを示し(リレーボードにはリレーがオンかオフかを示すLEDが付いているものもあります)、ポンプに電力が供給され、ポンプがオンになり、植物に水を送ります。

💁 リレーは、1つの出力回路をオンオフする代わりに、2つの出力回路を切り替えるためにも使用できます。レバーが動くと、1つの出力回路を完成させるスイッチが別の出力回路を完成させるスイッチに移動し、通常は共通の電源接続または共通の接地接続を共有します。

✅ 調査を行ってください:リレーには、制御回路が電力を供給されたときにリレーをオンまたはオフにするか、複数の出力回路があるなど、さまざまな種類があります。これらの異なる種類について調べてください。

レバーが動くと、通常、電磁石との接触がカチッという音で聞こえます。

💁 リレーは、接続を作ることで実際にリレーへの電力を切り、リレーをオフにし、それがリレーに電力を送り続けるように配線することができます。これにより、リレーは非常に速くクリックし、ブザー音を発します。これは、電気ドアベルで使用された最初のブザーのいくつかがどのように機能したかです。

リレーの電力

電磁石がレバーを引っ張るのに必要な電力は多くなく、3.3Vまたは5Vの出力を使用してIoTデバイスキットで制御できます。出力回路は、リレーに応じて、家庭用電圧や産業用のさらに高い電力レベルを含む、はるかに多くの電力を供給できます。この方法で、IoTデバイスキットは、単一の植物用の小さなポンプから、商業農場全体の大規模な産業システムまで、灌漑システムを制御できます。

制御回路、出力回路、リレーがラベル付けされたグローブリレー

上の画像は、Groveリレーを示しています。制御回路はIoTデバイスに接続され、3.3Vまたは5Vを使用してリレーをオンまたはオフにします。出力回路には2つの端子があり、どちらも電源または接地にすることができます。出力回路は、最大250Vで10Aまでの電力を処理でき、さまざまな家庭用電力デバイスに対応できます。さらに高い電力レベルを処理できるリレーもあります。

リレーを介して配線されたポンプ

上の画像では、リレーを介してポンプに電力が供給されています。USB電源の+5V端子からリレーの出力回路の1つの端子に赤いワイヤーが接続され、出力回路の他の端子からポンプに赤いワイヤーが接続されています。黒いワイヤーがポンプをUSB電源の接地に接続しています。リレーがオンになると、回路が完成し、5Vがポンプに送られ、ポンプがオンになります。

リレーを制御する

IoTデバイスキットからリレーを制御できます。

タスク - リレーを制御する

IoTデバイスを使用してリレーを制御するための関連ガイドを実行します:

MQTTを介して植物を制御する

これまでのところ、リレーは単一の土壌湿度読み取りに基づいてIoTデバイスによって直接制御されています。商業用灌漑システムでは、制御ロジックが集中化され、複数のセンサーからのデータを使用して灌漑の決定を行い、設定を一元的に変更できるようにします。これをシミュレートするために、MQTTを介してリレーを制御できます。

タスク - MQTTを介してリレーを制御する

  1. soil-moisture-sensorプロジェクトにMQTTライブラリ/pipパッケージとコードを追加してMQTTに接続します。クライアントIDをあなたのIDでプレフィックスされたsoilmoisturesensor_clientと名付けます。

    ⚠️ 必要に応じて、プロジェクト1、レッスン4のMQTTへの接続手順を参照できます。

  2. 土壌湿度設定でテレメトリを送信するための関連デバイスコードを追加します。テレメトリメッセージのプロパティ名をsoil_moistureとします。

    ⚠️ 必要に応じて、プロジェクト1、レッスン4のMQTTへのテレメトリ送信手順を参照できます。

  3. soil-moisture-sensor-serverというフォルダーに、テレメトリを購読し、リレーを制御するコマンドを送信するローカルサーバーコードを作成します。コマンドメッセージのプロパティ名をrelay_onとし、クライアントIDをあなたのIDでプレフィックスされたsoilmoisturesensor_serverとします。このレッスンの後半でこのコードを追加するため、プロジェクト1、レッスン4で作成したサーバーコードと同じ構造を保持します。

    ⚠️ 必要に応じて、プロジェクト1、レッスン4のMQTTへのテレメトリ送信手順およびMQTT経由でのコマンド送信手順を参照できます。

  4. 受信したコマンドからリレーを制御するための関連デバイスコードを追加し、メッセージのrelay_onプロパティを使用します。soil_moistureが450を超える場合はrelay_onにtrueを送信し、それ以外の場合はfalseを送信します。これは、以前にIoTデバイスに追加したロジックと同じです。

    ⚠️ 必要に応じて、プロジェクト1、レッスン4のMQTTからのコマンドに応答する手順)を参照できます。

💁 このコードはcode-mqttフォルダーにあります。

デバイスとローカルサーバーでコードが実行されていることを確認し、仮想センサーが送信する値を変更するか、水を追加するか、センサーを土壌から取り外すことで、土壌湿度レベルを変更してテストします。

センサーとアクチュエーターのタイミング

レッスン3でナイトライトを作成しました - 光センサーが低レベルの光を検出するとすぐにオンになるLEDです。光センサーは光レベルの変化を瞬時に検出し、デバイスはloop関数またはwhile True:ループの遅延の長さによってのみ制限されて迅速に応答できました。IoT開発者として、常にこのような高速フィードバックループに依存することはできません。

土壌湿度のタイミング

前回のレッスンで物理センサーを使用して土壌湿度を測定した場合、水を与えた後に土壌湿度の読み取りが低下するまでに数秒かかることに気付いたでしょう。これはセンサーが遅いからではなく、水が土壌に浸透するのに時間がかかるからです。

💁 センサーの近くに水を与えすぎた場合、読み取りが急速に低下し、その後戻るのを見たかもしれません - これは、センサーの近くの水が土壌全体に広がり、センサーの近くの土壌湿度が低下するためです。

658の土壌湿度測定値は、水を与えた後に水が土壌に浸透するまで変化しない

上の図では、土壌湿度の読み取り値が658を示しています。植物に水を与えますが、この読み取り値はすぐには変わりません。水がセンサーに到達していないためです。水やりは水がセンサーに到達する前に終了することもあり、その後値が低下して新しい湿度レベルを反映します。

リレーを介して土壌湿度レベルに基づいて灌漑システムを制御するコードを書く場合、この遅延を考慮に入れ、IoTデバイスにスマートなタイミングを組み込む必要があります。

✅ これを行う方法について少し考えてみてください。

センサーとアクチュエーターのタイミングを制御する

農場の灌漑システムを構築する任務を与えられたと想像してください。土壌の種類に基づいて、栽培される植物の理想的な土壌湿度レベルは、アナログ電圧読み取り値の400-450に一致することがわかっています。

ナイトライトと同じ方法でデバイスをプログラムすることができます - センサーが450を超える間はリレーをオンにしてポンプをオンにします。問題は、水がポンプから土壌を通ってセンサーに到達するのに時間がかかることです。センサーは450のレベルを検出すると水を止めますが、ポンプで供給された水が土壌に浸透し続けるため、水位は下がり続けます。結果として、水が無駄になり、根が損傷するリスクがあります。

✅ 覚えておいてください - 過剰な水は、少なすぎる水と同様に植物に悪影響を与え、貴重な資源を浪費します。

より良い解決策は、アクチュエーターがオンになってからセンサーが読み取る特性が変化するまでに遅延があることを理解することです。これは、センサーが再度測定する前にしばらく待つ必要があるだけでなく、次のセンサー測定が行われる前にアクチュエーターがしばらくオフになる必要があることを意味します。

リレーをオンにする時間はどれくらいですか?慎重を期してリレーを短時間だけオンにし、その後水が浸透するのを待ち、再度湿度レベルを確認する方が良いです。結局のところ、水を追加するために再度オンにすることはできますが、土壌から水を取り除くことはできません。

💁 この種のタイミング制御は、構築しているIoTデバイス、測定している特性、および使用しているセンサーとアクチュエーターに非常に特有です。

ポンプを介して水に接続されたイチゴの植物。ポンプはリレーに接続され、リレーと植物の土壌湿度センサーはRaspberry Piに接続されています

たとえば、私はイチゴの植物を持っており、土壌湿度センサーとリレーで制御されるポンプがあります。水を追加すると、土壌湿度の読み取り値が安定するまで約20秒かかることがわかりました。これは、湿度レベルを確認する前にリレーをオフにして20秒待つ必要があることを意味します。水が多すぎるよりも少なすぎる方が良いです - ポンプを再度オンにすることはできますが、植物から水を取り除くことはできません。

ステップ1、測定を行う。ステップ2、水を追加する。ステップ3、水が土壌に浸透するのを待つ。ステップ4、再度測定を行う

これにより、最適なプロセスは次のような灌水サイクルになります:

  • ポンプを5秒間オンにする
  • 20秒待つ
  • 土壌湿度を確認する
  • レベルがまだ必要な値を超えている場合は、上記の手順を繰り返す

5秒はポンプにとって長すぎるかもしれません。特に湿度レベルが必要な値をわずかに超えている場合です。どのタイミングを使用するかを知る最良の方法は、それを試してセンサーデータを取得し、フィードバックループを使用して調整することです。これにより、固定の5秒ではなく、必要な土壌湿度を100超えるごとに1秒間ポンプをオンにするなど、より細かいタイミングが得られることもあります。

✅ 調査を行ってください:他にタイミングの考慮事項はありますか?土壌湿度が低すぎる場合、いつでも植物に水をやることができますか、それとも植物に水をやるのに良い時間帯と悪い時間帯がありますか?

💁 屋外栽培の自動灌漑システムを制御する際には、天気予報も考慮に入れることができます。雨が予想される場合は、雨が終わるまで灌漑を保留にすることができます。その時点で土壌が十分に湿っている可能性があり、灌漑が不要になるため、雨の直前に水をやるよりもはるかに効率的です。

植物制御サーバーにタイミングを追加する

サーバーコードを変更して、灌水サイクルのタイミングを制御し、土壌湿度レベルが変化するのを待つ制御を追加できます。リレータイミングを制御するサーバーロジックは次のとおりです:

  1. テレメトリメッセージを受信
  2. 土壌湿度レベルを確認
  3. 問題がなければ何もしません。読み取り値が高すぎる場合(つまり、土壌湿度が低すぎる場合)は:
    1. リレーをオンにするコマンドを送信
    2. 5秒待つ
    3. リレーをオフにするコマンドを送信
    4. 土壌湿度レベルが安定するまで20秒待つ

灌水サイクル、つまりテレメトリメッセージを受信してから土壌湿度レベルを再度処理する準備が整うまでのプロセスには約25秒かかります。土壌湿度レベルを10秒ごとに送信しているため、サーバーが土壌湿度レベルの安定を待っている間にメッセージが受信され、別の灌水サイクルが開始される可能性があります。

これを回避するための2つのオプションがあります:

  • IoTデバイスコードを変更して、テレメトリを1分ごとに送信するようにします。これにより、次のメッセージが送信される前に灌水サイクルが完了します。
  • 灌水サイクル中にテレメトリの購読を解除します。

最初のオプションは、大規模な農場には必ずしも良い解決策ではありません。農家は、灌水中の土壌湿度レベルをキャプチャして後で分析するために使用したいかもしれません。たとえば、農場のさまざまなエリアでの水の流れを把握し、よりターゲットを絞った灌漑を行うためです。2番目のオプションの方が良いです - コードは使用できないときにテレメトリを無視していますが、他のサービスが購読するためのテレメトリはまだ存在します。

💁 IoTデータは、1つのデバイスから1つのサービスにのみ送信されるわけではなく、多くのデバイスがブローカーにデータを送信し、多くのサービスがブローカーからデータをリッスンできます。たとえば、1つのサービスは土壌湿度データをリッスンしてデータベースに保存し、後で分析することができます。別のサービスは同じテレメトリをリッスンして灌漑システムを制御できます。

タスク - 植物制御サーバーにタイミングを追加する

サーバーコードを更新して、リレーを5秒間実行し、その後20秒間待機するようにします。

  1. soil-moisture-sensor-serverフォルダーをVS Codeで開きます。仮想環境がアクティブになっていることを確認します。

  2. app.pyファイルを開きます。

  3. 既存のインポートの下に次のコードを追加します:

    import threading

    このステートメントは、Pythonライブラリからthreadingをインポートします。スレッドを使用すると、待機中に他のコードを実行できます。

  4. テレメトリメッセージを処理するhandle_telemetry関数の前に次のコードを追加します:

    water_time = 5
    wait_time = 20

    これは、リレーを実行する時間(water_time)と、その後に土壌湿度レベルが安定するまで待機する時間(wait_time)を定義します。

  5. このコードの下に次のコードを追加します:

    def send_relay_command(client, state):
    command = { 'relay_on' : state }
    print("Sending message:", command)
    client.publish(server_command_topic, json.dumps(command))

    このコードは、リレーを制御するコマンドをMQTT経由で送信するsend_relay_command関数を定義します。テレメトリは辞書として作成され、JSON文字列に変換されます。stateに渡される値は、リレーをオンまたはオフにするかどうかを決定します。

  6. send_relay_code関数の後に次のコードを追加します:

    def control_relay(client):
    print("Unsubscribing from telemetry")
    mqtt_client.unsubscribe(client_telemetry_topic)

    send_relay_command(client, True)
    time.sleep(water_time)
    send_relay_command(client, False)

    time.sleep(wait_time)

    print("Subscribing to telemetry")
    mqtt_client.subscribe(client_telemetry_topic)

    これは、必要なタイミングに基づいてリレーを制御する関数を定義します。最初にテレメトリの購読を解除して、灌水中に土壌湿度メッセージが処理されないようにします。次に、リレーをオンにするコマンドを送信します。その後、water_timeの間待機し、リレーをオフにするコマンドを送信します。最後に、土壌湿度レベルが安定するまでwait_time秒待機します。その後、テレメトリを再購読します。

  7. handle_telemetry関数を次のように変更します:

    def handle_telemetry(client, userdata, message):
    payload = json.loads(message.payload.decode())
    print("Message received:", payload)

    if payload['soil_moisture'] > 450:
    threading.Thread(target=control_relay, args=(client,)).start()

    このコードは土壌湿度レベルを確認します。450を超える場合、土壌は水を必要としているため、control_relay関数を呼び出します。この関数は別のスレッドで実行され、バックグラウンドで実行されます。

  8. IoTデバイスが実行されていることを確認し、このコードを実行します。土壌湿度レベルを変更し、リレーがどのように動作するかを観察します - 5秒間オンになり、その後少なくとも20秒間オフのままになり、土壌湿度レベルが十分でない場合にのみオンになります。

    (.venv) ➜  soil-moisture-sensor-server ✗ python app.py
    Message received: {'soil_moisture': 457}
    Unsubscribing from telemetry
    Sending message: {'relay_on': True}
    Sending message: {'relay_on': False}
    Subscribing to telemetry
    Message received: {'soil_moisture': 302}

    シミュレートされた灌漑システムでこれをテストする良い方法は、乾燥した土壌を使用し、リレーがオンの間に手動で水を注ぎ、リレーがオフになったときに注ぐのを止めることです。

💁 このコードはcode-timingフォルダーにあります。

💁 実際の灌漑システムを構築するためにポンプを使用したい場合は、6V水ポンプUSB端子電源を使用できます。ポンプへの電力がリレーを介して接続されていることを確認してください。


🚀 チャレンジ

アクチュエーターの結果がセンサーに到達するまでに時間がかかる同様の問題を抱えている他のIoTまたはその他の電気デバイスを考えられますか?おそらく、家や学校にいくつかあるでしょう。

  • それらはどのような特性を測定しますか?
  • アクチュエーターが使用された後、特性が変化するまでにどれくらいの時間がかかりますか?
  • 特性が必要な値を超えて変化しても問題ありませんか?
  • 必要に応じて、どのようにして元の値に戻すことができますか?

講義後のクイズ

講義後のクイズ

レビューと自己学習

課題

より効率的な灌水サイクルを構築する