大学生の電子工作 ラズパイでスマートロックを自作してみた |じょるブログ

じょるブログ

電子工作やプログラミング関連の情報を発信している技術系ブログ

電子工作 ラズベリーパイ

大学生の電子工作 ラズパイでスマートロックを自作してみた

投稿日:2018年12月24日 更新日:

前回前々回に続き、3回目の電子工作です。玄関の鍵が面倒だと感じたことは誰しも一度はありますよね。鍵をかばんやポケットから取り出すのが地味にめんどくさかったり、鍵をなくしてしまって困ってしまったというような経験をしたことがある人も多いでしょう。ということで今回は、鍵を持ち歩かなくてもスマホで(もしくは手ぶらで)簡単に鍵の開閉をできるように玄関の鍵をスマートロック化していきたいと思います。

 

搭載した機能

  

概要

今回搭載したメインの機能はスマホで鍵を開閉できるようにすることです。この機能はスマートリモコンを作成したときと同様にbeebotteとIFTTTというサービスを利用して実現します。鍵はモーターで開閉するため手動では開けにくくなってしまうため、家の中からはスイッチを押すことで鍵を開閉できるようにします。

また、まだ実装はしていませんが、圧力センサーや磁力センサーを利用してドアの開閉を感知し、ドアが閉まったらオートロックしたり、振動センサーを利用してあらかじめ設定したリズムでドアを叩くと鍵を開ける(ただしセキュリティ面を考えて自分のスマホが近くにある場合のみにする)という機能も今後搭載していきます。

 

実行環境

  • RasberryPi3 Model B+ (Raspberrypi zero wh などでも動作します)
  • Python3

 

購入したもの

  • RasberryPi3 Model B+
  • サーボモーター(SG92)
  • ジャンパーワイヤー
  • ボタンスイッチ

Raspberry Pi4 ModelB 4GB ラズベリーパイ4 技適対応品

   

スマートロック本体の作成

サーボモーターの玄関への取り付けは、石膏粘土を使用して作成しました!

石膏粘土は乾燥するとプラスチックのようにカッチカチに固まります。
値段もお手頃価格なので、3Dプリンターなどを持っていない方におすすめです!

ガムボトルを型にし、サーボモーターが入るように調整し成型しました。

  

ドライヤーで乾燥させたためひび割れができてしまいましたが、2~3日ほどでしっかりと固まりました。

サーボモーターに取り付ける、鍵を開ける部分は家にあったスプーンを変形させて即席で作成しましたw

スプーンを二つに折り、そのうちの持つ部分の方を使用して鍵にフィットするように調整して折り曲げたものをサーボモーターに取り付けました。

そして、100均で購入したカモフラージュ用のテープを乾燥した粘土に貼り付けて完成です。

  

セットアップ

・ラズベリーパイの基本設定

ラズベリーパイへのOSのインストールや初期設定がまだの方はこちらの記事をご覧ください。

    

・インストール、ダウンロードするもの

  • paho-mqtt(pythonパッケージ)
  • mqtt.beebotte.com.pem( beebotteの証明書)
  1. sudo pip3 install paho-mqtt
  2. curl -O https://beebotte.com/certs/mqtt.beebotte.com.pem

  

・外部サービスとの連携

ここでは、記事が長くなってしまうので一部省略して説明します。もし、うまく設定できない場合はこちらの記事(Alexa, Google HomeをRasberryPiと連携する)で詳しく解説しているので見てみてください。

 ・ beebotte の設定

beebotteにアカウントを作成し、ログインしたら、”create new” をクリックします。

すると以下のような画面が表示されるので、Channel名とResource名、それからそれらの説明の合計4つを入力したら、”create channel” をクリックします。
(Channel名、Resource名は何でも構いません。例えばChannel名をRaspberryPi、Resource名をSmartLockなどに設定してください。 ) 

以上でChannelの作成は完了です。作成したChannelにアクセスするためにはChannel Tokenが必要なので、以下のように作成したChannel名をクリックして、Channel Tokenをメモしておいてください。

 

 ・IFTTTの設定

アカウントを作成しログインしたら、右上の自分のアカウント名をクリックし、”New Applet”をクリックします。

次の画面で ”+This” というところをクリックし 、画面が切り替わったら“search service” のところに “Google” と入力してGoogle Assistant を探し、Google Assistantのアイコンをクリックします。
(Alexaの設定を行う場合はAlexaを選択します。)

choose trigerと表示されるので “Say a simple phrase” をクリックします。

