LoginSignup
3
1

More than 1 year has passed since last update.

RaspberryPi + 人感センサー + Sesame でオートロック解除

Last updated at Posted at 2019-12-12

前提・背景

  • ここ数年、自宅をスマートホーム化していて、こんなものを導入しています。
    • NatureRemo
      • 赤外線でデバイスとコントロールできます
      • エアコン、テレビ、シーリングを操作できます
    • SwitchBot
      • スイッチのON/OFFをコントロールできます
      • オートロックの解除と風呂の湯張りに使っています
    • Sesame
      • 玄関の鍵の施錠/解錠ができます
    • Google Home + Alexa
      • 上記のデバイスを音声でコントロールできるようになります
      • なんとなくGoogle Home miniを集めていたら7台になってしまいました。
  • 今回、玄関の鍵の解錠を自動化しようと考えました。

やりたいこと

  • 鍵の解錠を人感センサーとSesameを使って自動化する
    • 玄関に人が近づく
    • 人感センサーがRaspberryPiに知らせる
    • RasbperryPiがSesameAPIに解錠要求する
    • Sesameが玄関の鍵を解錠する

用意したもの

  • 人感センサー(HC-SR501)
  • RasbperryPi Zero WH
  • ジャンパピン(メス-メス)
  • モバイルバッテリー
  • USBケーブル

HC-SR501ってこんなやつ

IMG20191211233719.jpg

RasbperryPi ZeroWHってこんなやつ

IMG20191211233659.jpg

  • 超小型マイコンです
  • Linuxとか動きます
  • ヘッダピンがついていて電子回路と連携ができます

RaspberryPiと人感センサーの接続

  • 回路図
    rpi_to_hc_scr01.png

  • 実際につないだのがこんな感じ
    IMG20191211233645.jpg

  • このあたりを見てつなぎました

  • https://qiita.com/kazuppp/items/dc8170d11aa185e9b233

  • LEDとかつけるとわかりやすいのですが、純粋に出力をRaspberryPiで受け付けるだけ

  • このやり方だと、メスtoメスのジャンパワイヤだけ用意すればよいです

人がいることを検知してSesameに解錠要求する

  • Pythonのコードを書きます
  • 以下のようなコードを書きました
  • べたべた書きすぎですみません
sensor_to_sesame.py
# coding: utf-8
import RPi.GPIO as GPIO
import time
import urllib.request
import json

PIN = 14

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

try:
    print ('-----Start-----')
    while True:
        if GPIO.input(PIN) == GPIO.HIGH:
            count += 1
            print("検知しています "+"{}".format(count) + "回目")
            if count == 5:
                print("解錠します")
                url = 'https://api.candyhouse.co/public/sesame/{device_id}'
                data = { 'command': 'unlock' }
                headers = {
                    'Authorization': '{API_KEY}',
                    'Content-Type': 'application/json',
                }
                req = urllib.request.Request(url, json.dumps(data).encode(), headers)
                with urllib.request.urlopen(req) as res:
                    body = res.read()
                time.sleep(10)
                count = 0
            time.sleep(1)
        else:
            print("検知していません")
            count = 0
            time.sleep(3)
except KeyboardInterrupt:
    print("Cancel")
finally:
    GPIO.cleanup()
    print("-----end-----")

ちょっとした解説

  • 人がいることを検知する仕組み
    • 人感センサーは検知していないときは0を、検知しているときは1を送ってきます
    • そしてたまに誤検知するので、単純に1がきたら解錠とはできません
    • 今回は検知状態が5秒続いたときに解錠しに行くようにしました
  • Sesameに解錠要求する

課題

  • レスポンスの悪さ
    • SesamiAPIにリクエストを送って実際に解錠されるまでに最大5秒くらいかかります
      • 早い時と遅いときの差が激しいです。
    • 人感センサーが検知する時間も足すと最大10秒くらいかかる計算になります
    • さっさと鍵を開けてほしいのに10秒待機するのはつらいです

参考にした記事、サイト

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1