チーム1722
課題名
距離センサを用いた音階、オクターブの変更、出力
研究者名
Hideto Suzuki
Yoshihiro Setaka
概要
2つの距離センサを用いて音階と、オクターブの変更を試みる。
音階はかざした手を距離センサから離していくことで高くなっていき、オクターブの変更も同様にして行う。
距離センサの測定値をLCDディスプレイに表示する。
使用した機器
基盤
ジャンパ線
スピーカ
距離センサ(2つ)
配線
ソースコード
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
int SILENT = 0, C = 229, D = 204, E = 182, F = 172, G = 153, A = 136, B = 121,
CC = 115, DD = 102, EE = 91, FF = 86, GG = 77, AA = 68, BB = 61, c = 458, d = 408, e = 364, f = 343, g = 306, a = 273, b = 243;
void main(void)
{
unsigned int vec, oct; unsigned int oct2, vec2; int i = 0; LCD_Start(); LCD_Position(0,5);
LCD_PrHexInt(oct);
PGA_1_Start(PGA_1_HIGHPOWER); //PGA起動 PGA_2_Start(PGA_2_HIGHPOWER); M8C_EnableGInt; // Enable global interrupts DUALADC_Start(DUALADC_HIGHPOWER); // Turn on Analog section //DUALADC_SetResolution(10); // Set resolution to 10 Bits DUALADC_GetSamples(0); // Start ADC to read continuously PWM16_1_Start(); // 音発生 for(;;) { while(DUALADC_fIsDataAvailable() == 0); // Wait for data to be ready vec = DUALADC_iGetData1(); // Get Data from ADC Input1 oct = DUALADC_iGetData2(); // Get Data from ADC Input2 // and clear data ready fla
LCD_Position(0,0);
LCD_PrHexInt(vec);
LCD_Position(0,5);
LCD_PrHexInt(oct);
//func(iResult1,iResult2); // User function to use data PWM16_1_WritePulseWidth(125); if(vec <= 150){ vec2 = 0; } else if(vec <= 250){ vec2 = 7; } else if(vec <= 350){ vec2 = 6; } else if(vec <= 450){ vec2 = 5; } else if(vec <= 550){ vec2 = 4; } else if(vec <= 650){ vec2 = 3; } else if(vec <= 750){ vec2 = 2; } else { vec2 = 1; } if(oct <= 150){ oct2 = 0; } else if(oct <= 450){ oct2 = 3; } else if(oct <= 750){ oct2 = 2; } else { oct2 = 1; } switch(oct2*10 + vec2) { case 11: PWM16_1_WritePeriod(c); break; case 12: PWM16_1_WritePeriod(d); break; case 13: PWM16_1_WritePeriod(e); break; case 14: PWM16_1_WritePeriod(f); break; case 15: PWM16_1_WritePeriod(g); break; case 16: PWM16_1_WritePeriod(a); break; case 17: PWM16_1_WritePeriod(b); break; case 21: PWM16_1_WritePeriod(C); break; case 22: PWM16_1_WritePeriod(D); break; case 23: PWM16_1_WritePeriod(E); break; case 24: PWM16_1_WritePeriod(F); break; case 25: PWM16_1_WritePeriod(G); break; case 26: PWM16_1_WritePeriod(A); break; case 27: PWM16_1_WritePeriod(B); break; case 31: PWM16_1_WritePeriod(CC); break; case 32: PWM16_1_WritePeriod(DD); break; case 33: PWM16_1_WritePeriod(EE); break; case 34: PWM16_1_WritePeriod(FF); break; case 35: PWM16_1_WritePeriod(GG); break; case 36: PWM16_1_WritePeriod(AA); break; case 37: PWM16_1_WritePeriod(BB); break; default: PWM16_1_WritePeriod(SILENT); break; } }
}
考察
チーム1632のソースコードを基にして、ラボpwm_uart_2を参考にしながら作成した。
今回は距離センサを2つ用いるために距離データはDUALADCとしてPWM16モジュールによって音を出力するようにした。
また、距離の測定にはelse,switch文を用いていて、手をかざさないときに無音になるようにした。
今回の実装ではオクターブは動作することもあるが、音階のセンサは“ド”の音しか出ず、正常に動作していなかった。
また、無音になるところではノイズが激しすぎて無音にならなかった。
原因として考えられるのは、同じソースコードで基盤を変えただけで音の出力が変化したことによる、基盤自体の不良、
またスピーカ、距離センサについても同様なことが起こったのでそれらの不良も考えられる。
特に距離センサは、LCDでの出力が明らかに不自然なためその可能性が高い(いろいろ試したがほとんど改善しなかった)。
- 最終更新:2017-06-19 14:24:13