はじめに
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
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 !