1. 概要
複数の物体を区別するためにNFCタグを使ってみました。
NFCタグのシールが10枚1000円程度で販売されており比較的安価なのと、電池交換などの手間が不要なため採用しました。
NFCタグを認識するとLEDが光るプログラムの例はありましたが、複数のタグを認識するプログラム例がなかったので手を加えてみました。
NFCタグへの書き込みが上手くいかなかったため、最初から入っている情報を使って識別していますが、Androidアプリなどで書き込みができればもっと楽にできるのかもしれません。
2. 用意するもの
- サンワサプライ-NFCタグ-10枚入り-白-MM-NFCT
- RFID-RC522 Amazon 検索: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 ボクにもわかる地上デジタル
- ESP-WROOM-02とRFID-RC522で非接触Lチカ - Qiita
- miguelbalboa/rfid: Arduino RFID Library for MFRC522
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 |
6. プログラム
6.1 MFRC552ライブラリを導入
- こちらのライブラリを利用します。
- miguelbalboa/rfid: Arduino RFID Library for MFRC522
6.1.1 Library Managerを開く
6.1.2 「MFRC522」で検索しインストール(スクリーンショットはインストール後のもの)
6.2 サンプルプログラムを動かしてタグの情報を読み取る
- rfid/DumpInfo.ino at master · miguelbalboa/rfid
- 実行してシリアルモニタを立ち上げ、NFCタグをリーダーに近づけると情報が表示される。(スクリーンショットでは一応消しています)
- Card UIDがNFCタグごとに異なるのでメモしておく
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へのリンクになっています)