Help us understand the problem. What is going on with this article?

スマートロックを自作してみた

More than 1 year has passed since last update.

概要

研究室の鍵をいちいち取り出すのが面倒なのでICカードで開けれるようにした話

ゴール

ICカードをカードリーダにかざすと鍵の開閉ができるようになる

用意するもの

  • Raspberry Pi
  • サーボモーター
  • カードリーダー
  • (3dプリンタ)
  • (Fusion360)

システム構成

今回はサーボモーターを回転させるためのAPIを作成しています
そのためカードリーダーだけではなくスマホアプリ、スマートウォッチアプリからも開閉可能になっています
(APIが研究室のローカルで立っているためWiFiのパスがハックされない限り知らない人に開けられることはないです笑)

スクリーンショット 2018-10-05 19.23.25.png

  • FlaskでAPIを立てエンドポイントを作成
  • APIを叩いてサーボモーターをGPIOで制御

この記事の内容

1. FlaskでAPI作成
2. 3Dプリンタで鍵を回す部分の作成
3. スマホアプリ作成
4. 実際にAPI叩いてみる
5. 固定台の作成
6. カードリーダーの導入
7. 完成

FlaskでAPI作成

今回はGPIOでサーボモータを制御したいのでPythonのFlaskを使用してAPIを作成しました

Flaskのインストール

$ pip install flask

簡単なAPI作成

from flask import Flask

app = Flask(__name__)

@app.route("/open")
def open():  
    return "open"

if __name__ == "__main__":
    # webサーバー立ち上げ
    app.run(host="192.168.**.**", port=5000)

RPi.GPIOのインストール

$ pip install rpi.gpio

サーボモータのセットアップ

今回はこの記事を参考にさせていただきました
*ピンの配置は少し変えています
Raspberry Piでサーボモーターを回す

GPIOでサーボモータを回す

from flask import Flask

app = Flask(__name__)

@app.route("/open")
def open():  
    GPIO.setmode(GPIO.BCM)

    gp_out = 4
    GPIO.setup(gp_out, GPIO.OUT)

    servo = GPIO.PWM(gp_out, 50)
    servo.start(0)

    servo.ChangeDutyCycle(7.5)
    time.sleep(0.5)

    servo.stop()
    GPIO.cleanup()    
    return "open"


if __name__ == "__main__":
    # webサーバー立ち上げ
    app.run(host="192.168.**.**", port=5000)

3dプリンタで鍵を回す部分の作成

サーボモータの先っちょに鍵をはめる部分をつけたいのでFusion360でモデリングしてプリントします
スクリーンショット 2018-10-05 19.51.28.png
完成したらサーボモーターの先っちょにホットボンドなどでくっつけます

スマホアプリ作成

今回はAndroidのスマホとAndroid Wearのアプリを作成します
適当にボタンを配置してAPIを叩いてみます

openButton.setOnClickListener {
    object: MyAsyncTask2() {
        override fun doInBackground(vararg params: Void): JSONArray? {
            var result : JSONArray? = null
            var res: String = ""
            try {
                res = Run().run("http://192.168.**.**:5000/open")
                val resJson = JSONArray(res)
                status.text = "Status: Open"
                result = resJson
            } catch (e: IOException) {
                e.printStackTrace()
            } catch (e: JSONException) {
                e.printStackTrace()
            }
            return result
        }
    }.execute()
}

実際にAPI叩いてみる

ここまでで鍵が回せるか試してみます
意外と回るんですね笑

固定台の作成

上の動画では手で押さえているので固定する台を作成します

スクリーンショット 2018-10-05 19.54.25.png

こんな感じで作成してプリント

設置

固定台を設置すると手で押さえなくても回るようになりました!
こんな感じでゴリ押しです笑

カードリーダーの導入

RaspiでのNFCカードリーダの利用はこの記事を参考にさせていただきました
Raspberry PiにNFCリーダを接続してSuicaを読み取る

この記事を参考に少しコードを修正します
今回はSQLite3にカード情報を事前に登録して、登録したカードのみで開閉できるようにしました
また、ボタンを設置して、開けるモード、閉めるモードを切り替えるようにしましたが記事が長くなりそうなので割愛します
基本的にはただのLチカなので、この記事をみてもらえるとありがたいです

ラズパイと音声認識でLチカ

target_req_suica = nfc.clf.RemoteTarget("212F")

while True:
    clf = nfc.ContactlessFrontend('usb')
    target_res = clf.sense(target_req_suica,iterations=int(TIME_cycle//TIME_interval)+1 , interval=TIME_interval)

    if target_res != None:
        tag = nfc.tag.activate_tt3(clf, target_res)
        tag.sys = 3

        #IDmを取り出す
        idm = binascii.hexlify(tag.idm)

        #sqlite使って登録判定
        cur = conn.cursor().execute('select count(*) from cards where card_id = ?',(idm,))

        isExist = False
        if cur.fetchone()[0] > 0:
          isExist = True

        output=""

        if isExist == True:
            output= not GPIO.input(2)
            if output == True: 
                requests.get(open_url)
            else:
                requests.get(close_url)

完成

大分コード省略してますが完成です
これでいちいち鍵を取り出す必要がなくなりました!
スマートウォッチでも開けれるので楽チンですね!!!
家にも導入しようかな。。。

参考記事

Raspberry Piでサーボモーターを回す
Raspberry PiにNFCリーダを接続してSuicaを読み取る
ラズパイと音声認識でLチカ

mooriii
React/Rails/Swift/Kotlin/Python
https://mooriii.com
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