프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

쥬크박스 피규어 거치대 만들기

2014-09-17 17:10:56

개요


출처 : 페이퍼토이 '모모트'의 MARVEL시리즈 www.momot.co.kr

간편하게 직접 만들수 있는 페이퍼토이인 '모모트'입니다.
기본적으로 쇼케이스가 동봉되어 있지만, 저희는 메이커 답게 특별한 쇼케이스를 만들어 보겠습니다.
바로 쥬크 박스 기능을 넣어 볼텐데요, RFID모듈과 MP3쉴드를 이용하여
태그를 가져다 대면, 이를 인식하여 저장된 음악을 불러오는 기능을 만들어 보겠습니다.
물론, 이 원리를 이해하신 분들은 다른 방법으로 적용이 가능합니다.

출처: 말하는 봉제 인형 - www.ijdesign.org

출처 : RFID 쥬크박스 - hackaday.com

모듈을 인형안에 삽입하여 말하는 인형을 만들수도 있고,
태그를 여러개 사용하여 여러개의 음악 혹은 음성을 삽입할수 있습니다.


미리보기 동영상

필요한 사전지식

부품목록

NO 부품명 수량 상세설명
1 오렌지 보드 1  아두이노 호환보드
2 RFID 리더기(ID-12LA) 1 RFID 
3 RFID USB Reader(SEN-09963) 1 RFID 
4 Mp3 쉴드 1 VS1053 breakout board 
5 9v배터리 1 배터리
6 9v 어댑터 1 9v 어댑터 
7 점퍼케이블 3 점퍼케이블 
8 스피커 1 스피커
부품명 오렌지 보드 RFID 리더기
(ID-12LA)
RFID USB Reader
(SEN-09963)
Mp3 쉴드 9v배터리
파트 x1 x1 x1 x1 x1
부품명 9v 어댑터 점퍼케이블 스피커
파트 x1 x3

x1

하드웨어 Making


메뉴얼대로 조립해 주세요.(딱풀보다 순간접착제 사용이 만들기 수월합니다.)


하드웨어 연결은 모듈의 Tx단자를 0번(RX단자)에 연결하고,
Vcc 는 5v , Gnd 는 Gnd에 연결해 줍니다.


하판 측면에 칼집을 내어 스피커 단자가 들어갈수 있게 해줍니다.


모듈을 양면테이프로 고정해 줍니다.



최종 완성된 모습입니다.

회로도


브레드보드 레이아웃

소프트웨어 Coding

아래의 코드를 아두이노에 업로드 합니다.
/*
  RFID JUKEBOX
by www.kocoafab.cc
*/

#include <SPI.h>           // SPI library
#include <SdFat.h>         // SDFat Library
#include <SdFatUtil.h>     // SDFat Util Library
#include <SFEMP3Shield.h>  // Mp3 Shield Library

SdFat sd; //  SD카드를 사용하기 위한 오브젝트를 생성합니다. 
SFEMP3Shield MP3player; //  Mp3 라이브러리를 사용하기 위한 오브젝트를 생성합니다.


const uint8_t volume = 0; // MP3 Player volume 0=max, 255=lowest (off)
const uint16_t monoMode = 1;  // Mono setting 0=off, 3=max

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

boolean state = 0;


void setup()
{
  Serial.begin(9600);
  Serial.println("RFID example start !"); 
  Serial.println('\n');
  /* Set up all trigger pins as inputs, with pull-ups activated: */
 

  initSD();  // Initialize the SD card
  initMP3Player(); // Initialize the MP3 Shield
}

// All the loop does is continuously step through the trigger
//  pins to see if one is pulled low. If it is, it'll stop any
//  currently playing track, and start playing a new one.
void loop()
{
  char tagString[13]; //  tagString를 선언합니다
  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");
    if(readByte >= '0' && readByte <= 'F'){
      Serial.print("readByte input : ");
      Serial.println(readByte);
      tagString[index] = readByte;
      index++;
    }
  }
  
  checkTag(tagString); // 저장된 태그 ID와 RFID 리더에서 읽은 태그 ID와 일치하는지 확인
  clearTag(tagString); // 읽어온 태그 ID를 지움
  delay(100); 
}


