고급 예제

다양한 도구들을 가지고 마음껏 응용해보세요.

RFID 리더기(ID-12LA)

2014-08-14 16:59:44

개요


RFID(Radio-Frequency Identificationi) 라는 기술이 있습니다.  RFID는 주파수를 이용해 ID를 식별하는 시스템으로 전자태그로 불리곤 합니다. RFID 기술이란 전파를 이용해 먼 거리에서 정보를 인식하는 기술을 말하며, 여기에는 RFID 태그(이하 태그)와, RFID 판독기(이하 판독기)가 쌍으로 동작합니다. 태그는 안테나와 집적 회로로 이루어지는데, 집적 회로 안에 정보를 기록하고 안테나를 통해 판독기에게 정보를 송신합니다. 


이 기술을 사용해서 고속도로 진입 시 하이패스를 사용하여 빠르게 지나가거나,


출처 : ComputerWorld

놀이공원에 들어 갈 때 손목에 있는 띠로 간편하게 출입할 수 있습니다.

 

 
이 외에도 다양한 분야에서 RFID기술을 사용하고 있습니다.

이 컨텐츠에서는 아두이노와 RFID리더기를 연결해 보고, RFID의 사용법을 배워봅시다.
 

 

 

미리 보기 동영상

 

 

 

 

부품 목록

 

NO 부품명 수량 상세설명
1 아두이노 우노 R3 (오렌지보드) 1  아두이노
2 RFID 리더기(ID-12LA) 1 RFID 
3 RFID USB Reader(SEN-09963) 1 RFID 
4 5mm Yellow LED 1 LED 
5 330Ω 저항 1 저항 
6 브레드보드 1 브레드보드 
7 점퍼케이블 5 점퍼케이블 

 

부품명

아두이노 우노 R3

(오렌지보드)

RFID 리더기
(ID-12LA)
RFID USB Reader
(SEN-09963)
5mm Yellow LED 330Ω 저항
파트 x1 x1 x1 x1 x1

 

부품명 브레드보드 점퍼케이블
파트 x1 x5

 

 

하드웨어 Making

 

회로도

 

브레드보드 레이아웃

 

 

 

부품 소개

 

RFID USB reader와 RFID Reader입니다. 위의 브레드보드 레이아웃 처럼 usb reader 가운데에 RFID Reader의 핀에 맞게 꽂으시면 됩니다.

RFID USB reader에는 VCC, GND, TX 3핀을 아두이노와 연결했습니다.




오른쪽에 있는 흰색 카드가 RFID 태그입니다. 이제 이것을 가지고 리더기에 갖다 대면 삐 소리가 울리면서 정보를 읽어 옵니다.

 

소프트웨어 Coding

RFID 태그의 ID 확인

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

void loop() {
	// 태그의 ID를 저장할 곳
	char tagString[15];  
	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");
		
		// RFID 태그의 ID를 저장합니다.
		tagString[index] = readByte;  
		index++;
		Serial.println("tagString is : ");
		// RFID 태그의 ID를 출력합니다.
		Serial.println(tagString); 
	}
}

 

 

 

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

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

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

void loop() {
	//  tagString를 선언합니다
	char tagString[13]; 
	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++;
	}
	// 저장된 태그 ID와 RFID 리더에서 읽은 태그 ID와 일치하는지 확인
	checkTag(tagString); 
	// 읽어온 태그 ID를 지움
	clearTag(tagString); 
	delay(100);
}

// 저장된 태그 ID 와 RFID 리더에서 읽은 태그 ID가 일치하는지 확인 하는 함수
void checkTag(char tag[]) { 
	// 아무것도 읽지 않았을 경우, 건너뛴다. 
	if (strlen(tag) == 0 ) { 
		return; 
	}
	
	// 저장된 태그 ID와 읽은 태그 ID를 비교합니다.
	// 같을 경우 LED의 불을 켬
	if (compareTag(tag, tag1)) { 
		digitalWrite(led,HIGH);
		delay(3000);
		digitalWrite(led,LOW);
		Serial.println("LED2 on");
	
	// 읽은 태그와 일치하는 저장 태그가 없을면
	}  else { 
		Serial.println("No matching Tag, New tag name is display");
		// 읽은 태그 ID 출력
		Serial.println(tag); 
	}
}

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

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

 

 

 

