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

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

#### 謎の400円 中華PN532基板（以降、PN532リーダと記す）
![pn532.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155377/77e2cb9d-e335-2a68-5160-21410e6d3bd3.jpeg)
白い枠のところがアンテナになっています。
スペックは優秀です（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://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155377/4c85240f-f1d1-c478-fec5-3ab168158a19.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155377/846c0234-7469-eb21-18c3-92867c3985bd.jpeg)


# 設定方法
## １．結線
　このPN532リーダは、UART、I2C、SPIをディップスイッチで切り替えて接続できますが、今回はUART(ディップスイッチをS1=OFF、S2=OFF)にしています。
![PN532_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155377/b653611c-9d08-5122-ca21-484f03935f27.png)

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

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

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

#### 2.1 NFCライブラリインストール
  sudo apt install libnfc5 libnfc-bin libnfc-examples
#### 2.2 ライブラリ環境設定
sudo nano /etc/nfc/libnfc.conf

```text:libnfc.conf
device.name = "PN532_Ali"
device.connstring = "pn532_uart:/dev/ttyS0"
allow_intrusive_scan = true
```
#### 2.3 リブートし認識されるか確認してみましょう
nfc-scan-device &nbsp;&nbsp;-v

```
nfc-scan-device uses libnfc 1.7.1
1 NFC device(s) found:
.........
```
#### 2.4 NFCカードを読み取ってみましょう
nfc-poll &nbsp;&nbsp;-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
```

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

![node.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155377/5aa22b6f-b181-4906-7150-8134c7fe1c58.png)


# 実行（応用）
写真はNode-REDダッシュボード＋SVGノードを使って、読み取った値をChromeに表示しているところです。色々なノードとつないで簡単に拡張できるところがNode-REDの醍醐味ですね！
![moving1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155377/881b8c9a-6ebb-2d35-679c-fdde813ed3dd.jpeg)


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

Happy Making !