작성자 : 황교석 / 권민혁 

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

댓글을 달아 주세요

1. 아두이노 피아노?

말 그대로 아두이노를 이용하여 구현한 피아노이다. 각 음계의 주파수는 아래의 그림과 같이 나온다. 아두이노 우노 보드의 아날로그핀은 6개로 4번쨰 옥타브의 도부터 라까지의 음계만 구현해냈다. 각각의 스위치를 아날로그 핀에 연결한 후 각각에 번호를 부여하여 음계에 대입한다. 0번:도~5번:라.

저항은 100kohm짜리를 써서 아날로그 값을 읽었을 때 100정도의 값이 나오게 된다. 이 떄 눌러진 스위치에 할당된 음계가 피에조 센서를 통해 흘러나오게 된다. 스케매틱과 브레드보드 실사는 아래에 첨부해 놓았으니 참고하길 바라며 다음은 코드이다.

            그림 1 음계표

                                   그림 2 스케매틱

                                        그림 3 실제 그림.

Posted by 전호진 트랙백 0 : 댓글 6

댓글을 달아 주세요

  1. addr | edit/del | reply 김경만 2013.11.14 01:48

    우와 진짜 신기하네요...

  2. addr | edit/del | reply 김재현 2014.01.23 11:01

    혹시 어떤 부저를 이용하여야 하는 것인가요? 제가 이회로를 이용하였을 때는 스위치를 누르지도 않았는데도 소리가 나고
    스위치를 눌러도 원하는 소리가 나지 않아요?? 어떤 문제가 있을까요? ㅠㅠ

    • addr | edit/del 전호진 2014.02.04 21:07 신고

      늦어서 정말 죄송합니다 ㅠㅠ 제가 학교에 와서 사용했던 피에조센서를 봤는데 모델명이 기입되있지 않더군요. 어떤 부저를 사용했는지 정확히 설명을 못 드리겠습니다. 소리가 마음대로 나거나 소리가 잘 나지 않는 이유는 아마도 keyval값의 설정에 문제가 있는 것 같습니다. 아날로그 입력값이 저 범위일 때 스위치가 눌린 것이라 설정하였는데 저도 이론적으로 계산한 값에서 약간 다른 값을 넣었었거든요. 또 제가 사용하고자 한 방식이 for문으로 계속 버튼마다 번호를 지정해서 한번씩 계속 돌아가면서 입력값을 확인하고 맞으면 맞는 음을 흘러나오게 하는 방식인데 지금 생각해보니 사이사이에 delay를 넣는다거나 버튼이 입력되는 부분에서 오류가 나는 알고리즘 방식인 것 같습니다. 저도 비슷한 문제가 발생했었습니다. 완벽한 글을 올리지 못해 혼선을 드린점 죄송하고 추후에 더 연구해서 글을 수정하겠습니다. 읽어주셔서 감사합니다.

  3. addr | edit/del | reply ㅇㅈㅇ 2014.02.05 17:16

    10k옴이면요??

  4. addr | edit/del | reply 전호진 2014.02.14 22:45 신고

    알고리즘과 입력값 문제 관해서 학교에 갔을 때 병렬연결을 이용해 다시 만들어볼 생각입니다 현재 센서값을 각각을 직렬연결로 했을 때 다른 저항이 없이 스위치를 누를 때마다 다른 회로가 생기는 것이기 때문에 5V전압이 모두 걸릴것이라 예상됩니다. 병렬연결로 바꿔서 실험후 새로 글을 올리겠습니다

작성자 : 김경만

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

