2021年07月30日 更新

ラズパイにパソリを繋いでNFCタッチ!

どうも、クラゲです。
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+OEnterCtrl+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タッチ!」でした