RFID 태그의 UID 읽어오기
○ 사용 부품
○ 적용 회로
○ 적용 코드
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
byte uidPICC[4];
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
for (byte i = 0; i < 6; i++){
key.keyByte[i] = 0xFF;
}
Serial.println(F("This cod scan the MIFARE Classic NUID."));
Serial.print(F("Using the following key : "));
printHex(key.keyByte, MFRC522::MF_KEY_SIZE);
Serial.println();
}
void loop() {
// put your main code here, to run repeatedly:
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));
printHex(rfid.uid.uidByte, rfid.uid.size);
}
void printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
Serial.println("\n");
delay(1000);
}
○ 코드 뜯어보기
‘ :: ’연산자와 ‘ . ‘연산자
스케치의 기반 언어인 C++에는 클래스와 객체라는 개념이 존재한다.
클래스는 객체를 만들어 내기 위한 설계도 혹은 틀이며, 객체는 클래스의 모양대로 생성된 실체라고 부른다.
객체를 통해 클래스 메서드를 불러오는 연산자는 ‘ . ‘( 객체 멤버 연산자 )이며 객체를 통해 클래스 메서드를 불러오는 경우에는 ‘ :: ‘( 클래스 멤버 메서드 연산자 )를 사용한다.
○ 더 알아보기
RC522의 예제 중 DumpInfo를 실행해 보면 읽어오는 속도가 상당히 느린 것을 볼 수 있다.
읽는 중간에 조금만 틀어지더라도 정보 읽기에 실패하는 경우가 발생하는데
짧은 시간 안에 RFID태그의 정보를 읽어오려면 보드레이트를 높이는 것으로 해결이 가능하다.
다만 일정 보드레이트 이상부터는 시간이 오히려 늘어나거나, 한참 낮은 보드레이트와 별 차이가 없는 경우를 마주하게 된다. 최적의 보드레이트는 115200이라 생각됩니다.
아래는 그 표와 확인하는데 쓴 코드이다.
BoardRate |
MilliSeconds |
Unefficiency |
9,600 |
5324 |
|
19,200 |
2691 |
|
38,400 |
1374 |
|
57,600 |
947 |
|
74,880 |
822 |
|
115,200 |
814 |
|
230,400 |
824 |
O |
250,000 |
827 |
O |
500,000 |
815 |
O |
1,000,000 |
797 |
O |
2,000,000 |
792 |
O |
사용 코드
#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 BR1 9600
#define BR2 19200
#define BR3 38400
#define BR4 57600
#define BR5 74880
#define BR6 115200
#define BR7 230400
#define BR8 250000
#define BR9 500000
#define BR10 1000000
#define BR11 2000000
unsigned long time1;
unsigned long time2;
MFRC522 mfrc522(SS_PIN, RST_PIN);
void setup() {
Serial.begin(BR); // <---- BR을 위에 정의된 상수로 고쳐쓸 것
while (!Serial);
SPI.begin();
mfrc522.PCD_Init();
delay(4);
mfrc522.PCD_DumpVersionToSerial();
Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
}
void loop() {
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
time1 = millis();
mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
time2 = millis();
unsigned long diff = time2 - time1;
Serial.println(diff);
}
이걸로 어떤 프로젝트를 만들어 볼까요?~
웹 서버를 연동해 출퇴근 체크
버스카드 만들기
'메이커 이야기 > 아두이노' 카테고리의 다른 글
[아두이노 릴레이모듈] 릴레이모듈 LED 제어 (0) | 2020.02.07 |
---|---|
[아두이노 터치센서] 터치센서 LED on/off (0) | 2020.02.07 |
[아두이노 초음파] 초음파 센서로 거리측정하기 (0) | 2020.02.06 |
[침입감지기] 아두이노 PIR,피에조 활용 침입감지기 (2) | 2020.02.05 |
[온습도측정] 아두이노 온습도 제어 (0) | 2020.02.05 |