チーム1447

課題名

距離センサーを用いたスイッチ付き音階発生装置

研究者名

2年14組32番 坪内佑紀
2年14組33番 寺内浩斗

使用部品

基盤
PSoCMiniPrag
距離センサー
スピーカー
ジャンパー線

概要

赤外線を使い、距離に応じて音階を発生させる仕様にした。またスイッチを取り付け、押したら音階が発生し、押さなければ無音となる。
約8cm以上離れた距離から遠のけ、近いほうからド、レ、ミ、ファ、ソ、ラ、シ、ドとなっている。

仕様

音を出すためにPWM16モジュールを使用し、音の違いは距離センサーを使用した。
距離センサーから得た距離に関するアナログ的データをADCによってAD変換をさせ,デジタル数値化している.
main文では距離センサーが出す値によって場合分けをし、距離が遠い場所(値は1024)のときに、高いドの音を出力し,その後は値を+256ずつすることで出す音を下げている。つまり,手を遠ざけるほど音は高くなる仕様となっている.
音階を発生させる際にはスイッチを押す必要があり,SWはPort1[4]に接続している.
ディスプレイには,音が出てない間は,"SILENT"と表示し,音が出ている間はその音が(例えばソの音であれば"S")表示される.
PWM16の出力はPort0[0]で、それをスピーカーに、スピーカーをGNDに接続した。距離センサーは、port0[1]、GND、VCCにつなげている。

ソースプログラム




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

int PW=125; // Pulse Width

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

#define SW 0b00010000

void main(void)
{
  // M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
   // Insert your main routine code here.
   unsigned int adc_data;
   PGA_Start(PGA_HIGHPOWER);
   LCD_Start();
   LCD_InitBG(LCD_SOLID_BG);
   M8C_EnableGInt;
   ADCINC_Start(ADCINC_HIGHPOWER);
   ADCINC_GetSamples(0);
   PWM16_1_Start();
   PWM16_1_Stop();
   
   PRT1DR &= (~SW);
   
    while(1){
      while(ADCINC_fIsDataAvailable() == 0);
      adc_data = ADCINC_wClearFlagGetData();
      
      if(PRT1DR & SW){
      PWM16_1_Start();
      LCD_Start();
      // 音発生
      PWM16_1_WritePulseWidth(PW);
      
      if(adc_data <= 1024){
          PWM16_1_WritePeriod(DD);
          LCD_PrCString("DD");
          }
      
      else if(adc_data  > 1024 && adc_data  <= 1280){
          PWM16_1_WritePeriod(C);
          LCD_PrCString("C");
          }
      
      else if(adc_data  > 1280 && adc_data  <= 1536){
          PWM16_1_WritePeriod(R);
          LCD_PrCString("R");
          }
      
      else if(adc_data  > 1536 && adc_data  <= 1792){
          PWM16_1_WritePeriod(S);
          LCD_PrCString("S");
          }
      
      else if(adc_data  > 1792 && adc_data  <= 2048){
          PWM16_1_WritePeriod(F);
        LCD_PrCString("F");
      }
      
      else if(adc_data  > 2048 && adc_data  <= 2304){
          PWM16_1_WritePeriod(M);
          LCD_PrCString("M");
          }
      
      else if(adc_data  > 2304 && adc_data  <= 2560){
          PWM16_1_WritePeriod(L);
          LCD_PrCString("L");
          }
          
      else if(adc_data  > 2560 && adc_data  <= 2816){
          PWM16_1_WritePeriod(D);
          LCD_PrCString("D");
          }
          PRT1DR &= (~SW);
          }else{
          PWM16_1_Stop();
          LCD_Start();
          LCD_PrCString("SILENT");
          PRT1DR &= (~SW);
          }
          
   }
}

モジュールとPSoCの配線


DSC_0017_convert_20141014193741.jpg

DSC_0016_convert_20141014194114.jpg


考察

この装置は,lab3_adc, gpio_poll, timer_pwm2を応用させて製作した.
ディスプレイには今どんな音が出ているのかを表示させることで,ユーザーに不便のない仕様になった.
音を出力させた際に,あまり雑音が入ることはなかったが,演習で学んだフィルタを用いるとさらに音が鮮明に聞こえたのではないかと思う.
また,距離センサの仕様上,距離が近いほど音を出力する幅が狭くなってしまい,綺麗に音階を発生させることが難しくなってしまっているため,
その部分を改良すると,さらに良い装置になったと思う.

  • 最終更新:2014-10-21 15:24:16

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

認証パスワード