'Arduino/응용 프로젝트 (2학기)'에 해당되는 글 3건

  1. 2015.07.26 RFID를 활용한 가위바위보 게임 구현하기
  2. 2013.11.03 RFID를 이용한 효율적인 출석체크 시스템만들기 (4)
  3. 2013.09.11 GPS신호를 받아 LCD로 출력하기 (2)

작성자 : 황교석 / 권민혁 

2015년 경기북과학고등학교 과학 동아리 학술 대회를 맞이하여 저희 동아리 SADA에서는 두 명씩 팀을 이루어 프로젝트를 진행하였습니다. 어떤 프로젝트를 진행할지 많이 고민하기도 하였는데, 원래 계획하였던 아두이노를 활용한 LED 테트리스의 구현에 차질이 생겨 “RFID를 활용한 가위바위보 게임프로젝트를 진행하게 되었습니다. 다소 간단하고 쉬운 부분도 없지 않지만 이번 프로젝트를 바탕으로 조만간 아두이노를 활용한 LED 테트리스프로젝트에 도전해보겠습니다!

 

그럼 지금부터 “RFID를 활용한 가위바위보 게임프로젝트를 소개하도록 하겠습니다.

 

이번 프로젝트의 큰 흐름은 다음과 같습니다.

 

1. RFID를 이용하여 아두이노와 연결한 RFID 판독기가 RFID 태그 또는 카드를 잘 인식하는지 확인하기!

2. RFID를 이용한 가위바위보의 알고리즘을 생각하고 그것을 프로그래밍으로 구현하기!

3. LCD 모니터를 활용하여 가위바위보 결과를 출력하기!

4. 이후 다양한 가위바위보 미션들을 추가하며 즐겁게 즐기기!

 

이 세 가지의 과정에 따라 이번 프로젝트는 진행이 되었습니다.

 

프로젝트를 시작하기에 앞서 이번 프로젝트에 필용한 준비물들을 한번 알아보겠습니다.

 

준비물 : 아두이노 우노, 브래드 보드, RFID 태그(3), RFID 카드(3), RFID 판독기(RFID-RC522), LCD, 케이블, 외부전원

 

 





 

201311월 게시되었던 “RFID를 이용한 효율적인 출석체크 시스템 만들기에서 사용한 RFID 판독기와 카드, 태그와 이번 프로젝트에서 사용한 RFID 세트는 다소 차이가 있으니 잘 구분하여 사용해주기 바랍니다.

 

RFID에 대한 설명은 http://makethat.tistory.com/29 에 잘 나와 있으니 이 글을 참고하셔도 좋을 것 같습니다!

 

그럼 먼저, RFID 판독기가 RFID 카드와 태그를 인식할 수 있도록 구현해보도록 하겠습니다. 하드웨어를 구성하기 위해 브레드보드, RFID 판독기와 LCD, 아두이노 우노, 외부전원을 준비해 다음의 회로를 참고하며 하드웨어를 구성하였습니다.


하드웨어를 구성할 때에는 RFID3.3V에 꽂는 것을 주의해 주시기 바랍니다.

다음의 회로에서는 LCD 백라이트를 더 밝게 하기 위하여 외부전원을 LCD에 연결하였다는 점도 숙지해주시기 바랍니다.

 

회로도에 따라 하드웨워를 모두 구성하였으면 카드와 태그를 인식하여 각각의 고유 핀번호를 알아내야 합니다.




 

각각의 핀번호를 알아낸 것을 기록을 하였으면, 다음으로는 가위바위보의 알고리즘을 생각하여 프로그래밍을 진행하여야 합니다.

 

저희가 고안한 가위바위보 알고리즘은 다음과 같습니다!



그림을 참고하여 설명하염 보면 배열을 만들어서 가위 바위 보에 각각 숫자를 넣은 다음에 그것들의 차를 계산해서 승 패를 가리는 알고리즘을 생각해보았습니다.

 

알고리즘을 세우는 이 단계에서는 프로그래밍을 하는 여러분들의 다양한 아이디어들이 나올 수 있다고 생각되니, 자신만의 알고리즘을 세우는 것도 좋을 것 같습니다.

 

계획한 알고리즘에 따라 프로그래밍을 진행할 차례입니다. 지금까지 갈고 닦아온 자신의 코딩실력을 어김없이 보여주세요!

 

본 프로젝트에서 짠 코드는 밑에 참조하였습니다.

프로그래밍을 할 때에는 결과를 LCD를 통해 출력하는 부분까지 고려를 하여 진행하여야 합니다.

 



 

다음 사진처럼 LCD 모니터에 결과가 잘 출력되는지를 확인을 하였으면, 게임의 결과에 따라 다양한 벌칙이나 미션들을 진행함을 통해 게임을 즐겨주세요!!

 



 

혹시 소스코드가 궁금하신 분은 올려드리도록 하겠습니다. (AddicoreRFID Library가 필요합니다.) Addicore RFID quickstart의 예제를 가져와서 가위바위보 알고리즘과 LCD 화면 출력 코드를 넣었습니다.

 

출처 : 아두이노 UNO : arduino.cc

RFID : addicore.com

Battery : 구글 검색 battman.co.kr

LCD : 구글 검색 miniinthebox.com

가위바위보 손그림 : 구글 검색 kensaku.tistory.com


<code>

#include <AddicoreRFID.h>

#include <SPI.h>

#define uchar unsigned char

#define uint unsigned int

#include <LiquidCrystal.h>

 

uchar serNumA[5];

uchar fifobytes;

uchar fifoValue;

 

AddicoreRFID myRFID;

 

const int chipSelectPin = 10;

const int NRSTPD = 5;

 

#define MAX_LEN 16

 

