チーム1436

課題名

モスキート音発生装置~あなたの耳年齢は何歳?~

研究者名

2年15組11番 大石 達寛
2年15組12番 大関 宏

概要

この装置から流れるモスキート音が聞けるか聞けないかであなたの耳年齢が分かっちゃいます!!

対応したキーボードを押すことで以下の周波数のモスキート音が流れます。

LEVEL1 13KHz 41~50歳くらい
LEVEL2 15KHz 31~40歳くらい
LEVEL3 16KHz 25~30歳くらい
LEVEL4 18KHz 18~24歳くらい
LEVEL5 20KHz 13~17歳くらい
LEVELMAX 21KHz 聞こえたら人間ではない

聞き取れたら"g"を押してドラクエのレベルアップ音を聞きましょう!!
聞き取れなかったら"0"を押しましょう…マリオブラザーズのゲームオーバー音が流れます…

[対応キーボード一覧]
キーボード"1":Level1のモスキート音が流れ、LCDに"LEVEL1"と表示される。
キーボード"2":Level2のモスキート音が流れ、LCDに"LEVEL2"と表示される。
キーボード"3":Level3のモスキート音が流れ、LCDに"LEVEL3"と表示される。
キーボード"4":Level4のモスキート音が流れ、LCDに"LEVEL4"と表示される。
キーボード"5":Level5のモスキート音が流れ、LCDに"LEVEL5"と表示される。
キーボード"6":Level6のモスキート音が流れ、LCDに"LEVELMAX"と表示される。
キーボード"g":聞きとれた場合に押すとレベルアップ音が流れ、LCDに"LEVLUP"と表示される。
キーボード"0":聞き取れなかった場合に押すとゲームオーバー音が流れ、LCDに"GAMEOVER"と表示される。

配線

mosquito.png

ソースコード


#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;
int SILENT=0, D=229, L=204, M=182, F=172, S=153, R=136, C=121, DD=115, MM=91, LL=102 ,DDD=58, DDDD=29,FF=86,DDH=108,MH=193;
double level1=4.6030769230 ,level2=3.98933333 ,level3=3.74 ,level4=3.32444444,level5=2.992,levelmax=2.84952380;
int TC=0;
 int n = 0;
     void myISR(void){
   if(n == 1){
   TC += 1;
   PWM16_1_WritePulseWidth(PW);
   PWM16_1_Start();
   if(TC == 1)
   PWM16_1_WritePeriod(F);
   if(TC == 2)
   PWM16_1_WritePeriod(SILENT);
   if(TC == 3)
   PWM16_1_WritePeriod(F);
   if(TC == 4)
   PWM16_1_WritePeriod(SILENT);
   if(TC == 5)
   PWM16_1_WritePeriod(F);
   if(TC == 6)
   PWM16_1_WritePeriod(SILENT);
   if(TC == 7)
   PWM16_1_WritePeriod(MH);
   if(TC == 9)
   PWM16_1_WritePeriod(SILENT);
   if(TC == 11)
   PWM16_1_WritePeriod(S);
   if(TC == 13)
   PWM16_1_WritePeriod(F);
   if(TC == 18)
   PWM16_1_WritePeriod(SILENT);
   }
   if(n == 2){
   TC += 1;
   PWM16_1_WritePulseWidth(PW);
   PWM16_1_Start();
   if(TC == 1)
   PWM16_1_WritePeriod(DD);
   if(TC == 2)
   PWM16_1_WritePeriod(D);
   if(TC == 3)
   PWM16_1_WritePeriod(LL);
   if(TC == 4)
   PWM16_1_WritePeriod(C);
   if(TC == 5)
   PWM16_1_WritePeriod(FF);
   if(TC == 6)
   PWM16_1_WritePeriod(SILENT);
   if(TC == 7)
   PWM16_1_WritePeriod(FF);
   if(TC == 8)
   PWM16_1_WritePeriod(SILENT);
   if(TC == 9)
   PWM16_1_WritePeriod(MM);
   if(TC == 10)
   PWM16_1_WritePeriod(SILENT);
   if(TC == 11)
   PWM16_1_WritePeriod(LL);
   if(TC == 12)
   PWM16_1_WritePeriod(SILENT);
   if(TC == 13)
   PWM16_1_WritePeriod(DD);
   if(TC == 14)
   PWM16_1_WritePeriod(M);
   if(TC == 15)
   PWM16_1_WritePeriod(SILENT);
   if(TC == 16)
   PWM16_1_WritePeriod(M);
   if(TC == 17)
   PWM16_1_WritePeriod(D);
   if(TC == 18)
   PWM16_1_WritePeriod(SILENT);
   }
}


