报警器、电子门铃、电子音乐贺卡这些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-5VGND:接电源负极I/O:信号口无源蜂鸣器模块电器参数:9012三极管驱动工作电压:DC 3.3-5V触发信号:低电平规格尺寸:20*15mm无源蜂鸣器模块引脚定义:VCC:接电源正极DC 3.3-5VGND:接电源负极I/O:信号口Arduino实验下面我们就用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秒后,循环重新开始}