댓글을 달아 주세요

  1. addr | edit/del | reply 백동현 2014.03.16 19:57 신고

    실제로 대학에서 많이 쓰고 있는 전자출결방식을 모의로 진행해본 프로젝트이네요. 상당히 재미있는 주제인 것 같습니다. 전자출결방식의 경우 문제점이 글에서 언급했던 것처럼 다른 사람이 찍어서 출결을 확인하는 것인데 이에 대한 방안이 좀 더 구체적이면 좋겠네요 :)

    • addr | edit/del 수아기 2014.03.18 16:07 신고

      동아리 선발하는 날 짧게나만 볼 수 있어서 반가웠고 다음에는 좀 더 많은 이야기를 나누고 후배들에게 해줄 수 있으면 좋겠구나.^^ 대학생들과 함께하는 협업 프로젝트도 재미있을 텐데 말이야.

  2. addr | edit/del | reply 2015.05.20 16:16

    https://www.sparkfun.com/products/11839
    이싸이트에서 사셨다햇는데 배송까지 몇일 걸렷는지 혹시 아시나요??
    저도 이걸로 뭔가 만들어 볼려는데 오래 걸릴까요??

  3. addr | edit/del | reply 오유령 2015.07.01 20:53 신고

    안녕하세요, 글 잘 읽었습니다.
    본 글에서 아두이노를 이용하셨는데, 아두이노 대신 노트북이나 데스크탑을 이용해서 rfid기반 출석 프로그램을 구현할 수도 있을까요?

여러가지 세밀한 각도를 움직일 상황이나 다양한 회전 움직임을 만들때 사용하는 서보모터를 아두이노로 제어해보는 방법에 대해 알아보려한다.


일단 서보모터가 사용하는 방식은 PWM이라는 방식을 사용 한다.

PWM이란?  :Pulse Width Modulation 의 약자이며

PWM 제어라고 하면 펄스의 폭을 조정하여 부하에 전력의 크기를 조절하는 것이다.

내장된 타이머카운터를 이용하는 것이 보통이다.

 

PWM의 장점은 기존의 구조에서 많은 변화를 주지않고 프로그래밍만을 통하여 손쉽게 제어가 가능하다는 것과, 타이머카운터를 사용할 경우, 모터에 PWM신호를 주기위해 프로세서에서 분담되는 작업의 량이 대폭 줄일 수 있다는 것이다. 그리고 후자를 이해하기 위해서는 타이머/카운터의 기능과 사용법을 알고있어야한다. 또한 전압이나 전류를 분배 해주기 위한 저항회로를 따로 설치하지 않아도 되므로 좀 더 좋은 효율을 기대할 수 있다.


아두이노에서 이런 PWM방식을 제어하기 위해서 analogwrite() 함수를 사용하게 되는데 아두이노에서 제공하는 이 함수는 ()안에 0부터 255범위의 숫자중 하나의 값을 넣을 수 있게 만들어져있다.

왼쪽 그림과 같게 0을 넣을 경우에는 펄스의 %가 0%이고 255인경우에는 펄스의 %가 100%인 것으로 인식하게 된다. 

여기까지 대략 PWM방식에 대하여 알아보았고 이를 이용하는 서보모터를 알아보려한다.




이런 PWM방식을 사용하는 서보모터를 사용하였는데 우리가 사용한 서보모터는 표준RC서보모터로서 회전각은 180도 이고 핀은 3개로 구성되어있다. Vcc, GND 와 디지털 입력 핀으로 이루어져있다.이 모터의 장점은 DC모터와는 달리 세밀한 조절이가능한 모터이며 원하는 각도를 최대0.5도 정도 조절할 수 있다.



여기서 잠깐!) 서보모터는 기본적으로 PWM방식을 사용하여 원래의 경우에는 analogwrite()함수를 써야하지만 서보모터의 경우에는 보편적으로 많이 사용하는 하드웨어로서 이미 아두이노측에서 함수로 만들어 놓았기 때문에 myservo.write() 라는 함수를 사용하게 되면 내부적으로 analogwrite()로 변환되어 들어가게 되므로 작동시킬수 있다.


서보모터를 사용하는 기본적인 아두이노 예제

