🏠
Raspberry Piと人感センサーで玄関の自動化システムを作ってみた
はじめに
今回は、自宅の玄関にRaspberry Piと人感センサーを設置し、人が通るのを検知してLINE通知を送ったり、USBライトを自動で点灯させたりする、実用的なDIYプロジェクトをご紹介します。
以前から「Raspberry Piで何か作りたいな」と考えている方や、IoTを使ったホームオートメーションに興味がある方の参考になれば幸いです。
今回作るもの
- 機能: 人感センサーが人の動きを検知する
- アクション1: LINE Notify APIを利用して、LINEに「センサーが人を感知しました。」と通知を送る
- アクション2: USB接続のLEDライトを一定時間(今回は2分間)点灯させる
必要なもの
- Raspberry Pi本体 (今回はRaspberry Pi 3 Model B+を使用)
- 人感センサー (HC-SR501など)
- USB接続のLEDライト
- ブレッドボードとジャンパワイヤ
回路の接続
接続は非常にシンプルです。人感センサーのVCCを5Vピン、GNDをGNDピン、OUTをGPIO 18ピンに接続します。
人感センサー | Raspberry Pi |
---|---|
VCC | 5V |
GND | GND |
OUT | GPIO 18 (BCM) |
USBライトは、Raspberry PiのUSBポートに接続します。
Pythonコードの解説
メインとなるPythonスクリプトです。RPi.GPIO
ライブラリでセンサーを制御し、subprocess
やos.system
で外部コマンドを実行しています。
hub-ctrl
コマンドについて
USBライトのオン・オフは、hub-ctrl
というツールを使って、USBポートへの電力供給を直接制御しています。別途インストールが必要です。
# インストール
sudo apt-get install hub-ctrl
全体のコード
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import RPi.GPIO as GPIO
import os
# センサーの検知間隔(秒)
INTAVAL = 1
# ライトの点灯時間(秒)
LIGHTTIME = 120
# センサーを接続したGPIOピン番号(BCMモード)
SENSOR_PIN = 18
# GPIOのセットアップ
GPIO.setmode(GPIO.BCM)
GPIO.setup(SENSOR_PIN, GPIO.IN)
# 最後にセンサーを検知した時刻を記録する変数
last_detection_time = time.time() - INTAVAL
# LINE Notifyに通知を送るコマンド
# XXXX... の部分に自分のアクセストークンを入れる
LINE_CMD = "curl -X POST -H 'Authorization: Bearer XXXX...' -F 'message=センサーが人を感知しました。' [https://notify-api.line.me/api/notify](https://notify-api.line.me/api/notify)"
try:
print("センサー監視を開始します...")
while True:
# USBライトをオフにして待機
os.system("sudo hub-ctrl -h 0 -P 2 -p 0")
# センサーがHIGHになり、かつ前回の検知から指定秒数が経過していたら処理を実行
if (GPIO.input(SENSOR_PIN) == GPIO.HIGH) and (last_detection_time + INTAVAL < time.time()):
last_detection_time = time.time()
print(f"{time.ctime()} 人を検知しました。")
# USBライトをオンにする
os.system("sudo hub-ctrl -h 0 -P 2 -p 1")
# LINEに通知を送信
os.system(LINE_CMD)
# 指定時間スリープ(ライト点灯時間)
time.sleep(LIGHTTIME)
else:
# センサーが反応しない場合は短い間隔でスリープ
time.sleep(INTAVAL)
except KeyboardInterrupt:
print("プログラムを終了します。")
pass
finally:
# GPIOをクリーンアップ
GPIO.cleanup()
コードのポイント
-
LINE通知:
LINE_CMD
の部分には、LINE Notifyで取得したご自身のアクセストークンを設定してください。 -
誤検知防止:
last_detection_time
という変数を使って、一度検知したらINTAVAL
秒間は再検知しないようにするチャタリング対策を入れています。 -
クリーンアップ:
try...finally
構文を使い、プログラムが終了する際(Ctrl+Cで中断した場合など)にGPIO.cleanup()
が必ず呼ばれるようにしています。これにより、GPIOピンが初期状態に戻り、安全に終了できます。
実行方法
このスクリプトを sensor.py
のような名前で保存し、以下のコマンドで実行します。
sudo python sensor.py
hub-ctrl
の実行に管理者権限が必要なため、sudo
を付けて実行します。
まとめ
今回は、Raspberry Piと人感センサーを使って、非常に実用的なホームオートメーションシステムを構築してみました。LINE通知の部分をメール送信に変えたり、カメラを接続して写真を撮影・送信したりと、アイデア次第で様々な応用が可能です。
皆さんもぜひ、身の回りの「ちょっと不便」をRaspberry Piで解決してみてください!
この記事で紹介した内容以外にも、技術情報をブログで発信しています。
MyNote
Discussion