チーム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