ではSEN0193を使っていきましょう。ラズパイとの接続ですが、SPIを使います。以前I2Cでの接続について、大気の温度、湿度、気圧を測る「BME280」を例に解説したことがありますが、ラズパイと何かのデバイスをつなげて使うためにはこのI2Cと、今回紹介するSPIを通じてやりとりすることになります。
SPIはSerial Peripheral Interfaceの略で、I2Cのようにいくつものデバイスをぶら下げて使えますが、I2Cと違うのは「マスター」と「スレーブ」という形式でやりとりをすることです。ラズパイで使うときはもちろんラズパイがマスター、デバイスがスレーブです。そして以下の4線を通じてのやりとりとなります。
ラズパイでは、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番ピン)につなぎます。
そしてSEN0193ですが、赤、黒、青の3本の線が出ています。赤は3.3Vに、黒はGNDに、青はMCP3002のCH0(2番ピン)につなぎます。全てつないだ状態が以下の写真です。
つなぎ終わったらテストとして、以下のプログラムを走らせてみましょう。これは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')
このプログラムを起動したら、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 …………(以下無限ループ)
水につけていない状態の値が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')
これで土の中の状態が分かるようになりました。次回はLEDやLCD(液晶ディスプレイ)などを取り付けて、状態をもっと分かりやすくしてみます。
ラズパイで「Windows 10 on ARM64」を動かす(オーバークロック編)
ラズパイで「Windows 10 on ARM64」を動かす(インストール編)
ラズパイで「Windows 10 on ARM64」を動かす(事前準備編)
ラズパイ一体型キーボード「Raspberry Pi 400」レビュー 特例制度のWeb申請で“技適なし”を回避した
ラズパイ一体型キーボード「Raspberry Pi 400」の性能は? ベンチマークテストで従来モデルと比べた
ラズパイで気温と湿度を測定、LINEで通知を受け取る 〜前編〜
ラズパイを無線LANルーター化する 〜アクセスポイント編〜
本格的な撮影が楽しめる公式カメラモジュール「Raspberry Pi High Quality Camera」を試す
ラズパイで新型コロナウイルス解析に参加する 〜Ubuntu Serverの構築編〜
ラズパイでスマートスピーカーを作る 「アレクサ!あしたの天気は?」 〜ソフトウェア準備編〜
これが“らずキャン△”だ! キャンプ場で役立つ「気温・湿度・気圧センサー」の作り方
ラズパイで「YouTube」と「Amazon プライムビデオ」を見るCopyright © ITmedia, Inc. All Rights Reserved.
Special
PR