玄関をSuicaで開ける
玄関をSuicaで開ける
この記事は おうちハック Advent Calendar 2015 の23日目の記事です。
動機
私は普段、家の鍵を他の鍵と一緒にでまとめてをオシリポケットに入れているのですが、座ると鍵が当たって痛いので PASMO や Suica で開けられるようにしたいと思います
私は iPhone なので FeliCa を搭載していないため iPhone と iPhoneケースの間に PASMO と 磁気干渉防止シートを挟んで使っています
では、作っていきましょう!
この記事を見れば作れるようにしたいので少しくどくなるかもしれませんが、ご了承ください
セキュリティはあまり考えていません。試す際は自分で対策してください
(でも多分、空き巣は NFC をハックするより窓を割って入ってくる方が簡単)
構成
今回、時間をかけず簡単に作るために機能を最低限の「NFC をかざしたら鍵を開ける(そして自動で閉める)」という機能に絞ることにします
NFC リーダ はこの手の工作では定番の RC-S380 を使います
サーボモータは鍵のサムターン(つまみ)を回すことを考えてトルクの大きなものを秋月電子で購入しました
NFC からidmを取得する
Raspberry Pi の公式から Raspbian jessie を落としてSDカードにセットし IPアドレスの固定等の設定を行ったら(今回はRaspberry Pi Bを使います)
いよいよ PASMO から idm を取得します
idm とは PASMO/Suica 等の製造番号のことです
nfcpy
NFC を使うためのツールであるnfcpyを使います
これは公式サイトの Getting started の通りやるとインストールできました
bzrというバージョン管理システムをinstallして、nfcpyをinstallしたい場所に移動、bzrでnfcpyをinstallします
sudo apt-get install bzr cd <hoge> bzr branch lp:nfcpy trunk
続いて Python で USB を使うたに python-usb をinstallします
sudo apt-get install python-usb
できたらサンプルコードを動かしてみましょう
sudo python examples/tagtool.py
PASMO等をタッチして、こんな感じにIDが表示されたら成功です
今回はこのサンプルコードをそのまま使わせてもらいます
サーボを動かす
ServoBlaster
サーボを動かすにはServoBlasterというCで書かれたツールを使います
git で公開されているのでgit clone してきて、Cのコードをmakeでコンパイルしinstallします
git clone git://github.com/richardghirst/PiBits.git cd PiBits/ServoBlaster/user make sudo make install
サーボを動かしてみる
ServoBlasterは/dev/servoblaster
に文字列[Servo_number]=[0-100]%
を書き込むことでサーボを動かしてくれます
echo 4=100% > /dev/servoblaster
ServoBlasterで指定するServo_numberはgpioのピン番号とは違うので注意が必要です
ここではパーセンテージで指定するのでサーボを見ながら鍵を開けるのに良い角度を探ります
私のサーボの場合は91と40でした
このServoBlasterのいいところは使っていない時サーボに電圧をかけないところです
このため普通の鍵でも手で開閉錠できます
サーボが動いたら NFC をかざした時サーボを回してみましょう
サーボについて追加情報があります *1
登録したidmの時サーボを回す
Ruby から nfcpy と ServoBlaster を使うコードを書きます
ただコマンドを実行するだけなので簡単です
(ServoBlasterは Ruby の File.write ではダメな模様)
#ここは先ほど表示させた自分のidmに書き変える USERS = {"Bob_Marley" => "xxxxxxxxxxxxxxxx", "Alice_Cartelet" => "xxxxxxxxxxxxxxxx"} #ここも自分のサーボにあったものに書き換える #s03t-2bbmg servo UNLOCK_ANGLE = "91" LOCK_ANGLE = "40" AUTO_LOCK = 40 def nfc() #ここも自分の環境にあったものを指定 `sudo python ~/Documents/nfc/trunk/examples/tagtool.py` end def idm(text) m = text.match(/ID=(.*?)\s/) idm =m[1] print("IDm = #{idm}\n") return idm end def unlock() print("Unlocking\n") `echo 4=#{UNLOCK_ANGLE}% > /dev/servoblaster` end def lock() print("Locking\n") `echo 4=#{LOCK_ANGLE}% > /dev/servoblaster` end loop do idm = idm(nfc) unlock_user = USERS.key(idm) unless unlock_user == nil print("Welcome back #{unlock_user}!\n") unlock print("Wait #{AUTO_LOCK}sec...") sleep(AUTO_LOCK) print("\n") lock else print("Illegal user\n") end print("Please wait reader restart...\n") end
実行するとこんな感じに動くと思います
動画には写っていませんが40秒後に閉まります
ハードウェア
鍵のサムターン(つまみ)にサーボを取り付けるための木材をノコギリとドリルで作成します
30mm*30mmの角材を30mmで切ってサイコロ状のものを作成、サムターンに合う穴を開けます
続いてサーボを固定するためにダンボールでマウントを作成します
ダンボールを10枚積層、木工ボンドで合わせて完成です
ダンボールだととても簡単でよかったです(1時間ほどアニメ見ながら切りました)
レーザ加工機が使う余裕があればアクリルで作ってもいいかもしれません
ただダンボールでも木工ボンドで補強するとかなり頑丈になります
ちなみに今回は溜まりに溜まったamazonの箱を使いました
取り付けて完成です
動かすとこんな感じ(このNFCリーダは表からも裏からも使えました)
— Coro (@Coro365) December 23, 2015
— Coro (@Coro365) December 23, 2015
今後
- 開閉錠ボタンと状況表示用のLEDを付けたい
- 鍵が開いているか閉まっているかの状態を確認したい
- リードスイッチ(磁気を感知するスイッチ)でドアの開閉を検知してオートロックの挙動に生かしたい
- Sinatraとかでブラウザ上で開閉とログの確認をしたい
- Supervosorを使ってRaspberry Piのデーモンにする
雑感
- ServoBlasterとnfcpyが優秀ですぐにできてしまった
- 一番時間がかかったのはマウントを作成するところ(ダンボールで作る前にアクリルをノコギリとドリルで加工して半日無駄にしている)
- PASOM決済だけで生活できればiPhoneだけ持ち歩く生活にできるかも
- 個人が少しのお金で、いろんなことが可能な環境は素晴らしいなと思いました(この方向で人間、進化してもらいたい)
- 今後も隙を見ておうちを便利にしていきたいです
初めて Advent Calendar に参加しましたがイベントドリブンな感じで作ることができたので参加してよかったです(参加しなかったら作らなかったかも)
そんな おうちハック Advent Calendar 2015 の明日の記事は @YarmUIさん の スマートメータを自作した話 です
良いお年を!
購入したもの
Raspberry piは部屋に転がっていたものを使ったので出費は 4000円ほど
- Amazon.co.jp: Raspberry Pi Type B 512MB: パソコン・周辺機器
- Amazon.co.jp: SONY 非接触ICカードリーダー/ライター PaSoRi(パソリ) USB対応 RC-S380: パソコン・周辺機器
- GWSサーボ S03T/2BBMG/F(フタバ): サーボ 秋月電子通商 電子部品 ネット通販
ドアセンサ、開閉スイッチなどをつける時は必要です
- タクトスイッチ 12mm TVGP01-G73BB(黒): パーツ一般 秋月電子通商 電子部品 ネット通販
- ピンヘッダ 1×40 (40P): パーツ一般 秋月電子通商 電子部品 ネット通販
- ケース入りリードスイッチ(磁石付セット)MC-14AG: センサ一般 秋月電子通商 電子部品 ネット通販
参考ページ
- Raspberry PiにRaspbianをインストールする for Mac OSX
- Raspberry Pi 2 (Raspbian: jessie) でIPアドレスを固定する
- PWMでRaspberry PiのLEDの明るさ調整する
- FeliCa(フェリカ)IDmとは?|ステルス・ネットワークス
- Python module for near field communication — nfcpy trunk documentation
- Raspberry-PiにおけるGPIO関係ツールのインストール方法 | Раздан-3
- GPIO: Raspberry Pi Models A and B - Raspberry Pi Documentation
- nfcpyでお手軽NFC開発[1/2]
ありがとうございます
追記1 2017/08/09
サーボモータを回転させた際RasPiが再起動してしまう時は、別に電源を用意してください。
私の場合は、以下のように別電源にしました。(この方法が最適解かどうかはわかりません)
- USBケーブルを用意し皮膜をはがした後、プラスとマイナスの線をより分けます。
- プラスの線はサーボのプラスにつなぎ、マイナスの線 はサーボ と RasPi のGroundに繋ぎます。
- USBケーブル自体はApple USB 充電器 に繋ぎます
追記2 2017/08/09
多くの方にこの記事を読んで頂き大変嬉しく思っております。
また、この記事を見て同じものを作ろうとしている方の何人に連絡をいただきとても嬉しいです、記事にした甲斐がありました。
記事公開から1年以上経ち、その間にも iPhone が Suica 対応したり、電子マネー対応の店が増えてきたり、スマフォでATMからお金を引き出せたり、iPhone 1つで生活できる世の中に近づいている気がしてワクワクしています。
さて、この記事で作った物にLED,ドア開閉センサ,ボタンを追加した物がGithubに上がっているので、こちらもどうぞ。
github.com
追記おわり
*1:追記1 2017/08/09 をご覧ください