본문 바로가기

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

RFID를 활용한 가위바위보 게임 구현하기

작성자 : 황교석 / 권민혁 

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

}