チーム1233

課題名

PSoCの同期による演奏

研究者名

高木 芙美花
中島 樂

概要

ジャンパー線を利用してPSoC同士を同期させることで、2台のPSoCが同時に演奏できるようになった。
左がデータを受け取るPSoCで、右がデータを送るPSoCである。
2012-07-03 15.34.24.jpg

使用した器具


PSoC 2台
ストレート通信ケーブル 1本
ジャンプワイヤー 10本
スピーカー 2つ
MiniProg 2本

ソースコード


●主旋律

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
int PW=125; //Pilse Width
int SILENT=0,
  D=229, L=204, M=182, F=172, S=153, R=136, C=121, DD=115, //C-dur Scale 
   D1=214, L1=193, F1=162, S1=144, R1=128; //半音階
   H=241, B=255, A=275, G1=287, G=310, FF1=335;


int i;

void sound(int x,int y){
 int i=0;
  for(i=0;i<y;i++){
  PWM16_1_WritePeriod(x);
  }
}


void main(void)
{
  // M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
   // Insert your main routine code here.
   char *strPtr; //Patrameter pointer
   UART_CmdReset();    //Initialize receiver/cmd buffer
       UART_IntCntl(UART_ENABLE_RX_INT);    //Enable RX interrupts
   Counter8_WritePeriod(155);    //Set up baud rate generator
   Counter8_WriteCompareValue(77);
   Counter8_Start();    //Turn on band rate generator
   UART_Start(UART_PARITY_NONE);    //Enable UART
   M8C_EnableGInt;    //Turn on interrupts
   PWM16_1_Start();
   UART_CPutString("<\r\nPSoC Synthesizer. V1.1\r\n");
   while(1){
       if(UART_bCmdCheck()){    //Wait for Command
           if(strPtr = UART_szGetParam()){    //More than delimiter?
               UART_CPutString("Found vailid command\r\nCommand=>");
               UART_PutString(strPtr);    //Print out command
               UART_CPutString("\r\nParameters:\r\n");
                   if(*strPtr == 'a')
                       PWM16_1_WritePeriod(D);
                   else if(*strPtr == 's')
                       PWM16_1_WritePeriod(L);
                   else if(*strPtr == 'd')
                       PWM16_1_WritePeriod(M);
                   else if(*strPtr == 'f')
                       PWM16_1_WritePeriod(F);
                   else if(*strPtr == 'g')
                       PWM16_1_WritePeriod(S);
                   else if(*strPtr == 'h')
                       PWM16_1_WritePeriod(R);
                   else if(*strPtr == 'j')
                       PWM16_1_WritePeriod(C);
                   else if(*strPtr == 'k')
                       PWM16_1_WritePeriod(DD);
                   else if(*strPtr == 'w')
                       PWM16_1_WritePeriod(D1);
                   else if(*strPtr == 'e')
                       PWM16_1_WritePeriod(L1);
                   else if(*strPtr == 't')
                       PWM16_1_WritePeriod(F1);
                   else if(*strPtr == 'y')
                       PWM16_1_WritePeriod(S1);
                   else if(*strPtr == 'u')
                       PWM16_1_WritePeriod(R1);

                  
                       
                   else if(*strPtr == '1'){ //「森のくまさん」演奏開始
                       sound(S,5000);
                       sound(F1,5000);
                       sound(S,5000);
                       sound(M,25000);
                       sound(SILENT,500);

                      sound(M,5000);
                       sound(L1,5000);
                       sound(M,5000);
                       sound(D,25000);
                       sound(SILENT,500);
                       
                       sound(M,5000);
                       sound(L,5000);
                       sound(D,5000);
                       sound(L,25000);
                       sound(SILENT,500);
                       
                       sound(S,5000);
                       sound(R,5000);
                       sound(S,5000);
                       sound(M,25000);
                       sound(SILENT,500);
                       
                       sound(S,5000);
                       sound(R,5000);
                       sound(C,5000);

                      sound(DD,10000);
                       sound(S,10000);
                       sound(M,10000);
                       sound(D,10000);
                       
                       sound(R,25000);
                       sound(SILENT,500);

                      sound(R,5000);
                       sound(C,5000);
                       sound(R,5000);
                       
                       sound(S,10000);
                       sound(F,10000);
                       sound(M,10000);
                       sound(L,10000);
                       sound(D,25000);

                      PWM16_1_WritePeriod(SILENT);    
                     }    
                   
                   else if(*strPtr == '2'){//「かえるのうた(輪唱)」演奏開始
                       sound(D,10000);
                       sound(L,10000);
                       sound(M,10000);
                       sound(F,10000);
                       sound(M,10000);
                       sound(L,10000);
                       sound(D,10000);
                       sound(SILENT,10000);
                       
                       sound(M,10000);
                       sound(F,10000);
                       sound(S,10000);
                       sound(R,10000);
                       sound(S,10000);
                       sound(F,10000);
                       sound(M,10000);
                       sound(SILENT,10000);
                       
                       sound(D,20000);
                       sound(SILENT,500);
                       
                       sound(D,20000);
                       sound(SILENT,500);
                       
                       sound(D,20000);
                       sound(SILENT,500);
                       
                       sound(D,20000);
                       sound(SILENT,500);
                       
                       sound(D,5000);
                       sound(SILENT,100);
                       sound(D,5000);
                       
                       sound(L,5000);
                       sound(SILENT,100);
                       sound(L,5000);
                       
                       sound(M,5000);
                       sound(SILENT,100);
                       sound(M,5000);
                       
                       sound(F,5000);
                       sound(SILENT,100);
                       sound(F,5000);
                       
                       sound(M,10000);
                       sound(SILENT,100);
                       sound(L,10000);
                       sound(SILENT,100);
                       sound(D,20000);
                       sound(SILENT,500);
                       
                       sound(SILENT,10000);
                       sound(SILENT,10000);
                       sound(SILENT,10000);
                       sound(SILENT,10000);
                       sound(SILENT,10000);
                       sound(SILENT,10000);
                       sound(SILENT,10000);
                       sound(SILENT,10000);
                       
                       PWM16_1_WritePeriod(SILENT);    
                   }
                   
                       
                       
                   else if(*strPtr == 'l')
                       PWM16_1_WritePeriod(SILENT);
                       }
               UART_CmdReset();    //Reset command buffer
               }
           }
       }


