🏠

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ライブラリでセンサーを制御し、subprocessos.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
https://mynote.meantix.com/

Discussion