之前的文章中我們讓Arduino控制LED,除了視覺效果,我們再來玩玩聲音吧!讓Arduino發出聲音最簡單的方法就是利用蜂鳴器(Buzzer)。
蜂鳴器基本上分兩類:有源蜂鳴器、無源蜂鳴器。有源蜂鳴器是內建了一組固定的頻率,只要接通電源,就會發出固定的音調。無源蜂源器則不同,我們必須透過程式,告訴它頻率,我們才能得到所需的音調,但我們就可以利用它來播放簡單的旋律了!
有源蜂鳴器、無源蜂鳴器的外型很像,一般有源蜂鳴器會在上面貼一個白色貼紙,另外,有源蜂鳴器底部也會有膠封,無源蜂鳴器的底部可以直接看到電路板。
有源蜂鳴器
我們先來試試簡單的有源蜂鳴器吧。蜂鳴器上方會有+和-的符號,代表的自然就是正和負了。我們把-接到GND,+接到PIN 7,等一下我們就用PIN 7來控制聲音。
程式非常簡單,digitalWrite(7,HIGH)就能讓蜂鳴器發出聲音了,要持續多久,就用delay()來控制,然後再用digitalWrite(7,LOW)就能讓聲音停止了。
這個例子我們蜂鳴器叫1秒鐘後,停2秒,然後不斷重複;有源蜂鳴器的程式就這樣而已,非常容易。
void setup() {
pinMode(7,OUTPUT);
}
void loop() {
digitalWrite(7,HIGH);
delay(1000);
digitalWrite(7,LOW);
delay(2000);
}
無源蜂鳴器
無源蜂鳴器因為要處理聲音的頻率、節拍,所以自然是比無源蜂鳴器還要麻煩一點,不過Arduino IDE就有一個基本的範例「toneMelody」,大家從這個範例就能了解運作的原理了。
傑森把範例加上中文註解,大家就能快速了解了。
線路的接法和前面有源蜂鳴器完全相同,也是用PIN 7來進行控制。
#include "pitches.h" //載入音調和頻率的對照檔
// 旋律
int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
// 每個音的的拍子,4:4分音符,8:8分音符
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};
void setup() {
for (int thisNote = 0; thisNote < 8; thisNote++) {
//計算每個音的長度,4分音符: 1000 / 4,8分音符:1000/8
int noteDuration = 1000 / noteDurations[thisNote];
tone(7, melody[thisNote], noteDuration); //tone(PIN腳,音調,拍子)
// 每個音之間要停一小段時間,範例是建議拍子的長度加30%
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(7); // 停止播放
}
}
void loop() {
// no need to repeat the melody.
}
播放旋律主要是靠這個函式:
tone(7, melody[thisNote], noteDuration); //tone(PIN腳,音調,拍子)
而音調和頻率的對照檔範例有提供了:pitches.h。有了這個檔,你只要花點苦工,就能播放任何音樂囉。