« Raspberry Piに人感センサーつけてみた | トップページ | くら寿司でのRaspberry Pi + Coralによるエッジ端末活用事例 »

2020年11月 1日 (日)

Raspberry Pi + 磁気センサーで ドアの開閉をセンシングしてみた

先日もRaspberry Piに人感センサーの記事でちらっと書きましたが、会社でトイレIoTを作ろうとしておりまして。

ただ、人感センサーはあまりにも不確実なので、もうちょっと確実性の高いセンサーがないものか、探してみました。

で、見つかったのがこれ。

Img_4298

秋月電子通商で購入。その名も「ドアセンサースイッチ(リードスイッチ) SPS-320」。一つ250円で、4つ購入。送料込みで1500円でした。

いわゆる、磁気センサーです。磁石が接近すると、スイッチがオンになる、ただそれだけの仕組み。

会社のトイレは、人がいないときはドアが開きっぱなしに、いれば閉じているため、中にいるかどうかはドアの開閉で把握できます。そういう用途には、これが最適かと。

Img_4299

で、そいつをRaspberry piに接続して、以下のサイトを参考にコードを組みます。

【ラズパイ電子工作】スイッチのON/OFF状態を読み取る方法 | 電気設計人.com

上のリンクではスイッチでしたが、それをこの磁気センサーに置き換えただけ。

で、早速テスト。

Img_4302

磁石を近づけてみると、

Img_4301

ターミナル上にはこの通り、磁石が接近すると、数字が0から1に変わります。

おお、いい感じです。

Img_4303

さらに調子に乗って、コードをちょっといじってcsvファイル出力できるようにして、実際にドアにつけてみました。

Img_4304

こんな感じ。

Img_4306

開閉すると、

Toiletiot02

日時と数字(0,1)が記録されるようになりました。

さて、せっかくRaspberry Pi使っているので、一つのドアに一つじゃああまりにもったいない。

てことで、2つつけてみます。

と、その前に、センサーのリード線を一つだけ延長し、ブレッドボードに刺さりやすいよう加工します。

Img_4310

というわけで、はんだごてを引っ張り出して、

Img_4311

2本の線をはんだで固めます。

Img_4312

にしてもこの百均で以前買ったこのクリップ台、役に立ちますね。

Img_4313

その上からこの黒い被覆をかぶせて、はんだごての熱で収縮。

Img_4316

こうしてできたセンサーを使い、2箇所のドアのセンシングに挑戦。

ところでこのRaspberry Pi、よく見るとスイッチがついてますが、これはシャットダウンボタンです。2秒以上長押しすると、電源が落ちるようにしました(コードは後述)。

Img_4318

そして長い方を、隣の部屋のドアまで延長。

Img_4315

Img_4314

2つのドアに、両面テープでこんな感じに取りつけ。

Toiletiot03

ちなみに、回路図はこう。

ちょっと見難くて、申し訳ありません。スイッチ側は、一方を3.3Vに、もう一方をGPIO17と27に接続。

なお、シャットダウンボタンのスイッチは、GPIO22に接続しました。

で、コードはこちら。

【toil_tc.py】


import os
import datetime
import RPi.GPIO as GPIO
import time
import sys
#ポート番号の定義
Sw_pin1 = 17
Sw_pin2 = 27
Sw_pin3 = 18
Sw_pin4 = 23
Sw_shut = 22
#GPIOの設定
GPIO.setmode(GPIO.BCM)
#4つのGPIOを入力モードに設定してプルダウン抵抗を有効にする
#(最大4つまでセンシング可)
GPIO.setup(Sw_pin1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(Sw_pin2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(Sw_pin3, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(Sw_pin4, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(Sw_shut, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
#ファイル保存開始
date_file = datetime.datetime.now()
with open("/home/pi/toilet_open_{0:%Y%m%d%H%M%S}.csv"
.format(date_file),"a") as f:
#GPIOの入力を読み取る
#while文で無限ループ
while True:
try:
now = datetime.datetime.now()
print(now , "," , GPIO.input(Sw_pin1),","
, GPIO.input(Sw_pin2), ","
, GPIO.input(Sw_pin3),","
, GPIO.input(Sw_pin4), file=f)
time.sleep(1)
# シャットダウンボタンの設定
if GPIO.input(Sw_shut):
tcount+=1
print(tcount)
else:
tcount = 0
if tcount>=2: #2秒以上押されてると反応
os.system("sudo shutdown -h now")
break
except KeyboardInterrupt:
GPIO.cleanup()

見ていただくと分かりますが、最大4つのスイッチまで対応したコードにしました。GPIO 18と23に追加可能。

で、これを電源オンで自動実行できるようにするため、まず  /usr/local/bin  の中に「auto.sh」というファイルを作成。

その「auto.sh」の中身は、

/usr/bin/python3.7 /home/pi/TOILET/toil_tc.py

と、pythonもコードも絶対パスで記載しておきます。

で、/etc/rc.localの下の方に、auto.sh を記載します。

これで、電源オンでいきなりドア監視がはじまります。

Toiletiot04

4つ出力できるようにしてますが、センサーは2つなので、最初の2列だけに値が入ります。

1番のセンサーが付いたドアは基本、閉めっぱなししており、時折出入りするため、0、1が記録されてます。

Toiletiot06

グラフで書くと、こう。

1番のセンサーのみ、開け閉めが記録されております。

単純な構造なのに、いや、単純ゆえに、確実なセンシングをしてくれます。

週明けにでも、会社にもっていこうと思ってます。


I-O DATA Raspberry Pi メインボード Bluetooth(R) Wi-Fi対応モデル Raspberry Pi 3 model B 安心の1年間ハードウェア保証 UD-RP3

 

« Raspberry Piに人感センサーつけてみた | トップページ | くら寿司でのRaspberry Pi + Coralによるエッジ端末活用事例 »

Raspberry Pi・Arduino・電子工作」カテゴリの記事

コメント

私も長いことこれに似た事例に取り組んでおりまして、先日ようやく完成させました。
よろしかったら以下のサイトをご覧ください。

https://qiita.com/mo256man/items/13084c865bfbf512a691

> mo256man さん

見させていただきました。Raspberry Pi気絶問題にも対応とは恐れ入ります。死活チェックは重要ですよね。

さて、こちらはといえばやっと社内で起動です。ネットワークには繋げられないため、しばらくは電源オフしてデータ抜き取りという気の遠くなる作業の繰り返しとなりますが、その先に得られるものがあれば…

コメントを書く

(ウェブ上には掲載しません)

« Raspberry Piに人感センサーつけてみた | トップページ | くら寿司でのRaspberry Pi + Coralによるエッジ端末活用事例 »

当ブログ内検索

スポンサード リンク

ブログ村

無料ブログはココログ