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;
}
아두이노로 이런게 가능하군요… 대단하십니다.
좋아요Liked by 1명