2021年07月30日 更新
どうも、クラゲです。
Raspberry PiにUSBでPaSoRi(パソリ)を繋ぎ、NFC(近距離無線通信)対応のスマホや交通系ICカードなどでタッチ動作とID情報を読み取ります。
パソリを使うと各NFC固有のIDを読むことができます。また「タッチ」だけでなく「リリース」も検出できます。動画では、ある特定のIDのときにだけ、特別な音と表示を行っています。勤怠管理や特定動作を割り当てるなど、色々使い道がありそうです。
[TOC]
1つはNFCの受信側のSonyのパソリです。
パソリは何種類かバリエーションがあると思いますが、クラゲが今回試したのはこのRC-S380です。
画像引用元:www.amazon.co.jp/dp/B00948CGAG
もう1つはNFCの送信側のデバイスです
例えば、家にあるSuicaなどの交通系ICカードやNFC対応スマホなんかでOKです。もし、無い場合は以下のようなNFCタグのシールが活用できます
画像引用元:www.amazon.co.jp/dp/B00GXSGL5G
まずはラズパイがパソリを読み込んでいるか確かめてみましょう
パソリを接続前と接続後のそれぞれで、以下のコマンドを打ってみて下さい
lsusb
差分として Sony Corp.
と書かれたデバイスが出てくればOKです
次にnfcpy
のインストールとサンプルソースをダウンロードします
sudo pip3 install nfcpy
git clone https://github.com/nfcpy/nfcpy.git
cd nfcpy
sudo python3 examples/tagtool.py show
実行するとNFCタッチ待ち状態になり、NFCをタッチするとID等の情報表示を行った後にプログラムが終了します。
現状のままだとsudo
を最初につけないと実行できないので、sudo
なしでも実行できるようにします
sudo nano /etc/udev/rules.d/nfcdev.rules
以下の1行を書いて保存します。
(nanoの操作:Ctrl+O
、Enter
、Ctrl+X
です)
SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="06c3", GROUP="plugdev" # Sony RC-S380/P
これでreboot
を行うとsudo
なしでも実行できるようになります。
nfc_reader.py
というファイル名でアプリを作成します。
ちなみに、nfc.py
という名前だと不具合が起きますのでご注意して下さい。
nano nfc_reader.py
以下をコピペして保存してください
import binascii
import nfc
import os
class MyCardReader(object):
def on_connect(self, tag):
#タッチ時の処理
print("【 Touched 】")
#タグ情報を全て表示
print(tag)
#IDmのみ取得して表示
self.idm = binascii.hexlify(tag._nfcid)
print("IDm : " + str(self.idm))
#特定のIDmだった場合のアクション
if self.idm == "00000000000000":
print("【 登録されたIDです 】")
return True
def read_id(self):
clf = nfc.ContactlessFrontend('usb')
try:
clf.connect(rdwr={'on-connect': self.on_connect})
finally:
clf.close()
if __name__ == '__main__':
cr = MyCardReader()
while True:
#最初に表示
print("Please Touch")
#タッチ待ち
cr.read_id()
#リリース時の処理
print("【 Released 】")
Python3で実行します
python3 nfc_reader.py
タッチ時とリリース時のアクションを検出して文字列出力が行われていると思います。
このアプリを終了するには、別のターミナルを開き、以下を打ち込み強制終了させます
※ThonnyなどのIDEで実行している場合はこのコマンドは不要でStopアイコン等で終了できると思います。
pkill -KILL -f nfc_reader.py
ある特定のIDに反応ささせたい場合は、ソースコードの"00000000000000"
のIDmを変更してください。
以上、「ラズパイにパソリを繋いでNFCタッチ!」でした