概要
研究室の鍵をいちいち取り出すのが面倒なのでICカードで開けれるようにした話
ゴール
ICカードをカードリーダにかざすと鍵の開閉ができるようになる
研究室の鍵ハックした
— mori takuto(gump) (@m___04v) 2018年9月24日
ICカード対応させた👍
めっちゃ楽になった笑笑 pic.twitter.com/sb7WfswfD9
用意するもの
- Raspberry Pi
- サーボモーター
- カードリーダー
- (3dプリンタ)
- (Fusion360)
システム構成
今回はサーボモーターを回転させるためのAPIを作成しています
そのためカードリーダーだけではなくスマホアプリ、スマートウォッチアプリからも開閉可能になっています
(APIが研究室のローカルで立っているためWiFiのパスがハックされない限り知らない人に開けられることはないです笑)
- 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でモデリングしてプリントします
完成したらサーボモーターの先っちょにホットボンドなどでくっつけます
スマホアプリ作成
今回は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叩いてみる
ここまでで鍵が回せるか試してみます
意外と回るんですね笑
スマートウォッチで鍵が開けれちゃうよ✌️ pic.twitter.com/QS6HL2651j
— mori takuto(gump) (@m___04v) 2018年9月21日
固定台の作成
上の動画では手で押さえているので固定する台を作成します
こんな感じで作成してプリント
設置
固定台を設置すると手で押さえなくても回るようになりました!
こんな感じでゴリ押しです笑
裏側のゴリ押し具合 pic.twitter.com/8gnCfgu8Vm
— mori takuto(gump) (@m___04v) 2018年9月24日
カードリーダーの導入
RaspiでのNFCカードリーダの利用はこの記事を参考にさせていただきました
Raspberry PiにNFCリーダを接続してSuicaを読み取る
この記事を参考に少しコードを修正します
今回はSQLite3にカード情報を事前に登録して、登録したカードのみで開閉できるようにしました
また、ボタンを設置して、開けるモード、閉めるモードを切り替えるようにしましたが記事が長くなりそうなので割愛します
基本的にはただの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)
完成
大分コード省略してますが完成です
これでいちいち鍵を取り出す必要がなくなりました!
スマートウォッチでも開けれるので楽チンですね!!!
家にも導入しようかな。。。
研究室の鍵ハックした
— mori takuto(gump) (@m___04v) 2018年9月24日
ICカード対応させた👍
めっちゃ楽になった笑笑 pic.twitter.com/sb7WfswfD9
#参考記事
Raspberry Piでサーボモーターを回す
Raspberry PiにNFCリーダを接続してSuicaを読み取る
ラズパイと音声認識でLチカ