チーム1831

課題名

電子ピアノ

研究者名

Hikaru Ohmuro
Aizawa Kazuhiro
Koki Tomita
Ryuto Kitamura

使用器具

ジャンパ線 2本
ストレート通信ケーブル
スピーカー
PSoCMiniProg
PSoC基盤

操作説明

キーボードのキーを押すと、それに対応した音がスピーカーから出力される。
a : ド
w : ド#
s : レ
e : レ#
d : ミ
f : ファ
t : ファ#
g : ソ
y : ソ#
h : ラ
u : ラ#
j : シ
k : ド
l : 無音

< : 1オクターブ下げる
> : 1オクターブ上げる
? : 最初に戻す

配線図

gazou1.PNG

ソースコード

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
int PW = 125;
double SILENT = 0, D = 229.34, L = 204.31, M = 182.02, F = 171.81, S = 153.06;
double R = 136.36, C = 121.49, DD = 114.67;
double Ds = 216.47, Ls = 192.85, Fs = 162.16, Ss = 144.47, Rs = 128.71;

void reset()
{
  D = 229.34, L = 204.31, M = 182.02, F = 171.81, S = 153.06;
   R = 136.36, C = 121.49, DD = 114.67;
   Ds = 216.47, Ls = 192.85, Fs = 162.16, Ss = 144.47, Rs = 128.71;
}

void high()
{
  D = DD;
   L = L/2;
   M = M/2;
   F = F/2;
   S = S/2;
   R = R/2;
   C = C/2;
   DD = DD/2;
   Ds = Ds/2;
   Ls = Ls/2;
   Fs = Fs/2;
   Ss = Ss/2;
   Rs = Rs/2;
}
void low()
{
  DD = D;
   D = D*2;
   L = L*2;
   M = M*2;
   F = F*2;
   S = S*2;
   R = R*2;
   C = C*2;
   Ds = Ds*2;
   Ls = Ls*2;
   Fs = Fs*2;
   Ss = Ss*2;
   Rs = Rs*2;
}


void main(void)
{
  // Insert your main routine code here.
   char * strPtr;
   UART_CmdReset();
   UART_IntCntl(UART_ENABLE_RX_INT);
   Counter8_WritePeriod(155);
   Counter8_WriteCompareValue(77);
   Counter8_Start();
   UART_Start(UART_PARITY_NONE);
   M8C_EnableGInt;
   PWM16_1_Start();
   UART_CPutString("\r\nWelcome to PSoC UART test program. V1.1 \r\n");
   while(1){
         if(strPtr = UART_szGetParam()){
            UART_CPutString("Found valid command\r\nCommand =>");
            UART_PutString(strPtr);
            UART_CPutString("<\r\nParamaters:\r\n");
            if(*strPtr == 'a')
              PWM16_1_WritePeriod(D);
            else if(*strPtr == 's')
              PWM16_1_WritePeriod(L);
            else if(*strPtr == 'd')
              PWM16_1_WritePeriod(M);
            else if(*strPtr == 'f')
              PWM16_1_WritePeriod(F);
            else if(*strPtr == 'g')
              PWM16_1_WritePeriod(S);
            else if(*strPtr == 'h')
              PWM16_1_WritePeriod(R);
            else if(*strPtr == 'j')
              PWM16_1_WritePeriod(C);
            else if(*strPtr == 'k')
              PWM16_1_WritePeriod(DD);
            else if(*strPtr == 'l')
              PWM16_1_WritePeriod(SILENT);
            else if(*strPtr == 'w')
              PWM16_1_WritePeriod(Ds);
            else if(*strPtr == 'e')
              PWM16_1_WritePeriod(Ls);
            else if(*strPtr == 't')
              PWM16_1_WritePeriod(Fs);
            else if(*strPtr == 'y')
              PWM16_1_WritePeriod(Ss);
            else if(*strPtr == 'u')
              PWM16_1_WritePeriod(Rs);
            else if(*strPtr == '.')
              high();
            else if(*strPtr == ',')
              low();
            else if(*strPtr == '/')
              reset();
         }
      UART_CmdReset();
      }
  }

考察

課題pwm_uart_2の内容を、回路図をそのままにしてメイン文を改良した。
キーボード入力をしたときに、入力判定がされず、音がスムーズに切り替わらない時が多く見られた。これは原因が不明で、理由が多く考えられた。一つにパソコン自体の不良。二つ目にキーボードがチャタリングを起こしている可能性がある。三つ目に通信速度が38400と高く設定されていたため、うまくキー入力の結果を受信できなかったこと。原因が特定できなかったことにより、改善できなかった。
また、本当は追加コードとしてキーを押している間のみ音を出すようにするコードを実装したかったのだが、難易度が高く、断念した。

  • 最終更新:2018-07-10 16:30:44

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

認証パスワード