チーム1259

課題名

赤外線リモコン付き音楽演奏機

研究者名

2年14組9番  大橋尚人
2年14組18番 栗原宗志

内容紹介

今回、赤外線リモコン付き音楽再生装置を作成することにした。

この装置はリモコン側と、信号を受け取って音楽を再生する側の2台のPSoCを用いた。

リモコン側のスイッチを押すと、受信側のPSocで再生が行われる。

再生側では、スピーカーを2台用いて伴奏と主旋律を同時に再生させる。

そしてリモコン側ではLCDに音楽再生前には"Music start"
音楽再生中には"Music is playing"
音楽再生終了後には"Music ended"
と表示をさせるようにした。
この表示にはタイマー割り込みを用いて音楽の始まるタイミングや終わるタイミングに合わせて、表示を出すようにしている。

音楽演奏は、timer_pwm2で用いたタイマー割り込みを用いて音階に値する周波数を発生させている。


1259.jpg


ソースコード


送信側のソースコード
#include<m8c.h>
#include"PSoCAPI.h"
#pragma interrupt_handler myISR
#define SW 0b00010000
int TC = 0;

void myISR(void){
TC = TC + 1;
if(TC == 3){
LCD_Init();
LCD_Position(1,0);
LCD_PrCString("Music is playing");
}
else if(TC == 125){
LCD_Init();
LCD_Position(1,0);
LCD_PrCString("Music ended. ");
}
}

void main(void){
PRT1DR &= (~SW);

LCD_Start();
M8C_EnableGInt;
while(1){

if(PRT1DR & SW){
PWM8_Start();
LCD_Position(0,0);
LCD_PrHexInt(1);
LCD_Position(1,0);
LCD_PrCString("Music Start!!");
Timer16_1_EnableInt();
Timer16_1_Start();
}
else{
PWM8_Stop();
LCD_Position(0,0);
LCD_PrHexInt(0);
}
}
}

受信側のソースコード
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#define SW 0b00010000
#pragma interrupt_handler myISR
int PW = 125; // Pulse Width
int SILENT = 0, s = 306, r = 273, c = 243, D = 229, L = 204, M = 182, F = 172, S = 153, R = 136, C = 121, DD = 115;
int TC = 0; //Time Count