이렇게 서보모터를 제어하는 기본적인 내용은 마치기로 하고 추가적으로 processing 과 연동하여 마우스가 움직인 만큼 서보모터를 움직일수 있는 과정을 올릴예정이다

Posted by 박상비누 트랙백 0 : 댓글 0

댓글을 달아 주세요

 작성자 : 신준범


이번에 내가 제작할 것은 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

댓글을 달아 주세요

  1. addr | edit/del | reply 2015.04.15 03:27

    비밀댓글입니다

  2. addr | edit/del | reply 이영권 2015.06.04 16:13

    gps lcd둘다 잘 작동하는데 두개를 합칠때 lcd.print에 무엇을 입력해야지
    gps값이 인식이 되는지 조언좀 부탁드립니다..

작성자: 박종화

아두이노 연결에 대한 기초 개념을 잡을 수 있도록 되어 있는 자료이다. 

원본 출처는

http://www.pighixxx.com/abc-arduino-basic-connections/

챕터별 pdf로 존재하며 lock이 걸려 있어서 병합이나 이미지 추출이 되지 않는데, 누군가 통합본을 올려 놓았고 해당 자료를 이미지로 변환 한 것임 모두 읽어보면 좋을 듯 . 이미지 파일의 순서와 파일의 순서는 살짝 다르므로 순서를 잘 살펴서 해당 자료를 읽어보기 바란다.

챕터별  pdf 파일


arduinoBasicConnections.pdf

dispa_e.pdf

s1.pdf

s11.pdf

s12.pdf

s13.pdf

s14.pdf

s2.pdf

s3.pdf

s4.pdf

s5.pdf

s6.pdf

s7.pdf

s8.pdf

s9.pdf











































Posted by 수아기 트랙백 0 : 댓글 0

댓글을 달아 주세요

