ITmedia NEWS > STUDIO >
連載
» 2021年04月30日 12時00分 公開

庭の水やりで身近なIoTを体験、自動水やりシステムの構築 〜水分センサーの取り付け〜名刺サイズの超小型PC「ラズパイ」で遊ぶ(第40回)(2/2 ページ)

[岩泉茂,ITmedia]
前のページへ 1|2       

土中が乾いているかどうかを測定する

 ではSEN0193を使っていきましょう。ラズパイとの接続ですが、SPIを使います。以前I2Cでの接続について、大気の温度、湿度、気圧を測る「BME280」を例に解説したことがありますが、ラズパイと何かのデバイスをつなげて使うためにはこのI2Cと、今回紹介するSPIを通じてやりとりすることになります。

 SPIはSerial Peripheral Interfaceの略で、I2Cのようにいくつものデバイスをぶら下げて使えますが、I2Cと違うのは「マスター」と「スレーブ」という形式でやりとりをすることです。ラズパイで使うときはもちろんラズパイがマスター、デバイスがスレーブです。そして以下の4線を通じてのやりとりとなります。

  • クロック(SPI CLK、SCLK)
  • チップ・セレクト(CS)
  • マスター出力/スレーブ入力(MOSI)
  • マスター入力/スレーブ出力(MISO)

 ラズパイでは、SCLKはGPIO 11(23番ピン)、CSはGPIO 8(24番ピン)、MOSIはGPIO 10(19番ピン)、MISOはGPIO 9(21番ピン)です。

 ではまずSEN0193とMCP3002、ラズパイをつなげていきましょう。MCP3002のピンアサインは以下の画像の通りですので、VDDを3.3Vに、DOUTをGPIO 9(21番ピン)に、DINをGPIO 10(19番ピン)に、CS/SHDNをGPIO 8(24番ピン)に、VssをGND(25番ピン)につなぎます。

Raspberry Pi MCP3002のピンアサイン(データシートより)
Raspberry Pi ラズパイのピンアサイン(ラズベリー財団のWebサイトより)

 そしてSEN0193ですが、赤、黒、青の3本の線が出ています。赤は3.3Vに、黒はGNDに、青はMCP3002のCH0(2番ピン)につなぎます。全てつないだ状態が以下の写真です。

Raspberry Pi 全てつないだ状態
Raspberry Pi 図で表すとこのような形に

 つなぎ終わったらテストとして、以下のプログラムを走らせてみましょう。これはSEN0193で測定される値の上限と下限を見るためのものです。「spitest.py」のようにファイル名を付けておきましょう。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import subprocess
from gpiozero import MCP3002
Vref = 3.3
try:
    while True:
        sen0193 = MCP3002(channel=0)
        hum = round(sen0193.value * Vref * 100,2)
        print(str(hum))
        time.sleep(1)
except: KeyboardInterrupt
subprocess.call('clear')
spitest.py

 このプログラムを起動したら、SEN0193を水につけてみます。水につける限界ですが、チップなどがついている下に白線が引いてありますので、そこが限界線です。すると以下のような表示が出たかと思います。

$ python spitest.py
254.88
254.88
255.2
254.88
255.2
255.2
255.2
255.2
127.84
127.2
127.52
148.48
154.28
154.28
250.68
254.55
254.88
255.2
255.2
…………(以下無限ループ)
spitest.pyを動かしたときの表示

 水につけていない状態の値が255、たっぷりと水につけた状態が127ということが分かります。そこで255に近ければ「Dry」、127に近ければ「VeryWet」と表示するようにしてみましょう。またこの中間点あたりであれば「Wet」と表示させることにします。

 これを踏まえて以下のプログラムを作りました。GPIOの値ですが、以前解説したときは「RPi.GPIO」ライブラリを使いましたが、今回はGPIOを扱えるもうひとつのライブラリ「gpiozero」を使います。理由はMCP3002のライブラリが用意されているためです。なお、値の判定はif文を使って分岐させています。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import subprocess
from gpiozero import MCP3002
Vref = 3.3
# 値の最大値と最小値
dry = 270
water = 119
interval = (dry - water) / 3
wet = water + interval
lbdry = dry - interval
try:
    while True:
        pot = MCP3002(channel=0)
        hum = round(pot.value * Vref * 100,1)
        if (hum > water and hum < wet):
            print("very Wet")
        elif (hum > wet and hum < lbdry):
            print("Wet")
        elif (hum < dry and hum > lbdry):
            print("Dry")
        time.sleep(1)
except: KeyboardInterrupt
subprocess.call('clear')
spitokutei.py

 これで土の中の状態が分かるようになりました。次回はLEDやLCD(液晶ディスプレイ)などを取り付けて、状態をもっと分かりやすくしてみます。

前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.