チーム1626(56/58)

課題名

ピアノキーボード

研究者名

Yugo Yagi
Fumihisa Yarino

概要 

キーボードのAからLまでのキーを使いスピーカーからドレミファソラシドの音を3オクターブ出すことができる。
キーボードの上段が高い音で、下段が低い音である。
ラボ pwm_uart_2 とは違い、エンターキーを入力せずとも連続して音を出すことができる。

使用器具

PSoC基盤 1個
スピーカー 1個
ジャンパー線 4本
MiniProg 1個
ストレート通信ケーブル

ソースコード

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h"// PSoC API definitions for all User Modules
int PW = 125;
int SILENT = 0,D = 229,L = 204,M = 182,F = 172,S = 153,R = 136,C = 121,DD = 115, LL = 102,
  MM = 91,FF = 86,SS = 77,RR = 68,CC = 61,
   d = 458,l = 408,m = 364,f = 343,s = 306,r = 273,c = 243,DDD = 57;

void main(void)
{
  // M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
   // Insert your main routine code here.
   char *strPtr;
   char str;
   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){
       strPtr = UART_szGetParam();
       UART_PutString(strPtr);
       if(*strPtr == 'a' | | *strPtr ==','){
           PWM16_1_WritePeriod(D);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 's'){
           PWM16_1_WritePeriod(L);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'd'){
           PWM16_1_WritePeriod(M);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'f'){
           PWM16_1_WritePeriod(F);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'g'){
           PWM16_1_WritePeriod(S);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'h')    {
           PWM16_1_WritePeriod(R);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'j'){
           PWM16_1_WritePeriod(C);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'q' | | *strPtr == 'k'){
           PWM16_1_WritePeriod(DD);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'w'){
           PWM16_1_WritePeriod(LL);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'e'){
           PWM16_1_WritePeriod(MM);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'r'){
           PWM16_1_WritePeriod(FF);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 't'){
           PWM16_1_WritePeriod(SS);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'y'){
           PWM16_1_WritePeriod(RR);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'u'){
           PWM16_1_WritePeriod(CC);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'z'){
           PWM16_1_WritePeriod(d);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'x'){
           PWM16_1_WritePeriod(l);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'c'){
           PWM16_1_WritePeriod(m);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'v'){
           PWM16_1_WritePeriod(f);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'b'){
           PWM16_1_WritePeriod(s);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'n'){
           PWM16_1_WritePeriod(r);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'm'){
           PWM16_1_WritePeriod(c);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'i'){
           PWM16_1_WritePeriod(DDD);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
       else if(*strPtr == 'l'){
           PWM16_1_WritePeriod(SILENT);
           UART_CmdReset();
           UART_Start(UART_PARITY_NONE);
       }
   }
   UART_CmdReset();
}

ソースの説明(変更点)

PWM16によって音を鳴らす文を記述したのち、入力されたキーが保存してあるバッファをUART_CmdResetでリセットする。
またその後すぐに文字の入力待ち状態にするために、UART_Startと記述する。
上記の処理をすべての音に対して行う。この処理がないとバッファの限界を超えキーボードからの入力ができなくなる。
また、エンターキーを押さなくても音を鳴らす処理をするために、もともと記述してあった
if(UART_bCmdCheck()) を削除した。

配線

1621ブロック図.png

考察

参考にしたラボ
pwm_uart_2

今回作成したピアノキーボードでは、RXによるハードウェア割り込みと、ポーリング、シリアルポート通信を統合した。キーボードからコマンドを読み込み、コマンドに応じた音階の音を発生させる。
今回はバッファをリセットすることで連続入力を可能にしたが、これとは別に入力する文字をデータでまとめて読み込むのではなく、
1文字ずつ読み込めばバッファをリセットする必要がないと考えられる。

  • 最終更新:2016-06-14 15:48:59

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

認証パスワード