チーム1262

課題名

音楽プレイヤー

研究者名

佐藤拓人  里屋純平

概要

ラボtimer_pwm2をベースにし、音楽を奏でられるようにした。その際、光センサーを利用し、光度によって音の大きさが変わるようにした。
また、入力するキーによって奏でる音楽を変更し、今回は以下の3つの曲を実装した。
1.ドレミの歌
2.スーパーマリオ
3.ミッキーマウスマーチ
それぞれの曲は、その数字を入力することで演奏される。

また、以下のコマンドを入力することで、停止とリピートを行える。
0.停止
r.リピート
0を押すと演奏の途中でも停止することができる。ただし、次に再生するときは曲の初めからになる。

また、音階ごとに顔文字を設定しLCDに表示するようにした。
音楽ごとに音階の表示する顔文字は違う。

本体

DSC_0318.jpg
以上のようになった。

ブロック図

DSC_0319.jpg

ソースコード


#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#pragma interrupt_handler myISR
int PW=125; //Pulse Width
int SILENT=0, D=229, L=204, M=182, F=172, S=153, SR =144, R=136, RC =128, C=121, DD=115;//high
int LL=102,MM=91,FF=86,SS=75,RR=68,CC=64;
int TC=0;//Time Count
int i, j;

void myISR(void)
{
//カエルのうた
   if (i == 1) {
       TC += 1; //TC = TC +1
       PWM16_1_WritePulseWidth(PW);
   
          if(TC == 1 | | TC == 25 | | TC == 65 | | TC == 73 | | TC == 81 | | TC == 89 | | TC == 97 | | TC == 99 | | TC == 121){
              PWM16_1_WritePeriod(D);
               LCD_Position(1, 0);
                LCD_PrCString("(^ o ^)     ");
               }
          else if(TC == 5 | | TC == 21 | | TC == 101 | | TC == 103 | | TC == 117){
              PWM16_1_WritePeriod(L);
               LCD_Position(1, 0);
                LCD_PrCString("(o_o)/     ");
               }
          else if (TC == 9 | | TC == 17 | | TC == 33 | | TC == 57 | | TC == 105 | | TC == 107 | | TC == 113){
              PWM16_1_WritePeriod(M);
              LCD_Position(1, 0);
                LCD_PrCString("(^..^)//     ");
               }
  
          else if(TC == 13 | | TC == 37 | | TC == 53 | | TC == 109 | | TC == 111){
              PWM16_1_WritePeriod(F);
              LCD_Position(1, 0);
                LCD_PrCString("(^o(^o^)o^)     ");
               }
  
          else if(TC == 41 | | TC == 49){
              PWM16_1_WritePeriod(S);
              LCD_Position(1, 0);
                LCD_PrCString("(- 3 -)     ");
               }
  
          else if (TC == 45 | | TC == 33 | | TC == 41){
              PWM16_1_WritePeriod(R);
              LCD_Position(1, 0);
                LCD_PrCString("(. _.)     ");
               }
  
          else if(TC == 29 | | TC == 61 | | TC == 69 | | TC == 77 | | TC == 85 | | TC == 93){
              PWM16_1_WritePeriod(SILENT);
              LCD_Position(1, 0);
                LCD_PrCString("m(_ _)m     ");
               }
              
          else if(TC == 98 | | TC == 100 | | TC == 102 | | TC == 104 | | TC == 106 | | TC == 108 | | TC == 110 | | TC == 112){
              PWM16_1_WritePeriod(SILENT);
              LCD_Position(1, 0);
                LCD_PrCString("m(_ _)m     ");
               }
              
          else if(TC == 125){
               PWM16_1_WritePeriod(SILENT);
               LCD_Position(1, 0);
                LCD_PrCString("m(_ _)m     ");
               LCD_Position(1, 0);
               LCD_PrCString("END          ");
           }
           
           else if(TC == 127) {
               if (j == 1) {
                   TC = 0;
               }
           }
   }
   
  if(i==2){
       TC += 1; //TC = TC +1
       PWM16_1_WritePulseWidth(PW);
       
           if(TC == 7){
                  PWM16_1_WritePeriod(M);
               LCD_Position(1, 0);
                LCD_PrCString("(^..^)//     ");
           }
  
              else if (TC == 4| | TC == 17){
                  PWM16_1_WritePeriod(S);
               LCD_Position(1, 0);
                LCD_PrCString("(- 3 -)      ");
           }
  
              else if(TC == 10| | TC == 15){
                  PWM16_1_WritePeriod(R);
               LCD_Position(1, 0);
                LCD_PrCString("(. _.)       ");
           }
  
              else if(TC == 14){
                  PWM16_1_WritePeriod(RC);
               LCD_Position(1, 0);
                LCD_PrCString("(^ o ^)       ");
           }
  
              else if (TC == 12| | TC == 29){
                  PWM16_1_WritePeriod(C);
               LCD_Position(1, 0);
                LCD_PrCString("(o_o)/         ");
           }
  
              else if (TC == 1| | TC == 27){
                  PWM16_1_WritePeriod(DD);
               LCD_Position(1, 0);
                LCD_PrCString("(^o(^o^)o^)     ");
           }
               
  
              else if (TC == 28){
                  PWM16_1_WritePeriod(LL);
               LCD_Position(1, 0);
                LCD_PrCString("(~o~)           ");
           }
  
              else if (TC == 18| | TC == 25){
                  PWM16_1_WritePeriod(MM);
               LCD_Position(1, 0);
                LCD_PrCString("(~o~)(~o~)      ");
           }
  
              else if (TC == 22){
                  PWM16_1_WritePeriod(FF);
               LCD_Position(1, 0);
                LCD_PrCString("(//0//)          ");
           }
  
              else if (TC == 19| | TC == 23){
                  PWM16_1_WritePeriod(SS);
               LCD_Position(1, 0);
                LCD_PrCString("(o 3 o)          ");
           }
  
              else if (TC == 20){
                  PWM16_1_WritePeriod(RR);
               LCD_Position(1, 0);
                LCD_PrCString("(o 3 o)          ");
           }
  
              else if(TC == 2| | TC == 5| | TC == 8| | TC == 11| | TC == 16| | TC == 21| | TC == 24| | TC == 26| | TC == 30){
                  PWM16_1_WritePeriod(SILENT);
               LCD_Position(1, 0);
                LCD_PrCString("m(_ _)m     ");
           }
           
           else if(TC == 33){
               PWM16_1_WritePeriod(SILENT);
               LCD_Position(1, 0);
                LCD_PrCString("m(_ _)m     ");
               LCD_Position(1, 0);
               LCD_PrCString("END          ");
           }
           
               
           else if (TC == 32) {
               if (j == 1) {
                   TC = 0;
               }
           }
   }
   
  if(i==3){
   
         TC += 1; //TC = TC +1
          PWM16_1_WritePulseWidth(PW);
              if(TC == 13 | | TC == 41 | | TC == 48 | | TC == 77){
                  PWM16_1_WritePeriod(D);
               LCD_Position(1, 0);
                LCD_PrCString("(^ o ^)     ");
           }
           
              else if(TC == 12 | | TC == 33 | | TC == 49 | | TC == 50 | | TC == 51 | | TC == 52 | | TC == 53 | | TC == 54 | | TC == 76){
                  PWM16_1_WritePeriod(L);
               LCD_Position(1, 0);
                LCD_PrCString("(o_o)/     ");
           }
  
              else if (TC == 11 | | TC == 28 | | TC == 55 | | TC == 75 | | TC == 94){
                 PWM16_1_WritePeriod(M);
               LCD_Position(1, 0);
                LCD_PrCString("(^..^)//     ");
           }
               
              else if(TC == 1 | | TC == 2 | | TC == 3 | | TC == 4 | | TC == 5 | | TC == 6 | | TC == 7 | | TC == 8){
                  PWM16_1_WritePeriod(F);
               LCD_Position(1, 0);
                LCD_PrCString("(^o(^o^)o^)     ");
           }
               
              else if(TC == 10 | | TC == 17 | | TC == 18 | | TC == 19 | | TC == 21 | | TC == 22 | | TC == 23 | | TC == 26){
                  PWM16_1_WritePeriod(F);
               LCD_Position(1, 0);
                LCD_PrCString("(^o(^o^)o^)     ");
           }
               
             else if(TC == 29| | TC == 31 | | TC == 32 | | TC == 39 | | TC == 40 | | TC == 56){
                  PWM16_1_WritePeriod(F);
               LCD_Position(1, 0);
                LCD_PrCString("(^o(^o^)o^)     ");
           }
               
              else if(TC == 65 | | TC == 66 | | TC == 67 | | TC == 68 | | TC == 69 | | TC == 70 | | TC == 71 | | TC == 72){
                  PWM16_1_WritePeriod(F);
               LCD_Position(1, 0);
                LCD_PrCString("(^o(^o^)o^)     ");
           }
               
              else if(TC == 74 | | TC == 80 | | TC == 81 | | TC == 82 | | TC == 84 | | TC == 85 | | TC == 86 | | TC == 90 | | TC == 96){
                  PWM16_1_WritePeriod(F);
               LCD_Position(1, 0);
                LCD_PrCString("(^o(^o^)o^)     ");
           }
           
              else if(TC == 9 | | TC == 27 | | TC == 57 | | TC == 73 | | TC == 92){
                  PWM16_1_WritePeriod(S);
               LCD_Position(1, 0);
                LCD_PrCString("(- 3 -)      ");
           }
           
              else if (TC == 25 | | TC == 88){
                 PWM16_1_WritePeriod(R);
               LCD_Position(1, 0);
                LCD_PrCString("(. _.)       ");
           }
 
              else if(TC == 59 | | TC == 61 | | TC == 63){
                  PWM16_1_WritePeriod(DD);
               LCD_Position(1, 0);
                LCD_PrCString("(^o(^o^)o^)     ");
           }

             else if(TC == 30 | | TC == 47 | | TC == 58 | | TC == 60 | | TC == 62 | | TC == 64 | | TC == 79 | | TC == 104){
                  PWM16_1_WritePeriod(SILENT);
               LCD_Position(1, 0);
                LCD_PrCString("m(_ _)m     ");
           }
           
           else if(TC == 110){
               PWM16_1_WritePeriod(SILENT);
               LCD_Position(1, 0);
                LCD_PrCString("m(_ _)m     ");
               LCD_Position(1, 0);
               LCD_PrCString("END          ");
           }
               
           else if(TC == 106) {
               if(j == 1) {
                   TC = 0;
               }
           }
   }
   
   if(i==0){
           PWM16_1_WritePeriod(SILENT);
           LCD_Position(1, 0);
           LCD_PrCString("STOP (-.-)zzz     ");
   }
  
}
  

