LoginSignup
9
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-08

はじめに

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リーダと記す)

pn532.jpg
白い枠のところがアンテナになっています。
スペックは優秀です(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とカードのタイプを文字で表示しています。
nfc.gif
フルビデオ 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タグ(カード、キーホルダ、シール)tag.jpg

設定方法

1.結線

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

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.png

実行(応用)

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

おわりに

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

Happy Making !

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3