●副旋律

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
int PW=125; //Pilse Width
int SILENT=0,
  D=229, L=204, M=182, F=172, S=153, R=136, C=121, DD=115, //C-dur Scale 
   D1=214, L1=193, F1=162, S1=144, R1=128; //半音階
   H=241, B=255, A=275, G1=287, G=310, FF1=335;
int i;

void sound(int x,int y){
 int i=0;
  for(i=0;i<y;i++){
  PWM16_1_WritePeriod(x);
  }
}


void main(void)
{
  // M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
   // Insert your main routine code here.
   char *strPtr; //Patrameter pointer
   UART_CmdReset();    //Initialize receiver/cmd buffer
       UART_IntCntl(UART_ENABLE_RX_INT);    //Enable RX interrupts
   Counter8_WritePeriod(155);    //Set up baud rate generator
   Counter8_WriteCompareValue(77);
   Counter8_Start();    //Turn on band rate generator
   UART_Start(UART_PARITY_NONE);    //Enable UART
   M8C_EnableGInt;    //Turn on interrupts
   PWM16_1_Start();
   UART_CPutString("<\r\nPSoC Synthesizer. V1.1\r\n");
   while(1){
       if(UART_bCmdCheck()){    //Wait for Command
           if(strPtr = UART_szGetParam()){    //More than delimiter?
               UART_CPutString("Found vailid command\r\nCommand=>");
               UART_PutString(strPtr);    //Print out command
               UART_CPutString("\r\nParameters:\r\n");
                   if(*strPtr == 'a')
                       PWM16_1_WritePeriod(D);
                   else if(*strPtr == 's')
                       PWM16_1_WritePeriod(L);
                   else if(*strPtr == 'd')
                       PWM16_1_WritePeriod(M);
                   else if(*strPtr == 'f')
                       PWM16_1_WritePeriod(F);
                   else if(*strPtr == 'g')
                       PWM16_1_WritePeriod(S);
                   else if(*strPtr == 'h')
                       PWM16_1_WritePeriod(R);
                   else if(*strPtr == 'j')
                       PWM16_1_WritePeriod(C);
                   else if(*strPtr == 'k')
                       PWM16_1_WritePeriod(DD);
                   else if(*strPtr == 'w')
                       PWM16_1_WritePeriod(D1);
                   else if(*strPtr == 'e')
                       PWM16_1_WritePeriod(L1);
                   else if(*strPtr == 't')
                       PWM16_1_WritePeriod(F1);
                   else if(*strPtr == 'y')
                       PWM16_1_WritePeriod(S1);
                   else if(*strPtr == 'u')
                       PWM16_1_WritePeriod(R1);

                  
                       
                   else if (*strPtr=='1'){//「森のくまさん」演奏開始
                       sound(M ,5000);
                       sound(L1,5000);
                       sound(M,5000);
                       sound(D,25000);
                       sound(SILENT,500);

                      sound(D,5000);
                       sound(H,5000);
                       sound(D,5000);
                       sound(G,25000);
                       sound(SILENT,500);
                       
                       sound(D,5000);
                       sound(H,5000);
                       sound(A,5000);
                       sound(H,25000);
                       sound(SILENT,500);
                       
                       sound(M,5000);
                       sound(F,5000);
                       sound(M,5000);
                       sound(D,25000);
                       sound(SILENT,500);
                       
                       sound(M,5000);
                       sound(F,5000);
                       sound(S,5000);

                      sound(S,10000);
                       sound(M,10000);
                       sound(D,10000);
                       sound(G,10000);
                       
                       sound(F,25000);
                       sound(SILENT,500);

                      
                       sound(F,5000);
                       sound(S,5000);
                       sound(F,5000);
                       
                       sound(M,10000);
                       sound(L,10000);
                       sound(D,10000);
                       sound(G,10000);
                       sound(D,25000);

                      PWM16_1_WritePeriod(SILENT);    
                     }
                   
                   else if(*strPtr == '2'){//「かえるのうた(輪唱)」演奏開始
                       sound(SILENT,10000);
                       sound(SILENT,10000);
                       sound(SILENT,10000);
                       sound(SILENT,10000);
                       sound(SILENT,10000);
                       sound(SILENT,10000);
                       sound(SILENT,10000);
                       sound(SILENT,10000);
                       
                   
                       sound(D,10000);
                       sound(L,10000);
                       sound(M,10000);
                       sound(F,10000);
                       sound(M,10000);
                       sound(L,10000);
                       sound(D,10000);
                       sound(SILENT,10000);
                       
                       sound(M,10000);
                       sound(F,10000);
                       sound(S,10000);
                       sound(R,10000);
                       sound(S,10000);
                       sound(F,10000);
                       sound(M,10000);
                       sound(SILENT,10000);
                       
                       sound(D,20000);
                       sound(SILENT,500);
                       
                       sound(D,20000);
                       sound(SILENT,500);
                       
                       sound(D,20000);
                       sound(SILENT,500);
                       
                       sound(D,20000);
                       sound(SILENT,500);
                       
                       sound(D,5000);
                       sound(SILENT,100);
                       sound(D,5000);
                       
                       sound(L,5000);
                       sound(SILENT,100);
                       sound(L,5000);
                       
                       sound(M,5000);
                       sound(SILENT,100);
                       sound(M,5000);
                       
                       sound(F,5000);
                       sound(SILENT,100);
                       sound(F,5000);
                       
                       sound(M,10000);
                       sound(SILENT,100);
                       sound(L,10000);
                       sound(SILENT,100);
                       sound(D,20000);
                       sound(SILENT,500);
                       
                       PWM16_1_WritePeriod(SILENT);
                   }
           
                   
                       
                       
                   else if(*strPtr == 'l')
                       PWM16_1_WritePeriod(SILENT);
                       }
               UART_CmdReset();    //Reset command buffer
               }
           }
       }

考察

演奏を行うようにTeraTermで命令を行う際、どうしても文字化けが発生してしまうことがある。
これは、データを受け取る側のPSoCの動く速度がどうしても遅くなるためデータを受け取れなくなってしまい、送る側のPSoCの表示が間に合わなくなってしまうからだと考えられる。
改善するには、受ける側のPSoCの動作をバッファーなどを用いて高速にしなければならない。

また、ジャンパー線の方法を使うことで、2台だけでなく3台、4台...とたくさんのPSoCを同期させることができる。

  • 最終更新:2012-07-10 15:46:04

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

認証パスワード