void main()
{
  // M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
   // Insert your main routine code here.
   //Insert your main routine code here.
   
   char*strPtr;
   
   M8C_EnableGInt;
   PWM16_1_Start();
   Timer16_1_EnableInt();
   Timer16_1_Start();
   PGA_Start(PGA_HIGHPOWER);
   ADCINC_Start(ADCINC_HIGHPOWER);
   ADCINC_GetSamples(0);
   LCD_Start();
   LCD_InitBG(LCD_SOLID_BG);
   
   UART_CmdReset();
   UART_IntCntl(UART_ENABLE_RX_INT);
   Counter8_WritePeriod(155);
   Counter8_WriteCompareValue(77);
   Counter8_Start();
   UART_Start(UART_PARITY_NONE);

  UART_CPutString("\r\n数字を入力してください\r\n");
   UART_CPutString("\r\n1.カエルのうた 2.スーパーマリオ 3.ミッキーマウスマーチ 0.停止 r.リピート\r\n");
   
   while(1){
       if(UART_bCmdCheck()){
        if(strPtr=UART_szGetParam()){
            //UART_CPutString("Found vaild command\r\nCommand=>");
           
           UART_PutString(strPtr);
           UART_CPutString("\r\n");
           if (*strPtr=='1') {
               TC = 0;
               i = 1;
           }
           if (*strPtr=='2') {
               TC = 0;
               i = 2;
           }
           if (*strPtr=='3') {
               TC = 0;
               i = 3;
           }
           if (*strPtr=='0') {
               TC = 0;
               i = 0;
           }
           if (*strPtr=='r') {
               if (j == 0) {
                   UART_CPutString("リピート オン\r\n");
                   j = 1;
               }
               else {
                   UART_CPutString("リピート オフ\r\n");
                   j = 0;
               }
           }
        }
        UART_CmdReset();
       }
   }
           
}


考察

音楽プレイヤーを作ったのに一時停止機能を実装していない。
おそらく、一時停止のコマンドを受け取ったときに、そのときのTCの値をほかの変数に保持しておき、もう一度押されたときに、TCにその値を代入すればいいのではないかと考えられる。

私たちのグループは、光センサーで得た値をAD変換することで音の大きさを調節しようとしたが、勘違いにより光センサーで得た値をそのままスピーカーに接続していた。しかし、その状態でも音の大きさを変えることができている。
おそらく、クロック毎に見た値を積分した値の差をとっている。なので、光センサーの抵抗を大きくすると、差が少なくなるのであまり大きさが変化しない。実際に抵抗を大きくしたら音の大きさが変わらなかったことからそう考えられるのではないかと思う。

  • 最終更新:2013-01-08 12:43:16

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

認証パスワード