報警器、電子門鈴、電子音樂賀卡這些DIY小制作中都會用到一個電子模塊——蜂鳴器。
蜂鳴器
蜂鳴器通過電路驅動能發出蜂鳴聲,廣泛應用于計算機、打印機、複印機、報警器、電子玩具、汽車電子設備、電話機、定時器等電子産品中作發聲器件。
蜂鳴器的分類按構造方式的不同,可分為:電磁式蜂鳴器和壓電式蜂鳴器;
壓電式蜂鳴器:
主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。有的壓電式蜂鳴器外殼上還裝有發光二極管。多諧振蕩器由晶體管或集成電路構成。當接通電源後(1.5~15V直流工作電壓),多諧振蕩器起振,輸出100~500HZ的音頻信号,阻抗匹配器推動壓電蜂鳴片發聲。壓電蜂鳴片由锆钛酸鉛或铌鎂酸鉛壓電陶瓷材料制成。在陶瓷片的兩面鍍上銀電極,經極化和老化處理後,再與黃銅片或不鏽鋼片粘在一起。
電磁式蜂鳴器:
電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源後,振蕩器産生的音頻信号電流通過電磁線圈,使電磁線圈産生磁場。振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發聲。
按其驅動方式的原理分,可分為:有源蜂鳴器(a)和無源蜂鳴器(b);
有源蜂鳴器a和無源蜂鳴器b
注意:這裡的“源”不是指電源,而是指震蕩源。
有源蜂鳴器内部帶震蕩源,隻要一通電就會叫;而無源内部不帶震蕩源,所以如果用直流信号無法令其鳴叫。必須用2K-5K的方波去驅動它。
有源蜂鳴器往往比無源的貴,就是因為裡面多個震蕩電路。
無源蜂鳴器的優點是:
- 便宜
- 聲音頻率可控,可以做出“多來米發索拉西”的效果
- 在一些特例中,可以和LED複用一個控制口
有源蜂鳴器的優點是:程序控制方便。
驅動方式常用驅動無源蜂鳴器的方式有兩種:
- PWM 輸出口直接驅動;
- 利用I/O 定時翻轉電平産生驅動波形對蜂鳴器進行驅動。
PWM 輸出口直接驅動是利用PWM 輸出口本身可以輸出一定的方波來直接驅動蜂鳴器。在單片機的軟件設置中有幾個系統寄存器是用來設置PWM 口的輸出的,可以設置占空比、周期等等,通過設置這些寄存器産生符合蜂鳴器要求的頻率的波形之後,隻要打開PWM 輸出,PWM 輸出口就能輸出該頻率的方波,這個時候利用這個波形就可以驅動蜂鳴器了。比如頻率為2000Hz的蜂鳴器的驅動,可以知道周期為500μs,這樣隻需要把PWM 的周期設置為500μs,占空比電平設置為250μs,就能産生一個頻率為2000Hz 的方波,通過這個方波再利用三極管就可以去驅動這個蜂鳴器了。
而利用I/O 定時翻轉電平來産生驅動波形的方式會比較麻煩一點,必須利用定時器來做定時,通過定時翻轉電平産生符合蜂鳴器要求的頻率的波形,這個波形就可以用來驅動蜂鳴器了。比如為2500Hz的蜂鳴器的驅動,可以知道周期為400μs,這樣隻需要驅動蜂鳴器的I/O 口每200μs 翻轉一次電平就可以産生一個頻率為2500Hz,占空比為1/2duty 的方波,再通過三極管放大就可以驅動這個蜂鳴器了
蜂鳴器模塊介紹
有源蜂鳴器模塊電器參數:
- S8550三極管驅動
- 工作電壓:DC 3.3-5V
- 觸發信号:低電平
- 規格尺寸:32*13mm
有源蜂鳴器模塊
引腳定義:
- VCC:接電源正極DC 3.3-5V
- GND:接電源負極
- I/O:信号口
無源蜂鳴器模塊電器參數:
- 9012三極管驅動
- 工作電壓:DC 3.3-5V
- 觸發信号:低電平
- 規格尺寸:20*15mm
無源蜂鳴器模塊
引腳定義:
- VCC:接電源正極DC 3.3-5V
- GND:接電源負極
- I/O:信号口
下面我們就用Arduino UNO驅動蜂鳴器模塊工作吧。
硬件設備:
- Arduino UNO控制器 × 1
- 無源蜂鳴器模塊 × 1
- 有源蜂鳴器模塊 × 1
- 電源 × 1
- 杜邦線 × n
接線圖:
接線圖
有源蜂鳴器模塊程序:有源蜂鳴器驅動簡單,隻需給I/O高低點平就可以實現驅動
//蜂鳴器實現間歇性鳴叫
int buzzer=9; //控制蜂鳴器的引腳
void setup()
{
pinMode(buzzer,OUTPUT); //定義蜂鳴器的引腳為輸出
}
void loop()
{
digitalWrite(buzzer,HIGH); //定義蜂鳴器的引腳高電平,靜止
delay(1000); //延時1秒
digitalWrite(buzzer,LOW); //定義蜂鳴器的引腳低電平,發聲
delay(1000); //延時1秒
}
無源蜂鳴器模塊程序:無源蜂鳴器驅動複雜,但是它可以實現更多功能,比如變換發聲頻率,唱歌等。
//蜂鳴器實現不同頻率聲音
int buzzer=9; //設置控制蜂鳴器IO腳
void setup()
{
pinMode(buzzer,OUTPUT); //設置數字IO腳模式,OUTPUT為辒出
}
void loop()
{
unsigned char i,j;//定義變量
while(1)
{
for(i=0; i<80 ;i ) //輸出一個頻率的聲音
{
digitalWrite(buzzer,HIGH); //發聲
delay(1); //延時1ms
digitalWrite(buzzer,LOW); //不發聲
delay(1); //延時ms
}
for(i=0;i<100 ; i ) //輸出另一個頻率的聲音
{
digitalWrite(buzzer,HIGH); //發聲
delay(2); //延時2ms
digitalWrite(buzzer,LOW); //不發聲
delay(2); //延時2ms
}
}
}
//無源蜂鳴器,播放音樂《葫蘆娃》
#define NOTE_D0 -1
#define NOTE_D1 294
#define NOTE_D2 330
#define NOTE_D3 350
#define NOTE_D4 393
#define NOTE_D5 441
#define NOTE_D6 495
#define NOTE_D7 556
#define NOTE_DL1 147
#define NOTE_DL2 165
#define NOTE_DL3 175
#define NOTE_DL4 196
#define NOTE_DL5 221
#define NOTE_DL6 248
#define NOTE_DL7 278
#define NOTE_DH1 589
#define NOTE_DH2 661
#define NOTE_DH3 700
#define NOTE_DH4 786
#define NOTE_DH5 882
#define NOTE_DH6 990
#define NOTE_DH7 112
//以上部分是定義是把每個音符和頻率值
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625
//這部分是用英文對應了拍子
int tune[] =
{
NOTE_D0,NOTE_D0,NOTE_D0,NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D3,NOTE_D3,
NOTE_D6,NOTE_D5,NOTE_D6,NOTE_DH1,NOTE_D5,NOTE_D5,NOTE_D5,NOTE_D3,NOTE_D4,NOTE_D3,NOTE_D4,NOTE_DH1,
NOTE_D3,NOTE_D3,NOTE_D0,NOTE_DH1,NOTE_DH1,NOTE_DH1,NOTE_D7,NOTE_D4,NOTE_D4,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D0,NOTE_D6,NOTE_D7,
NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D3,NOTE_D3,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_DH1,
NOTE_D5,NOTE_D5,NOTE_D5,NOTE_D2,NOTE_D3,NOTE_D4,NOTE_DH1,NOTE_D7,NOTE_D7,NOTE_DH1,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_DH3,NOTE_DH1,NOTE_DH1,NOTE_DH1,
NOTE_DH1,NOTE_D7,NOTE_D6,NOTE_D6,NOTE_D7,NOTE_D5,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_DH1,NOTE_DH2,NOTE_DH3,NOTE_DH2,NOTE_DH3,NOTE_DH5,
NOTE_DH2,NOTE_DH2,NOTE_DH2,NOTE_D5,NOTE_D5,NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,
NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,NOTE_DH2,NOTE_DH2,NOTE_DH1,NOTE_D5,NOTE_D5,NOTE_D5,NOTE_DH4,NOTE_DH3,NOTE_DH2,NOTE_DH1,
NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH6,NOTE_DH6,NOTE_DH5,NOTE_DH5,NOTE_DH3,NOTE_DH2,NOTE_DH1,NOTE_DH1,NOTE_D0,NOTE_DH1,
NOTE_DH2,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_DH5,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH6,NOTE_DH6,NOTE_DH5,NOTE_DH5,
NOTE_DH3,NOTE_DH2,NOTE_DH1,NOTE_DH1,NOTE_D0,NOTE_DH1,NOTE_DH2,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_D7,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_D7
}; //這部分就是整首葫蘆娃曲子的音符部分,用了一個序列定義為tune,整數
float duration[]=
{
1,1,1,0.5,0.5, 1 0.5,0.5,1,1, 1,1,1,0.5,0.5,
1 0.5,0.5,1,1, 1,1,1,1, 1 0.5,0.5,1,1,
1,1,0.5,0.5,0.5,0.5, 1 0.5,0.5,1,1, 1,1,1,0.5,0.5,
1 0.5,0.5,1,1, 1,1,1,0.5,0.5, 1 0.5,0.5,1,1,
1,1,1,0.5,0.5, 1,0.5,0.25,0.25,0.25,0.5, 0.5,0.5,0.5,0.25,0.5,1,
0.5,0.5,0.5,0.5,1,1, 1,1,1,0.5,0.5, 1 0.5,0.5,1,1,
1,1,1,0.5,0.5, 1.5,0.5,1,1, 1,1,1,1,
0.5,0.5,1,1,0.5,0.5, 1.5,0.25,0.5,1, 1,1,1,1,
1,1,1,1, 1,1,1,1, 0.5,0.5,1,1,0.5,0.5,
1,0.5,0.5,1,1, 1,1,1,1, 1,1,1,1,
0.5,0.5,1,1,0.5,0.5, 1,0.5,0.25,0.5,1, 1,1,1,0.5,0.5
};//這部分是整首曲子的節拍部分,也定義個序列duration,浮點(數組的個數和前面音符的個數是一樣的,一一對應)
int length;//這裡定義一個變量,後面用來表示共有多少個音符
int tonePin=9; //蜂鳴器的pin
void setup()
{
pinMode(tonePin,OUTPUT);//設置蜂鳴器的pin為輸出模式
length = sizeof(tune)/sizeof(tune[0]);//這裡用了一個sizeof函數, 可以查出tone序列裡有多少個音符
}
void loop()
{
for(int x=0;x<length;x )//循環音符的次數
{
tone(tonePin,tune[x]);//此函數依次播放tune序列裡的數組,即每個音符
delay(400*duration[x]);//每個音符持續的時間,即節拍duration,是調整時間的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧
noTone(tonePin);//停止當前音符,進入下一音符
}
delay(5000);//等待5秒後,循環重新開始
}