【 아두이노모듈#11】 RFID (RC522) 사용하기 #1
RFID(Radio Frequancy Identification)는 무선 주파수를 이용하여 RFID 태그와 RFID리더간 데이터를 교환하는 장치이다.
교통카드, 학생신분증 겸용카드, 연구실 및 회사 출입문카드, 구내식당 카드, 마트 등의 상품 진열 및 관리 등등 다방면에서 이용되고 있다.
이번 실습에서는 아두이노와 연결하는 기본회로를 구성하고 시리얼 모니터를 통해 카드별로 UID를 확인해보는 실습을 진행하려고 한다.
▶ 선수 학습 :
없음.
▶ RFID 모듈 (RC522) 세부 스팩
※ RFID 모듈 개요
- RC522모듈은 RFID 범주에 속하는 NFC통신 방식을 사용한다. NFC는 13.56MHz의 주파수 대역을 사용하고 10cm 이내 가까운 거리의 비첩촉 통신을 뜻한다.
- RC522의 모듈 구성은 RFID 데이터를 읽고 기록 할 수 있는 본체가 있으며, RFID 고유데이터(UID) 코드가 저장되어 있는 카드키와 열쇠고리형키가 포함 되어 있다.
- 본 실습에서는 아두이노와 통신하기 위해 SPI통신 방식으로 연결하여 사용한다.
▶ 실습 목표 :
1. [ RFID 구동원리, 통신 방식에 대해 이해할 수 있다. ]
2. [ SPI통신과 회로 연결에 대해 이해 할 수 있다.]
3. [ 카드별 고유넘버(UID)를 알아 낼 수 있다.]
▶ 실습 회로도면 :
(이미지 클릭하면 확대 가능)
▶ 실습 절차 :
1. 부품을 준비하여 위와 같은 회로를 구성한다.
2. 아두이노IDE에서 MFRC522 라이브러리를 검색후 설치한다.
(메뉴 : 스케치 》 라이브러리 포함하기 》 라이브러리 관리 》 라이브러리 메니저 )
3. 설치된 라이브러리가 제공하는 예제파일을 열어 실행시킨다. (ReadNUD : UID 스캔 프로그램)
(메뉴 : 파일 》 예제 》 MFRC522 》 ReadNUD 클릭)
4. 프로그램을 동작시키고 카드키를 RC522본체에 접촉시킨 후 시리얼 모니터창을 통해 UID값을 확인한다.
▶ 프로그램 코드 및 설명 :
/* RC522.h 라이브러리에 포함된 ReadNUID 예제 참조 */
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10 // spi 통신을 위한 SS(chip select)핀 설정
#define RST_PIN 9 // 리셋 핀 설정
MFRC522 rfid(SS_PIN, RST_PIN); // 'rfid' 이름으로 클래스 객체 선언
MFRC522::MIFARE_Key key;
byte nuidPICC[4]; // 카드 ID들을 저장(비교)하기 위한 배열(변수)선언
void setup ( ) {
Serial.begin(9600);
SPI.begin(); // SPI 통신 시작
rfid.PCD_Init(); // RFID(MFRC522) 초기화
// ID값 초기화
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
// MIFARE 타입의 카드키 종류들만 인식됨을 표시
Serial.println(F("This code scan the MIFARE Classsic NUID."));
Serial.print(F("Using the following key:"));
printHex(key.keyByte, MFRC522::MF_KEY_SIZE);
}
void loop ( ) {
// 새카드 접촉이 있을 때만 다음 단계로 넘어감
if ( ! rfid.PICC_IsNewCardPresent())
return;
// 카드 읽힘이 제대로 되면 다음으로 넘어감
if ( ! rfid.PICC_ReadCardSerial())
return;
// 현재 접촉 되는 카드 타입을 읽어와 모니터에 표시함
Serial.print(F("PICC type: "));
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
Serial.println(rfid.PICC_GetTypeName(piccType));
// MIFARE 방식의 카드인지 확인 루틴
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println(F("Your tag is not of type MIFARE Classic."));
return;
}
// 이전 인식된 카드와 다른, 혹은 새카드가 인식되면
if (rfid.uid.uidByte[0] != nuidPICC[0] ||
rfid.uid.uidByte[1] != nuidPICC[1] ||
rfid.uid.uidByte[2] != nuidPICC[2] ||
rfid.uid.uidByte[3] != nuidPICC[3] ) {
Serial.println(F("A new card has been detected."));
// 고유아이디(UID) 값을 저장한다.
for (byte i = 0; i < 4; i++) {
nuidPICC[i] = rfid.uid.uidByte[i];
}
// 그 UID 값을 16진값으로 출력 한다.
Serial.println(F("The NUID tag is:"));
Serial.print(F("In hex: "));
printHex(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
// 그 UID 값을 10진값으로 출력 한다.
Serial.print(F("In dec: "));
printDec(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
}
// 연속으로 동일한 카드를 접촉하면 다른 처리 없이
// '이미 인식된 카드'라는 메세지를 출력한다.
else Serial.println(F("Card read previously."));
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}
// 16진 값으로 변환 해주는 함수 정의
void printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
// 10진 값으로 변환 해주는 함수 정의
void printDec(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], DEC);
}
}
▶ 실행영상 :
(전체화면 보기로 보세요)
(아래는 유튜브로 시청하기)
▶ 아두이노 파일다운 :
(다운받아서 압축을 풀어 사용하세요)
▶ 컴파일 에러 발생시 해결 방법 참고 : 아래 최신글을 참고해 보세요.
'아두이노 > 3. 아두이노 모듈' 카테고리의 다른 글
【 아두이노모듈#13】 RFID #3(RC522) 도어락 만들기! (13) | 2019.04.26 |
---|---|
【 아두이노모듈#12】 RFID (RC522) 사용하기 #2 (0) | 2019.04.25 |
【 아두이노모듈#10】 1채널 릴레이(JQC-3FF-S-Z) 사용하기 (4) | 2019.03.26 |
【 아두이노모듈#9】 TM1637 & DS1307 리얼타임 시계 만들기 (25) | 2019.03.21 |
【 아두이노모듈#8】 DS1307 (RTC) 리얼타임클럭 모듈 배우기 #1 (0) | 2019.03.15 |