【初心者向け】Raspberry Piで人感センサー作ってLINEに通知してみた!


はじめに

 Raspberry Piをセンサーモジュールに接続して、検知情報を自分のLINEに通知する人感センサーを作ってみました。

経緯

 社内の試作アプリ作成の一環として、人感センサーの構築を担当することになりました。
 ラズパイってなあに?Pythonって聞いたことあるけど何ができるの?状態からスタートして、センサーが反応したらLINEにお知らせしてくれるものを作ってみました。
 自社への作業報告を兼ねて記事を投稿してますが、ラズパイを使って電子工作をしてみたい!という方の参考になれば幸いです。

作るにあたり必要なもの

 ・RaspBerry Pi Zero 
 ・Ren He HC-SR501人体赤外線感応モジュール
   ( URL:https://www.amazon.co.jp/gp/product/B07DCKZS5S )
 ・SDカード
 ・ブレッドボード・ジャンパーワイヤー(メス-メス)
   ( URL:https://www.amazon.co.jp/gp/product/B01A4DDUTA )
 ・USBハブ
 ・モニター
 ・USBキーボード
 ・プラスチックハンマー
 ・GPIOハンマーヘッダー
   ( https://www.amazon.co.jp/gp/product/B0711MPHVF/ )

OSのインストール

ラズパイの公式サイトからOSをダウンロードします。
今回はNOOBS Liteを利用しました。
ダウンロードしたOSのZipファイルを解凍して、SDカードに書き込みます。

ラズパイとセンサーモジュールの接続

GPIO Hammer Header使ってGPIOピンをラズパイにプラスチックハンマーでトントンしたら、センサーモジュールと同じ役割のGPIOピンにジャンパーワイヤーで接続します。
今回使用したRaspBerry Pi Zeroではこんな感じで接続します。

センサーモジュールの検知時間と検知範囲はこのぐらいに設定しました。

初期設定

ラズパイにSDカードを挿入します。
モニター、USBキーボード、マウス、電源を接続してラズパイを起動します
こちらの記事を参考に、初期設定を行います

センサーモジュール動作確認

PythonでラズパイのGPIOの制御設定を行い、センサーモジュールの動作確認をします。
以下のプログラムを実行します

sensor_test.py
import RPi.GPIO as GPIO
GPIO_PIN = 12

GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN,GPIO.IN)

while True:
    if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
        print("1")
        break
GPIO.cleanup()

プログラム実行後、センサーモジュールに手をかざしてみて、以下の結果になれば動作確認完了です

pi@raspberrypi:~ $ python /home/pi/work/sensor_test.py
1

LINE Notifyでアクセストークンの発行

  1. LINE Notifyにアクセスして、通知を送りたいLINEのアカウントでログインしマイページを開きます

2.「トークンを発行する」をクリックします

3.トークン名を任意のトークン名に設定し、「1:1でLINE Notify 通知を受け取る」を選択する

4.発行されたトークンをメモします

人感センサーの検知情報をLINEへ通知

いよいよプログラム実装します!
センサーモジュールからの感知情報をラズパイでうけとり、LINE Notifyに向かってAPIをたたきます。

detection_LINE.py
import requests
import RPi.GPIO as GPIO
import time

SLEEPTIME = 30

GPIO_PIN = 12
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PIN,GPIO.IN)

def main():
    url = "https://notify-api.line.me/api/notify"
    token = "先ほどメモしたアクセストークン"
    headers = {"Authorization" : "Bearer "+ token}

    message =  'IN USE!!!!!'
    payload = {"message" :  message}
    requests.post(url ,headers = headers ,params=payload)


try:
    while True:
        if(GPIO.input(GPIO_PIN) == GPIO.HIGH):
                  main()
          time.sleep(SLEEPTIME)

finally:
    GPIO.cleanup

ラズパイ起動時に自動で実行されるようにCronの設定をします。

crontab -e 

cronの設定ファイルが開いたら、最終行に以下を追加します。

@reboot python /home/pi/work/detection_LINE.py

ラズパイ再起動

ラズパイを再起動して、センサーモジュールに手をかざしたら通知が来ました!

つくってみての感想

ちんぷんかんぷんな状態からスタートしましたが、GPIO取り付けるのに意外に力使ったり、センサーモジュールの検知範囲マックスにした状態+スリープタイム挟まずにスクリプト実行して爆竹のごとくLINE通知鳴りやまなかったりと、初心者ならではの周り道もたくさんしましたが、夏休みの自由研究感覚で楽しめました!

次はAWSのLambdaあたりを使って何か作れたらなあ~と思います。