Help us understand the problem. What is going on with this article?

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

前提・背景

  • ここ数年、自宅をスマートホーム化していて、こんなものを導入しています。
    • 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

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

  • 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秒待機するのはつらいです

参考にした記事、サイト

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした