Ardunio+蜂鳴器(Buzzer)播音樂


想成為 Maker,不久前買了個套件(發現被賺很大),但一直沒時間寫程式。衷心的建議想加入 Maker 的朋友: 先閱讀一本跟你有緣的書之後,直接買一塊 Arduino Uno R3 的版子(淘寶賣12~40塊人民幣,台灣賣480塊台幣),再根據需求自己去電子材料行拿就可以了

今天分享一個 Arduino 超級簡單的一個應用: 「用 Buzzer 彈奏電子音樂」,但不太好聽就是了! (因為偷懶,用方波取帶正弦波聲,很尖銳)

Buzzer 根據製作方法、物理與其運作方式一般被分成電磁式與壓電式,如下圖可顯示其接法的不同。下圖中使用了電晶體開關,以期得到較大的驅動電流,但我們所使用的蜂鳴器並不需要加電晶體即可驅動(根據 Arduino 官方數據,I/O DC Current 40mA),也不用擔心把它燒掉。






工作電壓: 電磁式的蜂鳴器,工作電壓較小,從1.524V; 而壓電式的從3V220V都有,一般建議使用9V以上的電壓,以獲得較大的聲音。

消耗電流: 電磁式比較耗電,從幾十到上百毫安培都有,壓電式的就省電的多,幾毫安培就可以正常的動作。

驅動方式: 自激式的內建了震盪電路,只要接上直流電(DC)即可發聲(固定頻率)。而他激式的,畢須自己提供時脈頻率。

更多物理運作細節,請參考:





我們使用的是最簡單的「他激電磁式」的蜂鳴器,如圖所示,一顆(小小顆的)電子材料行約12塊台幣。





正極一端接 Arduino 版子Pin8,另一頭接地。怎樣, 超簡單吧? 這應該列為 Arduino 的第一個入門程式。



(例一) 用蜂鳴器模擬手機鈴聲

const int buzzer = 8; // Pin8 輸出方波至蜂鳴器

void setup() {
    pinMode(buzzer,OUTPUT);
}

void loop() {
    // simulate phone call
    for ( int ii=0; ii<10; ii++ ) {
        tone(buzzer,1000);
        delay(50);
        tone(buzzer,500);
        delay(50);
    }
    noTone(buzzer);
    delay(2000);
}









(例二) 用蜂鳴器播BeeStar兩首歌

這邊我將代表各個音階所需的音頻列成一個矩陣 toneTable,種共五個八度。太低頻蜂鳴器發不出來,太高頻則會破音。我選用第三個音階,各位可以自己換換看其他的音頻。

const int buzzer = 8;
const int toneTable[7][5]={
    { 66, 131, 262, 523, 1046},  // C Do
    { 74, 147, 294, 587, 1175},  // D Re
    { 83, 165, 330, 659, 1318},  // E Mi
    { 88, 175, 349, 698, 1397},  // F Fa
    { 98, 196, 392, 784, 1568},  // G So
    {110, 220, 440, 880, 1760},  // A La
    {124, 247, 494, 988, 1976}   // B Si
};
char toneName[]="CDEFGAB";
char beeTone[]="GEEFDDCDEFGGGGEEFDDCEGGEDDDDDEFEEEEEFGGEEFDDCEGGC";
char starTone[]="CCGGAAGFFEEDDCGGFFEEDGGFFEEDCCGGAAGFFEEDDC";
int beeBeat[]={
    1,1,2, 1,1,2, 1,1,1,1,1,1,2,
    1,1,2, 1,1,2, 1,1,1,1,4,
    1,1,1,1,1,1,2, 1,1,1,1,1,1,2,
    1,1,2, 1,1,2, 1,1,1,1,4
};
int starBeat[]={
    1,1,1,1,1,1,2, 1,1,1,1,1,1,2,
    1,1,1,1,1,1,2, 1,1,1,1,1,1,2,
    1,1,1,1,1,1,2, 1,1,1,1,1,1,2
};

int getTone(char symbol) {
    int toneNo = 0;
    for ( int ii=0; ii<7; ii++ ) {
        if ( toneName[ii]==symbol ) {
            toneNo = ii;
            break;
        }
    }
    return toneNo;
}

void setup() {
    pinMode(buzzer,OUTPUT);
    noTone(buzzer);
}

void loop() {
    int ii, length, toneNo;
    int duration;
   
    // bee
    length = sizeof(beeTone)-1;
    for ( ii=0; ii<length; ii++ ) {
        toneNo = getTone(beeTone[ii]);
        duration = beeBeat[ii]*333;
        tone(buzzer,toneTable[toneNo][3]);
        delay(duration);
        noTone(buzzer);
    }
    delay(2000);
    
    // star
    length = sizeof(starTone)-1;
    for ( ii=0; ii<length; ii++ ) {
        toneNo = getTone(starTone[ii]);
        duration = starBeat[ii]*333;
        tone(buzzer,toneTable[toneNo][3]);
        delay(duration);
        noTone(buzzer);
    }
    noTone(buzzer);
    delay(2000);
}