次の画面で以下のように、Google Assistant に話しかける(または入力する)フレーズとそのレスポンスを入力し、言語をJapaneseに設定したら “create trigger” をクリックします。 (下の画像ではスマートリモコンの設定をしているので適宜変更してください。例えば ”エアコンつけて” と書いてあるところを ”鍵を開けて” などに変更してください。

次に、Google Assistant と beebotteを連携させるための仲介役となるwebhooksとの連携をしていきます。 ”+That” をクリックし 、画面が切り替わったら“search service” のところに “Webhooks” と入力してWebhooksを探し、Webhooksのアイコンをクリックします。

choose actionと表示されるので “ Make a web request ” をクリックします。

次の画面で以下のように入力してください。

・URL
” https://api.beebotte.com/v1/data/publish/チャンネル名/トピック名?token=[先ほどメモしたBeebotteのトークン] “と入力
・Method
” POST “を選択
・Content Type
” application/json “を選択
・Body
” {“data”:[{“device”:”デバイス名”,”action”:”アクション名”}]} “と入力

URL中のチャンネル名/トピック名にはbeebotteで設定したチャンネル名とトピック名を入力してください。
Bodyのデバイス名とアクション名は、デバイス名をlock、アクション名を鍵を開ける場合はopen、閉める場合はcloseと入力してください。

“Create action” をクリックし、次の画面で “Finish” をクリックすればIFTTTでの設定は完了です。

  

回路図

右側のスイッチが鍵を開ける用のスイッチで、左側が閉める用のスイッチです。

 

プログラム

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3.  
  4. import paho.mqtt.client as mqtt
  5. import subprocess
  6. import json
  7. import sys
  8. import time
  9. import RPi.GPIO as GPIO
  10.  
  11.  
  12.  
  13. ##### beebotteのセッティング #####
  14. HOST = 'mqtt.beebotte.com'
  15. PORT = 8883
  16. CA_CERTS = 'mqtt.beebotte.com.pem'
  17. TOKEN = 'token_xxxxxxxxxxxxxxxxxx' #Beebotteで作成したチャンネルのトークンを入力
  18. TOPIC = 'チャンネル名/トピック名' #Beebotteで作成したトピック名を入力
  19.  
  20.  
  21.  
  22. ##### サーボモーターのセッティング #####
  23. # pinの指定方法をBCMに設定(GPIO.BOARDとすると基盤のピン番号となる)
  24. GPIO.setmode(GPIO.BCM)
  25. # pin番号の指定
  26. pin_servo = 4
  27. # 指定したpinを出力に設定
  28. GPIO.setup(pin_servo, GPIO.OUT)
  29. # PWMサイクルを50Hz(20ms)に設定 (都合により関数内で設定を行う)
  30. # servo = GPIO.PWM(pin_servo, 50)
  31. # 回転角を定義
  32. left = 2.5
  33. center = 7.25
  34. right = 12.0
  35.  
  36.  
  37. ##### プッシュボタンのセッティング #####
  38. pin_open = 10
  39. pin_close = 27
  40.  
  41. GPIO.setup(pin_open,GPIO.IN,pull_up_down=GPIO.PUD_UP)
  42. GPIO.setup(pin_close,GPIO.IN,pull_up_down=GPIO.PUD_UP)
  43.  
  44. def press_open_button(pin_number):
  45. counter = 0
  46. print("GPIO[%d]のコールバックが発生しました" % pin_number)
  47. while True:
  48. status = GPIO.input(pin_open)
  49. if status == 0:
  50. counter = counter + 1
  51. if counter >= 10:
  52. print("開錠します")
  53. open()
  54. break
  55. else:
  56. print("開錠を取り消します")
  57. break
  58. time.sleep(0.001)
  59. print(counter)
  60.  
  61. def press_close_button(pin_number):
  62. counter = 0
  63. print("GPIO[%d]のコールバックが発生しました" % pin_number)
  64. while True:
  65. status = GPIO.input(pin_close)
  66. if status == 0:
  67. counter = counter + 1
  68. if counter >= 10:
  69. print("閉錠します")
  70. close()
  71. break
  72. else:
  73. print("閉錠を取り消します")
  74. break
  75. time.sleep(0.001)
  76. print(counter)
  77.  
  78.  
  79. def open():
  80. servo = GPIO.PWM(pin_servo, 50)
  81. servo.start(center)
  82. time.sleep(0.3)
  83. servo.ChangeDutyCycle(left)
  84. time.sleep(0.3)
  85. servo.ChangeDutyCycle(center)
  86. time.sleep(0.3)
  87. servo.stop()
  88.  
  89. def close():
  90. servo = GPIO.PWM(pin_servo, 50)
  91. servo.start(center)
  92. time.sleep(0.3)
  93. servo.ChangeDutyCycle(right)
  94. time.sleep(0.3)
  95. servo.ChangeDutyCycle(center)
  96. time.sleep(0.3)
  97. servo.stop()
  98.  
  99.  
  100. def on_connect(client, userdata, flags, respons_code):
  101. print('status {0}'.format(respons_code))
  102. def on_disconnect(client, userdata, flags, respons_code):
  103. print('disconect')
  104. #client.loop_stop()
  105.  
  106.  
  107. def on_message(client, userdata, msg):
  108. print(msg.topic + ' ' + str(msg.payload))
  109. data = json.loads(msg.payload.decode("utf-8"))["data"][0]
  110. print(msg.payload.decode("utf-8"))
  111. print(data)
  112.  
  113. if (data["device"] == 'lock'):
  114. if (data["action"] == 'open'):
  115. print('鍵を開けます')
  116. open()
  117. print('鍵を開けました')
  118. elif (data["action"] == 'close'):
  119. print('鍵を閉めます')
  120. close()
  121. print('鍵を閉めました')
  122. else:
  123. print('unknown message')
  124.  
  125. else:
  126. print('unknown message')
  127.  
  128. if __name__ == '__main__':
  129. try:
  130. client = mqtt.Client()
  131. client.on_connect = on_connect
  132. client.on_disconnect = on_disconnect
  133. client.on_message = on_message
  134. client.username_pw_set('token:%s' % TOKEN)
  135. client.tls_set(CA_CERTS)
  136. client.connect(HOST, PORT)
  137. client.subscribe(TOPIC)
  138.  
  139. GPIO.add_event_detect(pin_open, GPIO.FALLING, callback = press_open_button, bouncetime = 1000)
  140. GPIO.add_event_detect(pin_close, GPIO.FALLING, callback = press_close_button, bouncetime = 1000)
  141.  
  142. client.loop_forever()
  143. except KeyboardInterrupt:
  144. print('finished')
  145. GPIO.cleanup()

上のコードのbeebotteのセッティングのところに先ほどメモした自分のbeebotteのTokenとTopicを入力し、 先ほどダウンロードしたmqtt.beebotte.com.pemがあるディレクトリにこのプログラムを保存してください。

 

使い方

プログラムを実行して数秒待つと、mqttによる接続が開始され ” status 0 ” と表示されるので、お手持ちのスマホやGoogle HomeからGoogle Assistantを呼び出し、先ほどIFTTTで設定した言葉(エアコンつけてなど)を話してみてください(入力でも可)。先ほどIFTTTで設定した言葉(エアコンをつけますなど)が返ってきて、ターミナルにBeebotteに送られた(publishされた)データ等が表示されたら外部サービスとの連携は成功です。さらに数秒待つと鍵の開け閉めが実行されます。
Alexaから操作する場合は1つ注意する点があり、” アレクサ、エアコンつけて “と話しかけても動作しません。Alexaから IFTTTを使用するには” アレクサ、トリガー、エアコンつけて “といったり、” アレクサ、エアコンつけてをトリガー ” といったように話しかけなければいけません。成功すると ” IFTTTに送信します ” という言葉が返ってきます。

  

続きはこちら↓

google ads




google ads




-電子工作, ラズベリーパイ

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


関連記事

RaspberryPiのセットアップ ② – SSH,VNC(遠隔操作)の設定とファイルサーバーの設定

 この記事では、前回の記事(RaspberryPiのセットアップ ① – 2種類のOSインストール方法と基本設定)に引き続き、ラズパイを遠隔操作するためのSSH・VNCの設定方法と、パソコ …

RaspberryPiのセットアップ ① – 2種類のOSインストール方法と基本設定

 この記事では、私がラズパイにOSをインストールするたびに行っているRaspberryPiのセットアップについて記載します。ここでは、NOOBSとイメージファイルによる2種類のOSのインストール方法と …

ラズパイに4TBの外付けHDDを接続しNAS(ファイルサーバー)を構築してみた

私は256GBのSSDが搭載されているWindowsパソコンを使用しているのですが、最近空き容量が30GBくらいになってきてしまいました。空き容量がギリギリになると色々と不具合が発生してくるとどこかで …

壊れたイヤホンを半田ごてを使って直してみた – 修理方法解説

   長年使用していたイヤホンが壊れてしまったので、半田ごてを使用して直してみました。この記事ではイヤホンの直し方について解説します。 (イヤホンの構造によって多少直し方は異なる場合があります。) 今 …

大学生の電子工作 スマートリモコン(プログラム)

この記事ではスマートリモコンを作ってみたで紹介したスマートリモコンのプログラムを記載していきます。回路はスマートリモコン(回路)に記載してあります。今回作成するプログラムは以下の4つです。 (LED点 …

S