Arduinoで複数のNFCタグを区別する

## 1. 概要
複数の物体を区別するためにNFCタグを使ってみました。
NFCタグのシールが10枚1000円程度で販売されており比較的安価なのと、電池交換などの手間が不要なため採用しました。
NFCタグを認識するとLEDが光るプログラムの例はありましたが、複数のタグを認識するプログラム例がなかったので手を加えてみました。
NFCタグへの書き込みが上手くいかなかったため、最初から入っている情報を使って識別していますが、Androidアプリなどで書き込みができればもっと楽にできるのかもしれません。

## 2. 用意するもの
 - [サンワサプライ-NFCタグ-10枚入り-白-MM-NFCT](http://www.amazon.co.jp/dp/B00GXSGL5G)
 - RFID-RC522 [Amazon 検索:RC522](https://www.amazon.co.jp/s/field-keywords=RC522)
    - 安いものは海外発送のものもあるため郵送に時間が掛かります
 - Arduino UNO
 - ブレッドボード、ジャンパワイヤ(必要に応じて)

## 3. 作業環境
 - MacBook Air (13-inch, Mid 2012) & Mac OS 10.11.4
 - Arduino IDE 1.6.5

## 4. 参考サイト
 - [Arduinoで近距離無線通信 RFID-RC522 NFC by ボクにもわかる地上デジタル
](http://www.geocities.jp/bokunimowakaru/diy/arduino/rfid.html)
 - [ESP-WROOM-02とRFID-RC522で非接触Lチカ - Qiita](http://qiita.com/daxanya1/items/b9c2b971a946c8bf063e)
 - [miguelbalboa/rfid: Arduino RFID Library for MFRC522](https://github.com/miguelbalboa/rfid)


## 5. 配線
 - 上記のライブラリに記載の通りに接続する
 - 3.3VとGNDも接続

| Signal    |  MFRC522 Reader/PCD Pin | Arduino Uno Pin |
|:----------|:------------------------|:----------------|
| RST/Reset |  RST                    | 9            |
| SPI SS    |  SDA(SS)                | 10           |
| SPI MOSI  |  MOSI                   | 11 / ICSP-4  |
| SPI MISO  |  MISO                   | 12 / ICSP-1  |
| SPI SCK   |  SCK                    | 13 / ICSP-3  |

 - ブレッドボードとジャンパワイヤを使って配線した例(写真ではRSTがArduino Unoの5に接続されていますが9に接続してください)
![IMG_3342のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/94069/75a70170-ce2a-943e-60aa-06724b296f31.jpeg)


## 6. プログラム
### 6.1 MFRC552ライブラリを導入
 - こちらのライブラリを利用します。
 - [miguelbalboa/rfid: Arduino RFID Library for MFRC522](https://github.com/miguelbalboa/rfid)

#### 6.1.1 Library Managerを開く


![スクリーンショット 2016-06-16 14.50.34.png](https://qiita-image-store.s3.amazonaws.com/0/94069/0f9d85e6-68be-90f4-11a8-04d280c1d6ca.png)

#### 6.1.2 「MFRC522」で検索しインストール(スクリーンショットはインストール後のもの) 
 
![スクリーンショット 2016-06-16 14.52.19.png](https://qiita-image-store.s3.amazonaws.com/0/94069/b818351f-efc1-a0b0-9822-255da2ea5329.png)

### 6.2 サンプルプログラムを動かしてタグの情報を読み取る
 - [rfid/DumpInfo.ino at master · miguelbalboa/rfid](https://github.com/miguelbalboa/rfid/blob/master/examples/DumpInfo/DumpInfo.ino)
 - 実行してシリアルモニタを立ち上げ、NFCタグをリーダーに近づけると情報が表示される。(スクリーンショットでは一応消しています)
 - Card UIDがNFCタグごとに異なるのでメモしておく

![スクリーンショット 2016-06-16 16.33.26.png](https://qiita-image-store.s3.amazonaws.com/0/94069/4994a947-d8dc-c0a6-8384-07b337bb6806.png)


### 6.3 指定したタグを認識してシリアルモニタに表示するプログラム
 - DumpInfo.inoをベースにしています。
 - DumpInfo.inoで読み取ったCard IDを``` #define UIDx "xx xx xx xx xx xx xx" ```のところに貼り付けてください。
 - NFCタグのUIDを2桁ずつ読み取っているので、連結して"xx xx xx xx xx xx xx"のような文字列に変換して該当するUIDと比較しています。 

```java:NFC_test.ino

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         9          // Configurable, see typical pin layout above
#define SS_PIN          10         // Configurable, see typical pin layout above

#define UID1 "xx xx xx xx xx xx xx"  // DumpInfo.inoで読み取ったUIDを記入
#define UID2 "xx xx xx xx xx xx xx"  // DumpInfo.inoで読み取ったUIDを記入
#define UID3 "xx xx xx xx xx xx xx"  // DumpInfo.inoで読み取ったUIDを記入
#define UID4 "xx xx xx xx xx xx xx"  // DumpInfo.inoで読み取ったUIDを記入
#define UID5 "xx xx xx xx xx xx xx"  // DumpInfo.inoで読み取ったUIDを記入
#define UID6 "xx xx xx xx xx xx xx"  // DumpInfo.inoで読み取ったUIDを記入
#define UID7 "xx xx xx xx xx xx xx"  // DumpInfo.inoで読み取ったUIDを記入

MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance

MFRC522::MIFARE_Key key;

void setup() {
  Serial.begin(9600);   // Initialize serial communications with the PC
  while (!Serial);    // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
  SPI.begin();      // Init SPI bus
  mfrc522.PCD_Init();   // Init MFRC522
  mfrc522.PCD_DumpVersionToSerial();  // Show details of PCD - MFRC522 Card Reader details
  Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));

  dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
}

void loop() {
  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

    String strBuf[mfrc522.uid.size];
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      strBuf[i] =  String(mfrc522.uid.uidByte[i], HEX);  // (E)using a constant integer
      if(strBuf[i].length() == 1){  // 1桁の場合は先頭に0を追加
        strBuf[i] = "0" + strBuf[i];
      }
    }

    String strUID = strBuf[0] + " " + strBuf[1] + " " + strBuf[2] + " " + strBuf[3] + " " + strBuf[4] + " " + strBuf[5] + " " + strBuf[6];
    if ( strUID.equalsIgnoreCase(UID1) ){  // 大文字小文字関係なく比較
      Serial.println("1");
    }
    else if ( strUID.equalsIgnoreCase(UID2) ){
      Serial.println("2");
    }
    else if ( strUID.equalsIgnoreCase(UID3) ){
      Serial.println("3");
    }
    else if ( strUID.equalsIgnoreCase(UID4) ){
      Serial.println("4");
    }
    else if ( strUID.equalsIgnoreCase(UID5) ){
      Serial.println("5");
    }
    else if ( strUID.equalsIgnoreCase(UID6) ){
      Serial.println("6");
    }
    else if (strUID.equalsIgnoreCase(UID7) ){
      Serial.println("7");
    }

}

/**
 * Helper routine to dump a byte array as hex values to Serial.
 */
void dump_byte_array(byte *buffer, byte bufferSize) {
    for (byte i = 0; i < bufferSize; i++) {
        Serial.print(buffer[i] < 0x10 ? " 0" : " ");
        Serial.print(buffer[i], HEX);
    }
}
```

## 7.動作の様子
 - シリアルモニタでNFCタグの1と2が認識されている様子が分かります。(YouTubeへのリンクになっています)

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/hJ_QIgeyijA/0.jpg)](http://www.youtube.com/watch?v=hJ_QIgeyijA)