どうも、CHASUKEです。
Raspberry Pi(ラズパイ)に接続できる人感センサーモジュールを使って、手持ちのガジェットと連携させてみた。
タイトルには自作とあるが、昔、昔、何かのついでに買った人感センサーモジュールを使います。家に転がってましたw
今回は、ラズパイに標準インストールされているPython言語で使ったり、 以下の他デバイス(IFTTT含む)へ連携したりで遊んでみました♪
- Google Home
- BOCCO(ボッコ)
- LaMetric
- LINEやSLACK
- Google Spreadsheet
将来、夏休みに子供とこんなことして遊びたいなーと思いつつ、「人感センサー × 〇〇」なことをやろうとしている人の参考になれば幸いです♪
ラズパイと人感センサーの繋ぎ方
事前に準備するモノ
- Raspberry Pi(ラズパイ)
- 人感センサーモジュール
- ジャンパーワイヤ(メス-メス)
Raspberry Pi(ラズパイ)
今回は『ラズパイ3 B』を使ってます。
これから購入するなら、パワーアップした新型『ラズパイ3 B+』がおすすめです。
ミニサイズのラズパイZeroでも良いですが、GPIOピンを使うのでピン付き『ラズパイ Zero WH』がおすすめです。
人感センサーモジュール
これが人感(モーション)センサーモジュールです。
人感センサー対応家電に付いてるのを見かけたことがあると思います。冬に購入したファンヒーターにも付いてたなー。
家に転がってたので、どこで購入したかも覚えてないですが、Amazon.co.jpで数百円で買えます。
▼裏側はこんな感じになっている。
上方に見える配線は左から「GND」「Output」「Power」となる。少し見辛いですが、下方にはオレンジ色の調節ネジ(感度、検知時間)があります。
▼調節ネジは、基本的にドライバーを使って回すが、頑張れば指でつまんで回せます。
感度調節では、モーション検知範囲をコントロールできます。
あまり大きくし過ぎると誤検知のもとなので注意しましょう。右に回しきると最大7mまで検知できるようです。
検知時間調節では、1度検知した状態を保持する時間を調整できます。
資料がないので、ネジを回してどれほど違いが出るのか不明ですが、ここは最小にしておき、プログラム側で制御すれば良さそうです。
ジャンパーワイヤー(メス-メス)
ラズパイとセンサーモジュールは、ジャンパーワイヤー(メス-メス)でつなぎます。
こちらもAmazon.co.jpで40本で100円ちょいで売ってます。40本も要らんw
ラズパイと人感センサーを接続
さぁ、配線します。3本さすだけなので簡単です。ちゃんとラズパイの電源をOFFにしてから接続しましょうねー。
▼ラズパイのGPIOには、下記のように役割が割り当てられている。
色枠で囲った箇所に配線しているが、同じ役割のピンであれば、どこに接続してもOK。
1ピン :5V電源(Power)
6ピン :0Vアース(GND)
12ピン:GPIO18 (Output)
Pythonで動かしてみる
ラズパイにもともとインストールしてあるPython3を使って、GPIOに接続した人感センサーの情報を取得します。
▼下記コマンドにてPython3が利用可能かチェック。
$ python3 -V
Python 3.5.3
$ pip3 -V
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.5)
▼人感センサープログラム書いてみる。
ファイル名:test_base.py
from datetime import datetime
import time
import RPi.GPIO as GPIO
# インターバル
INTERVAL = 3
# スリープタイム
SLEEPTIME = 20
# 使用するGPIO
GPIO_PIN = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN, GPIO.IN)
if __name__ == '__main__':
try:
print ("処理キャンセル:CTRL+C")
cnt = 1
while True:
# センサー感知
if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
print(datetime.now().strftime('%Y/%m/%d %H:%M:%S') +
":" + str("{0:05d}".format(cnt)) + "回目の人感知")
cnt = cnt + 1
time.sleep(SLEEPTIME)
else:
print(GPIO.input(GPIO_PIN))
time.sleep(INTERVAL)
except KeyboardInterrupt:
print("終了処理中...")
finally:
GPIO.cleanup()
print("GPIO clean完了")
GPIO18を利用しているため、「GPIO_PIN = 18」としてます。また、スリープ時間やインターバルは任意の時間でお試しを。
▼Pythonスクリプトを実行して、モーション検知すると、こんな感じに出力される。
$ python3 test_base.py
処理キャンセル:CTRL+C
0
2018/08/17 17:07:24:00001回目の人感知
0
0
0
2018/08/17 17:07:53:00002回目の人感知
0
0
センサーモジュールに手をかざして、反応すれば成功です♪
IFTTT連携させてみる
ここまで出来ると人感センサーが反応したら、「テレビをつける」や「電気をつける」など何かアクションを起こしたくなりますよね。
ということで、IFTTT経由でLINEやSlackなどのメッセージアプリや、我が家のスマートガジェットに連携させて通知システムを作ってみます。例えば、僕の椅子のすぐ近くにセンサーを設置して、誰かが椅子に座ったら、お知らせする仕組みです。
先ほどのPythonで作った人感センサープログラムに追記する形で、IFTTTのWebhookトリガーにアクセスします。
▼Webhookにアクセスする方法は下記に詳しく載せました。
https://chasuke.com/wp/python_ifttt/
CHASUKE
IFTTTキーの取得方法もこちらをチェック!
LINEやSlackに通知
IFTTTアプレット「Webhooks → LINE(またはSlack)」で簡単にできます。
▼Ptyhonスクリプトはこんな感じ。
ファイル名:test_line.py
from datetime import datetime
import time
import RPi.GPIO as GPIO
import requests
# インターバル
INTERVAL = 3
# スリープタイム
SLEEPTIME = 20
# 使用するGPIO
GPIO_PIN = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN, GPIO.IN)
def ifttt_webhook(eventid):
payload = {'value1': "おーい、椅子に誰か座ったぞー!!"}
url = "https://maker.ifttt.com/trigger/" + eventid + "/with/key/【IFTTTキー】"
response = requests.post(url, data=payload)
if __name__ == '__main__':
try:
print ("処理キャンセル:CTRL+C")
cnt = 1
while True:
# センサー感知
if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
print(datetime.now().strftime('%Y/%m/%d %H:%M:%S') +
":" + str("{0:05d}".format(cnt)) + "回目の人感知")
# IFTTT_Webhook
ifttt_webhook(【Webhooksに指定したEvent Name】)
cnt = cnt + 1
time.sleep(SLEEPTIME)
else:
print(GPIO.input(GPIO_PIN))
time.sleep(INTERVAL)
except KeyboardInterrupt:
print("終了処理中...")
finally:
GPIO.cleanup()
print("GPIO clean完了")
CHASUKE
途中にある【IFTTTキー】は自分のものに置き換えてね
上記スクリプトは、先ほどの「jinkan_base.py」から、新規で追加した関数(ifttt_webhook)を呼び出しています。
これを実行すれば、モーション検知するたびにLINEに通知がいくはずです。
python3 test_line.py
Google Spreadsheetで記録
こちらもIFTTTアプレット「Webhooks → Google Spreadsheet」で簡単にできますね。
A,BセルにPython側で計算させた値を出力させてみた。
LaMetric Time
スマートクロックの「Lametric Time」です。
https://chasuke.com/wp/lametric/
こちらはWebAPIが公開されていますが、IFTTTが利用できるので、こちらから簡単にティッカー表示できます。
人感センサーがモーション検知すると、こんな感じで文字が流れるように。
その他スマートデバイス連携
スマートスピーカー「Google Home」や見守りロボット「BOCCO」とも連携させてみた。こういうのが家にあると子供の食い付き非常に良い♪
Google Home(グーグルホーム)
ご存知の通りGoogleのスマートスピーカーです。
普通なら、「OK, Google」やら「ねぇ, Google」などウェイクワードから利用するが、NodeJSライブラリ「google-home-notifier」を利用することで、好きなタイミングに好きなワードを喋らせることができる。
▼設定方法はこちらを参考に。
https://chasuke.com/wp/ghnotifier/
BOCCO(ボッコ)
BOCCOは、留守番中の子どもやお年寄りの見守りを助けるロボットです。
こちらのロボットもWebAPIが公開されており、Pythonライブラリを使って自由に喋らせることができる。
▼『人感センサー + BOCCO』のPythonスクリプトはこんな感じ。
ファイル名:test_bocco.py
from datetime import datetime
import time
import RPi.GPIO as GPIO
import bocco
# インターバル
INTERVAL = 3
# スリープタイム
SLEEPTIME = 20
# 使用するGPIO
GPIO_PIN = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN, GPIO.IN)
# BOCCO_API利用
def bocco_say():
session = bocco.api.Client.signin(【APIキー】, 【ログインID】, 【PASSWORD】)
api = bocco.api.Client(session.access_token)
# 全ての部屋にメッセージを送る
for room in api.get_rooms():
#print(room['uuid']) # ルームID確認用
api.post_text_message(room['uuid'], "おーい、椅子に誰か座ったぞー!!")
if __name__ == '__main__':
try:
print ("処理キャンセル:CTRL+C")
cnt = 1
while True:
# センサー感知
if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
print(datetime.now().strftime('%Y/%m/%d %H:%M:%S') +
":" + str("{0:05d}".format(cnt)) + "回目の人感知")
# BOCCO_API
bocco_say()
cnt = cnt + 1
time.sleep(SLEEPTIME)
else:
print(GPIO.input(GPIO_PIN))
time.sleep(INTERVAL)
except KeyboardInterrupt:
print("終了処理中...")
finally:
GPIO.cleanup()
print("GPIO clean完了")
【APIキー】, 【ログインID】, 【PASSWORD】を書き換えてお試しください。
人感センサーがモーション検知すると、BOCCOが喋り出す。
人感センサーをApple HomeKit対応
HomeKitをエミュレートしてくれるNode.jsサーバー『Homebridge』を使えば、人感センサーをAppleホームアプリに追加して、オートメーションできそうだ。
▼僕も前回『Homebridge』を利用して、Nature RemoをHomeKit対応させました。
https://chasuke.com/wp/remo_homebridge/
人感センサーモジュールのHomeKit対応方法についてはこちらで説明されています。
これは面白そうなので、ぜひやりたいと思っている。
最後に
自作人感センサーとして、他サービスと連携させて遊んでみました。
モジュールやジャンパーワイヤーは安いので、何かラズベリーパイでIoTなことがしたいと思っている方にはちょうど良いのではないかと思います。
ざっくり書いてしまったので、わからない点や間違っている点、他にこんな事がしたいなどありましたら、コメントください!!
それではまた。