チーム1951

課題名

音当てゲーム

研究者名

Mahiro Nihei
Ayano Sagasaki


概要

PSoCから流れる音を聞いて、「今鳴っている音を当てよう」、「鍵盤上で、一つ目の音と二つ目の音のどちらの方が三つ目の音に近いだろうか?」という二種類の問題に挑戦しよう。

問題は前者のものが1問、後者のものが2問作成済み。

解答には、PCのキーボードを使用。

あなたの音感とちょっとした知識が試されます。


※キーボードのどの文字が「ドレミファソラシド」に対応しているかは、ラボ pwm_uart_2 に準拠するものとします。

使用機材

PSoC基板×1
MiNiProg×1
ジャンパ線×2
スピーカー×1
ストレート通信ケーブル×1

ソースコード

#include <m8c.h> // part specific constants and macros
#include <stdlib.h>
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#pragma interrupt_handler myISR

int PW=125;
int SILENT=0, D=229, L=204, M=182, F=172, S=153, R=136, C=121, DD=115;
int TC=0, Q=0;

void main(void)
{
  char* strPtr;
   int x;
   
   UART_CmdReset();
   UART_IntCntl(UART_ENABLE_RX_INT);
   Counter8_WritePeriod(155);
   Counter8_WriteCompareValue(77);
   Counter8_Start();
   UART_Start(UART_PARITY_NONE);
   M8C_EnableGInt;
   PWM16_1_Start();
   UART_CPutString("\r\nWelcome to PSoC UART test program. V1.1 \r\n");
     
   while(1){
       if(UART_bCmdCheck()){
         if(strPtr = UART_szGetParam()){
           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 == 'l')
               PWM16_1_WritePeriod(SILENT);
           else if(*strPtr == 'q'){
               UART_CmdReset();
               PWM16_1_WritePeriod(F);
               while(1){
                   if(UART_bCmdCheck()){
                       if(strPtr = UART_szGetParam()){
                           if(*strPtr == 'f'){
                               PWM16_1_WritePeriod(SILENT);
                               UART_CPutString("正解! \r\n");
                               break;
                           }
                           else{
                               x=atoi(strPtr);
                               PWM16_1_WritePeriod(x);
                               UART_CPutString("不正解! \r\n");
                               break;
                           }
                       }
                   }
               }
           }
           else if(*strPtr == '1'){
               TC = 0;
               Q = 1;
               Timer16_1_EnableInt();
               Timer16_1_Start();
               UART_CmdReset();
               while(1){
                   if(UART_bCmdCheck()){
                       if(strPtr = UART_szGetParam()){
                           if(*strPtr == 'a'){
                               UART_CPutString("正解! \r\n");
                               break;
                           }
                           else if(*strPtr == 'f'){
                               UART_CPutString("不正解! \r\n");
                               break;
                           }
                           else{
                               UART_CPutString("a or f \r\n");
                               UART_CmdReset();
                           }    
                       }
                   }
               }
           }
           else if(*strPtr == '2'){
               TC = 0;
               Q = 2;
               Timer16_1_EnableInt();
               Timer16_1_Start();
               UART_CmdReset();
               while(1){
                   if(UART_bCmdCheck()){
                       if(strPtr = UART_szGetParam()){
                           if(*strPtr == 'f'){
                               UART_CPutString("正解! \r\n");
                               break;
                           }
                           else if(*strPtr == 'k'){
                               UART_CPutString("不正解! \r\n");
                               break;
                           }
                           else{
                               UART_CPutString("f or k \r\n");
                               UART_CmdReset();
                           }    
                       }
                   }
               }
           }
         }
         UART_CmdReset();
        }
       }
}


void myISR(void){

  TC+=1;
   PWM16_1_WritePulseWidth(PW);
   
   if(Q == 1){
       if(TC == 1){
           PWM16_1_WritePeriod(D);
           UART_CPutString("First Sound \r\n");
       }
       else if(TC == 10){
           PWM16_1_WritePeriod(F);
           UART_CPutString("Second Sound \r\n");
       }
       else if(TC == 19){
           PWM16_1_WritePeriod(L);
           UART_CPutString("Third Sound \r\n");
       }
       else if(TC == 28){
           PWM16_1_WritePeriod(SILENT);
           UART_CPutString("Choose First Sound(a) or Second Sound(f) \r\n");
           Timer16_1_Stop();
       }
   }
   else if(Q == 2){
       if(TC == 1){
           PWM16_1_WritePeriod(F);
           UART_CPutString("First Sound \r\n");
       }
       else if(TC == 10){
           PWM16_1_WritePeriod(DD);
           UART_CPutString("Second Sound \r\n");
       }
       else if(TC == 19){
           PWM16_1_WritePeriod(S);
           UART_CPutString("Third Sound \r\n");
       }
       else if(TC == 28){
           PWM16_1_WritePeriod(SILENT);
           UART_CPutString("Choose First Sound(f) or Second Sound(k) \r\n");
           Timer16_1_Stop();
       }
   }
   
   
   
}

考察

 ラボ pwm_uart_2 から着想を得た。

 今回は、PCのキーボードから入力されたコマンドをリセットする関数UART_CmdReset()を実行する位置を誤っていたために、時間がかかった。コマンドが入力されているかを確認するif文の外にリセットの関数が記述されていたために、入力したコマンドが読み込まれる前にリセットされていた思われる。
 また、ハードウェア割り込みの myISR 内の処理を、本来想定していない書き方で作ってしまっているとの助言が先生からあったため、ISR の理想的な書き方を知っておくべきだと思った。
 本来、問題数はもっと多くなる予定だったが、時間の関係で少なくなってしまった。また、今回は白鍵の部分しか問題に出せなかったので、黒鍵の問題を作ってもよかったと思った。

  • 最終更新:2019-12-03 16:31:03

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

認証パスワード