設備與材料
個人電腦 × 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) 函式 配合音階頻率表來發音
相關知識
Arduino 輸出實習(單燈閃爍)
Arduino 輸出實習(跑馬燈-愚公移山)
Arduino 輸出實習(跑馬燈-for迴圈)
Arduino 數位輸入實習
Arduino 數位輸入實習(INPUT_PULLUP)
Arduino 類比輸入實習
Arduino PWM 實習 (呼吸燈)
Arduino PWM 實習 (光感應調光燈)
Arduino 8×8 LED Matrix MAX7219 實習
Arduino 紅綠燈小綠人 實習
Arduino 計時器 實習
Arduino 音樂盒
Arduino 電子琴(鍵盤掃描)
Arduino DHT11 溫濕度感應器
Arduino OLED 顯示
Arduino 超音波測距模組 HC-SR04
Arduino 執行時間實習
Arduino 電容測試器
Arduino 紅外線接收實習
Arduino 紅外線發射實習 EPSON 投影機控制
ESP-12F 網路智慧開關(MQTT)
ESP-12F 雲端記錄型 K-Type 溫度計(MQTT ThingSpeak)
ESP-12F 手機雲端紅外線控制
ESP-12F 網路電台收音機
ESP-12F 電子鼓