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

<h2>はじめに</h2>
どうもseigo2016です！
今回は自宅の普通(?)のプッシュプル錠式の玄関ドアをスマホから開閉可能にした過程の記録です
玄関近くもWifiが飛んでいるので、Wifi内からのみ開閉できるようにしています。
※こちらは個人ブログに上げた記事からの移行ページです
<h2>準備</h2><h3>Raspberry pi Zero WH</h3>
私はサイズと消費電力(と手持ち)の点からZero WHにしましたが、基本何でもいいと思います
<h3>MicroSDカード</h3>
私は<a href="https://www.amazon.co.jp/dp/B019RE5X60/ref=cm_sw_em_r_mt_dp_U_tlUMCb78SD6CG">ToshibaのmicroSDカード</a>を愛用しています。(安いという点が大きいですが…)
今回は8GBを使用しました。
<h3>ACアダプター</h3>
Raspberrypi Zeroとサーボ2つ分の電流を供給する必要があるためとりあえず<a href="https://www.yamada-denkiweb.com/2365035017?q=JK2100BL">こちら</a>の製品にしました。
<h3>サーボモーター</h3>
最初は<a href="http://akizukidenshi.com/catalog/g/gM-08914/">SG92R</a>を使おうとしたのですが、トルクが足りなかったので<a href="http://akizukidenshi.com/catalog/g/gM-08913/">SG-5010</a>を使いました。
自宅の鍵のトルクと相談してください。
<h3>タクトスイッチ</h3>
一応内側からはボタンで開閉できるようにスイッチを付けます。大きさやデザインと相談してください。
<h3>抵抗</h3>
タクトスイッチをRaspberry piで使うために使用します。130Ωを使用しましたが、130Ω以上なら大丈夫そうです。
<h2>設定・インストール</h2><h3>情報</h3>
<strong>OS  </strong>---<strong>  Raspbian</strong>
<strong>Python </strong>---<strong> 3.5.3</strong>
<strong>PHP </strong>---<strong> 7.0</strong>
<h3>IPアドレスの固定</h3>
省略
<h3>GPIO、SSHの有効化</h3>
省略
<h3>apache2・PHPのインストール</h3>
本題から外れますのでここでは細かい設定は省きます。
<pre>sudo apt install apache2
sudo apt install php7.0</pre>
<h3>PythonからGPIOを使う</h3>
PythonでGPIOを使用するためのライブラリのRPI.GPIOをインストールします。
<pre>sudo python3 -m pip install RPI.GPIO</pre>
<h2>Pythonのコードを書く</h2>
今回はmain.py・open.py・close.pyに分けています。
<h3>main.py</h3>

```python

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
```
<h3>open.py</h3>
```python
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()
```
<h3>close.py</h3>
```python
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()
```

<h2>PHPのコードを書く</h2>
本題のスマホから操作するための部分です。

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


```php

<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>
```

<script src="https://gist.github.com/seigo2016/2c5ff91cd05c0940aad52619d717aa09.js"></script>
<h2>設置</h2>
<h3>配線図</h3>
![5A1wVQyW.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311807/a207a089-6013-82a5-214e-fc5948a6ba0d.jpeg)



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

取り付け部分に関しては鍵やドアによって大きく変わりますので、参考程度に写真を張り付けておきます。
<p style="text-align: left;"><strong>初期の取り付け</strong></p>
<strong2号機の取り付け</strong>
<h2>完成</h2>
<h3>動作映像</h3>
[Youtube]("https://www.youtube.com/embed/PzG0b35WH9Y")
<h3>各部の写真</h3>
![IMG_8512.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311807/6c9b7c34-610d-69c3-854c-148c772422a7.jpeg)

<h4>スイッチ部分</h4>
![IMG_1803.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311807/824b4d95-c57d-3b77-e1af-3aa7902cff8b.jpeg)

<h4>スマホ画面</h4>
<img width="414" alt="IMG_1942.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311807/5f218a87-211c-92ce-1565-eff716addb4a.png">


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

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

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

LTで使用したスライド
https://www.slideshare.net/secret/4sVEoyc3XEYAiQ