Raspberry Pi は、安定性の理由からB+以上がおすすめです。今回、RaspbianはDebian 8 (Jessie)ベースのものを、NFCリーダー/ライターには、 SONYのPaSoRi を使用しました。
libnfc を使う手もありますが、工作の際にはGPIOピンをPythonでいじった方がよりやりやすいと思うので、Pythonでお手軽にいじれる nfcpy を利用します。というわけで、利用にあたって必要なものをインストールします。
Raspbian に標準で入ってました。確かに入ってそう。
PaSoRiはUSB接続で使用しますので、PythonからUSBポートにアクセスするために必要です。僕はpipで入れました。
sudo pip install pyusb --pre
ドキュメントに従って入れます。
sudo apt-get install bzr cd ~ bzr branch lp:nfcpy trunk
これで、~/trunk
下にいろいろ落ちたはずです。
(ここらへん環境によって違いそうな気がするけど、よく考えたら Raspbian 前提にしてるから別に注釈いらないか。)
cp -R trunk/nfc /usr/local/lib/python2.7/dist-packages
デフォルトだと、sudoをつけてPythonプログラムを実行しないと、USB接続のリーダーを認識してくれません。そこで、リーダー情報を登録して、sudoしなくても認識できるようにします。
dmesg | tail
すると、
[ 4225.809847] usb 1-1.3: new full-speed USB device number 4 using dwc_otg [ 4225.914395] usb 1-1.3: New USB device found, idVendor=054c, idProduct=06c3 [ 4225.914435] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=4 [ 4225.914453] usb 1-1.3: Product: RC-S380/P [ 4225.914469] usb 1-1.3: Manufacturer: SONY [ 4225.914484] usb 1-1.3: SerialNumber: *******
みたいな感じのが出てくるので、 /etc/udev/rules.d/nfcdev.rules
を以下のように編集。
SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="06c3", GROUP=="sudo"
これで、sudoグループに入ってるユーザーはsudoなしで認識できるようになりました。(ここらへん、"nfc"グループを作って、ユーザーを放り込んで、nfcグループ指定にしたほうが良い気がする。)
やっと準備完了。以下のような、NFCタグ内のデータを読む簡単なPythonプログラムを作成しました。
1: import nfc 2: clf = nfc.ContactlessFrontend('usb') 3: 4: def connected(tag): 5: print tag.ndef.message.pretty() 6: 7: clf.connect(rdwr={'on-connect': connected})
実行して新品のNFCタグをあてると、以下のようなデータが出ます。
record 1 type = '' name = '' data = ''
買ったまま何も手を加えていないからね。というわけでデータを書き込んでみます。
1: import nfc 2: clf = nfc.ContactlessFrontend('usb') 3: 4: def connected(tag): 5: record = nfc.ndef.TextRecord("Hello World!") 6: tag.ndef.message = nfc.ndef.Message(record) 7: print tag.ndef.message.pretty() 8: 9: clf.connect(rdwr={'on-connect': connected})
すると…
record 1 type = 'urn:nfc:wkt:T' name = '' data = '\x02enHello World!'
無事書き込めました!一旦プログラムを終了して再度読んでみても、ちゃんとデータが書き込まれていることが確認できます。めでたしめでたし。こんな感じで、お手軽に書き込めます。上記プログラムでは nfc.ndef.TextRecord()
関数を用いましたが、nfcpyでは他にも多くのNDEFの記録関数が用意されています。詳しくは 公式ドキュメント を参照してください。