Raspberry Pi + Node-REDを使い、NFCでタッチ&ゴー


はじめに

NFCとは、Near Field Communicationの略で近距離無線通信のことを言います。
JR東日本のスイカもNFCの一つです。一部のスマホにもNFCやFeliCa(NFCの一つ)が搭載されていますので利用している方も多いと思います。NFCの詳細はWikipediaをご覧ください。
NFCのタグについては1枚数円~とお安いですが、タグを読み書きするリーダーライターは数千円するため、今まではNFC搭載のAndroidスマホで遊んでいました。
ところが、電子工作の友である中華通販サイトAliexpressを見ていたらPN532というNFC読み書きチップが載った赤い謎基板のリーダーライターがサンプルタグ付きで400円という格安で売っており、衝動買いして使い方を一通り調べました。
本記事は、PN532謎基板を使ってNode-REDでタッチ&ゴーする手順を記述します。

謎の400円 中華PN532基板(以降、PN532リーダと記す)


白い枠のところがアンテナになっています。
スペックは優秀です(Aliexpressですから中華品質です)。

  • 接続 I2C、SPI、UART
  • リーダー/ライターサポート
  • Mifare 1 18k、4 18k、Lite、desfire、ISO/IEC 14443-4 カード、CD97BX、CD 光、Desfire、P5CN072 (SMX)、IRT5001、Innovisionジュエルカードカード、フェリカ、RCS_860 と RCS_854など

まずは動いているところをご覧下さい

画面はNode-REDダッシュボードにSVGノードを追加して表示しています。
NFCタグをタッチするとマルを赤にしてタグのIDとカードのタイプを文字で表示しています。

フルビデオ https://www.youtube.com/watch?v=UGPxl5hh_lY

注意

この記事は以下の環境で実施しています。

  • Raspberry Pi 3B+ raspbian stretch
  • Node-RED V1.0.2(といくつかの追加Node ※後ほど説明)
  • 写真に示したPN532リーダ(型番等不明)をUARTで接続
  • NFCタグはPN532リーダにおまけで付いていたMIFAREカード型とMIFAREキーホルダ型、昔どこかで入手したTypeBのシール型、通勤定期(SUICA)を使用

NFCタグ(カード、キーホルダ、シール)

設定方法

1.結線

 このPN532リーダは、UART、I2C、SPIをディップスイッチで切り替えて接続できますが、今回はUART(ディップスイッチをS1=OFF、S2=OFF)にしています。

Raspberry PI とUART接続します。UARTなのでTX,RX信号線を互いにすること。

PI PN532
4番5V VCC
6番GND GND
8番TX RXD
10番RX TXD

2.Node-REDに必要なNFCライブラリをインストール

Node-REDの追加ノードと、それに必要なライブラリをインストールします。

2.1 NFCライブラリインストール

sudo apt install libnfc5 libnfc-bin libnfc-examples

2.2 ライブラリ環境設定

sudo nano /etc/nfc/libnfc.conf

libnfc.conf
device.name = "PN532_Ali"
device.connstring = "pn532_uart:/dev/ttyS0"
allow_intrusive_scan = true

2.3 リブートし認識されるか確認してみましょう

nfc-scan-device   -v

nfc-scan-device uses libnfc 1.7.1
1 NFC device(s) found:
.........

2.4 NFCカードを読み取ってみましょう

nfc-poll   -v
読めるとIDなどの情報が表示されます。

2.5 Node-REDに追加のノードをインストールします

まずは、Node-REDを入れたフォルダに移動してからノードを追加します。
cd ./node-red
次に、nfcpy関係を入れます。
sudo pip install -U nfcpy-id-reader
**Python2.7環境に入れています
そして、追加ノードを入れます。
npm install node-red-contrib-nfcpy-id

※他にもnode-red-contrib-PN532というそのものズバリのノードもありましたが、MIFAREの読み込みのみに対応していたため、今回はFerica(のID)も読める上記のノード(この後パッチ当てしますが)を選びました。

2.6 パッチ当て

残念ながら、このノードは、このままだとUART接続のPN532を読むことができません。デバイス名がハードコードされているので手で修正します。
sudo nano /usr/local/lib/python2.7/dist-packages/nfcpy_id_reader/__main__.py
下図に示す、Pythonコードの下部の usb の部分を tty:S0 に変更

if __name__ == '__main__':
    while True:
        if running:
            with nfc.ContactlessFrontend('usb') as clf:
                while clf.connect(rdwr={'on-connect': on_connect}):
                    stdout_json({'event':'touchend'})
                    if non_loop:
                        running = False
                        break
        elif not(exiting):
            time.sleep(0.1)
        else:
            break

3.プログラミング

Nodeプログラム例を示します。
NFCを読むノードを配置し、読み取ったデータをデバッグウインドに出している例です。
payloadプロパティにIDが入り、typeプロパティにカードのタイプが入ります。

実行(応用)

写真はNode-REDダッシュボード+SVGノードを使って、読み取った値をChromeに表示しているところです。色々なノードとつないで簡単に拡張できるところがNode-REDの醍醐味ですね!

おわりに

説明が足りない箇所もあると思いますが、なるべくググれるようにキーワードは英字のまま掲載しました。
NFCはカードを近づけるだけでなく、カードを離すことでリーダ近辺にあったタグがついたモノが無くなった、というような使い方もあり、いろいろ応用が利きそうです。
最後に、Node-REDは拡張性の高さと簡単さから電子工作/IoTする人に最適なツールだと思っています。

Happy Making !