チーム1412
課題名
傾けたら音鳴るやーつ♪
研究者名
2年15組44番 平山功基
2年15組45番 牧井慶太朗
使用機材
PSoC
三軸加速センサ(ジャイロセンサ)
ジャンパ線 5本(+2本)
スピーカー
内容
ジャイロセンサを左に傾けると音が一音ずつあがり、逆に右に傾けると音が一音ずつ下がる装置を作った。
また上下に傾けると音が消える仕組みになっているので、離れた音階でも理論上は奏でることが可能である。
傾き具合も16進法ではあるが、LCDに表示させている。
配線とソースコード
- 配線
- ソースコード
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
int SILENT=0, D=229, L=204, M=182, F=172, S=153, R=136, C=121, DD=115;
int SD=459, SL=409, SM=364, SF=344, SS=306, SR=273, SC=242;
void main(void)
{
int x,y,z; //x,y,zそれぞれの傾き。zは今回は使わない。 int xs,ys; //xs,ysはx,y,zの符号のフラグ。0が正、1が負。 PGA_1_Start(PGA_1_HIGHPOWER); PGA_2_Start(PGA_2_HIGHPOWER); PGA_3_Start(PGA_3_HIGHPOWER); PWM16_Start(); LCD_Start(); LCD_InitBG(LCD_SOLID_BG); M8C_EnableGInt; TRIADC_Start(TRIADC_HIGHPOWER); TRIADC_SetResolution(12); TRIADC_GetSamples(0); while(1){ while(TRIADC_fIsDataAvailable() == 0); x = TRIADC_iGetData1(); //TRIADC input1 から値を受け取る。 y = TRIADC_iGetData2(); //TRIADC input2 から値を受け取る。 z = TRIADC_iGetData3ClearFlag(); //TRIADC input3 から値を受け取る。 x += 272; //x成分の傾きの調整。利用するジャイロセンサーによって変わる。 y += 256; //y成分の傾きの調整。利用するジャイロセンサーによって変わる。 xs = 0; //始めは正と仮定。 ys = 0;
if(x < 0){ xs = 1; x = 65535 - x; //負の値の表記に対応させる。 } if(y < 0){ ys = 1; y = 65535 - y; } LCD_Position(0,0); LCD_PrCString("X:"); LCD_Position(0,2); if(xs == 1) //xsが1ならxの前にマイナス記号を、そうでなければ何も表示しない。 LCD_PrCString("-"); else LCD_PrCString(" "); LCD_Position(0,3); LCD_PrHexInt(x);
LCD_Position(0,8); LCD_PrCString("Y:"); LCD_Position(0,10); if(ys == 1) //ysが1ならyの前にマイナス記号を、そうでなければ何も表示しない。 LCD_PrCString("-"); else LCD_PrCString(" "); LCD_Position(0,11); LCD_PrHexInt(y);
LCD_Position(1,0); LCD_PrCString("Z:"); LCD_Position(1,3); LCD_PrHexInt(z); //yの傾きが大きいときは音がならないようにします。 if(y >300) PWM16_WritePeriod(SILENT); //xの傾きにより音階が変わるようにします。 else if(xs==1 && 700<= x) PWM16_WritePeriod(SD); else if(xs==1 && 600<= x && x<700) PWM16_WritePeriod(SL); else if(xs==1 && 500<= x && x<600) PWM16_WritePeriod(SM); else if(xs==1 && 400<= x && x<500) PWM16_WritePeriod(SF); else if(xs==1 && 300<= x && x<400) PWM16_WritePeriod(SS); else if(xs==1 && 200<= x && x<300) PWM16_WritePeriod(SR); else if(xs==1 && 100<= x && x<200) PWM16_WritePeriod(SC); else if(xs==1 && 0<= x && x<100) PWM16_WritePeriod(D); else if(xs==0 && 0<= x && x<100) PWM16_WritePeriod(D); else if(xs==0 && 100<=x && x<200) PWM16_WritePeriod(L); else if(xs==0 && 200<=x && x<300) PWM16_WritePeriod(M); else if(xs==0 && 300<=x && x<400) PWM16_WritePeriod(F); else if(xs==0 && 400<=x && x<500) PWM16_WritePeriod(S); else if(xs==0 && 500<=x && x<600) PWM16_WritePeriod(R); else if(xs==0 && 600<=x && x<700) PWM16_WritePeriod(C); else if(xs==0 && 700<=x) PWM16_WritePeriod(DD); }
}
- 説明
ジャイロセンサを使うにあたり、TRIADCモジュールを利用した。
ジャイロセンサは3方向(x,y,z)の電圧変化を出力するため、それぞれの方向に一つのPGAが必要なので、PGAを3つ用意する必要がある。
x,yの値により音の高さを変えるため、ポーリングによりx,yの値を取得させ、x,yが一定の範囲になったら音が鳴るようにした。
考察
今回作成にあたり timer_pwm2 ラボと 使い方資料 を参考にした。
ジャイロセンサによってどうしても水平位置の誤差があるため、プログラム中に記述して水平位置を修正したが、
使うジャイロセンサによって誤差の大きさも変わってしまうのでいちいちソースコードを変更しなければならない欠点がある。
スイッチを押すと水平位置の情報を取得し、自動的に修正してくれるようプログラムに組み込めばより良いものになると思う。
- 最終更新:2014-05-20 15:48:32