蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于报警器、电子玩具、汽车电子设备、电话机等电子产品中作发声器件。轮式移动机器人上采用的是右图所示的有源自激蜂鸣器。由于自激蜂鸣器是直流电压驱动的,不需要利用交流信号进行驱动单片机驱动他激蜂鸣器的方式有两种:一种是PWM 输出口直接驱动,另一种是利用I/O 定时翻转电平产生驱动波形对蜂鸣器进行驱动。
PWM 输出口直接驱动是利用PWM 输出口本身可以输出一定的方波来直接驱动蜂鸣器。在单片机的软件设置中有几个系统寄存器是用来设置PWM 口的输出的,可以设置占空比、周期等等,通过设置这些寄存器产生符合蜂鸣器要求的频率的 波形之后,只要打开PWM 输出,PWM 输出口就能输出该频率的方波,这个时候利用这个波形就可以驱动蜂鸣器了。比如频率为2000Hz 的蜂鸣器的驱动,可以知道周期为500μs,这样只需要把PWM 的周期设置为500μs,占空比电平设置为250μs,就能产生一个频率为2000Hz 的方波,通过这个方波就可以去驱动这个蜂鸣器了。调节占空比不同的PWM方波,即可产生不同音调的鸣叫声了。
蜂鸣器是一种根据电压频率发出响声的电子元件,还记得家里的台式电脑开机时的“滴”一声吗?那就是接在主板上的蜂鸣器发出的声音。
按照驱动方式的不同,可分为:有源蜂鸣器(内含驱动线路)和无源蜂鸣器(外部驱动)
外观如图所示。左边的是无源蜂鸣器,右边的是有源蜂鸣器。
从外观上看,两种蜂鸣器好像一样,但仔细看,两者的高度略有区别,有源蜂鸣器,高度为9mm,而无源蜂鸣器高度为8mm。如将两种蜂鸣器的引脚都朝上放置时,可以看出有绿色电路板的一种是无源蜂鸣器,没有电路板而用黑胶封闭的是有源蜂鸣器。进一步判断有源蜂鸣器和无源蜂鸣器,可以用万用表最低量程的电阻档测试:用黑表笔接蜂鸣器 “+”引脚,红表笔在另一引脚上来回触碰,贴近耳朵听,如果发出咔、咔声的是无源蜂鸣器;如果能发出持续声音的,电阻在几百欧以上的,是有源蜂鸣器。有源蜂鸣器直接接上额定电源,就可连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能发声。
以电磁式蜂鸣器为例说明其工作原理,它由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
下面是用Arduino去控制蜂鸣器发声的连线图及程序源代码,有源和无源蜂鸣器都可以用同样的方式去控制。
int buzzer=8;//设置控制蜂鸣器的数字IO脚 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 } } } |
想用Arduino奏出美妙的音乐吗?其实用不同频率的PWM波去驱动蜂鸣器即可得到不同的旋律,下面的范例就是以不同频率的PWM方波产生不同的声调。如果你家里还有废旧收音机,还可以拆下来使用,那样的效果可是更好的哦!
/*旋律 *本例使用蜂鸣器或扬声器来演奏简单的旋律, *它通过驱动不同频率的方波,产生相应的声调 * 下面是计算声调和频率的参考公式 * 高电平时间=周期/2=1/(2*声调频率) * 不同声调的频率如下表所示: * * 音符 频率 周期 高电平时间 * c 261 Hz 3830 1915 * d 294 Hz 3400 1700 * e 329 Hz 3038 1519 * f 349 Hz 2864 1432 * g 392 Hz 2550 1275 * a 440 Hz 2272 1136 * b 493 Hz 2028 1014 * C 523 Hz 1912 956 *代码说明参考网址 * http://www.arduino.cc/en/Tutorial/Melody */ int speakerPin = 9; int length = 15; // the number of notes char notes[] = "ccggaagffeeddc "; // a space represents a rest int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 }; int tempo = 300; void playTone(int tone, int duration) { for (long i = 0; i < duration * 1000L; i += tone * 2) { digitalWrite(speakerPin, HIGH); delayMicroseconds(tone); digitalWrite(speakerPin, LOW); delayMicroseconds(tone); } } void playNote(char note, int duration) { char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' }; int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 }; // play the tone corresponding to the note name for (int i = 0; i < 8; i++) { if (names[i] == note) { playTone(tones[i], duration); } } } void setup() { pinMode(speakerPin, OUTPUT); } void loop() { for (int i = 0; i < length; i++) { if (notes[i] == ' ') { delay(beats[i] * tempo); // rest } else { playNote(notes[i], beats[i] * tempo); } // pause between notes delay(tempo / 2); } } |
good!