Raspberry Pi と Sony RC-S380/P、nfcpy で NFC カードの IDm を読み取る
電子工作系はちょっと横に置いておき、Raspberry Pi で NFC カードを読み取ってみる。使った NFC リーダーは、Sony の パソリ RC-S380/P。nfcpyを使ったら、簡単にカード情報を読み取ることができた。pynfc: Python bindings for libnfc は 2012年7月末から更新がないような感じなので、nfcpy を使うことにした。nfcpy の公式ドキュメントの nfcpy Example Programsを見ると便利なtagtool.py などの使い方も分かる。Using LibUSB for installing FeliCa NFC-Device on Windows 7 64bit とかは answers.lauchpad.net/nfcpy で見つかる。nfcpy: Getting started を見ると、インストールの仕方が分かる。nfcpy のページも読んでおいた方が役に立つ。日本語情報で参考になるのは、nfcpyでお手軽NFC開発[1/2]、nfcpyでお手軽NFC開発[2/2]あたり。たとえば、sudo でプログラム動かすのやだしというのであれば、 /etc/udev/rules.d/nfcdev.rules にリーダーの情報を登録してあげればいいとかは、公式サイトの nfcpy のサイトを見ると分かる。私の場合、パソリ RC-S380/P を使っているので、idVendor=054c, idProduct=06c3 を含む情報を書き込んだ。dmesg コマンドで見ると、usb 1-1.2: new full-speed USB device number 5 using dwc_otgusb 1-1.2: New USB device found, idVendor=054c, idProduct=06c3usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=4usb 1-1.2: Product: RC-S380/Pusb 1-1.2: Manufacturer: SONYusb 1-1.2: SerialNumber: 5555555 # これは嘘シリアルなのでSUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="054c", \ ATTRS{idProduct}=="06c3", GROUP="plugdev" # Sony RC-S380/Pを書き込んだ。Python module for near field communication: A major update for nfcpyを見ると、次のようにあるので、RC-S380 が使えるなら RC-S380/P でも大丈夫かなと、ちょっと idProduct を変えて試したわけ。- The driver API needed to change in order to support tag emulation, as possible now with the RC-S380 reader.これで、USB を引きぬいてから、再度つなぐと、sudo しなくてもプログラムが動かせるようになった。ちなみに、ユーザーは、plugdev グループに入れておく必要があるが(GROUP="plugdev" で指定している)、Raspberry Pi のデフォルトユーザーの pi は最初からそういう設定になっているので、nfcdev.rules に書き込むだけで OK だった。インストールについては、python-usb を最初にインストールしておく。lsusb コマンドで、パソリが認識されているのを確認。$ sudo apt-get install python-usbその後、nfcpy をダウンロード$ wget https://launchpad.net/nfcpy/0.9/0.9.1/+download/nfcpy-0.9.1.tar.gz$ tar xvzf nfcpy-0.9.1.tar.gz# または$ sudo apt-get install bzr$ cd <somedir>$ bzr branch lp:nfcpyダウンロードしたら試してみる。$ sudo sample/tagtool.py[nfc.clf] searching for reader with path 'usb'[nfc.clf] using SONY RC-S380/P at usb:001:004[main] touch a tagType3Tag IDm=01010101ffffffff PMm=1001001001001000 SYS=0003# IDm と PMm はデタラメインタプリタからも試してみる。ちゃんと認識している。>>>import nfc>>>clf = nfc.ContactlessFrontend('usb')>>>print(clf)SONY RC-S380/P on usb:001:004リーダーをUSB デバイスとして決め打ちで指定するときには、import nfcclf = nfc.ContactlessFrontend('usb:054c:06c3')print(clf)のようにすればよい(前のコマンドを実行したあとで、うまく行かなかったら、clf.close()してから、決め打ちの方法を試してみればよいようだ。ちなみに、sudo しないで Python を実行すると、リーダーが見つからないので、上述のように nfcdev.rules にリーダー情報を書き込んで使うか、毎回 sudo で実行する。nfcdev.rules に書き込まず、sudo しないと次のようにリーダーが認識できないかった。pi@rasb01 ~/src/nfcpy-0.9.1/examples $ python tagtool.py [nfc.clf] searching for reader with path 'usb'[nfc.clf] no reader found at 'usb'[main] no contactless reader found読んだだけではつまらないので、Raspberry Pi で LED チカチカしてみた で試した LED をチカリと光らせてみた(単にカードを読み込み終わったあとに、チカリと LED を点滅させるだけ)。過去の関連記事Raspberry Pi 買ってみたRaspberry Pi で LED チカチカしてみた★確実正規★返金保証★サポート抜群【最安挑戦】【即納】ラズベリーパイ Raspberry Pi Type B 512MB【確実正規】