6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-06-10

はじめに

どうも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

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

close.py

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

設置

配線図

![5A1wVQyW.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311807/a207a089-6013-82a5-214e-fc5948a6ba0d.jpeg)

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

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

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

初期の取り付け

完成

動作映像

[Youtube]("https://www.youtube.com/embed/PzG0b35WH9Y")

各部の写真

![IMG_8512.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311807/6c9b7c34-610d-69c3-854c-148c772422a7.jpeg)

スイッチ部分

![IMG_1803.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311807/824b4d95-c57d-3b77-e1af-3aa7902cff8b.jpeg)

スマホ画面

IMG_1942.PNG

おわりに

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

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

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

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

6
4
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
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?