Arduino Module

FWB-MSound 모듈로 말하는 시계 구현

FWB-엠사운드(MSound) 프로젝트 사용예

FWB-MSound Module을 이용한 말하는 시계

  • 모듈이름 : FWB-MSound™
  • 판매 : 디바이스마트, https://www.devicemart.co.kr/goods/view?no=12547593
  • 동작 : 아두이노 우노에서 버튼과 소프트웨어 시리얼통신을 초기화 하고 타이머 인터럽트로 10ms를 만든 다음 현재 시간을 시분초@12시간단위 동작하게 한다. 설정된 버튼을 누르면 타이머로부터 실시간 동작되는 시간을 불러와 확인을 위해 시리얼 통신으로 출력하고 사운드 인덱스를 “FWB-MSound”에서 찾아 스피커로 출력하는 말하는 시계를 구현했다.
  • 특징 : “FWB-MSound”의 내장 플래시메모리에 저장된 소리, 노래, 목소리, 사운드 등의 저장 어드레스를 시리얼 통신으로 호출하면 스피커로 출력한다. Custom 편집과 저장도 가능하다.
  • 구성 : 개발된 모듈에는 칩의 제어와 통신을 담당하는 Cortex-™M0과 Nuvoton사의 음원저장 IC로 구성되어 있다.

  • 아두이노 소스코드 :
// 개요 :
// 모듈 이름 : FWB-엠사운드(MSound)
// 용도 : 엠사운드 모듈을 이용한 사운드 출력 예제
// 동작 : 소프트웨어로 12시간 단위 시계를 만들고 지금 시간을 버튼 신호로 출력
// 응용 : 세상의 모든 소리, 음악 서비스. 단 Sound IC 메모리가 허락하는 한
// 제작 : 펌웨어뱅크(주), www.firmwarebank.com  070-8801-1968
// 판매 : 디바이스마트, www.devicemart.co.kr 

// 라이버러리 등록 : MsTimer2.h
// 동작 처리방법 : 소프트웨어 시리얼 통신

//  연결 :
//  UNO         Module
//  5V          엠사운드 1번핀 VCC(기판 뒷면 부품 납땜면이 정사각형 모양)
//  GND         엠사운드 2번핀 GND
//  D6          엠사운드 3번핀 Tx 핀이며 모듈에서 출력이 없기 때문에 사용하지 않는다.
//  D8(Tx)      엠사운드 4번핀 Rx

//  D2          버튼 2번핀과 GND 연결, 현재 시간을 음성 사운드로 듣기위한 시작 버튼 

// 엠사운드 시리얼 출력
// 0xFB 해드문자 1바이트 시리얼 전송, 출력하고자 하는 사운드 어드레스 3이상 전송
// "십육진수" 사운드 어드레스111(0x6F) 출력 예) 0xFB, 0x6F 또는 251, 111
// 현재 시간을 설정
// 버튼을 누르면 현재 시간 사운드 출력 

// HomeWork : 
// 알람을 설정하고 정해진 시간이 되면 104번 "허리업" 의 사운드를 30회 1분 이내에 출력하라.

// 엠사운드 상세 PDF 기술 정보 네이버 카페 :https://cafe.naver.com/fws/359

//유투브 영상
//Embedded Cortex-M 또는 로봇 적용 :
//https://youtu.be/hbvrf7c_VwI

//아두이노 적용 영상: 
//https://youtu.be/_MBnJOvzM3M
//https://youtu.be/QVn72pf6TxA
//말로 하는 음성 지원 응용 프로젝트 수평계 사용 https://youtu.be/RGuzt1vpExo
// MPro Cortext-M0 NUC130 Embedded 적용 https://youtu.be/dvChbNDf6ps

// 구입 G마켓 : http://gmkt.kr/gBq2-QW

#include <SoftwareSerial.h>
#include <MsTimer2.h> // 라이버러리를 다운 받으세요

//Proto type
void timer_10ms_IRQ(void);
unsigned long isflag(unsigned long flag);
void setflag(unsigned long flag);
void clrflag(unsigned long flag);

void sound_hour(unsigned short usnumber);// 0~11 si
void sound_00_59(unsigned short usnumber);// 0~59 bun, sec
void sound_min(unsigned short usnumber);// 0~59 bun
void sound_sec(unsigned short usnumber);// 0~59 초
void processor_soundic(unsigned char soundindex); 

// flag define
#define F_READRFID   0x8000000
#define F_COM_TIME0  0x4000000
#define F_BUTTON_ON  0x2000000

// run value
unsigned long runflag;
unsigned long ucsoundnumber;

