본문 바로가기

Arduino/응용 프로젝트 (2학기)

RFID를 이용한 효율적인 출석체크 시스템만들기

작성자 : 김경만

RFID를 이용한 효율적인 출석체크 시스템만들기


1. 개요

경기북과학고등학교의 방과 후 자율학습시간, 모든 학생들이 학습실에서 공부하는 것은 아닙니다. 200명에 가까운 학생들은 컴퓨터실, 정보검색대, 각종 세미나실, 실험실 등 학교 구석구석에서 활동합니다. 사감선생님들은 모든 학생들이 어디서 활동하는지 확인하고 활동하지 않는 학생들을 찾아야하는데 학생들이 잠깐 어디를 다녀왔다면 출석을 제대로 확인할 수 없는 경우가 존재합니다. 또한 자율학습 시간 5분전 착석이 원칙이지만 제대로 확인할 수 없는 경우가 대부분입니다. 이렇게 직접 학교를 돌아다니며 출석을 확인하고 5분전 착석을 확인할 수 없는 비효율적인 출석체크를 효율적으로 하기위해 RFID를 접목시켰습니다. 이 제작의 목적은 학생들이 각자 RFID 태그를 가지고 있으며 활동장소에 리더기가 설치되어 있다고 가정하고 출석체크 시스템을 구현해보는 것입니다. 시스템은 RFID태그를 RFID리더기에 인식시키면 컴퓨터에서 RFID리더기와 연결된 아두이노에게 받은 태그의 데이터를 parallax daq를 이용하여 액셀로 보내는 것입니다. 이때 태그에 있는 학생정보와 컴퓨터의 시간정보를 합쳐서 액셀에 학생정보, 시간, 장소를 나타냅니다. 사감선생님은 액셀에 목록화된 데이터들을 보시는 것입니다. 

준비물

아두이노 기판, 브래드 보드, RFID 태그(많을수록 좋다, 필자는 2개를 사용했다), RFID 리더기

여기서 잠깐, RFID란?

RFID 기술이란 전파를 이용해 먼 거리에서 정보를 인식하는 기술을 말합니다. 여기에는 RFID 태그와, RFID 리더기가 필요합니다. 태그는 안테나와 집적 회로로 이루어지는데, 집적 회로 안에 정보를 기록하고 안테나를 통해 판독기에게 정보를 송신합니다. 이 정보는 태그가 부착된 대상을 식별하는 데 이용되며 사진처럼 도어락이나 버스카드에 응용됩니다. 이 시스템에서 태그는 학생 정보를 담고있습니다. 

필자는 RFID 리더기와 태그를 https://www.sparkfun.com/products/11839 에서 주문하여 제작하였습니다. 
RFID Starter Kit이며 태그카드 2개, 리더기 ID-12LA와 이 리더기를 쉽게 회로에 연결할 수 있도록 도와주는 RFID board로 이루어져 있습니다. 
                                        

            <RFID board>                                               <RFID 리더기>                                                <RFID 태그 2장>

2. Breadboard & Schematic

RFID 리더기는 RFID board에 핀을 맞춰 연결시킬 수 있기 때문에 RFID board와 아두이노를 연결시키면 됩니다.
RFID board와 아두이노의 연결

리더기가 태그에 있는 정보를 받기 위해서는 기본적인 회로부터 연결해야 합니다. RFID board에는 8개의 핀이 있는데 각 핀의 이름은 뒷면에 써져 있습니다. 먼저 첫번째 핀은 VCC로 아두이노의 5V와 연결합니다. 두번째 핀은 GND로 아두이노의 GND와 연결시킵니다. 이제 기본적인 회로는 연결이 되었으며 리더기와 아두이노가 정보를 송수신 할 수 있도록 RX, TX에 연결을 해주어야 합니다. RX는 수신부를 의미하며 TX는 송신부를 의미합니다. RFID board에는 세번째에 TX, 네번째에 TXR이 있는데 TXR은 RX라고 생각하면 됩니다. 필자는 TX를 6번핀, RX를 5번핀에 연결했습니다.


                     <RFID board와 아두이노의 연결>

3. Code

먼저 아두이노에 있는 SoftwareSerial 이란 기능을 이용할 것입니다. SoftwareSerial은 시리얼 통신을 위한 통로를 생성해주는 것이라 생각하면 됩니다. 즉 아두이노와 컴퓨터가 시리얼 통신을 하는것 말고도 아두이노와 RFID가 시리얼 통신을 또 할 수 있다는 의미입니다. 즉 RFID board의 TX와 RX를 아두이노와 연결한것은 이 SoftwareSerial을 이용하기 위한것입니다. SoftwareSerial의 이용방법은 간단합니다. 아두이노 코드의 처음부분에 SoftwareSerial mySerial(6,5); 을 입력해줍니다. 이 코드는 mySerial이란 이름을 가진 새로운 시리얼통신을 사용하겠단 의미이며 바꿔도 상관 없습니다. 가로 안에 (6,5)는 아두이노 입장에서의 (RX, TX) 핀번호를 입력해줍니다. 저는 RFID board의 TX를 6번핀에 연결했습니다. RFID board의 송신부는 아두이노에서는 수신부가 될 것입니다. 그래서 RX에 6을 쓴것이며 마찬가지로 RFID board의 수신부는 아두이노의 송신부이기 때문에 (RX, TX) 를 (6,5)로 썼습니다. 아두이노 코드의 setup 함수에서는 mySerial.begin(9600);을 써줍니다. 속도를 지정해주는 부분이며 앞에는 시리얼의 이름이 들어갑니다. 이렇게 두줄의 코드만으로 사용 준비가 끝났으며 평소 시리얼통신을 이용하는 것과 같은 사용방법을 가집니다. 

