読者です 読者をやめる 読者になる 読者になる

ゆっくり技術ノート!

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

玄関をSuicaで開ける

Ruby RaspberryPi HomeControl

玄関を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 をかざした時サーボを回してみましょう

登録した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で切ってサイコロ状のものを作成、サムターンに合う穴を開けます
https://gyazo.com/61f72b681190835a0f0af0cb833f8b40

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

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

取り付けて完成です

https://gyazo.com/d3b67758280aa7dd7687c4f182bfa113 動かすとこんな感じ(この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(フタバ): サーボ 秋月電子通商 電子部品 ネット通販
  4. タクトスイッチ 12mm TVGP01-G73BB(黒): パーツ一般 秋月電子通商 電子部品 ネット通販
  5. ピンヘッダ 1×40 (40P): パーツ一般 秋月電子通商 電子部品 ネット通販

参考ページ

  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]

ありがとうございます