struct st_clock{
  unsigned long sec;
  unsigned long bun;
  unsigned long hour;
};

struct st_clock clk;

unsigned long sec10ms, temp_sec10ms;

SoftwareSerial MSound_to_Arduino(6, 8); // RX(연결해도 소용없음), TX
  
void setup() {
  Serial.begin(9600);
  Serial.println("Voice Clock Print"); // write()

  // 보이스 시작 알림 버튼
  pinMode(2, INPUT_PULLUP);

  // MSound serial Software
  MSound_to_Arduino.begin(9600);
  delay(500);
  MSound_to_Arduino.write(0xFB); // 16진수만 전송하기위해 write 사용, Header 0xFB Send
  MSound_to_Arduino.write(110); // "아이좋아" sound 출력
  
  // 타이머 인터럽트
  MsTimer2::set(10, timer_10ms_IRQ); // 10ms
  MsTimer2::start();

  // now time @ 12 hour 0:0:0sec ~ 11:59:59sec
  clk.sec= 30;
  clk.bun = 13;
  clk.hour = 4;
  sec10ms = (clk.sec + (60 * clk.bun) + (clk.hour  * (60*60)))*100; // 100msc
}

void loop() {
  if(isflag(F_BUTTON_ON)){ // 버튼 누름 플래그 동작
   temp_sec10ms = sec10ms; // 타이머 인터럽트 안에 있는 시간 읽어 오기
   clk.sec= (temp_sec10ms/100)%60;
   clk.bun = ((temp_sec10ms/100)/60) % 60;
   clk.hour = ((temp_sec10ms/100)/(60*60)) % 12;  
   
   // 시리얼 출력
   Serial.print("H:");Serial.print(clk.hour);
   Serial.print("  m:");Serial.print(clk.bun);
   Serial.print("  S:");Serial.println(clk.sec);

   sound_hour(clk.hour);// 0~11 si
   sound_min(clk.bun);// 0~59 bun
   sound_sec(clk.sec);// 0~59 초
   
   clrflag(F_BUTTON_ON);
  }  
}

void timer_10ms_IRQ(void){ // @10ms timer interrupt
    sec10ms++;
    if(sec10ms >= 4320000){ // 60sec*60min*12hour * 100ms = 4320000
      sec10ms=0; // ini
    }
     
     if(digitalRead(2)==0){ // 버튼 눌렸을 경우 
      setflag(F_BUTTON_ON);
     }
}  


void sound_hour(unsigned short usnumber){// 0~11 si
  if(usnumber ==0) processor_soundic(54);// 영
  if(usnumber ==1) processor_soundic(71); // 하나
  if(usnumber ==2) processor_soundic(72);
  if(usnumber ==3) processor_soundic(73);
  if(usnumber ==4) processor_soundic(74);
  if(usnumber ==5) processor_soundic(75);
  if(usnumber ==6) processor_soundic(76);
  if(usnumber ==7) processor_soundic(77);
  if(usnumber ==8) processor_soundic(78);
  if(usnumber ==9) processor_soundic(79);
  if(usnumber ==10) processor_soundic(70);
  if(usnumber ==11) processor_soundic(04);

  delay(1000); // 소리 출력이 완전히 마칠때 까지
  processor_soundic(80); // si 
  delay(1000);  
}

void sound_00_59(unsigned short usnumber){// 0~59 bun, sec
  if(usnumber >= 10){
    processor_soundic(usnumber-7); 
  }  
  else{ // 0~9
    processor_soundic(usnumber+54); 
  }
}

void sound_min(unsigned short usnumber){// 0~59 bun
  sound_00_59(usnumber);
  delay(1500); // 소리 출력이 완전히 마칠때 까지
  processor_soundic(81); // bun 
  delay(1200);  
}

void sound_sec(unsigned short usnumber){// 0~59 초
  sound_00_59(usnumber);
  delay(1500); // 소리 출력이 완전히 마칠때 까지
  processor_soundic(82); // 초 
  delay(1200);  
}

void processor_soundic(unsigned char soundindex){ // 실제로 FWB-엠사운드(MSound)을 담당한다.
  MSound_to_Arduino.write(0xFB); // Header 0xFB Send, Hex값만 전송하기 위해 write()명령어 사용
  MSound_to_Arduino.write(soundindex); // 해당 숫자 sound 출력
  delay(100);  
}

// flag
unsigned long isflag(unsigned long flag){
  return (runflag & flag);
}

void setflag(unsigned long flag){
   runflag |= flag;
}

void clrflag(unsigned long flag){
  runflag &= ~flag;
}

덧글 1개

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: