Arduino+蜂鸣器制作有趣的⼩⾳乐
Arduino相关姿势
Arduino是⼀个开源的硬件平台,包括开发套组(开发板和相关的模块以及连线)和IDE,开发语⾔基于C。核⼼是⼀块8位ATmega328的处理器,这块处理器是AVR单⽚机系列的⾼档产品。Arduino提供了数字接⼝和模拟信号⼝,还有扩展⼝便于进⾏设计。开发板通电后可以产⽣5V和3.3V电压。
蜂鸣器
根据发声原理不同分为电压式蜂鸣器和电磁式蜂鸣器。我们使⽤的是电磁式蜂鸣器,接通电源后,振动膜⽚周期性的振动发声。需要注意的⼀点是,发声是在内部有电流产⽣磁场,使得膜⽚振动的⼀瞬间。 如果内部⼀直是直流电的话我们只能听到很⼩的⼀下的声⾳,如果需要持续的声⾳(就像我萌以前过⽣⽇的那种唱⽣⽇快乐歌的⼩玩意)应该怎么办呢?BINGO!需要⼀个交流的驱动电路就⾏。最简单的⽅波就可以驱动。 这⾥我们使⽤的是⽆源蜂鸣器, 这⾥的源指的是振荡源,⾃带BUFF的就是有源,也就是直接同直流电就可以发声,⽆源则需要外部送⼊⽅波信号⽤于驱动才⾏。
硬件连线
连线很简单,直接将正负极分别接⼊数字IO和GND就可以。如果觉得声⾳太⼤的话可以串联⼀个1K左右
的电阻(具体取决于你的蜂鸣器额定电压)。
让蜂鸣器响起来
前⾯我们已经把数字IO连接到了蜂鸣器的正极,让蜂鸣器响起来只需要在数字IO上放⼊⽅波即可。
错过了缘分错过了你
digitalWrite(buzzerPin,HIGH);//⾼电平
delay(100);
digitalWrite(buzzerPin,LOW);//低电平
delay(100);
其中的100指的是发声后延时100ms。
不同的旋律
原理
如果只是这样的话,只能简单的发出警报⼀类的声⾳吧?如果要发出精确的不同频率的乐⾳怎么办?难道还要算?
好吧,那我萌肯定知道不同的乐⾳有着不同的频率,这⾥贴⼀张乐⾳频率图。
受过的伤就像玻璃碎片
在Arduino中我们使⽤tone()函数就可以实现发出乐⾳的效果,可以参考。
⽅法
实现⾳乐有两个基本的要素,第⼀是⾳符,刚才我萌已经搞定了;第⼆是节奏,也就是拍⼦,或者说⾳符时值。之前的delay()函数可以⽤于延长这个⾳,因此我们如果规定四分⾳符的时延,编写⼀个时延数组就可以控制延长的时间。
值得注意的是,delay()函数的参数是unsigned long,因此四分⾳符的时延基数不妨设置为偶数,这样其他的⾳符就可以减半和加倍。如果没有太多连⾳和更⼩时值的⾳符,那么这样做就很⽅便。
Code
演奏⼩星星⼤家都会啦,这⾥放⼀曲我很喜欢的CLANNAD的**《潮鸣》**的段落代码,算作这⼀次⼩项⽬的礼物~(~ ̄▽ ̄)~
/**
* 使⽤Buzzer演奏潮鸣
* @author Mr.Bubbles
* 1=C
*/
#include"music_note.c"//⾳符表
int buzzer=3;//蜂鸣器⼝,PWM
int scale[]={G,A,EE,A,G,A,G,A,EE,A,G,
A,EE,A,G,A,E,
G,D,E,G,A,B,
A,EE,A,G,A,G,
A,EE,B,CC,B,CC,B,A,E,
D,E,G,A,B,A,EE,A,G,A,
G,A,EE,A,G,A,EE,A,G,A,
好听的粤语老歌
E,G,D,E,G,A,B,A,EE,A,G,A,
G,A,EE,B,CC,B,CC,DD,EE,AA};//旋律float duration[]={2,1,1,1,1,7,1,1,1,1,1,
旧日的足迹吉他谱
1,1,1,1,3,1,
3,1,1,1,1,1,
1,1,1,1,7,1,
1,1,1,1,1,1,1,1,6,
1,1,1,1,1,1,1,1,1,7,
1,1,1,1,1,1,1,1,1,3,
1,3,1,1,1,1,1,1,1,1,1,7,
1,1,1,1,1,1,1,1,1,4};//⾳符时值
int len=0;//该变量后⾯⽤于统计⾳符个数void setup(){
pinMode(buzzer,OUTPUT);
len=sizeof(scale)/sizeof(scale[0]);
}
void loop(){
for(int i=0;i<len;i++){
tone(buzzer,scale[i]);
delay(250*duration[i]);
noTone(buzzer);
delay(100);
}
delay(1000);
}
Git Repository Reference
1.
2.
3.大张伟穷开心
4.
5.
林申老婆杨雨辰照片6.