소프트웨어 설명

 * 위의 두 소스는 스케치를 사용하여 작성 / 업로드 합니다. 스케치에 대한 사용법은 링크를 참고하시기 바랍니다.

 위 소스는 Tina님 블로그 아두이노 스토리 - brainwt님의 글을 참고 하였습니다.

 소스 업로드 시 디지털 0번 핀에 꽂혀 있는 RFID USB reader 의 tx 핀을 빼고 업로드를 하셔야 합니다.

 우선 자신의 RFID 태그의 ID를 알기 위해서 맨 처음의 소스를 업로드 합니다.

 


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

void loop() {
	// 태그의 ID를 저장할 곳
	char tagString[15];  
	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");
		
		// RFID 태그의 ID를 저장합니다.
		tagString[index] = readByte;  
		index++;
		Serial.println("tagString is : ");
		// RFID 태그의 ID를 출력합니다.
		Serial.println(tagString); 
	}
}

 

위의 소스를 업로드해서 리더기에 태그를 대보면 밑의 화면처럼 시리얼 모니터가 뜹니다. 마지막에 tagString is : 다음에 나오는 문자열이 자신이 가지고 있는 RFID 태그 ID입니다.
(저는 ID 맨 앞에 이상한 문자가 들어가 있는데, 다음 소스에서 필요한 부분만 맞게 편집했습니다. 자세한 건 해당 부분 소스 설명할 때 적겠습니다.)

이 RFID 태그의 ID를 잘 기억하도록 합시다. 다음 소스에서 RFID 태그를 인식할 때 ID가 필요합니다.

 

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

등록된 태그의 ID를 저장합니다. 제 RFID 태그의 ID는 6F005C9656F3이므로 tag1에 내 RFID 태그의 ID를 저장하고 불을 켤 LED와 연결된 핀 번호를 설정합니다.

 

	// 태그 리더기에 태그를 가져다 대면, 읽기 시작합니다. 
	//시리얼 포트에 읽을 데이터가 있으면
	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++;
	}

 

리더기에 태그를 갖다 대면 태그의 데이터를 전송합니다. 그러면 아두이노에서 읽어서 태그의 정보를 출력합니다.

 

// 저장된 태그 ID 와 RFID 리더에서 읽은 태그 ID가 일치하는지 확인 하는 함수
void checkTag(char tag[]) { 
	// 아무것도 읽지 않았을 경우, 건너뛴다. 
	if (strlen(tag) == 0 ) { 
		return; 
	}
	
	// 저장된 태그 ID와 읽은 태그 ID를 비교합니다.
	// 같을 경우 LED의 불을 켬
	if (compareTag(tag, tag1)) { 
		digitalWrite(led,HIGH);
		delay(3000);
		digitalWrite(led,LOW);
		Serial.println("LED2 on");
	
	// 읽은 태그와 일치하는 저장 태그가 없을면
	}  else { 
		Serial.println("No matching Tag, New tag name is display");
		// 읽은 태그 ID 출력
		Serial.println(tag); 
	}
}

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

 

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

 


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

 

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

(제 RFID 태그 ID를 조사할 때 매번 맨 앞에 이상한 문자가 들어가 있어서, 그다음 정상적인 ID가 출력되는 부분부터 비교했습니다. 이 컨텐츠를 보시고 따라 하시는 분들은 태그 ID 확인 할 때 맨 앞에 이상한 문자가 없이 바로 ID가 출력되신다면 if 문의 조건을 if(one[i] != two[i])  로 하시면 됩니다. 이러한 방법으로 자신의 태그 ID를 보시고 비교해 주시면 되겠습니다.)

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

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

RFID 리더기, 아두이노