이제 parallax daq에 대해 설명하겠습니다. parallax daq는 아두이노와 액셀을 연결할 수 있는 프로그램으로 아두이노 코드상에서 액셀에 어떠한 데이터를 출력할지 정하며 컴퓨터와 아두이노의 시리얼통신을 이용합니다. 다음 첨부파일 두개는 다운 파일과 액셀파일입니다. 액셀파일은 매크로 프로그램이 있으며 바로 사용하실 수 있습니다. 다음 사진은 매크로 프로그램의 사진으로 포트와 속도를 설정하게 되어있습니다. 아두이노에서 컴퓨터와 연결했던 포트와 설정했던 시리얼속도로 맞춰주시면 됩니다. 

plx_daq_install.exe

RFID_Tag_info_final.xlsm

이제 아두이노 코드에서의 parallax daq 사용법에 대해 소개하겠습니다. 현재 RFID와 아두이노 그리고 컴퓨터는 두개의 시리얼통신에 의해 연결되어 있으며 아두이노에서 RFID에 의해 받은 정보를 액셀로 넘기면 됩니다. 먼저 액셀과 아두이노는 SoftwareSerial이 아닌 그냥 컴퓨터와 연결되는 시리얼로 연결되어 있기 때문에 Serial.~~을 사용합니다. setup함수 부분에서 Serial.println("CLEARDATA");와 Serial.println("LABEL,Time,number,name");을 씁니다. Serial.println("CLEARDATA");는 데이터를 보내기 전 액셀에 있는 모든 데이터를 지우겠다는 것이며 Serial.println("LABEL,Time,number,name");는 액셀의 맨 윗줄에 라벨을 다는 것입니다. 이 라벨 밑에 데이터가 목록화되는 것이며 필자는 RFID태그가 인식된 시간과 그 태그의 학생정보와 이름이 필요하기 때문에 이렇게 설정했습니다. 그리고 loop함수에는 실제로 라벨 밑에 RFID에게 받은 학생정보를 기입할 수 있는 코드를 적어야 할것입니다. Serial.print("DATA,TIME,"); Serial.print(x); Serial.print(","); Serial.println("Kim kyoung man"); 라는 코드가 필요합니다. Serial.print는 액셀에 출력하겠다는 의미이며 액셀의 셀은 ,에 의해 구분됩니다. 먼저 DATA를 써주고 그 다음은 ,로 구분지으면서 라벨에 맞는 정보를 쓰면 됩니다. TIME을 쓰면 시간을 출력할 수 있게 되며 필자는 x라는 int형 변수에 1504를 저장시켰습니다. 이렇게 1504라는 학번과 함께 이름을 출력할 수 있게 됩니다. 이름을 영어로 입력한 이유는 아두이노 코드상에서 한글을 사용할 수 없었기 때문입니다. 

마지막으로 태그카드 구분방법에 대해 설명하겠습니다. 이제 우리는 RFID가 주는 정보를 받아들여서 어떠한 학생인지 분류만 하면 됩니다. 그러면 위에서 설명드린 방법으로 액셀에 데이터를 출력할 수 있게 됩니다. RFID의 정보를 받아들이는 방법은 mySerial.read() 입니다. 그런데 태그카드의 정보는 알파벳과 숫자의 조합으로 이루어져 있고 이 함수는 한글자씩 읽어 버퍼에 저장시킵니다. 그래서 한글자한글자를 받아 배열로 저장시킨 후 전체 ID를 가지고 있는 학생 태그정보돠 비교해야만 했습니다. 하지만 태그카드가 많지 않을때 한글자씩만 읽어도 구분이 가능한 방법이 존재했습니다. 바로 각자 태그카드가 자신만 가지고 있는 특정 숫자나 알파벳이 있었습니다. 필자는 이러한 방법으로 태그카드 두개를 분류했습니다. 그래서 최종적인 아두이노 코드는 다음과 같습니다.


4. 완성 사진

두 종류의 태그카드를 6초차이로 인식시켰을 때 액셀의 화면입니다. 두번의 데이터가 출력된 것을 볼 수 있습니다.

약 30초 이후에 다시 필자의 학생정보가 담긴 태그카드를 인식시켰을 때의 액셀 화면입니다. 한줄의 데이터가 추가된 것을 볼 수 있습니다.


5. 결론

RFID를 어디에 응용할 수 있을까 생각하던중 출석체크가 떠올라 제작하게 되었습니다. 제작을 하면서 가장 효율적인 출석체크 방법은 무엇일까에 대한 생각을 많이 했습니다. 사감선생님의 컴퓨터에 학교의 각 장소에서 인식된 학생정보가 출력되게 한다면 어떨까 생각했지만 친구들의 태그카드를 대신 찍어주는 문제가 생기기 때문에 이러한 시스템이 가장 효율적일 것이라는 결론을 내렸습니다. 각 장소에서 인원수를 직접 셀 수 있기 때문입니다. 제작을 하면서 한글이름을 액셀에 띄울 수 없다는 것이 가장 아쉬웠지만 parallax daq 프로그램의 사용방법이나 SoftwareSerial에 대해 혼자서 탐구하고 사용하는데 성공했다는 것에 만족했습니다. RFID 태그가 많아진다면 학생정보를 분류하는 방법이 배열을 사용하는 방법으로 바뀌어야 한다고 생각했으며 액셀의 매크로함수에 대해 공부해본다면 한글데이터를 출력할수도 있을거란 생각도 해보았습니다. 


출처 <RFID 사진 : 구글 검색 http://www.kaba.co.nz/Products-Solutions/Lodging-Systems/34792/remote-access-controllers-racs.html>
       <RFID Starter Kit 구성사진 : https://www.sparkfun.com/products/11839>