ラズパイ入門まとめ:PLC水位監視 + 警報LED & カメラ画像処理
Raspberry Pi の定番テーマを、実際にコードを動かしながらまとめて解説します。この記事では PLC水位監視 + 警報LED/カメラ画像処理 の2テーマを扱います。
各テーマは ブラウザ上の仮想Raspberry Piシミュレーターで、コードを編集しながら自分で動かせます。
1. PLC水位監視 + 警報LED
概要
PLCの水位センサを監視し、閾値超過で警報LEDと排水弁を制御。ブラウザ上の仮想Raspberry Piで、実際にコードを動かしながら挙動を確認できます。
プログラムの内容(ざっくり)
PLCの保持レジスタ0から水位を1秒ごとに読み取り、閾値THRESHOLDを超えたら警報LED(GPIO17)を点灯し、PLCの排水弁(コイル0)を開きます。実TCPソケットのModbus/TCPで通信します。
# === 仮想PLC 水位監視システム ===
# PLC(保持レジスタ0)のタンク水位を1秒ごとに読み取り、閾値を超えたら
# 警報LED(GPIO17)を点灯し、PLCの排水弁(コイル0)を開く。
# ※ plc は接続済みの Modbus/TCP クライアント。数値を編集して挙動を変えてみよう。
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT) # 警報LED
THRESHOLD = 700 # ← この閾値を変えると挙動が変わる
while True:
level = plc.read_register(0)
print(f"水位 = {level} cm")
if level > THRESHOLD:
GPIO.output(17, GPIO.HIGH)
plc.write_coil(0, True) # 排水弁OPEN
print(f" 警報! {level} > {THRESHOLD} -> 排水弁OPEN")
else:
GPIO.output(17, GPIO.LOW)
plc.write_coil(0, False) # 排水弁CLOSE
time.sleep(1)
配線
配線図(PLC水位監視 + 警報LED)
GPIO17 ──[330Ω]──▶|(赤LED 警報灯)──── GND
eth0 (RJ45) ══════ LAN ══════ RJ45 PLC
PLC 保持レジスタ0 → タンク水位センサ (cm)
PLC コイル0 ← 排水弁(Piが制御)
シェルの出力
実行すると、Pi側と相手デバイス側に次のような出力がリアルタイムで流れます。
🍓 Raspberry Pi シェル
pi@raspberrypi:~ $ python app.py
水位 = 549 cm
水位 = 600 cm
水位 = 681 cm
水位 = 726 cm
警報! 726 > 700 -> 排水弁OPEN
水位 = 633 cm
水位 = 683 cm
水位 = 731 cm
警報! 731 > 700 -> 排水弁OPEN
🏭 PLC (Modbus/TCP)
SCAN#001 DB1.水位=549cm Y0.排水弁=CLOSE
SCAN#002 DB1.水位=600cm Y0.排水弁=CLOSE
SCAN#003 DB1.水位=640cm Y0.排水弁=CLOSE
SCAN#004 DB1.水位=681cm Y0.排水弁=CLOSE
SCAN#005 DB1.水位=726cm Y0.排水弁=CLOSE
SCAN#006 DB1.水位=676cm Y0.排水弁=OPEN
SCAN#007 DB1.水位=633cm Y0.排水弁=OPEN
SCAN#008 DB1.水位=683cm Y0.排水弁=CLOSE
SCAN#009 DB1.水位=731cm Y0.排水弁=CLOSE
SCAN#010 DB1.水位=684cm Y0.排水弁=OPEN
計測値(タンク水位(cm))の推移:
コードを編集したらどうなるか
THRESHOLDを下げると早い段階で排水が始まり、水位は低い位置で安定します。上げると高い水位まで許容します。閾値付近で水位が振動する様子が変わります。
まとめ
Modbus/TCPでPLCと双方向通信し、しきい値制御で水位を保つ基本形です。産業機器連携の入り口です。
Raspi 仮想シミュレーターのライブ実行結果から生成。ブラウザ上で自分でコードを編集して試せます。
2. カメラ画像処理
概要
毎フレームをキャプチャし、最も明るい領域(動く光点)を検出して枠表示・LED点灯。ブラウザ上の仮想Raspberry Piで、実際にコードを動かしながら挙動を確認できます。
プログラムの内容(ざっくり)
毎フレームをキャプチャし、最も明るい領域(動く光点)を検出します。面積がMIN_AREA以上なら検出枠を描き、検知LED(GPIO17)を点灯します。
# === カメラ画像処理(動体・輝点検出)===
# 毎フレームを取得し、最も明るい領域を検出。面積が一定以上なら
# 検出枠を描き、検知LED(GPIO17)を点灯する。THRESH/MIN_AREA を編集してみよう。
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
THRESH = 150 # 明るさしきい値
MIN_AREA = 12 # 検知に必要な画素数
while True:
frame = camera.capture() # 画像取得(自動表示)
x, y, v = frame.brightest() # 最も明るい画素
area = frame.count_above(THRESH) # しきい値以上の画素数
print(f"最輝点=({x},{y}) 値={v} 面積={area}")
if area >= MIN_AREA:
frame.mark(x, y) # 検出位置に枠
GPIO.output(17, GPIO.HIGH)
print(f" 物体検知! 位置=({x},{y})")
else:
GPIO.output(17, GPIO.LOW)
time.sleep(0.4)
配線
構成(カメラ + 検知LED)
CSI カメラ ── Raspberry Pi カメラポート
GPIO17 ──[330Ω]──▶|(検知LED)──── GND
シェルの出力
実行すると、Pi側と相手デバイス側に次のような出力がリアルタイムで流れます。
🍓 Raspberry Pi シェル
pi@raspberrypi:~ $ python app.py
最輝点=(25,14) 値=242 面積=13
物体検知! 位置=(25,14)
最輝点=(22,17) 値=255 面積=11
最輝点=(18,18) 値=239 面積=13
物体検知! 位置=(18,18)
最輝点=(14,18) 値=244 面積=12
物体検知! 位置=(14,18)
最輝点=(10,17) 値=255 面積=9
最輝点=(8,14) 値=249 面積=12
物体検知! 位置=(8,14)
最輝点=(7,11) 値=236 面積=13
物体検知! 位置=(7,11)
最輝点=(9,8) 値=244 面積=14
物体検知! 位置=(9,8)
最輝点=(12,6) 値=247 面積=11
📷 カメラ (PiCamera)
frame #001 captured 32x24
frame #002 captured 32x24
frame #003 captured 32x24
frame #004 captured 32x24
frame #005 captured 32x24
frame #006 captured 32x24
frame #007 captured 32x24
frame #008 captured 32x24
frame #009 captured 32x24
frame #010 captured 32x24
計測値(検出面積(px))の推移:
コードを編集したらどうなるか
THRESHを上げると明るい対象だけに反応し、MIN_AREAを上げると大きな対象だけを検知します。感度を調整できます。
まとめ
しきい値処理と領域検出という画像処理の基礎です。監視カメラや物体検知の入り口です。
Raspi 仮想シミュレーターのライブ実行結果から生成。ブラウザ上で自分でコードを編集して試せます。
おわりに
どちらもラズパイの基礎として役立つテーマです。気に入ったらLGTM・ストックしていただけると励みになります。他のテーマも順次まとめていきます。
