Raspberry Piを使ってNFCタグで遊ぶ
この記事は最終更新から半年以上経過しており、内容が古い可能性があります。
この記事は「Raspberry Pi Advent Calendar」19日目の記事です。 18日目の記事: 「About my streaming service in Secondlife 」(mayuka0527さん)
というわけで19日目担当の@hideo54です。4時間くらい遅れました。すいません。
実はそんなに新規性ないのですが、 NFCタグで遊ぶ話をしたいと思います。
Raspberry Piそんな関係なくね? という説もあるのですが、まあNFCタグでみっちり遊ぶには工作やプログラミングが必要ですし、Debian派生が走ってくれるRPiはそういったことにもってこいですから、たぶんスレチじゃないはずです。(震え声)
この記事では、 PythonでNFCタグを読み書きする基本的な方法 を簡単にまとめます。まだ遊びというほどには遊びません。タイトルは詐欺です。
いるもの
- セットアップ済みRaspberry Pi (Raspbian入り)
- NFCタグ
- NFCリーダー/ライター (今回はSONYのPaSoRiを使用)
準備
libnfcを使う手もありますが、工作の際にはGPIOピンをPythonでいじった方がよりやりやすいと思うので、Pythonでお手軽にいじれるnfcpyを利用します。
というわけで、利用にあたって必要なものをインストールします。
libusb
Raspbian に標準で入ってました。確かに入ってそう。
PyUSB
PaSoRiはUSB接続で使用しますので、PythonからUSBポートにアクセスするために必要です。 僕はpipで入れました。
sudo pip install pyusb --pre
nfcpy
ドキュメントに従って入れます。
sudo apt-get install bzr cd ~ bzr branch lp:nfcpy trunk
これで、~/trunk
下にいろいろ落ちたはずです。
どこでもnfcモジュールを使えるようにする
(ここらへん環境によって違いそうな気がするけど、よく考えたら Raspbian 前提にしてるから別に注釈いらないか。)
cp -R trunk/nfc /usr/local/lib/python2.7/dist-packages
sudoしなくてもUSBデバイスを見れるようにする
デフォルトだと、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プログラムを作成しました。
import nfc clf = nfc.ContactlessFrontend('usb') def connected(tag): print tag.ndef.message.pretty() clf.connect(rdwr={'on-connect': connected})
実行して新品のNFCタグをあてると、以下のようなデータが出ます。
record 1 type = '' name = '' data = ''
買ったまま何も手を加えていないからね。というわけでデータを書き込んでみます。
import nfc clf = nfc.ContactlessFrontend('usb') def connected(tag): record = nfc.ndef.TextRecord('Hello World!') tag.ndef.message = nfc.ndef.Message(record) print tag.ndef.message.pretty() clf.connect(rdwr={'on-connect': connected})
すると…
record 1 type = 'urn:nfc:wkt:T' name = '' data = '\x02enHello World!'
無事書き込めました! 一旦プログラムを終了して再度読んでみても、ちゃんとデータが書き込まれていることが確認できます。
まとめ
以上、NFCタグで読み書きしてみた話でした。
この後NFCタグで工作してみる話は、冬コミ3日目に「SunPro」というサークルの会誌に載りますので、ぜひご覧ください!! (最後に宣伝にもっていく) (実はまだ書き終えていない)
まだこのブログでは告知していませんが、また後で (原稿を書き終えたら) 詳細を告知します!
参考文献
- http://nfcpy.org/latest/index.html (nfcpy公式ドキュメント): インストール、読み書きなど
- http://plaza.rakuten.co.jp/kugutsushi/diary/201402230000/ :
/etc/udev/rules.d/nfcdev.rules
の記法
明日は Marie Kawasuji さんの担当です。