ゆっくり技術ノート!

いつかきっとできるだろうよ

玄関をSuicaで開ける

玄関をSuicaで開ける

この記事は おうちハック Advent Calendar 2015 の23日目の記事です。

動機

私は普段、家の鍵を他の鍵と一緒にでまとめてをオシリポケットに入れているのですが、座ると鍵が当たって痛いので PASMOSuica で開けられるようにしたいと思います

私は iPhone なので FeliCa を搭載していないため iPhoneiPhoneケースの間に PASMO磁気干渉防止シートを挟んで使っています

では、作っていきましょう!

この記事を見れば作れるようにしたいので少しくどくなるかもしれませんが、ご了承ください
セキュリティはあまり考えていません。試す際は自分で対策してください
(でも多分、空き巣は NFC をハックするより窓を割って入ってくる方が簡単)

構成

今回、時間をかけず簡単に作るために機能を最低限の「NFC をかざしたら鍵を開ける(そして自動で閉める)」という機能に絞ることにします
NFC リーダ はこの手の工作では定番の RC-S380 を使います
サーボモータは鍵のサムターン(つまみ)を回すことを考えてトルクの大きなものを秋月電子で購入しました

https://gyazo.com/ef7c2750e751b7af3209cf18c9c2fe93:plain:w300

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が表示されたら成功です https://gyazo.com/450bf973357d0df5bcfa0f59bc1cff4c

今回はこのサンプルコードをそのまま使わせてもらいます

サーボを動かす

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のピン番号とは違うので注意が必要です
https://gyazo.com/0c86c45477643e795ca7b5481fd835b8
https://gyazo.com/00d9e01f2b023184ecb46b7694edd4ae
ここではパーセンテージで指定するのでサーボを見ながら鍵を開けるのに良い角度を探ります
私のサーボの場合は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

実行するとこんな感じに動くと思います https://gyazo.com/08b4d3d417724a3c00b491bfa92ea553 動画には写っていませんが40秒後に閉まります

土曜の進捗

A video posted by coro365 (@coro365) on

ハードウェア

鍵のサムターン(つまみ)にサーボを取り付けるための木材をノコギリとドリルで作成します
30mm*30mmの角材を30mmで切ってサイコロ状のものを作成、サムターンに合う穴を開けます
Image from Gyazo

続いてサーボを固定するためにダンボールでマウントを作成します
ダンボールを10枚積層、木工ボンドで合わせて完成です
ダンボールだととても簡単でよかったです(1時間ほどアニメ見ながら切りました)
Image from Gyazo

レーザ加工機が使う余裕があればアクリルで作ってもいいかもしれません
ただダンボールでも木工ボンドで補強するとかなり頑丈になります
ちなみに今回は溜まりに溜まったamazonの箱を使いました
https://gyazo.com/901a037740a05a6df9c20aec7ca3547a

取り付けて完成です

Image from Gyazo 動かすとこんな感じ(このNFCリーダは表からも裏からも使えました)

今後

  • 開閉錠ボタンと状況表示用のLEDを付けたい
  • 鍵が開いているか閉まっているかの状態を確認したい
  • リードスイッチ(磁気を感知するスイッチ)でドアの開閉を検知してオートロックの挙動に生かしたい
  • Sinatraとかでブラウザ上で開閉とログの確認をしたい
  • Supervosorを使ってRaspberry Piのデーモンにする

雑感

  • ServoBlasterとnfcpyが優秀ですぐにできてしまった
  • 一番時間がかかったのはマウントを作成するところ(ダンボールで作る前にアクリルをノコギリとドリルで加工して半日無駄にしている)
  • PASOM決済だけで生活できればiPhoneだけ持ち歩く生活にできるかも
  • 個人が少しのお金で、いろんなことが可能な環境は素晴らしいなと思いました(この方向で人間、進化してもらいたい)
  • 今後も隙を見ておうちを便利にしていきたいです

初めて Advent Calendar に参加しましたがイベントドリブンな感じで作ることができたので参加してよかったです(参加しなかったら作らなかったかも)
そんな おうちハック Advent Calendar 2015 の明日の記事は @YarmUIさん の スマートメータを自作した話 です
良いお年を!

購入したもの

Raspberry piは部屋に転がっていたものを使ったので出費は 4000円ほど

  1. Amazon.co.jp: Raspberry Pi Type B 512MB: パソコン・周辺機器
  2. Amazon.co.jp: SONY 非接触ICカードリーダー/ライター PaSoRi(パソリ) USB対応 RC-S380: パソコン・周辺機器
  3. GWSサーボ S03T/2BBMG/F(フタバ): サーボ 秋月電子通商 電子部品 ネット通販

ドアセンサ、開閉スイッチなどをつける時は必要です

  1. タクトスイッチ 12mm TVGP01-G73BB(黒): パーツ一般 秋月電子通商 電子部品 ネット通販
  2. ピンヘッダ 1×40 (40P): パーツ一般 秋月電子通商 電子部品 ネット通販
  3. ケース入りリードスイッチ(磁石付セット)MC-14AG: センサ一般 秋月電子通商 電子部品 ネット通販

参考ページ

  1. Raspberry PiにRaspbianをインストールする for Mac OSX
  2. Raspberry Pi 2 (Raspbian: jessie) でIPアドレスを固定する
  3. PWMでRaspberry PiのLEDの明るさ調整する
  4. FeliCa(フェリカ)IDmとは?|ステルス・ネットワークス
  5. Python module for near field communication — nfcpy trunk documentation
  6. Raspberry-PiにおけるGPIO関係ツールのインストール方法 | Раздан-3
  7. GPIO: Raspberry Pi Models A and B - Raspberry Pi Documentation
  8. nfcpyでお手軽NFC開発[1/2]

ありがとうございます

追記1 2017/08/09

サーボモータを回転させた際RasPiが再起動してしまう時は、別に電源を用意してください。
私の場合は、以下のように別電源にしました。(この方法が最適解かどうかはわかりません)

  1. USBケーブルを用意し皮膜をはがした後、プラスとマイナスの線をより分けます。
  2. プラスの線はサーボのプラスにつなぎ、マイナスの線 はサーボ と RasPi のGroundに繋ぎます。
  3. USBケーブル自体はApple USB 充電器 に繋ぎます

追記2 2017/08/09

多くの方にこの記事を読んで頂き大変嬉しく思っております。
また、この記事を見て同じものを作ろうとしている方の何人に連絡をいただきとても嬉しいです、記事にした甲斐がありました。
記事公開から1年以上経ち、その間にも iPhoneSuica 対応したり、電子マネー対応の店が増えてきたり、スマフォでATMからお金を引き出せたり、iPhone 1つで生活できる世の中に近づいている気がしてワクワクしています。

さて、この記事で作った物にLED,ドア開閉センサ,ボタンを追加した物がGithubに上がっているので、こちらもどうぞ。
github.com

追記おわり

*1:追記1 2017/08/09 をご覧ください