土壌水分量センサー(LM393)を試してみる

スマート農業を始めようと思っています。センシングのためのセンサーを試行しています。

土壌水分量センサー(LM393)

土壌水分量センサーがどんなもんなのか確認してみます。

 ちっちゃく型番が書いてあるんですが、HW-080とHW-103と書いてあります。他のサイトだとYL-69となっていたり、一体どれが正しいのかよくわかりませんが、それっぽくやってみます。

まずは、HW-080とHW-103をメスメスジャンパーワイヤー で接続します。

前にも書きましたが、このセンサーはアナログ値を取得することができるのですが、Raspberry piではアナログ値が扱えないので、A/Dコンバータでアナログをデジタルに変換してRaspberry piで扱えるようにする必要があります。

そこで登場するのが、MCP3008です。

MCP3008取り付け

MCP3008は10bitのADCなので、アナログ値を0から1023までの値に変換してくれます。10の2乗 ー 1ですね。1023のときは乾燥、0の時は水浸しという値になります。

実際にそうなるかを確認していきます。

まずは、ブレッドボードにMCP3008を取り付けます。

取り付けの際は、中央をまたぐように取り付けます。MCP3008は想像より小さくてとても可愛かったです。

接続の情報は右記の通りです。この辺りの詳細は、ココを参照しました。

  • MCP3008 VDD -> 3.3V (red)
  • MCP3008 VREF -> 3.3V (red)
  • MCP3008 AGND -> GND (black)
  • MCP3008 CLK -> SCLK (yellow)
  • MCP3008 DOUT -> MISO (purple)
  • MCP3008 DIN -> MOSI (white)
  • MCP3008 CS -> #22 (green)
  • MCP3008 DGND -> GND (black)

という風に書かれているので、その通りに配線していきます。配線の際に参考にした図は、参照先サイトの下記の図です。

引用元:Connecting the Cobbler to a MCP3008

このでは、Breadboard trim potentiometerというのを取り付けているみたいなので、我々は、その代わりにLM393を取り付けます。

LM393取り付け

配線した結果が以下の写真になります。すごいゴチャゴチャしてますね。

見た目はゴチャゴチャしていますが、ひとつひとつ順番に接続していけば、きちんと接続できるのが楽しいですね。何より半田を使わなくていいのがいいです。

あとは、接続が正解かどうかがぱっと見よくわかららないので、通電の時ドキドキします。

通電すると、ちゃんとLEDが光りました。今の所うまくいっているようです。

では、Pythonを使って動作確認していきます。

Pythoで動作確認

DHT22の時は用意されたライブラリをそのまま使ったので楽チンでしたが、今回はrpi.gpioを使ってGPIOを制御しながら値をとっていきます。

まずは、必要なライブラリをインストールしましょう。

$ pip install rpi.gpio

インストールが終わったら、Pythonのコードを実行していきます。jupyter notebookで動作確認しています。

まずは、ライブラリをインポートします。

import time
import os
import RPi.GPIO as GPIO

次に、値を読み込む関数を定義します。関数を呼ぶ際は、adcnumはMCP3008のCHの番号を指定します。残りの引数は、ラズパイのGPIOの番号を指定します。あとは、出力をHIGHにしたりLOWにしたりしながら値を取得します。

def readadc(adcnum, clockpin, mosipin, misopin, cspin):
    if ((adcnum > 7) or (adcnum < 0)):
        return -1
    GPIO.output(cspin, True)


    GPIO.output(clockpin, False)  # start clock low
    GPIO.output(cspin, False)   # bring CS low


    commandout = adcnum
    commandout |= 0x18  # start bit + single-ended bit
    commandout <<= 3  # we only need to send 5 bits here
    for i in range(5):
        if (commandout & 0x80):
            GPIO.output(mosipin, True)
        else:
            GPIO.output(mosipin, False)
        commandout <<= 1
        GPIO.output(clockpin, True)
        GPIO.output(clockpin, False)


    adcout = 0
    # read in one empty bit, one null bit and 10 ADC bits
    for i in range(12):
        GPIO.output(clockpin, True)
        GPIO.output(clockpin, False)
        adcout <<= 1
        if (GPIO.input(misopin)):
            adcout |= 0x1


    GPIO.output(cspin, True)


    adcout >>= 1     # first bit is 'null' so drop it
    return adcout

GPIOの番号を定数で定義して、それぞれGPIO.setupで初期化します。

adc_pin = 0 は、MCP3008のCHの番号を指定します。

SPICLK = 11
SPIMISO = 9
SPIMOSI = 10
SPICS = 22


# set up the SPI interface pins
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPICS, GPIO.OUT)


# adc #0
adc_pin = 0;

1秒おきに定期的に呼び出してみます。

try:
    while True:
        # read the analog pin
        moisture = readadc(adc_pin, SPICLK, SPIMOSI, SPIMISO, SPICS)


        print("moisture: {0}".format(moisture))
        time.sleep(1)
except KeyboardInterrupt:
    print("interrupt")

GPIO.cleanup()

濡れたティッシュの水分量で実験してみます。

ティッシュを外した状態。水分量なしなので1023を示す
ティッシュに包んだ状態。1023より低い値を示す

最初はティッシュに包まず、しばらくしてティッシュに包んでみました。値が減っているので正常に動作していることが確認できました。

moisture: 1023
moisture: 1023
moisture: 1023
moisture: 827
moisture: 905
moisture: 902
moisture: 902
moisture: 829
moisture: 813
moisture: 816
moisture: 782

これで離れた農場の水分量が確認でき、水やりのタイミングや、水分量と作物の成長の相関などが確認できるようになりました。

思いの外、順調に動いてくれて嬉しいです。

テスト運用

実際に、家の観葉植物の鉢に挿してみました。

以下が現在の水分量です。濡れティッシュと同じくらいの水分量でした。明日になったら少し乾いてると面白いですね。ちょっとモニタリングしてみます。

moisture: 833
moisture: 836
moisture: 838
moisture: 841
moisture: 844
moisture: 846
moisture: 847
moisture: 848
moisture: 850
moisture: 852
moisture: 854
moisture: 858

コメント

  1. […] それぞれのテストの際のコードの詳細は、DHT22、LM393、GY-30のそれぞれを参照してください。 […]

タイトルとURLをコピーしました