土壌水分の検出
スケッチノート: Nitya Narasimhan 作。画像をクリックすると大きなバージョンが表示されます。
このレッスンは、Microsoft Reactor の IoT 01 for Beginners Project 2 - Digital Agriculture series の一環として教えられました。
講義前のクイズ
はじめに
前回のレッスンでは、環境の特性を測定し、それを使用して植物の成長を予測する方法を学びました。温度は制御できますが、制御には費用がかかり、制御された環境が必要です。植物にとって最も簡単に制御できる環境の特性は水です。これは、大規模な灌漑システムから庭に水をやる子供たちまで、毎日制御されています。
このレッスンでは、土壌水分の測定について学び、次のレッスンでは自動灌漑システムの制御方法を学びます。このレッスンでは、3つ目のセンサーを紹介します。すでに光センサーと温度センサーを使用しましたが、このレッスンでは、センサーとアクチュエーターがIoTデバイスとどのように通信するかについても学び、土壌水分センサーがどのようにデータをIoTデバイスに送信できるかを理解します。
このレッスンでは 以下をカバーします:
土壌水分
植物は成長するために水を必要とします。植物は全体を通して水を吸収し、その大部分は根系によって吸収されます。植物は水を3つの目的で使用します:
- 光合成 - 植物は水、二酸化炭素、光を使って炭水化物と酸素を生成する化学反応を起こします。
- 蒸散 - 植物は葉の気孔を通じて空気中の二酸化炭素を拡散させるために水を使用します。このプロセスはまた、植物内の栄養素を運び、人間の汗のように植物を冷却します。
- 構造 - 植物は構造を維持するためにも水を必要とします。植物は90%が水で構成されており(人間は60%)、この水が細胞を硬く保ちます。植物が十分な水を持たないと、しおれて最終的には死んでしまいます。
✅ 調査してみましょう:蒸散によってどれだけの水が失われるか?
根系は植物が成長する土壌の水分から水を供給します。土壌に水が少なすぎると植物は成長するために十分な水を吸収できず、水が多すぎると根が必要な酸素を吸収できずに機能しなくなります。これにより根が死に、植物は生きるために必要な栄養素を得ることができなくなります。
農家が最良の植物成長を得るためには、土壌が湿りすぎず乾きすぎないことが重要です。IoTデバイスは土壌水分を測定することで、農家が必要なときにだけ水をやることができるようにします。
土壌水分を測定する方法
土壌水分を測定するために使用できるさまざまなタイプのセンサーがあります:
-
抵抗式 - 抵抗式センサーには土壌に挿入する2つのプローブがあります。電流が1つのプローブに送られ、もう1つのプローブで受信されます。センサーは土壌の抵抗を測定し、2つ目のプローブで電流がどれだけ減少するかを測定 します。水は電気の良い導体であるため、土壌の水分含有量が高いほど抵抗は低くなります。
💁 抵抗式土壌水分センサーは、数センチメートル離れた2つの金属片(例えば釘)を使用し、それらの間の抵抗をマルチメーターで測定することで作成できます。
-
静電容量式 - 静電容量式水分センサーは、正と負の電極板に蓄えられる電荷の量、つまり静電容量を測定します。土壌の静電容量は水分レベルの変化に伴って変化し、これを電圧に変換してIoTデバイスで測定できます。土壌が湿っているほど、出力される電圧は低くなります。
これらはどちらもアナログセンサーであり、土壌水分を示す電圧を返します。この電圧がどのようにしてコードに届くのでしょうか?これらのセンサーをさらに進める前に、センサーとアクチュエーターがIoTデバイスとどのように通信するかを見てみましょう。
センサーがIoTデバイスと通信する方法
これまでのレッスンで、いくつかのセンサーとアクチュエーターについて学びました。これらは物理的なハードウェアラボを行っている場合、IoTデバイスキットと通信していました。しかし、この通信はどのように機能するのでしょうか?土壌水分センサーの抵抗測定がどのようにしてコードで使用できる数値になるのでしょうか?
ほとんどのセンサーとアクチュエーターと通信するには、ハードウェアと通信プロトコルが必要です。これは、データを送受信するための明確に定義された方法です。例えば、静電容量式土壌水分センサーを考えてみましょう:
- このセンサーはどのようにしてIoTデバイスに接続されるのでしょうか?
- アナログ信号である電圧を測定する場合、ADCが必要であり、これにより値のデジタル表現が作成されます。この値は0と1を送信するための交互の電圧として送信されますが、各ビットはどのくらいの時間送信されるのでしょうか?
- センサーがデジタル値を返す場合、それは0と1のストリームになりますが、各ビットはどのくらいの時間送信されるのでしょうか?
- 電圧が0.1秒間高い場合、それは単一の1ビットでしょうか、それとも連続する2つの1ビットでしょうか、それとも10でしょうか?
- 数値はどの時点で始まるのでしょうか?
00001101
は25でしょうか、それとも最初の5ビットは前の値の終わりでしょうか?
ハードウェアはデータが送信される物理的な接続性を提供し、異なる通信プロトコルはデータが正しい方法で送受信されることを保証し、それが解釈できるようにします。
汎用入出力 (GPIO) ピン
GPIOは、ハードウェアをIoTデバイスに接続するために使用できるピンのセットであり、Raspberry PiやWio TerminalなどのIoT開発キットによくあります。このセクションでカバーするさまざまな通信プロトコルをGPIOピンを介して使用できます。一部のGPIOピンは通常3.3Vまたは5Vの電圧を提供し、一部のピンはグランドであり、他のピンはプログラムによって電圧を送信(出力)または受信(入力)するように設定できます。
💁 電気回路は、使用している回路を介して電圧をグランドに接続する必要があります。電圧をバッテリーの正端子(+ve)と考え、グランドを負端子(-ve)と考えることができます。
GPIOピンを使用して、オンまたはオフの値のみを気にするデジタルセンサーやアクチュエーターと直接通信できます。オンは高、オフは低と呼ばれます。いくつかの例を示します:
-
ボタン。ボタンを5Vピンと入力に設定されたピンの間に接続できます。ボタンを押すと、5Vピンからボタンを通じて入力ピンに回路が完成します。コードから入力ピンの電圧を読み取り、電圧が高(5V)であればボタンが押されており、低(0V)であればボタンが押されていないことがわかります。実際の電圧自体は読み取られず、電圧がしきい値を超えているかどうかに応じて1または0のデジタル 信号が得られます。
-
LED。LEDを出力ピンとグランドピンの間に接続できます(抵抗を使用しないとLEDが焼損します)。コードから出力ピンを高に設定すると、3.3Vが送信され、3.3VピンからLEDを通じてグランドピンに回路が完成します。これによりLEDが点灯します。
より高度なセンサーの場合、GPIOピンを使用してデジタルセンサーやアクチュエーターと直接デジタルデータを送受信したり、ADCやDACを使用してアナログセンサーやアクチュエーターと通信したりできます。
💁 これらのラボでRaspberry Piを使用している場合、Grove Base Hatにはアナログセンサー信号をデジタルに変換してGPIOを介して送信するハードウェアがあります。
✅ GPIOピンを持つIoTデバイスをお持ちの場合、これらのピンを見つけ、どのピンが電圧、グランド、またはプログラム可能であるかを示す図を見つけてください。
アナログピン
Arduinoデバイスなどの一部のデバイスにはアナログピンがあります。これらはGPIOピンと同じですが、デジタル信号のみをサポートするのではなく、電圧範囲を数値に変換するADCを備えています。通常、ADCは10ビットの解像度を持ち、電圧を0〜1,023の値に変換します。
例えば、3.3Vのボードでは、センサーが3.3Vを返す場合、返される値は1,023になります。返される電圧が1.65Vの場合、返される値は511になります。
💁 ナイトライト - レッスン3では、光センサーは0〜1,023の値を返しました。Wio Terminalを使用している場合、センサーはアナログピンに接続されていました。Raspberry Piを使用している場合、センサーはベースハットのアナログピンに接続されており、ADCが統合されてGPIOピンを介して通信していました。仮想デバイスはアナログピンをシミュレートするために0〜1,023の値を送信するように設定されていました。
土壌水分センサーは電圧に依存しているため、アナログピンを使用し、0〜1,023の値を返します。
インターインテグレーテッドサーキット (I2C)
I2C(アイスクエアードシーと発音)は、複数のコントローラーと複数のペリフェラルを持つプロトコルで、接続されたデバイスはすべてコントローラーまたはペリフェラルとして動作し、I2Cバス(データを転送する通信システムの名前)を介して通信できます。データはアドレス付きパケットとして送信され、各パケットには通信対象の接続デバイスのアドレスが含まれます。
💁 このモデルは以前はマスター/スレーブと呼ばれていましたが、奴隷制との関連性のためにこの用語は廃止されつつあります。Open Source Hardware Associationはコントローラー/ペリフェラルを採用しています、ただし古い用語の参照がまだ見られるかもしれません。
デバイスにはI2Cバスに接続する際に使用されるアドレスがあり、通常はデバイスにハードコードされています。例えば、SeeedのGroveセンサーの各タイプには同じアドレスがあります。すべての光センサーには同じアドレスがあり、すべてのボタンには光センサーのアドレスとは異なるアドレスがあります。一部のデバイスには、ジャンパー設定を変更したりピンをはんだ付けしたりしてアドレスを変更する方法があります。
I2Cには、2本の主なワイヤーと2本の電源ワイヤーがあります:
ワイヤー | 名前 | 説明 |
---|---|---|
SDA | シリアルデータ | このワイヤーはデバイス間でデータを送信するためのものです。 |
SCL | シリアルクロック | このワイヤーはコントローラーによって設定された速度でクロック信号を送信します。 |
VCC | 電圧共通コレクタ | デバイスの電源供給。このワイヤーはプルアップ抵抗を介してSDAおよびSCLワイヤーに接続され、どのデバイスもコントローラーでないときに信号をオフにします。 |
GND | グランド | 電気回路の共通グランドを提供します。 |
データを送信するには、1つのデバイスがデータを送信する準備ができたことを示すスタート条件を発行します。これによりコントローラーになります。コントローラーは次に、通信したいデバイスのアドレスと、データを読み取るか書き込むかを送信します。データの送信が完了すると、コントローラーはストップ条件を送信して終了を示します。その後、別のデバイスがコントローラーになり、データを送受信できます。
I2Cには速度制限があり、固定速度で動作する3つの異なるモードがあります。最速は最大速度3.4Mbps(メガビット毎秒)の高速モードですが、その速度をサポートするデバイスは非常に少ないです。例えば、Raspberry Piは400Kbps(キロビット毎秒)の高速モードに制限されています。標準モードは100Kbpsで動作します。
💁 IoTハードウェアとしてGrove Base Hatを使用しているRaspberry Piを使用している場合、I2Cセンサーと通信するために使用できる多数のI2Cソケットがボード上にあることがわかります。アナログGroveセンサーもADCを使用してアナログ値をデジタルデータとして送信するためにI2Cを使用するため、使用した光センサーはアナログピンをシミュレートし、値はRaspberry PiがデジタルピンのみをサポートするためI2C経由で送信されました。
ユニバーサル非同期受信送信機 (UART)
UARTは、2つのデバイスが通信できる物理的な回路を含みます。各デバイスには送信(Tx)と受信(Rx)の2つの通信ピンがあり、最初のデバイスのTxピンが2番目のデバイスのRxピンに接続され、2番目のデバイスのTxピンが最初のデバイスのRxピンに接続されています。これにより、データを両方向に送信できます。
- デバイス1はTxピンからデータを送信し、デバイス2のRxピンで受信します
- デバイス1はRxピンでデータを受信し、デバイス2のTxピンから送信されます
🎓 データは1ビットずつ送信され、これをシリアル通信と呼びます。ほとんどのオペレーティングシステムとマイクロコントローラーにはシリアルポートがあり、これはコードで利用可能なシリアルデータを送受信できる接続です。
UARTデバイスにはボーレート(シンボルレートとも呼ばれる)があり、これはデータがビット毎秒で送受信される速度です。一般的なボーレートは9,600で、毎秒9,600ビット(0と1)のデータが送信されます。
UARTはスタートビットとストップビットを使用します。つまり、バイト(8ビット)のデータを送信する前にスタートビットを送信し、8ビットを送信した後にストップビットを送信します。
UARTの速度はハードウェアに依存しますが、最速の実装でも6.5Mbps(メガビット毎秒、または毎秒送信される0または1のビット数)を超えることはありません。
GPIOピンを介してUARTを使用できます。1つのピンをTxとして、もう1つのピンをRxとして設定し、これらを別のデバイスに接続できます。
💁 IoTハードウェアとしてGrove Base Hatを使用しているRaspberry Piを使用している場合、UARTプロトコルを使用するセンサーと通信するために使用できるUARTソケットがボード上にあることがわかります。
シリアルペリフェラルインターフェース (SPI)
SPIは、フラッシュメ モリなどのストレージデバイスと通信するために設計された短距離通信用のプロトコルです。これは、単一のコントローラー(通常はIoTデバイスのプロセッサ)が複数のペリフェラルと対話するコントローラー/ペリフェラルモデルに基づいています。コントローラーはペリフェラルを選択し、データを送信または要求することで、すべてを制御します。
💁 I2Cと同様に、コントローラーとペリフェラルの用語は最近の変更であるため、古い用語がまだ使用されている場合があります。
SPIコントローラーは3本のワイヤーを使用し、ペリフェラルごとに1本の追加ワイヤーを使用します。ペリフェラルは4本のワイヤーを使用します。これらのワイヤーは次のとおりです:
ワイヤー | 名前 | 説明 |
---|---|---|
COPI | コントローラー出力、ペリフェラル入力 | このワイヤーはコントローラーからペリフェラルにデータを送信するためのものです。 |
CIPO | コントローラー入力、ペリフェラル出力 | このワイヤーはペリフェラルからコントローラーにデータを送信するためのものです。 |
SCLK | シリアルクロック | このワイヤーはコントローラーによって設定された速度でクロック信信号を送信します。 |
CS | チップセレクト | コントローラーには複数のワイヤーがあり、各ワイヤーは対応するペリフェラルのCSワイヤーに接続されています。 |
CSワイヤーは、COPIおよびCIPOワイヤーを介して1つのペリフェラルを一度にアクティブにして通信するために使用されます。コントローラーがペリフェラルを変更する必要がある場合、現在アクティブなペリフェラルに接続されているCSワイヤーを非アクティブにし、次に通信したいペリフェラルに接続されているワイヤーをアクティブにします。
SPIは全二重であり、コントローラーはCOPIおよびCIPOワイヤーを使用して同じペリフェラルから同時にデータを送受信できます。SPIはSCLKワイヤー上のクロック信号を使用してデバイスを同期させるため、UARTを介して直接送信する場合とは異なり、スタートビットやストップビットは必要ありません。
SPIには定義された速度制限はなく、実装によっては毎秒数メガバイトのデータを送信できることがよくあります。
IoT開発キットは、いくつかのGPIOピンを介してSPIをサポートすることがよくあります。例えば、Raspberry PiではGPIOピン19、21、23、24、および26をSPIに使用できます。
ワイヤレス
一部のセンサーは、Bluetooth(主にBluetooth Low Energy、またはBLE)、LoRaWAN(Long Range低電力ネットワーキングプロトコル)、またはWiFiなどの標準的なワイヤレスプロトコルを介して通信できます。これにより、IoTデバイスに物理的に接続されていないリモートセンサーが可能になります。