Arduino 電子琴(鍵盤掃描)實習

學習如何學習!

4×4按鍵
4×4 按鍵電路圖

設備與材料

個人電腦 × 1
arduino Uno × 1
麵包板 × 1
喇叭 × 1
NPN 電晶體 9013 × 1
電阻 220Ω × 1
4×4按鍵 × 1
連接線 若干

實體接線圖

參考程式

/***************************************************/
/*  按鍵掃描程式,按S1 code=1,按S2 code=2 ...       */
/***************************************************/

const int  CS[4]={8,9,10,11};  //設定輸入接腳
const int  RS[4]={6,5,4,3};   //設定掃描輸出接腳
byte code=0;  //按鍵狀態
//喇叭接腳定義請自行加入
//音階頻率表請自行加入

void setup() {
  for(int i=0;i<4;i++){
        //設定輸入接腳
        pinMode(CS[i],INPUT_PULLUP);
        //設定掃描輸出接腳
        pinMode(RS[i],OUTPUT);
        //輸出全部高電位
        digitalWrite(RS[i],HIGH);
  }
  //開始串列傳輸 這是測試按鍵狀態程式,正式做電子琴時請刪除
  Serial.begin(9600);     
}

void loop() {

     //按鍵掃描
    code = 0 ;
    for(int i=0;i<4;i++){
       //依序將RS[]的接腳輸出低電位 
        digitalWrite(RS[i],LOW);
        //依序檢測CS[]的接腳是否是低電位(是否按鍵)
        for(int j=0;j<4;j++){
            if(!digitalRead(CS[j])){
              code = 1+4*i+j;  
              Serial.println(code); //這是測試按鍵狀態程式,正式做電子琴時請刪除
              delay(500); //這是測試按鍵狀態程式,正式做電子琴時請刪除
              break;
            }
        }
       //將RS[]的接腳輸出高電位 
        digitalWrite(RS[i],HIGH);
    }  
    
    //請自行加上判斷按鈕發出相對音階程式
    //建議使用 switch 選擇指令


}

音階頻率表

//低8度音頻率表 lfreqs[1]=>低音Do
int lfreqs[] = {0,131,147,165,175,196,220,247};
//中音頻率表 freqs[1]=>Do
int freqs[] = {0,262,294,330,349,392,440,494};
//高8度音頻率表 hfreqs[1]=>高音Do
int hfreqs[] = {0,523,587,659,698,784,880,988};
//高16度音頻率表 shfreqs[1]=>高16度音Do
int shfreqs[] = {0,1046,1175,1318,1397,1568,1760,1976};

//中音半音頻率表 ufreqs[1]=>#Do
int ufreqs[] = {0,278,313,0,373,418,469,0};

使用 arduino IDE內的序列戶監控視窗就可以看到執行結果

執行結果

功能

上面參考程式是按鍵掃描程式,利用8支接腳來讀取16個按鈕的按鍵狀態,請把上面程式加入發音功能,變成一台小小電子琴,發音音階如下圖。

提示

電子琴是按多久就發音多久,放開時停止發音,因此建議使用 tone(pin,frequency) noTone(pin) 函式 配合音階頻率表來發音

相關知識

鍵盤掃描
switch
tone

noTone


入門
知識
語法
流程
函式
實習

發佈留言