void initSD()
{
  
  if(!sd.begin(SD_SEL, SPI_HALF_SPEED)) 
    sd.initErrorHalt();
  if(!sd.chdir("/")) 
    sd.errorHalt("sd.chdir");
}

void initMP3Player()
{
  uint8_t result = MP3player.begin(); 
  if(result != 0) 
  {
    
  }
  MP3player.setVolume(volume, volume);
  MP3player.setMonoMode(monoMode);
}

void checkTag(char tag[]){
// 저장된 태그 ID 와 RFID 리더에서 읽은 태그 ID가 일치하는지 확인 하는 함수
  if (strlen(tag) == 0 ){ // 아무것도 읽지 않았을 경우
   return; 
  }

 if(compareTag(tag, tag1)){ // 저장된 태그 ID와 읽은 태그 ID를 비교합니다.
 
 Serial.println("sucess tag");
 {   
 
    {
      if (state == 1){
        MP3player.stopTrack();
        state = 0;
      }else{
      
      uint8_t result = MP3player.playTrack(1);


      if (result == 0)  //만약 결과가 0일 경우 1번 트랙을 재생합니다.
      {
        // Success
      }
      else 
      {
        
      }
        state = 1;
      }
    }
  }
 }  else { // 읽은 태그와 일치하는 저장 태그가 없을면
   Serial.println("No matching Tag, New tag name is display");
   Serial.println(tag); // 읽은 태그 ID 출력
 }
}

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

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


1. 라이브러리 설치하기
아래의 주소에서 라이브러리를 다운받고,
MP3-TF.zip > 압축파일을 해제하여 <SdFat>폴더와 <SFEMP3Shield>폴더를 아래의 경로에 넣어주세요.
Documents(문서) > Arduino > Library

2. 스케치 설명

#include <SPI.h>           // SPI library
#include <SdFat.h>         // SDFat Library
#include <SdFatUtil.h>     // SDFat Util Library
#include <SFEMP3Shield.h>  // Mp3 Shield Library

SdFat sd; //  SD카드를 사용하기 위한 오브젝트를 생성합니다. 
SFEMP3Shield MP3player; //  Mp3 라이브러리를 사용하기 위한 오브젝트를 생성합니다.
SdFat과 SFEMP3Shield 라이브러리를 불러옵니다.
const uint8_t volume = 0; // MP3 Player volume 0=max, 255=lowest (off)
const uint16_t monoMode = 1;  // Mono setting 0=off, 3=max

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

boolean state = 0;
볼륨과 모노/스테레오 설정을 할수 있습니다.
13개의 문자열 입력을 통해 RFID 태그의 고유번호를 인식합니다.
boolean을 통해 접촉유무를 확인합니다.
if(compareTag(tag, tag1)){ // 저장된 태그 ID와 읽은 태그 ID를 비교합니다.
  Serial.println("sucess tag");
 {   
 
    {
      if (state == 1){
        MP3player.stopTrack();
        state = 0;
      }else{
      
      uint8_t result = MP3player.playTrack(1);


      if (result == 0)  //만약 결과가 0일 경우 1번 트랙을 재생합니다.
      {
        // Success
      }
      else 
      {
        
      }
        state = 1;
      }
    }
  }
 }
고유의 태그번호가 인식되면, 태그 성공메세지를 시리얼 모니터에 출력하고,
1의 상태(음악이 재생중일 때)라면 음악재생을 중지하고,
0의 상태로 설정합니다.
아닐 경우, 트랙 1번을 재생합니다.

기술문서 

  • 부품목록
  • 회로도
  • 브레드보드 레이아웃
  • 소스 코드

hihyo

아두이노,RFID,MP3쉴드,쥬크박스,말하는인형,스피커,음악재생