RFID (Radio-Frequency Identification)

주파수를 이용해 ID를 식별하는 SYSTEM으로 일명 전자태그.

바코드가 진화된 것으로 전자태그가 도입되면 물류 뿐만 아니라 유통 보완 위폐방지, HOME NET-WORK, 텔레매틱스 동물 추적, 환자 관리 등 일상생활 전반에 큰 변화 발생할 수 있다.

RFID 기술이란 전파를 이용해 먼 거리에서 정보를 인식하는 기술을 말한다

부품명 수량
아두이노 우노 R3 1
RFID 리더기(ID-12LA) 1
RFID USB Reader(SEN-09963) 1
330Ω 저항 1
5mm LED 1
점퍼케이블 5

회로도

브레드보드 레이아웃

usb reader 가운데에 RFID Reader의 핀에 맞게 꽂고, RFID USB reader에는 VCC, GND, TX 3핀을 연결.

coding

RFID 태그의 ID확인

void setup(){
  Serial.begin(9600);
  Serial.println("RFID example start!");
  Serial.println('\n');
}

void loop(){
  char tagString[15];  // 태그의 ID를 저장할 곳
  int index = 0;
  while(Serial.available()){  // 시리얼 포트에 읽을 데이터가 있으면
    int readByte = Serial.read();  // 시리얼 포트에 있는 데이터를 저장합니다.
    Serial.println("Serial.read() is ");
    Serial.print("DEC : ");
    Serial.println(readByte, DEC);
    Serial.print("HEX : ");
    Serial.println(readByte, HEX);
    Serial.println("RFID reading.... store string");

    tagString[index] = readByte;  // RFID 태그의 ID를 저장합니다.
    index++;
    Serial.println("tagString is : ");
    Serial.println(tagString); // RFID 태그의 ID를 출력합니다.
  }
}

시리얼 보니터에 tagString is:에 뜨는것이 RFID태그 ID값.

RFID 태그를 읽으면 LED 켜는 소스

읽은 RFID태그ID값을 셋팅.

char tag1[13] = "6F005C9656F3";   // RFID 태그의 ID입니다. 
int led = 2;

void setup(){
  Serial.begin(9600);
  pinMode(led, OUTPUT); 
  Serial.println("RFID example start !"); 
  Serial.println('\n');
}

void loop(){
  char tagString[13]; //  tagString를 선언합니다
  int index =0 ;
  boolean reading = false;

  while(Serial.available()) { //시리얼 포트에 읽을 데이터가 있으면
  // 태그 리더기에 태그를 가져다 대면, 읽기 시작합니다. 
    int readByte = Serial.read(); // 시리얼 포트에 있는 데이터를 저장합니다.


    // 태그에서 읽은 정보를 출력 
    Serial.println("Serial.read() is "); 
    Serial.print("DEC : "); Serial.println(readByte, DEC  ); 
    Serial.print("HEX : "); Serial.println(readByte, HEX);
    Serial.println("RFID reading..... store string");
    tagString[index] = readByte;
    index++;
    }

  checkTag(tagString); // 저장된 태그 ID와 RFID 리더에서 읽은 태그 ID와 일치하는지 확인
  clearTag(tagString); // 읽어온 태그 ID를 지움
  delay(100);
}


void checkTag(char tag[]){
// 저장된 태그 ID 와 RFID 리더에서 읽은 태그 ID가 일치하는지 확인 하는 함수
  if (strlen(tag) == 0 ){ // 아무것도 읽지 않았을 경우
   return; // empty no ndeed to continue
  }

 if(compareTag(tag, tag1)){ // 저장된 태그 ID와 읽은 태그 ID를 비교합니다.
    digitalWrite(led,HIGH);
    delay(3000);
    digitalWrite(led,LOW);
    Serial.println("LED2 on");
    // 같을 경우 LED의 불을 켬

 }  else { // 읽은 태그와 일치하는 저장 태그가 없을면
   Serial.println("No matching Tag, New tag name is display");
   Serial.println(tag); // 읽은 태그 ID 출력
 }
}

void clearTag(char one[]){   // 읽은 태그 ID를 초기화
  for(int i =0; i < strlen(one); i++){
    one[i] = 0;
  }
}


boolean compareTag(char one[], char two[]){ // 읽은 태그 ID와 저장된 태그 ID를 비교

Serial.println("in the compareTag");

 if(strlen(one) == 0 ){ // 읽은 태그가 비어 있을 경우
   Serial.println("empty string");
   return false; 
  }
  for (int i=0; i < 12; i++){  // 읽은 태그와 저장된 태그 ID를 한자리 씩 비교
    if(one[i+1]!=two[i]) { // 제 태그 ID의 앞자리가 이상한 값이 들어와서 수정
      Serial.println("one of the string mismatches");
      return false; // 하나라도 다르면 다른 태그 ID로 정함
    }
  }
  Serial.println("All string matches");
  return true; // 전부 일치할 경우 일치하는 상태 값을 보냄
}

checkTag() 함수는 읽은 태그와 등록되어있는(저장된) 태그를 비교해서 비교 결과에 따라서 맞는 동작을 하는 함수입니다. RFID 태그에서 읽어온 태그 ID를 저장된 태그 ID와 비교해서(비교하는 함수는 따로 있습니다.) 같을 경우는 LED의 불을 켜고, 다를 경우에는 태그가 맞지 않는다는 메시지를 띄우고 읽어온 태그 ID를 출력합니다.

compareTag()는 checkTag() 에서 보낸 태그 ID 2개를 비교하는 함수입니다. (one[]이 읽은 ID, two[]가 저장돼 있는 ID) 우선 읽어온 ID의 크기를 보고 비어있는지 아닌지를 확인한 후, 저장된 태그 ID와 0번부터 한 자리씩 비교합니다.

같을 경우에는 all matches 메시지를 띄우고 호출한 함수에게 같다는 상태(true) 값을 전달해 줍니다. 틀릴 경우에는 mismatch.. 메시지를 띄우고 다르다는 상태(false) 값을 전달해 줍니다. (여기서는 한 자리라도 틀릴 경우에는 다른 태그의 ID입니다.)