void myISR(void)
{
TC += 1; //TC = TC + 1
PWM16_2_WritePulseWidth(PW);
PWM16_1_WritePulseWidth(PW);
if(TC == 1) {
PWM16_1_WritePeriod(D);
}
else if(TC == 2)
PWM16_1_WritePeriod(SILENT);
else if (TC == 3)
PWM16_1_WritePeriod(D);
else if(TC == 4)
PWM16_1_WritePeriod(M);
else if(TC == 5)
PWM16_1_WritePeriod(SILENT);
else if (TC == 6)
PWM16_1_WritePeriod(M);
else if(TC == 7)
PWM16_1_WritePeriod(r);
else if (TC == 8)
PWM16_1_WritePeriod(SILENT);
else if (TC == 9)
PWM16_1_WritePeriod(r);
else if(TC == 10)
PWM16_1_WritePeriod(D);
else if(TC == 11) 
PWM16_1_WritePeriod(SILENT);
else if(TC == 12)
PWM16_1_WritePeriod(D);
else if(TC == 13)
PWM16_1_WritePeriod(L);
else if (TC == 14)
PWM16_1_WritePeriod(SILENT);
else if(TC == 15)
PWM16_1_WritePeriod(L);
else if(TC == 16)
PWM16_1_WritePeriod(F);
else if (TC == 17)
PWM16_1_WritePeriod(SILENT);
else if (TC == 18)
PWM16_1_WritePeriod(F);
else if (TC == 19)
PWM16_1_WritePeriod(s);
else if (TC == 20)
PWM16_1_WritePeriod(SILENT);
else if(TC == 21)
PWM16_1_WritePeriod(s);
else if (TC == 22)
PWM16_1_WritePeriod(c);
else if(TC == 23)
PWM16_1_WritePeriod(SILENT);
else if (TC == 24)
PWM16_1_WritePeriod(c);
else if (TC == 25) {
PWM16_1_WritePeriod(D);
PWM16_2_WritePeriod(D);
}
else if(TC == 26)
PWM16_1_WritePeriod(SILENT);
else if (TC == 27) {
PWM16_1_WritePeriod(D);
PWM16_2_WritePeriod(SILENT);
}
else if(TC == 28) {
PWM16_1_WritePeriod(M);
PWM16_2_WritePeriod(D);
}
else if(TC == 29)
PWM16_1_WritePeriod(SILENT);
else if (TC == 30) {
PWM16_1_WritePeriod(M);
PWM16_2_WritePeriod(SILENT);
}
else if(TC == 31) {
PWM16_1_WritePeriod(r);
PWM16_2_WritePeriod(D);
}
else if (TC == 32)
PWM16_1_WritePeriod(SILENT);
else if (TC == 33)
PWM16_1_WritePeriod(r);
else if(TC == 34)
PWM16_1_WritePeriod(D);
else if(TC == 35) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC == 36)
PWM16_1_WritePeriod(D);
else if(TC == 37)
PWM16_1_WritePeriod(L);
else if (TC == 38)
PWM16_1_WritePeriod(SILENT);
else if(TC == 39) {
PWM16_1_WritePeriod(L);
PWM16_2_WritePeriod(D);
}
else if(TC == 40) {
PWM16_1_WritePeriod(F);
PWM16_2_WritePeriod(C);
}
else if (TC == 41) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if (TC == 42) {
PWM16_1_WritePeriod(F);
PWM16_2_WritePeriod(r);
}
else if (TC == 43) {
PWM16_1_WritePeriod(s);
PWM16_2_WritePeriod(c);
}
else if (TC == 44) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC == 45) {
PWM16_1_WritePeriod(s);
PWM16_2_WritePeriod(D);
}
else if (TC == 46) {
PWM16_1_WritePeriod(c);
PWM16_2_WritePeriod(L);
}
else if(TC == 47) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if (TC == 48)
PWM16_1_WritePeriod(c);
else if(TC == 49) {
PWM16_1_WritePeriod(D);
PWM16_2_WritePeriod(M);
}
else if(TC == 50)
PWM16_1_WritePeriod(SILENT);
else if (TC == 51) {
PWM16_1_WritePeriod(D);
PWM16_2_WritePeriod(SILENT);
}
else if(TC == 52) {
PWM16_1_WritePeriod(M);
PWM16_2_WritePeriod(M);
}
else if(TC == 53)
PWM16_1_WritePeriod(SILENT);
else if (TC == 54) {
PWM16_1_WritePeriod(M);
PWM16_2_WritePeriod(SILENT);
}
else if(TC == 55) {
PWM16_1_WritePeriod(r);
PWM16_2_WritePeriod(M);
}
else if (TC == 56)
PWM16_1_WritePeriod(SILENT);
else if (TC == 57)
PWM16_1_WritePeriod(r);
else if(TC == 58)
PWM16_1_WritePeriod(D);
else if(TC == 59) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC == 60)
PWM16_1_WritePeriod(D);
else if(TC == 61)
PWM16_1_WritePeriod(L);
else if (TC == 62)
PWM16_1_WritePeriod(SILENT);
else if(TC == 63) {
PWM16_1_WritePeriod(L);
PWM16_2_WritePeriod(M);
}
else if(TC == 64) {
PWM16_1_WritePeriod(F);
PWM16_2_WritePeriod(L);
}
else if (TC == 65) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if (TC == 66) {
PWM16_1_WritePeriod(F);
PWM16_2_WritePeriod(D);
}
else if (TC == 67) {
PWM16_1_WritePeriod(s);
PWM16_2_WritePeriod(L);
}
else if (TC == 68) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC == 69) {
PWM16_1_WritePeriod(s);
PWM16_2_WritePeriod(M);
}
else if (TC == 70) {
PWM16_1_WritePeriod(c);
PWM16_2_WritePeriod(F);
}
else if(TC == 71) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if (TC == 72)
PWM16_1_WritePeriod(c);
else if (TC == 73) {
PWM16_1_WritePeriod(D);
PWM16_2_WritePeriod(S);
}
else if(TC == 74)
PWM16_1_WritePeriod(SILENT);
else if (TC == 75)
PWM16_1_WritePeriod(D);
else if(TC == 76)
PWM16_1_WritePeriod(M);
else if(TC == 77) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if (TC == 78)
PWM16_1_WritePeriod(M);
else if(TC == 79) {
PWM16_1_WritePeriod(r);
PWM16_2_WritePeriod(D);
}
else if (TC == 80)
PWM16_1_WritePeriod(SILENT);
else if (TC == 81)
PWM16_1_WritePeriod(r);
else if(TC == 82)
PWM16_1_WritePeriod(D);
else if(TC == 83) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC == 84)
PWM16_1_WritePeriod(D);
else if(TC == 85)
PWM16_1_WritePeriod(L);
else if (TC == 86)
PWM16_1_WritePeriod(SILENT);
else if(TC == 87) {
PWM16_1_WritePeriod(L);
PWM16_2_WritePeriod(R);
}
else if(TC == 88) {
PWM16_1_WritePeriod(F);
PWM16_2_WritePeriod(S);
}
else if (TC == 89) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if (TC == 90) {
PWM16_1_WritePeriod(F);
PWM16_2_WritePeriod(F);
}
else if (TC == 91) {
PWM16_1_WritePeriod(s);
PWM16_2_WritePeriod(M);
}
else if (TC == 92) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC == 93)
PWM16_1_WritePeriod(s);
else if (TC == 94) {
PWM16_1_WritePeriod(c);
PWM16_2_WritePeriod(L);
}
else if(TC == 95) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if (TC == 96)
PWM16_1_WritePeriod(c);
else if (TC == 97) {
PWM16_1_WritePeriod(D);
PWM16_2_WritePeriod(D);
}
else if(TC == 98) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if (TC == 99)
PWM16_1_WritePeriod(D);
else if(TC == 100) {
PWM16_1_WritePeriod(M);
PWM16_2_WritePeriod(DD);
}
else if(TC == 101) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if (TC == 102) {
PWM16_1_WritePeriod(M);
PWM16_2_WritePeriod(C);
}
else if(TC == 103) {
PWM16_1_WritePeriod(r);
PWM16_2_WritePeriod(R);
}
else if (TC == 104) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if (TC == 105) {
PWM16_1_WritePeriod(r);
PWM16_2_WritePeriod(C);
}
else if(TC == 106) {
PWM16_1_WritePeriod(D);
PWM16_2_WritePeriod(R);
}
else if(TC == 107) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC == 108) {
PWM16_1_WritePeriod(D);
PWM16_2_WritePeriod(S);
}
else if(TC == 109) {
PWM16_1_WritePeriod(L);
PWM16_2_WritePeriod(F);
}
else if (TC == 110) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC == 111) {
PWM16_1_WritePeriod(L);
PWM16_2_WritePeriod(S);
}
else if(TC == 112) {
PWM16_1_WritePeriod(F);
PWM16_2_WritePeriod(F);
}
else if (TC == 113) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if (TC == 114) {
PWM16_1_WritePeriod(F);
PWM16_2_WritePeriod(M);
}
else if (TC == 115) {
PWM16_1_WritePeriod(s);
PWM16_2_WritePeriod(F);
}
else if (TC == 116) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC == 117)
PWM16_1_WritePeriod(s);
else if (TC == 118) {
PWM16_1_WritePeriod(c);
PWM16_2_WritePeriod(S);
}
else if(TC == 119)
PWM16_1_WritePeriod(SILENT);
else if (TC == 120) {
PWM16_1_WritePeriod(c);
PWM16_2_WritePeriod(SILENT);
}
else if (TC == 121) {
PWM16_1_WritePeriod(D);
PWM16_2_WritePeriod(D);
}
else if (TC == 124) {
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
}

