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 さんの担当です。


コメントする