和可變電阻/光敏電阻一樣,IS Shield上面已內置了蜂鳴器 Buzzer,但需要做一點硬件連接。在Selector的部份加上一個Jumper就能把A0和Buzzer的零件連接起來了。由於最右上和右下的排針都是buzzer的延伸腳,所以下圖右方的兩樣接法都可以連接上Buzzer
我們用的蜂鳴器Buzzer只要有電就能發聲,所以我們可以用digitalWrite();的指令測試讓蜂鳴器發聲。
打開Arduino 內的File ➡ Examples ➡ 01.Basics ➡ Blink找到和閃爍燈的程式,把輸出腳位改為A0就可以測試蜂鳴器能否正常運作了。
要控制蜂鳴器能像鋼琴有高低音階之分,我們需要用到tone這個指令,語法如下:
tone(腳位, 頻率, 時長);
腳位指要哪個腳位的零件發聲,這裏的話就是A0
頻率就是決定音階的高低,像五線譜的middle C就是約261.6HZ
時長就是決定這個聲音要維持多長時間,用法相等於delay();
相對如果要停止的話可以用notone指令:
notone(腳位);
現在我們嘗試令蜂鳴器由middle C高一個八度的Do開始順音階響一個循環,即
Do(C5)➡ Re(D5)➡ Mi(E5)➡ Fa(F5)➡ So(G5)➡ La(A5)➡ Si(B5)➡ Do(C6)、每個音階維持一秒
主程式如下:
void loop() {
tone(A0, 523, 1000);delay(1000); //C5 note ~523Hz
tone(A0, 587, 1000);delay(1000); //D5 note ~587Hz
tone(A0, 659, 1000);delay(1000); //E5 note ~659Hz
tone(A0, 698, 1000);delay(1000); //F5 note ~698Hz
tone(A0, 784, 1000);delay(1000); //G5 note ~784Hz
tone(A0, 880, 1000);delay(1000); //A5 note ~880Hz
tone(A0, 988, 1000);delay(1000); //B5 note ~988Hz
tone(A0, 1047, 1000);delay(1000); //C6 note ~1047Hz
noTone(A0);delay(1000); //stop the sound for 1s
}
在上方的程式雖然用數字型式的音階頻率(523,587...)可以做到音階的高低效果,但相對不直觀而且單看數字難以理解,所以有人把所有的頻率整理並做成對應的音階字符pitches.h,詳見箭頭
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
把連結內的pitches.h下載安裝,或者開一個New Tab把上方箭頭內的指令複製貼上(詳見1.5)
#define NOTE_B0 31 的意思告訴程式看見"NOTE_B0"這個字就當成是31,其功能和int NOTE_B0=31; 一樣。如些一來我們就可以用NOTE_C5等字串代替523等的數字頻率了。
現在我們可以把主程式的內容修改,有了上方的#define開頭的指令,
主程式如下:
void loop() {
tone(A0, NOTE_C5, 1000); //C5 note ~523Hz
tone(A0, NOTE_D5, 1000); //D5 note ~587Hz
tone(A0, NOTE_E5, 1000); //E5 note ~659Hz
tone(A0, NOTE_F5, 1000); //F5 note ~698Hz
tone(A0, NOTE_G5, 1000); //G5 note ~784Hz
tone(A0, NOTE_A5, 1000); //A5 note ~880Hz
tone(A0, NOTE_B5, 1000); //B5 note ~988Hz
tone(A0, NOTE_C6, 1000); //C6 note ~1047Hz
noTone(A0);delay(1000); //stop the sound for 1s
}
我們可以把上方的音階串起來做出類似早期遊戲的8bit音樂。像8音盒會把音階記錄在一個金屬管上,我們也可以用一個變數把音樂的每個音階和長度記錄下來,如此一來就不用像上方那樣每一個音都要用一句那麼長了。
下面設定一個array陣列變數 melody[],用作記錄音樂的每個音符;
另一個array陣列變數noteDurations[],用作記錄每個音符的長短;
int melody[]={
NOTE_C4, NOTE_G3,NOTE_G3, NOTE_GS3, NOTE_G3, 0, NOTE_B3, NOTE_C4};
int noteDurations[]={
4,8,8,4,4,4,4,4}; //這裏以4代表4分音符(4分之1秒)
在使用時以一個for迴圈把上方的內容逐個執行:
for (int thisNote = 0; thisNote < 8; thisNote++) {
int noteDuration = 1000/noteDurations[thisNote];
tone(A0, melody[thisNote],noteDuration);
delay(noteDuration +30);
}
整個程式如下:
int melody[]={
NOTE_C4, NOTE_G3,NOTE_G3, NOTE_GS3, NOTE_G3, 0, NOTE_B3, NOTE_C4};
int noteDurations[]={
4,8,8,4,4,4,4,4}; //這裏以4代表4分音符(4分之1秒)
void setup() {
pinMode(A0,OUTPUT);}
void loop() {
for (int thisNote = 0; thisNote < 8; thisNote++) {
int noteDuration = 1000/noteDurations[thisNote];
tone(A0, melody[thisNote],noteDuration);
delay(noteDuration +30);
}
}