void main(void)
{
  char*strPtr;
   UART_CmdReset();
   UART_IntCntl(UART_ENABLE_RX_INT);
   Counter8_WritePeriod(155);
   Counter8_WriteCompareValue(77);
   Counter8_Start();
   UART_Start(UART_PARITY_NONE);
   M8C_EnableGInt;
   UART_CPutString("\r\nWelcom to PSoC UART test program.V1.1\r\n");
   while(1){
   if(UART_bCmdCheck()){
   if(strPtr = UART_szGetParam()){
   UART_CPutString("Found valid command\r\nCommand =>");
   UART_PutString(strPtr);
   UART_CPutString("<\r\nParamaters:\r\n");
    PWM16_1_Start();
   if(*strPtr=='1'){
    LCD_1_Start();
    LCD_1_PrCString("LEVEL1");
    PWM16_1_WritePeriod(level1);
    }
   else if(*strPtr=='2'){
    LCD_1_Start();
    LCD_1_PrCString("LEVEL2");
    PWM16_1_WritePeriod(level2);
    }
   else if(*strPtr=='3'){
    LCD_1_Start(); 
    LCD_1_PrCString("LEVEL3");
    PWM16_1_WritePeriod(level3);
    }
   else if(*strPtr=='4'){
    LCD_1_Start();
    LCD_1_PrCString("LEVEL4");
    PWM16_1_WritePeriod(level4);
    }
    else if(*strPtr=='5'){
    LCD_1_Start();
    LCD_1_PrCString("LEVEL5");
    PWM16_1_WritePeriod(level5);
    }
   else if(*strPtr=='6'){
    LCD_1_Start();
    LCD_1_PrCString("LEVELMAX");
    PWM16_1_WritePeriod(levelmax);
    }
    else if(*strPtr=='0'){
    n=2;
    M8C_EnableGInt;
    LCD_1_Start();
    LCD_1_PrCString("GAMEOVER");
    PWM16_1_Start();
    Timer16_1_EnableInt();
    Timer16_1_Start();
    while(1)
    {};
    }
     
    if(*strPtr=='g')
    {
    n=1
    M8C_EnableGInt;
    PWM16_1_Start();
    LCD_1_Start();
    LCD_1_PrCString("LEVELUP");
    Timer16_1_EnableInt();
    Timer16_1_Start();
    while(1)
    {};
    }
     
     
}
UART_CmdReset();
}
}
}

考察

参考としたラボはhello_world,timer_pwm2,pwm_uart_2である。

工夫した点として
モスキート音を聞けた場合レベルアップの効果音を、モスキート音を聞こえなかった場合ゲームオーバーの効果音を用意した。またモスキート音が鳴っているとき、レベルがわかるようにLCDディスプレーに今聞いているモスキート音のレベルを表示させた。
nという変数を使うことでどの効果音が流れるかの場合分けをした。
出力される周波数とVC3の周波数との関係を調べ、特定の周波数を流すのには苦労した。
自分たちの耳でも聞こえない周波数はウェーブスペクトラを使用し、本当にスピーカーから音が出ているか確認した。
効果音を鳴らした後、リセットボタンを押さずににモスキート音を鳴らすということが実装できなかった。

  • 最終更新:2014-07-15 16:35:50

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

認証パスワード