LiquidCrystal lcd(3,4,6,7,8,9);

 

int A[2] = {6,12};

 

void setup() {

lcd.begin(16, 2);

Serial.begin(9600);

SPI.begin();

pinMode(chipSelectPin,OUTPUT);

digitalWrite(chipSelectPin, LOW);

pinMode(NRSTPD,OUTPUT);

digitalWrite(NRSTPD, HIGH);

lcd.clear();

myRFID.AddicoreRFID_Init();

}

 

void loop() {

int count = 0;

uchar i, tmp, checksum1;

uchar status;

uchar str[MAX_LEN];

uchar RC_size;

uchar blockAddr;

String mynum = "";

 

str[1] = 0x4400;

status = myRFID.AddicoreRFID_Request(PICC_REQIDL, str);

if (status == MI_OK) {

Serial.println("RFID tag detected");

Serial.print(str[0],BIN);

Serial.print(" , ");

Serial.print(str[1],BIN);

Serial.println(" ");

}

status = myRFID.AddicoreRFID_Anticoll(str);

if (status == MI_OK) {

checksum1 = str[0] ^ str[1] ^ str[2] ^ str[3];

Serial.println("The tag's number is : ");

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);

if(str[0]==35) A[0] = 1;

if(str[0]==83) A[0] = 2;

if(str[0]==164) A[0] = 3;

if(str[0]==149) A[1] = 1;

if(str[0]==180) A[1] = 2;

if(str[0]==84) A[1] = 3;

Serial.println(A[0]);

Serial.println(A[1]);

delay(1000);

}

if((A[1]-A[0])==1) {

lcd.print("card Win");

count = 1;

}

if((A[1]-A[0])==-1){

lcd.print("tag Win");

count = 1;

}

if((A[1]-A[0])==2){

lcd.print("tag Win");

count = 1;

}

if((A[1]-A[0])==-2){

lcd.print("card Win");

count = 1;

}

if((A[1]-A[0])==0){

lcd.print("draw");

count = 1;

}

if(count ==1){

while(1);

}

delay(1000);

myRFID.AddicoreRFID_Halt();

}

 


Posted by 황교석 트랙백 0 : 댓글 0

작성자 : 김경만

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>

Posted by 김경만 트랙백 0 : 댓글 4

 작성자 : 신준범


이번에 내가 제작할 것은 GPS센서를 통해 GPS신호를 수신한 후 LCD로 출력하는 시스템을 만들 것이다.

1. 이론적 배경

GPS란?

GPS(Global Positioning System 글로벌 포지셔닝 시스템) 또는 범지구위치결정시스템은 현재 완전하게 운용되고 있는 유일한 범지구위성항법시스템이다. GPS에서는 중궤도를 도는 24개(실제는 그 이상)의 인공위성에서 발신하는 마이크로파 GPS 수신기에서 수신하여 수신기의 위치벡터를 결정한다.

출처 : http://ko.wikipedia.org/wiki/GPS

 LCD

액정 디스플레이(液晶 Display) 또는 액정 표시장치(液晶表示裝置), 줄여서 LCD(liquid crystal display)는 얇은 디스플레이 장치의 하나이다. 전력이 적게 소모되기 때문에 휴대용 장치에 많이 쓰인다.

하나의 화소는 두 개의 투명 전극이 연결된 액정으로 되어 있고, 양쪽에는 서로 수직인 편광 필터가 있다. 평상시에는 액정의 일정한 배열이 빛을 통과시키지만 전압을 걸면 액정의 배열이 고정되어 빛이 통과하지 못하고 차단된다.

출처 : http://ko.wikipedia.org/wiki/%EC%95%A1%EC%A0%95_%EB%94%94%EC%8A%A4%ED%94%8C%EB%A0%88%EC%9D%B4

 

2. 연구 방법



사용한 LCD연결


먼저 처음으로 LCD만을 이용하여 LCD를 사용해보았다.

사용한 코드는 예제에도 있는 Hello world 코드이다.

 

다음으로 GPS센서를 이용해보았다.

사용한 GPS모듈 GTPA013이다.

rx는 2번 포트에 tx는 3번 포트에 연결을 한후 Vin과 3.3V를 연결해주고 GND를 연결해준다. 그리고 adafruit_GPS라는 이름의 라이브러리(인터넷 서핑을 하면 금방 찾을 수 있을 것이다.)를 추가 한 다음에 Adafruit_GPS.h의 헤더파일을 추가한 후 예제에 있는 parsing이라는 프로그램을 이용한다.

 

 

 

 

그리고 baud를 115200으로 맞추면 다음과 같이 gps 신호를 수신받을 수 있다.

이렇게 두 가지를 병합해서 사용하면

 

다음과 같이 LCD에 GPS 값을 띄울 수 있다.    

LCD와 GPS센서를 동시에 쓸 때는 LCD만 썼을 떄의 5, 4, 3, 2포트를 10,9,8,7포트로 옮겨 사용하였다.

그리고 GPS신호가 2초마다 갱신되므로 LCD에 나오는 값도 2초마다 갱신되게 하였다.

 

3. 결론

LCD와 GPS를 동시에 이용할 수 있다.
허나 GPS값을 받았을 때 시간에 9시간의 오차가 있었다. 이번 이 프로젝트를 할 때에는 시간 코드에 +9를 하여 보정하긴 했지만 정확하게 하기위해서는 3시(보정한 시간은 12시)가 넘어가는 순간의 시간도 보정해주어야 된다.
병합 코드가 날아가버리는 바람에 업로드 할 순 없었지만 조만간 다시 코딩 해보아야 겠다.

Posted by 햄스터 신준범 트랙백 0 : 댓글 2