用Arduino奏出你要的音乐

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于报警器、电子玩具、汽车电子设备、电话机等电子产品中作发声器件。轮式移动机器人上采用的是右图所示的有源自激蜂鸣器。由于自激蜂鸣器是直流电压驱动的,不需要利用交流信号进行驱动单片机驱动他激蜂鸣器的方式有两种:一种是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); 
  }
}
打赏

1 thought on “用Arduino奏出你要的音乐

Leave a Reply