チーム1662

課題名

てるみちゃん

研究者名

Tomoki Hayashi
Kouchi Matsutani

概要

距離センサーを用いて手をかざすことでドレミの演奏ができる楽器を作成した。


使用機器

PSoC本体
PSoC MiniProg
距離センサー
LCD
スピーカー


動作原理

距離センサーの信号をデジタル変換し数値として受け取る。
数値を受け取った際にポーリング処理を行い、Periodを受け取った値に応じて上書きしドレミの音を鳴らす。


ソースコード


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


void main(void)
{
  int counter=0;
   unsigned int adc_data=0;
   M8C_EnableGInt;
   PWM16_1_Start();

  PGA_Start(PGA_HIGHPOWER);
   LCD_Start();
   LCD_InitBG(LCD_SOLID_BG);
   M8C_EnableGInt;
   ADCINC_Start(ADCINC_HIGHPOWER);
   ADCINC_GetSamples(0);

  PWM16_1_WritePulseWidth(128);
   PWM16_1_WritePeriod(0);
   
   while(1){
       while(ADCINC_fIsDataAvailable()==0);
       LCD_Position(0,0);
       LCD_DrawBG(1,0,16,(adc_data/50));
       if(counter==0){ // 0のときPeriodの変更を許す
           counter=10;
           adc_data=ADCINC_wClearFlagGetData();
           if(adc_data/10>100)
               if(adc_data/10>229)
                   PWM16_1_WritePeriod(229);
               else if(adc_data/10>204)
                   PWM16_1_WritePeriod(204);
               else if(adc_data/10>182)
                   PWM16_1_WritePeriod(182);
               else if(adc_data/10>172)
                   PWM16_1_WritePeriod(172);
               else if(adc_data/10>153)
                   PWM16_1_WritePeriod(153);
               else if(adc_data/10>136)
                   PWM16_1_WritePeriod(136);
               else if(adc_data/10>121)
                   PWM16_1_WritePeriod(121);
               else
                   PWM16_1_WritePeriod(115);
           else
               PWM16_1_WritePeriod(100000); // 手を離すと音が止まる
       }else{
           counter--;
       }
   }
}

考察

lab3_adcとtimer_pwm2をベースに作成した。
距離センサーの値は不安定で、手を動かさなくても音階がゆらぐことがあったので、
一度Periodが変更されるとしばらくは変更を受け付けないようにする
手ブレ補正のようなもの機能をつけて演奏しやすくした。
また、演奏しやすくするため、ソフトウェア制御で8種類の音に絞り込んだ。
距離センサーを使用し、無音にするためにPWM16_1_WritePeriod(0);を実行するとノイズが発生したため、
無音にするために、あえて非常に低い音にすることで人には聞こえにくいようにした。
フィルターを通して綺麗な音にした方が良いと考えられる。

  • 最終更新:2016-12-20 15:41:08

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

認証パスワード