チーム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 モジュールの配置
p.png

以下の図2ように、PSoC基盤に、KEYPAD-4X4、スピーカーを、ジャンパー線 、MiniProg、ストレート通信ケーブルを用いて配線をする。
図1より、TxとP01を、RxとP07を、P00とVRと確認用にLEDを、そして、P10~P17とスイッチを、つなげる。

図2 配線
DSC_03802.JPG

if文で場合分けして、スイッチを押すと、PWM16_1のPeriodを書き換えて、音を出す。
スイッチを押している間だけ鳴るようにした。
スイッチが押されると、音が出るのと同時にLCDに音の名前を表示する。
また、シリアル通信を通じてパソコンのTeraTermの画面にも音の名前が表示される。
TeraTermの画面は、以下の図3のようである。

図3 TeraTerm画面
無題1.png

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
button2.png

そのようなKEYPADの回路図の考案したものを、以下の図5に示す。
①②③④の出力ピンにつなげる回路になっている。

図5 8個のスイッチ横並びKEYPADの回路図考案
switch4.jpg

  • 最終更新:2016-11-22 14:23:01

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

認証パスワード