void main(void)
{
LCD_Start();
   LCD_InitBG(LCD_SOLID_BG);
PGA_Start(PGA_HIGHPOWER);

PRT1DR &= (~SW);
while(1) {
  if (PRT1DR & SW) {
    LCD_Position(0, 0);
    LCD_PrHexInt(0);
  }else{
    LCD_Position(0, 0);
    LCD_PrHexInt(1);
    break;
    }
}
M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
// Insert your main routine code here.
M8C_EnableGInt;
PWM16_1_Start();
PWM16_2_Start();
Timer16_1_EnableInt();
Timer16_1_Start();
while(1)
   {};
}

見出しN

見出しNに対する内容や説明文などを書いてください。

考察


この自由課題で、送信側のPSoCのLCDに音楽が演奏前、演奏中、演奏終了の表示をしたが、表示に安定性が無く、赤外線の信号は遅れるが、LCDが消えてしまうことがよくあった。最初はLCDの表示を切り替えるときに初期化を行っていなかったので表示がうまくいかなかったと思われたが、そこを変更しても表示率は5割くらいになってしまった。
結果として対応策が見つからず、プログラムから取り除くことも考えたが、うまくいく場合もあるので残すことにした。

音楽演奏のほうでは、最初に主旋律から作り始めたため、どのような感覚で演奏をすればいいのかがわからず四苦八苦していたが途中から伴奏を先に作成したことで主旋律も作成できたので音楽演奏のプログラムを作成する際には伴奏から作成すればいいのではないかと思われる。

さらに、同じ音を連続で出す場合にそのまま音を出力してもつながって聞こえてしまうのでこのような場合には"SILENT"を音と音の間に入れることで一音一音の音を独立させることができたので、"SILENT"をうまく活用するひつようがあると思われる。

  • 最終更新:2012-11-20 16:49:39

このWIKIを編集するにはパスワード入力が必要です

認証パスワード