想成為 Maker,不久前買了個套件(發現被賺很大),但一直沒時間寫程式。衷心的建議想加入 Maker 的朋友: 先閱讀一本跟你有緣的書之後,直接買一塊 Arduino Uno R3 的版子(淘寶賣12~40塊人民幣,台灣賣480塊台幣),再根據需求自己去電子材料行拿就可以了!
今天分享一個 Arduino 超級簡單的一個應用: 「用 Buzzer 彈奏電子音樂」,但不太好聽就是了! (因為偷懶,用方波取帶正弦波聲,很尖銳)
Buzzer 根據製作方法、物理與其運作方式一般被分成電磁式與壓電式,如下圖可顯示其接法的不同。下圖中使用了電晶體開關,以期得到較大的驅動電流,但我們所使用的蜂鳴器並不需要加電晶體即可驅動(根據 Arduino 官方數據,I/O DC Current 約 40mA),也不用擔心把它燒掉。
Source: Advanced Acoustic Technology
工作電壓: 電磁式的蜂鳴器,工作電壓較小,從1.5到24V; 而壓電式的從3V到220V都有,一般建議使用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);
}
|
(例二) 用蜂鳴器播Bee與Star兩首歌
這邊我將代表各個音階所需的音頻列成一個矩陣 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);
}
|