Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@seigo2016

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

More than 1 year has passed since last update.

はじめに

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

設置

配線図

5A1wVQyW.jpg

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

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

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

初期の取り付け



完成


動作映像


Youtube

各部の写真


IMG_8512.JPG

スイッチ部分

IMG_1803.JPG

スマホ画面

IMG_1942.PNG

おわりに

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

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

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

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

3
Help us understand the problem. What is going on with this article?
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
nnn-school
IT×グローバル社会を生き抜く“総合力”を身につける多様なスキルと多様な体験

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?