チーム1844

近づくな、音変わる。

1曲目 ドレミの歌
2曲目 カエルの歌
3曲目 チューリップ

研究者名

Fujii Tatuya
Muto Daiki
Deki Ryunosuke

使った器具

Psoc 1
スピーカー 1
距離センサー 2
ジャンパー線 2


概要

音楽を3曲設定しておきスイッチを押すと音楽が順番に入れ替わる。
電源を入れてる間、常に音楽が流れています。
1つ目の距離センサーは、物体がある一定の距離より近いときは音を1オクターブ下がるようにした。
また物体がある一定の距離より遠いと音が1オクターブ上がり、元に戻る。
2つ目の距離センサーは、物体がある一定の距離より近いときは音楽が消える。
また物体がある一定の距離より遠いとき音楽がまたなり始める。

ソースコード

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#pragma interrupt_handler myISR
#define SW 0b00010000
int PW=125; // Pulse Width
int SILENT=10000, D=229, L=204, M=182, F=172, S=153, R=136, C=121, DD=115;
int d=229, l=204, m=182, f=172, s=153, r=136, c=121, dd=115;
int OC = 2;
int TC=0; //Time Count
unsigned adc_data;
unsigned adc_data2;
int count = 0;
int co = 0;
int prcount = 0;

int onFlag;


