ぼくの技術日誌

日誌って銘打っていますが、更新頻度が…

ebayでPN532 BreakeoutBoardを買ってlib-nfcでRFIDタグを読み取った話

ebay売っているPN532 BreakeoutBoardを買ってみたので、Ubuntuにlib-nfcをインストール、NFCタグ読み取りを行うまでの手順をまとめてみました。

前置き

ebayでは、中国で製造された電子部品が安く買うことができるようです。
見漁っていると、RFIDリーダライタ基板が出品されているのを発見しました。
丁度NFCに興味もあったので、試しにこの基板を買ってみることにしました。


New PN532 NFC Module Reader Writer 3 3V 5V Arduino Compatible with 2 S50 Card | eBay


実はこのRFIDリーダライタ基板と同等ものがadafruitにて39.95USD(送料別)で販売されています。
PN532 NFC/RFID controller breakout board [v1.6] ID: 364 - $39.95 : Adafruit Industries, Unique & fun DIY electronics and kits

しかし、今回購入した基板はadafruitの半額程でNFCカードとタグも付属しており、さらに送料が無料です。
かなりお買い得だと思いませんか?
他に同じような基板や付属内容が異なっているものも多く出品されています
また、ebayはオークションサイトですから、販売元により値段にも差があります。

今回は購入から2週間も経たないうちに商品が到着しました。
ただし、販売元によって購入商品の到着日は大きく異なります。


さて、購入前の下調べの結果、以下のことがわかっています。

RFID通信チップにNXP社のPN532を使用している。
OSSRFID通信ライブラリであるlib-nfcがPN532に対応している。
ArduinoやRaspberry Piと関連した技術情報が多くある(adafuritでPN532基板の取り扱いがあるため?)。

具体的に作りたいアプリケーションはありませんが、タグをかざすことでなにか入出庫を管理したり、ものの操作トリガにしたりで面白いことが出来たらなーなんてぼんやり考えています。

lib-nfcのインストール

Ubuntu 14.04 LTS(VirtualBox)にlib-nfc 1.7.1をインストールします。

なお、lib-nfcのインストール作業には、以下のパッケージが必要でしたので、都度インストールしました。

yosuke@yosuke-vm:/etc/nfc$ sudo aptitude install autoconf libtool

まず、ソースコードを公式ページよりダウンロードします。

yosuke@yosuke-vm:~/$ mkdir nfc
yosuke@yosuke-vm:~/$ cd nfc/
yosuke@yosuke-vm:~/nfc$ wget https://libnfc.googlecode.com/archive/libnfc-1.7.1.tar.gz

公式ページをはじめ、lib-nfcのビルド手順は様々なWebページで解説されていますが、ダウンロードリンクが15年2月1日現在失効しているようです(因にgitは取得できました)。
今回はadafruitのインストールチュートリアルに載っていたURLでパッケージを取得しました。

圧縮ファイルを展開し、configureを実行します。

yosuke@yosuke-vm:~/nfc$ tar -xvzf libnfc-1.7.1.tar.gz

しかし、configureを実行したら、configureがないというようなエラーになりました。
調べてみると、autoreconf?でconfigureを生成する必要があるようです(それで、autoconfをインストールしました)。

autoreconfの後、configureを実行します。
(configureの実行途中でエラーに遭遇、それも調べてみたらlibtoolを必要としているとわかり、こちらもインストールしました)。

yosuke@yosuke-vm:~/nfc/libnfc-libnfc-1.7.1$ autoreconf -vis
yosuke@yosuke-vm:~/nfc/libnfc-libnfc-1.7.1$ ./configure --with-drivers=pn532_uart --enable-serial-autoprobe
configure: WARNING: unrecognized options: --enable-serial-autoprobe

<中略>

config.status: executing depfiles commands
config.status: executing libtool commands
configure: WARNING: unrecognized options: --enable-serial-autoprobe

Selected drivers:
   acr122_pcsc...... no
   acr122_usb....... no
   acr122s.......... no
   arygon........... no
   pn53x_usb........ no
   pn532_uart....... yes
   pn532_spi.......  no
   pn532_i2c........ no
yosuke@yosuke-vm:~/nfc/libnfc-libnfc-1.7.1$

configureの--with-driversオプションはPN532でUART機能を有効化するためのものだと思います。また、他にi2cやUSBを有効にするオプションもあります。

    • with-driver=allで全ての機能を有効に出来ます。
    • enable-serial-autoprobeはシリアル接続を勝手に設定してくれるのだと思うのですが、

上記のように「そんなオプションないよ」といわれます。

