Arduino
電子工作
NFC

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

More than 1 year has passed since last update.


1. 概要

複数の物体を区別するためにNFCタグを使ってみました。

NFCタグのシールが10枚1000円程度で販売されており比較的安価なのと、電池交換などの手間が不要なため採用しました。

NFCタグを認識するとLEDが光るプログラムの例はありましたが、複数のタグを認識するプログラム例がなかったので手を加えてみました。

NFCタグへの書き込みが上手くいかなかったため、最初から入っている情報を使って識別していますが、Androidアプリなどで書き込みができればもっと楽にできるのかもしれません。


2. 用意するもの


3. 作業環境


  • MacBook Air (13-inch, Mid 2012) & Mac OS 10.11.4

  • Arduino IDE 1.6.5


4. 参考サイト


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


6. プログラム


6.1 MFRC552ライブラリを導入


6.1.1 Library Managerを開く

スクリーンショット 2016-06-16 14.50.34.png


6.1.2 「MFRC522」で検索しインストール(スクリーンショットはインストール後のもの)

スクリーンショット 2016-06-16 14.52.19.png


6.2 サンプルプログラムを動かしてタグの情報を読み取る


  • rfid/DumpInfo.ino at master · miguelbalboa/rfid

  • 実行してシリアルモニタを立ち上げ、NFCタグをリーダーに近づけると情報が表示される。(スクリーンショットでは一応消しています)

  • Card UIDがNFCタグごとに異なるのでメモしておく

スクリーンショット 2016-06-16 16.33.26.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と比較しています。


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