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 라이브러리 파일: Arduino IDE 설치폴더 하위 Libraries에 압축풀고 복사한다.
RFID Master 라이브러리:
RC522칩 데이터시트:
RFID Quick Start Guide:
##소스##
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 |
'아두이노' 카테고리의 다른 글
[아두이노] 7 Segment LED(4 Digit LED, FND)의 사용 (4) | 2015.09.18 |
---|---|
[아두이노] 8x8 도트 매트릭스 LED의 활용 (8x8 dot matrix led) (6) | 2015.09.17 |
[아두이노] 워터센서(Water Sensor)를 이용한 물감지, 수위감지 (13) | 2015.09.08 |
[아두이노] 릴레이(Relay)를 이용하여 220V 전원을 제어해보자 (51) | 2015.09.07 |
[아두이노] 7 Segment LED(1 Digit LED)로 숫자 표시하기 (2) | 2015.09.05 |