この後、make cleanしてmake installでlib-nfcのインストールは完了します。
しかし、今回買った基板はこれだけでは使用できませんでした。

もう少し詳しく調べると、途中から少し違う手順を踏む方法がわかりました。
どうやら、手動で設定ファイルを作ってそれをlib-nfcが見に行く?ようにするみたいです。こちらで上手くゆきました。

ディレクトリを作成します。

sudo mkdir /etc/nfc && sudo mkdir /etc/nfc/devices.d/

下記内容の設定ファイルを作成します。

## Typical configuration file for PN532 board (ie. microbuilder.eu / Adafruit) device
name = "Adafruit PN532 board via UART"
connstring = pn532_uart:/dev/ttyUSB0
allow_intrusive_scan = true
log_level = 3
# Allow device auto-detection (default: true)
# Note: if this auto-detection is disabled, user has to set manually a device
# configuration using file or environment variable
allow_autoscan = true

# Allow intrusive auto-detection (default: false)
# Warning: intrusive auto-detection can seriously disturb other devices
# This option is not recommended, user should prefer to add manually his device.
#allow_intrusive_scan = false

# Set log level (default: error)
# Valid log levels are (in order of verbosity): 0 (none), 1 (error), 2 (info), 3 (debug)
# Note: if you compiled with --enable-debug option, the default log level is "debug"
#log_level = 1

# Manually set default device (no default)
# To set a default device, you must set both name and connstring for your device
# Note: if autoscan is enabled, default device will be the first device available in device list.
#device.name = "microBuilder.eu"
#device.connstring = "pn532_uart:/dev/ttyUSB0"

configureにオプションを追加します。--sysconfdirは設定ファイルのディレクトリ指定、--prefixはライブラリのインストール先を指定しているようです。

yosuke@yosuke-vm:/etc/nfc$ sudo ./configure --sysconfdir=/etc --prefix=/usr --with-drivers=pn532_uart
yosuke@yosuke-vm:/etc/nfc$ sudo make clean all
yosuke@yosuke-vm:/etc/nfc$ sudo make install all

以上でlib-nfcのインストールは完了です。

タグの読み取り

lib-nfcのインストールを終えたので、サンプルプログラムでRFIDの読み取り動作を確認します。

lib-nfcディレクトリの中のutilsとexampleにいくつかの実行ファイルが入っています。
詳細は調べていませんが、utils/nfc-toolsはRFIDリーダーをオープンする、
example/nfc-pollはNFCの読み取りを待ち受け、読み取りを行ったらNFC情報を表示するプログラムのようです。

以下がプログラムの実行結果です。

yosuke@yosuke-vm:~/nfc/libnfc-libnfc-1.7.1/utils$ sudo ./nfc-list
/home/yosuke/nfc/libnfc-libnfc-1.7.1/utils/.libs/lt-nfc-list uses libnfc 1.7.1
NFC device: pn532_uart:/dev/ttyUSB0 opened
yosuke@yosuke-vm:~/nfc/libnfc-libnfc-1.7.1/utils$
yosuke@yosuke-vm:~/nfc/libnfc-libnfc-1.7.1/examples$ sudo ./nfc-poll 
/home/yosuke/nfc/libnfc-libnfc-1.7.1/examples/.libs/lt-nfc-poll uses libnfc 1.7.1
NFC reader: pn532_uart:/dev/ttyUSB0 opened
NFC device will poll during 30000 ms (20 pollings of 300 ms for 5 modulations)
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  44  
       UID (NFCID1): 04  15  75  1a  2c  26  80  
      SAK (SEL_RES): 00  
nfc_initiator_target_is_present: Timeout
Waiting for card removing...done.
^Cyosuke@yosuke-vm:~/nfc/libnfc-libnfc-1.7.1/examples$ sudo ./nfc-poll 
/home/yosuke/nfc/libnfc-libnfc-1.7.1/examples/.libs/lt-nfc-poll uses libnfc 1.7.1
NFC reader: pn532_uart:/dev/ttyUSB0 opened
NFC device will poll during 30000 ms (20 pollings of 300 ms for 5 modulations)
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04  
       UID (NFCID1): ca  ac  95  b4  
      SAK (SEL_RES): 08  
nfc_initiator_target_is_present: Timeout
Waiting for card removing...done.
^Cyosuke@yosuke-vm:~/nfc/libnfc-libnfc-1.7.1/examples$


基板とlib-nfcの動作確認は出来たので、今後自分でlib-nfcでタグ情報を読み取るプログラムを作成してみたいと思います。