名刺サイズの超小型PC「ラズパイ」で遊ぶ(第40回)
庭の水やりで身近なIoTを体験、自動水やりシステムの構築 ~水分センサーの取り付け~(2/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番ピン)につなぎます。
そして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')
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(液晶ディスプレイ)などを取り付けて、状態をもっと分かりやすくしてみます。
Copyright © ITmedia, Inc. All Rights Reserved.
名刺サイズの超小型PC「ラズパイ」で遊ぶ
今やスマートフォンアプリで何でも完結できてしまう時代。しかし、一から自分の手でデバイスを作り上げ、試行錯誤しながらアイデアを具現化する楽しさは格別です。この連載では、テーマや用途にあわせてマイクロコンピュータ(マイコン)と呼ばれる名刺サイズの超小型PC「Raspberry Pi」(通称ラズパイ)の活用方法から具体的な工作手順までを紹介します。
この記事の著者
関連記事
こんなメディアも見られています
ITmedia NEWSに関連する情報をお探しであれば、こちらのメディアもお役に立てるかもしれません。
SpecialPR
本日の新着記事
アクセスランキング
-
1
「焼肉きんぐ」個人情報約1079万件が漏えい 公式アプリのシステムに不正アクセス ほぼ全会員分に相当
-
2
不正アクセスなぜ急増 原因はAIか、それとも…… 専門家の見解は
-
3
GMO「infoQ」に不正アクセス、最大95万件の会員情報漏えい ポイント287万円分が不正交換される
-
4
大和証券、22万件情報漏えいか 顧客約11万人の口座番号も
-
5
日経社員のGoogle Workspaceに不正ログイン 1646人分の個人情報漏えいか
-
6
大阪公立大、システム障害で1週間近く休講に 出願期間中で入試にも影響
-
7
韓国の銀行6行にサイバー攻撃 計2万5000人超の個人情報流出──AIエージェントを使った可能性も 現地報道
-
8
ホワイトエッセンス、約105万アカウントの個人情報流出 8月発表の不正アクセス調査で判明
-
9
大阪公立大の大規模システム障害、サイバー攻撃が原因か 13万人超の個人情報流出恐れ
-
10
個人向けGeminiのモデル選択が厳格化 無料ユーザーが使えるのは「Flash-Lite」のみに
ITmedia NEWS SNS
インフォメーション
注目情報をチェック
ITmediaNEWSをフォロー
あなたにおすすめの記事PR