void myISR(void)
{
if (adc_data < 0x08D6) {
D = d/OC;
L = l/OC;
M = m/OC;
F = f/OC;
S = s/OC;
R = r/OC;
C = c/OC;
DD = dd/OC;
}
else {
D = d;
L = l;
M = m;
F = f;
S = s;
R = r;
C = c;
DD = dd;
}

if (adc_data2 < 0x08D6) {
  onFlag = 1;
   }
else {
  onFlag = 0;
   }

if (prcount < co) {
  count++;
   }



if (onFlag) {
if (count % 3 == 0) {
  
TC += 1; //TC = TC +1
PWM16_1_WritePulseWidth(PW);
       
if(TC == 1){
PWM16_1_WritePeriod(D);
}
else if(TC == 4)
PWM16_1_WritePeriod(L);
else if(TC == 5)
PWM16_1_WritePeriod(M);
else if(TC == 8)
PWM16_1_WritePeriod(D);
else if(TC == 9)
PWM16_1_WritePeriod(M);
else if(TC == 11)
PWM16_1_WritePeriod(D);
else if(TC == 13)
PWM16_1_WritePeriod(M);

else if(TC == 17){

PWM16_1_WritePeriod(L);
}
else if(TC == 20)
PWM16_1_WritePeriod(M);
else if(TC == 21)
PWM16_1_WritePeriod(F);
else if(TC == 22)
PWM16_1_WritePeriod(F);
else if(TC == 23)
PWM16_1_WritePeriod(M);
else if(TC == 24)
PWM16_1_WritePeriod(L);
else if(TC == 25)
PWM16_1_WritePeriod(F);

else if(TC == 32){

PWM16_1_WritePeriod(M);
}
else if(TC == 35)
PWM16_1_WritePeriod(F);
else if(TC == 36)
PWM16_1_WritePeriod(S);
else if(TC == 39)
PWM16_1_WritePeriod(M);
else if(TC == 40)
PWM16_1_WritePeriod(S);
else if(TC == 42)
PWM16_1_WritePeriod(M);
else if(TC == 44)
PWM16_1_WritePeriod(S);

else if(TC == 48){

PWM16_1_WritePeriod(F);
}
else if(TC == 51)
PWM16_1_WritePeriod(S);
else if(TC == 52)
PWM16_1_WritePeriod(R);
else if(TC == 53)
PWM16_1_WritePeriod(R);
else if(TC == 54)
PWM16_1_WritePeriod(S);
else if(TC == 55)
PWM16_1_WritePeriod(F);
else if(TC == 56)
PWM16_1_WritePeriod(R);

else if(TC == 63){

PWM16_1_WritePeriod(S);
}
else if(TC == 66)
PWM16_1_WritePeriod(D);
else if(TC == 67)
PWM16_1_WritePeriod(L);
else if(TC == 68)
PWM16_1_WritePeriod(M);
else if(TC == 69)
PWM16_1_WritePeriod(F);
else if(TC == 70)
PWM16_1_WritePeriod(S);
else if(TC == 71)
PWM16_1_WritePeriod(R);
else if(TC == 79)
PWM16_1_WritePeriod(SILENT);

else if(TC == 80){

PWM16_1_WritePeriod(R);
}
else if(TC == 84)
PWM16_1_WritePeriod(L);
else if(TC == 85)
PWM16_1_WritePeriod(M);
else if(TC == 86)
PWM16_1_WritePeriod(F);
else if(TC == 87)
PWM16_1_WritePeriod(S);
else if(TC == 88)
PWM16_1_WritePeriod(R);
else if(TC == 89)
PWM16_1_WritePeriod(C);
else if(TC == 95)
PWM16_1_WritePeriod(SILENT);

else if(TC == 96){
PWM16_1_WritePeriod(C);
}
else if(TC == 100)
PWM16_1_WritePeriod(M);
else if(TC == 101)
PWM16_1_WritePeriod(F);
else if(TC == 102)
PWM16_1_WritePeriod(S);
else if(TC == 103)
PWM16_1_WritePeriod(R);
else if(TC == 104)
PWM16_1_WritePeriod(C);
else if(TC == 105)
PWM16_1_WritePeriod(DD);
else if(TC == 111)
PWM16_1_WritePeriod(SILENT);

else if(TC == 112){

PWM16_1_WritePeriod(DD);
}
else if(TC == 113)
PWM16_1_WritePeriod(C);
else if(TC == 114)
PWM16_1_WritePeriod(R);
else if(TC == 116)
PWM16_1_WritePeriod(F);
else if(TC == 118)
PWM16_1_WritePeriod(C);
else if(TC == 120)
PWM16_1_WritePeriod(S);
else if(TC == 122)
PWM16_1_WritePeriod(DD);

else if(TC == 126){
PWM16_1_WritePeriod(SILENT);
  }
if (TC >= 126)
      TC = 0;

}


else if (count % 3 == 1) {
TC += 1; //TC = TC +1
PWM16_1_WritePulseWidth(PW);
 


if(TC==1) { PWM16_1_WritePeriod(D);}
else if(TC==5) PWM16_1_WritePeriod(L);
else if(TC==9) PWM16_1_WritePeriod(M);
else if(TC==13) PWM16_1_WritePeriod(F);
else if(TC==17) PWM16_1_WritePeriod(M);
else if(TC==21) PWM16_1_WritePeriod(L);
else if(TC==25) PWM16_1_WritePeriod(D);
else if(TC==29) PWM16_1_WritePeriod(SILENT);
else if(TC==33) { PWM16_1_WritePeriod(M);}
else if(TC==37) PWM16_1_WritePeriod(F);
else if(TC==41) PWM16_1_WritePeriod(S);
else if(TC==45) PWM16_1_WritePeriod(R);
else if(TC==49) PWM16_1_WritePeriod(S);
else if(TC==53) PWM16_1_WritePeriod(F);
else if(TC==57) PWM16_1_WritePeriod(M);
else if(TC==61) PWM16_1_WritePeriod(SILENT);
else if(TC==65) { PWM16_1_WritePeriod(D);}
else if(TC==69) PWM16_1_WritePeriod(SILENT);
else if(TC==73) PWM16_1_WritePeriod(D);
else if(TC==77) PWM16_1_WritePeriod(SILENT);
else if(TC==81) PWM16_1_WritePeriod(D);
else if(TC==85) PWM16_1_WritePeriod(SILENT);
else if(TC==89) PWM16_1_WritePeriod(D);
else if(TC==93) PWM16_1_WritePeriod(SILENT);
else if(TC==97) { PWM16_1_WritePeriod(D); }
else if(TC==98) PWM16_1_WritePeriod(SILENT);
else if(TC==99) PWM16_1_WritePeriod(D);
else if(TC==100) PWM16_1_WritePeriod(SILENT);
else if(TC==101) PWM16_1_WritePeriod(L);
else if(TC==102) PWM16_1_WritePeriod(SILENT);
else if(TC==103) PWM16_1_WritePeriod(L);
else if(TC==104) PWM16_1_WritePeriod(SILENT);
else if(TC==105) PWM16_1_WritePeriod(M);
else if(TC==106) PWM16_1_WritePeriod(SILENT);
else if(TC==107) PWM16_1_WritePeriod(M);
else if(TC==108) PWM16_1_WritePeriod(SILENT);
else if(TC==109) PWM16_1_WritePeriod(F);
else if(TC==110) PWM16_1_WritePeriod(SILENT);
else if(TC==111) PWM16_1_WritePeriod(F);
else if(TC==112) PWM16_1_WritePeriod(SILENT);
else if(TC==113) PWM16_1_WritePeriod(M);
else if(TC==117) PWM16_1_WritePeriod(L);
else if(TC==121) PWM16_1_WritePeriod(D);
else if(TC==125) PWM16_1_WritePeriod(SILENT);

if(TC >= 126) TC = 0;

}
      

else if (count%3 == 2) {

TC += 1; //TC = TC +1
PWM16_1_WritePulseWidth(PW);
switch( TC ) {
              
              // 繝峨Ξ繝・
              case 1:
                  PWM16_1_WritePeriod(D);
              break;
              
              case 4:
                  PWM16_1_WritePeriod(SILENT);
              break;
              
              case 5:
                  PWM16_1_WritePeriod(L);
              break;
              
              case 8:
                  PWM16_1_WritePeriod(SILENT);
              break;
              
              case 9:
                  PWM16_1_WritePeriod(M);
              break;
              
              case 14:
                  PWM16_1_WritePeriod(SILENT);
              break;
              
              // 繝峨Ξ繝・
              case 17:
                  PWM16_1_WritePeriod(D);
              break;
              
              case 20:
                  PWM16_1_WritePeriod(SILENT);
              break;
              
              case 21:
                  PWM16_1_WritePeriod(L);
              break;
              
              case 24:
                  PWM16_1_WritePeriod(SILENT);
              break;
              
              case 25:
                  PWM16_1_WritePeriod(M);
              break;
              
              case 30:
                  PWM16_1_WritePeriod(SILENT);
              break;
              
              // 繧ス繝溘Ξ繝・
              case 33:
                  PWM16_1_WritePeriod(S);
              break;
              
              case 36:
                  PWM16_1_WritePeriod(SILENT);
              break;
              
              case 37:
                  PWM16_1_WritePeriod(M);
              break;
              
              case 40:
                  PWM16_1_WritePeriod(SILENT);
              break;
              
              case 41:
                  PWM16_1_WritePeriod(L);
              break;
              
              case 44:
                  PWM16_1_WritePeriod(SILENT);
              break;
              
              case 45:
                  PWM16_1_WritePeriod(D);
              break;
              
              case 48:
                  PWM16_1_WritePeriod(SILENT);
              break;
              
              // 繝ャ繝溘Ξ
              case 49:
                  PWM16_1_WritePeriod(L);
              break;
              
              case 52:
                  PWM16_1_WritePeriod(SILENT);
              break;
              
              case 53:
                  PWM16_1_WritePeriod(M);
              break;
              
              case 56:
                  PWM16_1_WritePeriod(SILENT);
              break;
              
              case 57:
                  PWM16_1_WritePeriod(L);
              break;
              
              case 60:
                  PWM16_1_WritePeriod(SILENT);
              break;
          }
          
          // 繝ォ繝シ繝・
          if( TC >= 65 ) { TC = 0; }

}
}
else {
PWM16_1_WritePulseWidth(PW);
PWM16_1_WritePeriod(SILENT);
}
}//髢「謨ー邨ゆコ・