대부분의 아두이노를 이용한 프로젝트를  수행 후 문서화를 할 때 혹은 그 이전 작업이라고 하더라도 Fritzing(http://fritzing.org/) 프로그램을 이용하여 회로를 그리거나 eaglecad(http://www.cadsoftusa.com/)를 이용하여 회로도를 그리는 편이다. 물론 복잡해지면 생략하는 경우도 많지만. 오늘 인터넷을 통해 Audesk가 circuits.io 와 손잡고 런칭한 123D Circuits(http://www.123dapp.com/sandboxhttp://123d.circuits.io)를 보았다. 이전 부터 시뮬레이션 프로그램들도 존재해왔고 웹에서 회로를 그리는 사이트도 존재하기는 했지만 상당히 재미있고 관심이 가는 사이트라는 생각이 든다. 일단 위의 사이트를 방문해 보면 사용이 그렇게 어렵지도 않고 간단하게 시뮬레이션도 가능하다. 또한 회로를 협업하여 작업할 수 도 있고 Fork의 개념까지 있으니 Github가 생각이 나는구나. 앞으로의 행보가 주목되는 사이트라는 생각이 든다. 사이트의 버벅거림 정도는 참아주어야 할 듯... 사용법은 간단하면 아두이노를 클릭하여 코드를 입력하고 시뮬레이션이 가능하다.

iframe 삽입으로 인해 속도가 너무 느려지는구나. 링크로 대신한다. http://123d.circuits.io/circuits/21686/



Posted by 수아기 트랙백 0 : 댓글 0

댓글을 달아 주세요

아두이노에서 ADXL345 3축 기울기센서를 이용해 기울기를 알아내는 방법을 알아보자.



기울기센서는 크게 분류해서 2종류로 나눌 수 있다.

  • 3축 기울기 정보 x, y, z를 따로따로 받는 센서

  • SDO, SDA, SDL을 이용해 하나의 정보로 받는 센서

x, y, z 축의 정보를 따로따로 받는 센서는 센서의 연결부분에 x, y, z라고 명시적으로 표현되어 있다. 대표적으로 ADXL335가 있는데, 이 센서가 ADXL345보다 쓰기 편해서 인터넷에서 찾을 수 있는 기울기 센서 관련 많은 문서들이 이 기울기 센서를 사용하고 있다. 반면 SDO, SDA, SDL을 사용하는 센서는 위의 센서보다 훨씬 빠른 속도로 기울기를 측정할 수 있는 장점이 있으나, 비교적 사용이 어려운 점이 있다. ADXL345는 3축의 정보를 하나의 값으로 받아 다른 방법이 필요하다. ADXL345를 사용하기 위해서는 다음 사이트의 예제 코드가 필요하다.

https://www.sparkfun.com/tutorials/240

위의 사이트에서 기본적인 센서 제어 코드를 받을 수 있다. 이번 글에서는 이를 약간 응용하여 시각적으로 기울기를 표현하는 것을 최종 목표로 하도록 하겠다. 


먼저 아두이노와 센서를 연결해 기울기를 읽어들이는 작업을 해보자.

ADXL345는 3축의 가속도를 센서에서 읽어 아두이노로 정보를 전송한다. 센서의 CS핀에 일정한 전압을 걸어주게 되면 센서가 활성화되어서 SDO, SDA, SDL 핀을 이용해 x, y, z축 기울기의 정보를 보내주게 된다. 다음 예제를 통해 이 방법을 알아보겠다.


1. 필요 부품

아두이노 보드, ADXL345 3축 가속도 센서, 케이블...

 

2. 회로도

센서와 보드를 다음과 같이 연결한다.

센서 - 아두이노 보드

GND - GND

VCC - 3.3V

CS   - 10

SDO - 12

SDA - 11

SCL - 13





3. 아두이노 코드


4. 실행 결과

위 코드에서 보았듯이 ADXL345는 받아들인 센서값을 16진수 6자리로 받아들이게 된다. 이를 앞에서부터 2자리씩 잘라 각 성분을 x, y, z에 대입하면 0~255 사이의 정수로 된 성분값을 얻어낼 수 있다. 이 코드를 실행시킨 결과는 다음과 같다.

이 결과를 보면 센서에서 읽어들인 x, y, z 기울기 성분값이 ','를 경계로 차례대로 출력되고 있는 것을 볼 수 있다.

 그럼 두번째로 이를 보다 시각적으로 알아보기 쉽게 하기 위해 Processing을 이용해 정육면체가 기우는 것으로 표현해보자. 

 Processing은 Arduino가 시리얼 모니터에 출력한 값을 읽어들여 사용하는 방식으로 서로 연결해 사용할 수 있다. 이를 코드로 표현해보자.


5. Processing 코드


ADXL345에서 받은 x, y, z의 성분값을 각변위벡터로 표현할 수 있으므로 정육면체가 기울어지는 정도를 x, y, z에 비례하도록 하면 받은 데이터값에 따라 기울어지는 것을 볼 수 있다. 사람의 입장에서 보았을 때 보다 직관적일 수 있도록 센서의 입장에서 보이는 데이터인 x, y, z에 좌우를 대칭변환시켰다. 실행 결과는 다음과 같다.


6. 결론

이 글을 통해 기울기 센서중 하나인 ADXL345를 아두이노에서 사용하는 방법과 이를 프로세싱에 연동해 가시적으로 표현하는 방법을 알아보았다. 기울기 센서를 이용해 실제 물체가 어떻게 기울어져있는지를 알 수 잇었다는 것이 의미가 있었던 것 같다. 아쉬웠던 점은 기울기를 측정할 수 있는 점을 이용해서 활용하지 못했다는 점이였다. 그래서 다음에는 기울기를 이용해 물체를 움직이거나 상태를 측정하는 활동을 하고 싶다.

Posted by 김건우_ 트랙백 0 : 댓글 0

댓글을 달아 주세요

Arduino and Processing Serial Communication

작성자 : 권혁원


1. 개요

아두이노는 수 많은 센서들을 이용하여 어느 분야에서든지 유용하게 쓰일 수 있따. 또한 프로세싱은 코딩을 통하여 무궁무진한 그래픽을 구현하는 언어이다. 이 두 언어가 서로 통신이 가능하다는 말을 듣고서 호기심이 생겨 어떠한 방법으로 통신을 하는지, 어떤 코드를 이용하면 통신이 가능하게 할 수 있는지 등을 알아보고싶어 이 프로젝트를 계획하였다.


2. Code

<Arduino Code (INPUT)>

<Processing Code (OUTPUT)


위의 코드를 보면 아두이노와 프로세싱의 두 언어가 서로 커뮤니케이션을 한다는 것을 보여준다. 아두이노에서 보낸 값을 프로세싱에서 받는 형식으로 코드를 작성하였다. 위의 코드는 아두이노의 코드, 아래쪽의 코드가 프로세싱 코드이다. 아두이노에서 시리얼 값을 전송하는 방법엔 print, write 이 두가지 함수가 존재하였다. 이 두 가지 함수가 각각 프로세싱에선 어떤 값으로 받아들이는 지에대한 예제를 작성한 결과이다.

<if == 51일 때>

<if == 3 일 때>

다음 각각의 그림은 print, write 이 두함수로 각각 받아들였을 때의 결과 화면이다. 이를 통하여 print는 시리얼 값을 아스키코드 값으로 넘겨준다는 것을 알 수 있으며, write는 다른 값으로 if(x == 3)으로 바꾸었을 때 write함수를 사용한 결과가 사각형이 나오는 것을 보아 write함수는 값을 변환하지 않고 그대로 넘겨준다는 것을 알았다.


3. 결론

프로세싱에서 아두이노의 신호를 받아드리러면 import processing.serial.*;, Serial port; 이 두가지 함수를 이용한다는 것을 알았으며, void setup() {port = new Serial(this, Serial.list()[port번째수],9600);}으로 아두이노 에서처럼 초기화를 시켜준 뒤, 최종적으로 port.read();로 아두이노에서 write혹은 print함수를 써서 받아들인 시리얼 값을 읽는 다는 것을 알았따. 또한 프로세싱에서 아두이노로 전송을 할 시엔 port.write();로 넘길 수 있어 아두이노에서 프로세싱으로 만이 아닌 프로세싱에서 아두이노로도 값을 전달 할 수 있어 쌍방향 통신이 가능하다는 것을 알게 되었다. 또한 write는 괄호 안의 값을 글대로 넘겨주며 print는 아스키코드로 변환하여 넘겨준다는 것 역시 알 수 있게 되었다.


4. 참고 문헌

http://wiki.processing.org

http://www.processing.org

http://www.arduino.cc






Posted by 혁원 트랙백 0 : 댓글 0

댓글을 달아 주세요

블루투스를 이용한 아두이노 탱크


1. 제작동기


평소에 로봇에 관심이 많고 좋아하고 특히 모터를 좋아하는 나는 아두이노로 탱크를 만들기로 했다. 아두이노 탱크를 만들기로 결심하고 어떻게 이 탱크를 조종할까 고민 중 스마트폰 어플리케이션 중 블루투스를 이용하는 조종기 어플리케이션을 발견하게 되고 블루투스로 조종을 할 수 있는 아두이노 탱크를 만들기로 결심하였다.



2.이론적 배경


(1)블루투스 :

 

블루투스(Bluetooth)는 휴대폰, 노트북, 이어폰·헤드폰 등의 휴대기기를 서로 연결해 정보를 교환하는 근거리 무선 기

술 표준을 뜻한다. 주로 10미터 안팎의 초단거리에서 저전력 무선 연결이 필요할 때 쓰인다. 블루투스 통신기술은

1994년 휴대폰 공급업체인 에릭슨(Ericsson)이 시작한 무선 기술 연구를 바탕으로, 1998년 에릭슨, 노키아, IBM,

도시바, 인텔 등으로 구성된 ‘블루투스 SIG(Special Interest Group)’를 통해 본격적으로 개발됐다. 이후 블루투스

SIG 회원은 급속도로 늘어나 2010년 말 기준 전세계 회원사가 13,000여 개에 이른다.


(2) DC 모터 :

일반적으로 모터는 전력을 이용하여 회전운동의 힘을 얻는 기계이다. 전류에서 돌림힘을 끌어내는 원리는

"자기장 속을 흐르는 전류에는 자기력이 작용한다"라는 것이며, 이 자기력의 방향은 자계와 전류 방향에

직각이 된다. 이 관계는 플레밍의 왼손 법칙으로 표시된다. DC모터는 모터 중 직류 전원을 사용하는 모터이다.

 

(3) 서보 모터 : 서보모터란 세 가지 연결부위를 가지고 있는 모터로 하나는 GND(접지), 다른 하나는 5V,

나머지 하나는 입력신호가 들어오는 전선으로 사용하며 입력된 값만큼 모터를 특정 방향으로 돌리는

모터이다. 여기에서는 휴대폰과 연결하여 아두이노의 신호값을 받아서 포신을 회전시키는데 이용된다.


3. 제작기


일단 아두이노 탱크의 외형제작을 위해 '로보로보'사의 프레임들과 모터 4개를 다루기 위해 모터 드라이브를 썼다.

(물론 메인보드랑 프로그램은 아두이노 것을 썼다.)

로보로보 사의 모터들을 보면 DC모터는 선이 2개, 서보모터는 선이 3개가 있는데 나는 DC모터의 빨간색 선은 VCC

검은색 선은 GND이고 서보모터의 빨간색 선은 VCC 검은색 선은 GND 마지막으로 DC모터와 달리 추가적으로 하나

더 있는 노란색 선은 서보모터를 추가적인 조작(예를 들어 각도값을 주어 동작한게하는 것 등등)을 할 수 있게 한다.


(좌 DC모터 우 서보모터)


다음으로 여러가지의 DC모터를 조작하기 위한 DC모터 드라이브란

렇게 생겼고 모터를 여러개 사용 가능하도록 해준다. 보드 하나당 최대 모터를 2개까지 연결가능하며

드라이브 보드가 여러개만 2개 이상도 가능하다. 왼쪽의 핀4개(사진은 8개가 있지만 제가 사

용한 보드는 왼쪽에 핀이 4개 있었다.)는 DC모터와 연결하는 부분으로 각 모터당 핀 2개,

GND와 VCC를 필요로 하였고 왼쪽에 핀 12개는 6개씩 각 모터랑 연결되어 메인보드로 부터 신호를 받아내는 부분이다. 

위 드라이브를 보시면 오른쪽 핀들 옆에 화살표(GND를 알리는 화살표)가 있는데 그 방향을 기준으로

세로로 3개씩 한 세트의 핀이다. 첫번째 세트의 핀, 두번째 세트의 핀, 세번째 세트의 핀, 네번째 세트의 핀

각 세트마다 아래(화살표가 있는 라인)에서부터 검은색, 빨간색, 노란색 선을 끼우시면 된다.

 

연결은 첫번째 노란색 선(a)을 6번 포트에 두번째 노란색 선(b)을 7번 포트에 연결했습니다. 이것은 제가 모터 테스트 삼아 사용했던 프로그램으로 a에 LOW, b에 HIGH를 하면 전진 a에 HIGH, b에 LOW로 하니 후진을 하였다. 

그리고 이제 탱크의 포신을 조작할 서보모터를 연결한다. 아래에 포신의 좌우를 조작할 서보모터 하나 상하를 움직일 서보모터 하나 고무줄을 발사하기 위한 서보모터 추가적으로 하나 이렇게 연결한다. 

1번 서보모터가 고무줄을 발사하기 위한 서보모터
2번 서보모터가 포신을 상하로 움직이기 위한 서보모터
3번 서보모터가 포신을 좌우로 움직이기 위한 서보모터이다.


그리고 블루투스 모듈이다.

사용한 블루투스 모듈은 DF-Robot Bluetooth V3라는 블루투스 모듈이다.

 

블루투스 모듈의 핀을 보면 좌측부터 GND VCC NC RXD TXD GND 3V3이 있는데 그 중 GND VCC RXD TXD를

사용합니다. TXD와 RXD는 어디에 연결하는지 아래 코드에 나와있다.


스마트폰의 블루투스 어플리케이션은 공개적으로 무료로 배포되는 어플리케이션을 사용했다.  

'bluetooth controller'라는 어플로 사용하기 쉽고 플레이스토어에서 다운로드 가능하다.



이렇게 아두이노로 블루투스 탱크의 외부를 제작한 후 프로그램을 짭니다.

선이 너무 많아 회로도 그리기도 어렵고 보셔도 알아보기 힘드실 것 같아 설명으로 하겠다.


사용한 아두이노는 아두이노 mega보드를 사용하였다. 포트가 부족해서 UNO로는 제작이 어려울 것 이다.

LF는 LEFT FORWARD로 왼쪽 앞바퀴를 뜻하고 RF는 RIGHT FORWARD로 오른쪽 앞바퀴를 뜻한다.

LB는 LEFT BACK으로 왼쪽 뒷바퀴를 뜻하고 RB는 RIGHT BACK으로 오른쪽 뒤바퀴를 뜻한다.

왼쪽 앞바퀴의 첫번째 노란색 선은 6번 포트 두번째 노란색 선은 7번 포트에 연결을 한다.

왼쪽 뒷바퀴의 첫번째 노란색 선은 8번, 두번째 노란색 선은 9번 포트에 연결을 한다.

오른쪽 앞바퀴의 첫번째 노란색 선은 10번, 두번째 노란색 선은 11번 포트에 연결을 한다.

오른쪽 뒷바퀴의 첫번째 노란색 선은 12번, 두번째 노란색 선은 13번 포트에 연결을 한다.

그리고 블루투스 모듈의 TX선은 62번 포트(A8 포트), RX선은 63번 포트(A9 포트)에 연결을 한다.

BS는 BOTTOM SERVO MOTOR로 포신의 좌우 운동을 담당하는 서보모터이다. 5번 포트에 연결한다.

US는 UPDOWN SERVO MOTOR로 포신의 상하 운동을 담당하는 서보모터이다. 38번 포트에 연결한다.

LS는 LAUNCH SERVO MOTOR로 고무줄 발사를 담당하는 서보모터이다. 22번 포트에 연결한다.


그리고 블루투스 신호는 1~9까지 수신이 가능한데 나는 각각

블루투스 신호 1일때는 전진 2일때는 후진 3일때는 좌회전 4일때는 우회전 5일떄는 포탑 좌회전 6일때는 포탑 우회전 7일 때는 포탑 위로 8일때는 포탑 아래로 9일떄는 신호 9가 한번 오면 탱크를 정지하게 하고 두번 눌리면 고무줄을 발사하게 한다. 


4. 동영상







참고 문헌 및 사이트
1. 블루루스 :  서동민 / IT동아 기자 네이버 캐스트 http://navercast.naver.com/contents.nhn?rid=122&contents_id=5531

2. 모터 : 위키백과 http://ko.wikipedia.org/wiki/%EC%A0%84%EB%8F%99%EA%B8%B0, 블로그 글 http://makethat.tistory.com/3

3. 모터 사진 및 모터 드라이브 사진 : 로보로보 쇼핑몰 http://www.roborobo.co.kr/shop/depth_1.php



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

댓글을 달아 주세요

  1. addr | edit/del | reply 햄스터 신준범 2013.10.07 22:10 신고

    우와 잘 만드셨네요 제작기간은 얼마나 걸리셨나요?