buzzer-2

之前的文章中我們讓Arduino控制LED,除了視覺效果,我們再來玩玩聲音吧!讓Arduino發出聲音最簡單的方法就是利用蜂鳴器(Buzzer)。

蜂鳴器基本上分兩類:有源蜂鳴器、無源蜂鳴器。有源蜂鳴器是內建了一組固定的頻率,只要接通電源,就會發出固定的音調。無源蜂源器則不同,我們必須透過程式,告訴它頻率,我們才能得到所需的音調,但我們就可以利用它來播放簡單的旋律了!

有源蜂鳴器、無源蜂鳴器的外型很像,一般有源蜂鳴器會在上面貼一個白色貼紙,另外,有源蜂鳴器底部也會有膠封,無源蜂鳴器的底部可以直接看到電路板。

buzzer-5-1

有源蜂鳴器

我們先來試試簡單的有源蜂鳴器吧。蜂鳴器上方會有+和-的符號,代表的自然就是正和負了。我們把-接到GND,+接到PIN 7,等一下我們就用PIN 7來控制聲音。

buzzer-1

程式非常簡單,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」,大家從這個範例就能了解運作的原理了。

buzzer-3

傑森把範例加上中文註解,大家就能快速了解了。

線路的接法和前面有源蜂鳴器完全相同,也是用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。有了這個檔,你只要花點苦工,就能播放任何音樂囉。

buzzer-4