반응형

RFID(Radio Frequency Identification)는 무선주파수를 이용하여 RFID태그와 RFID리더간 데이터를 교환하는 장치이다. 현재 실생활에 매우 많이 쓰이고 있으며 버스카드, 신용카드 등에 가장 많이 쓰이고 있다. 앞으로는 유통산업 등에서 바코드 시스템을 대체하는 시스템으로 각광 받을 것으로 예상된다. 바코드와 비교하여 장점으로는 바코드보다 훨씬 많은 정보를 칩에 저장할 수 있으며 무선으로 데이터를 교환하기 때문에 바코드처럼 직접 찍어주지 않아도 된다. 아마도 마트 계산대 같은 곳에 응용할 경우 바코드를 일일히 찍지 않고 물건을 실은 카트만 통과하면 모든 물건의 값이 계산 가능할 것이다.


무선으로 데이터를 주고 받는 원리는 위의 그림과 같다. 리더측에서 자기장을 발생시키면 카드 측의 코일에서는 유도전류가 발생한다. 이 전류를 이용하여 칩에 전원이 공급되고 전파를 통하여 칩에 담긴 데이터가 리더 안테나에 읽히게 된다. 리더는 이 데이터를 받아서 컴퓨터 등으로 전달하여 원하는 동작을 할 수 있도록 한다.


RFID Tag의 구조이다. 코일이 있고 가운데 까만 점이 정보를 담고 있는 IC칩이다.



동물용 RFID 이다. 우리나라에서도 의무화되어 애완동물의 몸에 삽입하는 RFID이다. 마찬가지로 코일이 보이고 가운데에 IC칩이 보인다. IC칩에는 동물의 주인에 대한 정보가 들어가서 애완견을 잃어버리더라도 저 칩의 내용만 RFID리더로 읽어들이면 동물의 주인을 찾아 줄 수 있다. 신용카드나 버스카드 등도 뜯어보면 위와 같이 코일과 칩으로 RFID 가 구성되어 있다.


내가 가지고 있는 RFID Reader는 NXP사의 RC522라는 칩을 사용한 리더이다.

핀의 배열은 아래와 같다.



아두이노 우노와의 연결은 다음과 같다. Piezo Buzzer는 RFID 감지시 BEEP 음을 내주기 위하여 사용하였다.


fritzing 파일: 

rfid.fzz


RFID 라이브러리 파일: Arduino IDE 설치폴더 하위 Libraries에 압축풀고 복사한다.

AddicoreRFID.zip


RFID Master 라이브러리:

rfid-master.zip


RC522칩 데이터시트:

MFRC522.pdf


RFID Quick Start Guide:

RFIDQuickStartGuide.pdf


##소스##

RFID를 감지하여 BEEP음을 내고 ID값을 읽어 ID값에 따른 HELLO 메시지를 출력합니다.

본 소스에서는 2장의 카드로 테스트하며 각각 224, 170의 ID값을 가지고 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
 
#include <AddicoreRFID.h>
#include <SPI.h>
 
#define    uchar    unsigned char
#define    uint    unsigned int
 
//4 bytes tag serial number, the first 5 bytes for the checksum byte
uchar serNumA[5];
 
uchar fifobytes;
uchar fifoValue;
 
AddicoreRFID myRFID; // create AddicoreRFID object to control the RFID module
 
/////////////////////////////////////////////////////////////////////
//set the pins
/////////////////////////////////////////////////////////////////////
const int chipSelectPin = 10;
const int NRSTPD = 5;
const int speakerPin = 8//스피커가 연결된 디지털핀 설정
 
//Maximum length of the array
#define MAX_LEN 16
 
void setup() {                
  Serial.begin(9600);                        // 시리얼 모니터 출력 설정
 
  // start the SPI library:
  SPI.begin();
  
  pinMode(chipSelectPin,OUTPUT);              // Set digital pin 10 as OUTPUT to connect it to the RFID /ENABLE pin 
  digitalWrite(chipSelectPin, LOW);         // Activate the RFID reader
  pinMode(NRSTPD,OUTPUT);                     // Set digital pin 10 , Not Reset and Power-down
  digitalWrite(NRSTPD, HIGH);
 
  myRFID.AddicoreRFID_Init();  
}
 
void loop()
{
  uchar i, tmp, checksum1;
    uchar status;
  uchar str[MAX_LEN];
  uchar RC_size;
  uchar blockAddr;    //Selection operation block address 0 to 63
  String mynum = "";
  str[1= 0x4400;
        
    //RFID 태그의 타입을 리턴
    status = myRFID.AddicoreRFID_Request(PICC_REQIDL, str);    
    if (status == MI_OK)    //MIFARE 카드일때만 작동
    {
          tone(speakerPin,2000,100);
          Serial.println("RFID tag detected");
            Serial.print(str[0],BIN);
          Serial.print(" , ");
            Serial.print(str[1],BIN);
          Serial.println(" ");
    }
 
  //RFID 충돌방지, RFID 태그의 ID값(시리얼넘버) 등 저장된 값을 리턴함. 4Byte
    status = myRFID.AddicoreRFID_Anticoll(str);
    if (status == MI_OK)      //MIFARE 카드일때만 작동
    {
          checksum1 = str[0] ^ str[1] ^ str[2] ^ str[3];
          Serial.println("The tag's number is  : ");
            //Serial.print(2);
            Serial.print(str[0]);
          Serial.print(" , ");
            Serial.print(str[1],BIN);
          Serial.print(" , ");
            Serial.print(str[2],BIN);
          Serial.print(" , ");
            Serial.print(str[3],BIN);
          Serial.print(" , ");
            Serial.print(str[4],BIN);
          Serial.print(" , ");
          Serial.println(checksum1,BIN);
           
            // Should really check all pairs, but for now we'll just use the first
            if(str[0== 224)                      //RFID 태그의 ID값이 224번이면 Gil Dong의 카드
            {
                Serial.print("Hello Gil Dong!\n");
            } else if(str[0== 170) {             //RFID 태그의 ID값이 170번이면 Kang Min의 카드
                Serial.print("Hello Kang Min!\n");
            }
            Serial.println();
            delay(1000);
    }
        myRFID.AddicoreRFID_Halt();           //Command tag into hibernation              
}
cs



##결과##
RFID가 감지되면 BEEP음과 함께 태그의 내용이 시리얼 모니터에 출력되며 태그의 ID값에 따라 신분을 구분하여 Hello 메시지를 출력한다.




##후기##
가정에서 이용한다면 RFID 저장값에 따라 신원을 확인하는데 이용할 수 있을 것 같다. 예를 들어 현관문 잠금장치에 서보모터 등을 달아 가족마다 카드를 나누어주어 잠금장치를 해제 하는데도 이용할 수 있을 것 같다.
조금 더 응용 한다면 PC등과 연결하여 데이터를 쌓으면 누가 몇 시에 들어오고 나갔는지 확인 할 수도 있을 것이다.


반응형

+ Recent posts