void main()
{
// Insert your main routine
PGA_Start(PGA_HIGHPOWER);
PGA_2_Start(PGA_2_HIGHPOWER);
LCD_Start();
LCD_InitBG(LCD_SOLID_BG);
DUALADC_Start(DUALADC_HIGHPOWER);
DUALADC_GetSamples(0);

M8C_EnableGInt;

PWM16_1_Start();
Timer16_1_EnableInt();
Timer16_1_Start();
PRT1DR &=(~SW);
while(1) {
  
   if (PRT1DR & SW) {
       co++;
       //count /= 3; // 繝懊ち繝ウ縺ョ繧ォ繧ヲ繝ウ繝医′螟ァ縺阪>縺ョ縺ァ +1, +2, +3 縺ッ蜷後§蛟、縺ォ縺吶k
       PRT1DR &= (~SW);
   }
   else {
       prcount = co;
       PRT1DR &= (~SW);
   }
   
   while(DUALADC_fIsDataAvailable() == 0);
   adc_data = DUALADC_iGetData1();
   adc_data2 = DUALADC_iGetData2();
   LCD_Position(0,0);
   LCD_PrHexInt(count);
   LCD_DrawBG(1,0,16,(adc_data/50));
   }
}

考察

DUALADC を使用して距離センサーの値をデジタル変換しようとしたがうまくいかなかったので、
まず、ADCINC を使用して、授業で使用したパラメータを用いて、距離センサーが動くことを確認したのち、
そのパラメータを DUALADC に適用したらうまくいった。
おそらく、最初は DUALADC のパラメータが正しくなかったと考えられる。
スイッチを押すことで値が増加する変数を用意し、その値を用いて再生する曲を変更している。このとき、変数の値を直接使うのではなく、変数を3で割った余りを用いることで3曲を順番に流せるようにした。
また、2つ目の距離センサーを用いて距離に応じて流れる音楽の速さを変えることも考えたが、速さを変化させた時のTC(音と音の間隔を制御する変数)の値の整合性がうまく取れなかったため、音楽の再生のon/offに変更した。
この問題については、近いときと遠いときで別々の変数を用意することで解決できると推測したが、時間の関係上実現できなかった。

参考:チーム82

  • 最終更新:2018-10-23 16:48:09

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

認証パスワード