Python
PHP
RaspberryPi

スマートロックの制作! 〜Raspberry Pi〜

はじめに

どうもseigo2016です!

今回は自宅の普通(?)のプッシュプル錠式の玄関ドアをスマホから開閉可能にした過程の記録です

玄関近くもWifiが飛んでいるので、Wifi内からのみ開閉できるようにしています。

※こちらは個人ブログに上げた記事からの移行ページです

準備

Raspberry pi Zero WH



私はサイズと消費電力(と手持ち)の点からZero WHにしましたが、基本何でもいいと思います

MicroSDカード



私はToshibaのmicroSDカードを愛用しています。(安いという点が大きいですが…)

今回は8GBを使用しました。

ACアダプター



Raspberrypi Zeroとサーボ2つ分の電流を供給する必要があるためとりあえずこちらの製品にしました。

サーボモーター



最初はSG92Rを使おうとしたのですが、トルクが足りなかったのでSG-5010を使いました。

自宅の鍵のトルクと相談してください。

タクトスイッチ



一応内側からはボタンで開閉できるようにスイッチを付けます。大きさやデザインと相談してください。

抵抗



タクトスイッチをRaspberry piで使うために使用します。130Ωを使用しましたが、130Ω以上なら大丈夫そうです。

設定・インストール

情報



OS  ---  Raspbian

Python --- 3.5.3

PHP --- 7.0

IPアドレスの固定



省略

GPIO、SSHの有効化



省略

apache2・PHPのインストール



本題から外れますのでここでは細かい設定は省きます。

sudo apt install apache2

sudo apt install php7.0


PythonからGPIOを使う



PythonでGPIOを使用するためのライブラリのRPI.GPIOをインストールします。

sudo python3 -m pip install RPI.GPIO


Pythonのコードを書く



今回はmain.py・open.py・close.pyに分けています。

main.py


import subprocess
import RPi.GPIO as GPIO
import time
import socket
GPIO.setmode(GPIO.BCM)
flag = True
IN = 10
GPIO.setup(IN,GPIO.IN)
try:
while True:
if GPIO.input(IN) == GPIO.HIGH and not flag:
subprocess.call("sudo python3 open.py",shell=True)
flag = not flag
elif GPIO.input(IN) == GPIO.HIGH and flag:
subprocess.call("sudo python3 close.py",shell=True)
flag = not flag
except KeyboardInterrupt:
pass

open.py

import RPi.GPIO as GPIO

import time
GPIO.setmode(GPIO.BCM)
flag = True
out1 = 14
GPIO.setup(out1, GPIO.OUT)
servo1 = GPIO.PWM(out1, 50)
servo1.start(0)
def open():
for i in range(0,50,1):
servo1.ChangeDutyCycle(2.5+i/10)
time.sleep(0.01)
servo1.start(0)
open()
servo1.stop()
GPIO.cleanup()

close.py

import RPi.GPIO as GPIO

import time
GPIO.setmode(GPIO.BCM)
flag = True
out1 = 14
GPIO.setup(out1, GPIO.OUT)
servo1 = GPIO.PWM(out1, 50)
servo1.start(0)
def close():
for i in range(0,50,1):
servo1.ChangeDutyCycle(7.5-i/10)
time.sleep(0.01)
servo1.start(0)

close()
servo1.stop()
GPIO.cleanup()

PHPのコードを書く

本題のスマホから操作するための部分です。

とはいってもphpからpythonのスクリプトを実行しているだけです。


<html>
<head>
<meta charset='utf-8'>
<title>Key</title>
</head>
<body>
<?php
if(isset($_POST['open'])) {
$cmd = "/usr/bin/sudo -S /usr/bin/python3 Key/open.py";
shell_exec($cmd);
}
if(isset($_POST['close'])) {
$cmd = "/usr/bin/sudo -S /usr/bin/python3 Key/close.py";
shell_exec($cmd);
<form method="post">
<button type='submit' name='open' value="1" style="font-size:45px;width:500px;height:250px">open</button>
<button type='submit' name='close' value="1" style="font-size:45px;width:500px;height:250px">close</button>
</form>
</body>
</html>

設置

配線図

全体図

スイッチ部分



サーボモーターの取り付け



私は最初にプラ板で基本を固定していましたが、見た目が悪かったので3Dプリンターを使用して取り付け部分を製作しました。

取り付け部分に関しては鍵やドアによって大きく変わりますので、参考程度に写真を張り付けておきます。

初期の取り付け





完成

動作映像



Youtube

各部の写真

スイッチ部分



スマホ画面





おわりに



pythonのコードは関数等でもっとスマートに呼び出す方法はあると思います。

機能はしているんですが、デザイン性が皆無なのが悲しいです…。

現在家の部屋のライトのスイッチ(トイレとか洗面所etc..)を使うと時々勝手に動くのですが、原因不明なのでどなたか可能性がある事柄を教えてください…。

LTで使用したスライド

https://www.slideshare.net/secret/4sVEoyc3XEYAiQ