チーム1458
課題名
電子ピアノ
研究者名
Shinsuke Kurokawa
Fukumi Koshikawa
概要
16個のスイッチが使えるKEYPAD-4X4 の指定のスイッチを押すと、スピーカーからドレミファソラシドの音を出すことができる。
可変抵抗によって、音量調節もできる。
出力した音の名前が、PSoC基盤のLCD画面と、シリアル通信を通じてパソコンのTeraTerm画面とに、表示される。
使用器具
PSoC基盤 1個
KEYPAD-4X4 1個
スピーカー 1個
ジャンパー線 6本
MiniProg 1個
ストレート通信ケーブル 1本
仕様
PWM16_1、Counter8、UARTモジュールを以下の図1のように配置する。
図1 モジュールの配置
以下の図2ように、PSoC基盤に、KEYPAD-4X4、スピーカーを、ジャンパー線 、MiniProg、ストレート通信ケーブルを用いて配線をする。
図1より、TxとP01を、RxとP07を、P00とVRと確認用にLEDを、そして、P10~P17とスイッチを、つなげる。
図2 配線
if文で場合分けして、スイッチを押すと、PWM16_1のPeriodを書き換えて、音を出す。
スイッチを押している間だけ鳴るようにした。
スイッチが押されると、音が出るのと同時にLCDに音の名前を表示する。
また、シリアル通信を通じてパソコンのTeraTermの画面にも音の名前が表示される。
TeraTermの画面は、以下の図3のようである。
図3 TeraTerm画面
P00とVRをつないでいるので、可変抵抗で音の大きさを変えることもできる。
プログラムソース
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#define SWD 0b00000001
#define SWL 0b00000010
#define SWM 0b00000100
#define SWF 0b00001000
#define SWS 0b00000001
#define SWR 0b00000010
#define SWC 0b00000100
#define SWDD 0b00001000
int PW=125;
int SILENT=0,D=229,L=204,M=182,F=172,S=153,R=136,C=121,DD=115;
int count=0;
int word=0;
int sw[8] = {0};
int i=0;
void main(void){
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(); LCD_Start(); UART_CPutString("\r\nWelcome to piano \r\n"); PWM16_1_WritePulseWidth(PW); while(1) { count=0; PRT1DR=0; PRT1DR |= 0b00010000; if(PRT1DR & SWD){ PWM16_1_WritePeriod(D); LCD_Position(0,5); LCD_PrCString("D "); if(sw[0]==0){ UART_CPutString("\r\n低いド\r\n"); sw[0]=1; for(i=1;i<8;i++){ sw[i]=0; } } } else if(PRT1DR & SWL){ PWM16_1_WritePeriod(L); LCD_Position(0,5); LCD_PrCString("L "); if(sw[1]==0){ UART_CPutString("\r\nレ\r\n"); for(i=0;i<1;i++){ sw[i]=0; } sw[1]=1; for(i=2;i<8;i++){ sw[i]=0; } } } else if(PRT1DR & SWM){ PWM16_1_WritePeriod(M); LCD_Position(0,5); LCD_PrCString("M "); if(sw[2]==0){ UART_CPutString("\r\nミ\r\n"); for(i=0;i<2;i++){ sw[i]=0; } sw[2]=1; for(i=3;i<8;i++){ sw[i]=0; } } } else if(PRT1DR & SWF){ PWM16_1_WritePeriod(F); LCD_Position(0,5); LCD_PrCString("F "); if(sw[3]==0){ UART_CPutString("\r\nファ\r\n"); for(i=0;i<3;i++){ sw[i]=0; } sw[3]=1; for(i=4;i<8;i++){ sw[i]=0; } } } else{ count++; } PRT1DR=0; PRT1DR = 0b001000000; if(PRT1DR & SWS){ PWM16_1_WritePeriod(S); LCD_Position(0,5); LCD_PrCString("S "); if(sw[4]==0){ UART_CPutString("\r\nソ\r\n"); for(i=0;i<4;i++){ sw[i]=0; } sw[4]=1; for(i=5;i<8;i++){ sw[i]=0; } } } else if(PRT1DR & SWR){ PWM16_1_WritePeriod(R); LCD_Position(0,5); LCD_PrCString("R "); if(sw[5]==0){ UART_CPutString("\r\nラ\r\n"); for(i=0;i<5;i++){ sw[i]=0; } sw[5]=1; for(i=6;i<8;i++){ sw[i]=0; } } } else if(PRT1DR & SWC){ PWM16_1_WritePeriod(C); LCD_Position(0,5); LCD_PrCString("C "); if(sw[6]==0){ UART_CPutString("\r\nシ\r\n"); for(i=0;i<6;i++){ sw[i]=0; } sw[6]=1; for(i=7;i<8;i++){ sw[i]=0; } } } else if(PRT1DR & SWDD){ PWM16_1_WritePeriod(DD); LCD_Position(0,5); LCD_PrCString("DD "); if(sw[7]==0){ UART_CPutString("\r\n高いド\r\n"); for(i=0;i<7;i++){ sw[i]=0; } sw[7]=1; } } else{ count++; } if(count==2){ PWM16_1_WritePeriod(SILENT); LCD_Position(0,5); LCD_PrCString("SILENT "); } }
}
考察
今回、パソコンのTeraTerm画面に連続して出力されるのを防ぐために、今回は配列を用意して、その音が初めて押されたかどうかの判別をおこなった。
配列ではなく、音ごとに変数で判別をすれば、変数を一つ用意すればよいので、メモリを減らすことができた。
また、今回のプログラムだと、スイッチが8個あればよいのに対して、4X4の16個のスイッチがあるKEYPADを使用した。
8個のスイッチが横並びになっているような、以下の図4のような見た目のKEYPADを使えば、よりピアノらしい演奏を行える装置にできるだろう。
図4 8個のスイッチ横並びKEYPAD
そのようなKEYPADの回路図の考案したものを、以下の図5に示す。
①②③④の出力ピンにつなげる回路になっている。
図5 8個のスイッチ横並びKEYPADの回路図考案
- 最終更新:2016-11-22 14:23:01