Arduino+蜂鸣器制作有趣的小音乐

发布于 2020-11-3 18:46
浏览
0收藏

Arduino相关姿势
Arduino是一个开源的硬件平台,包括开发套组(开发板和相关的模块以及连线)和IDE,开发语言基于C。核心是一块8位ATmega328的处理器,这块处理器是AVR单片机系列的高档产品。Arduino提供了数字接口和模拟信号口,还有扩展口便于进行设计。开发板通电后可以产生5V和3.3V电压。

 

蜂鸣器


根据发声原理不同分为电压式蜂鸣器和电磁式蜂鸣器。我们使用的是电磁式蜂鸣器,接通电源后,振动膜片周期性的振动发声。需要注意的一点是,发声是在内部有电流产生磁场,使得膜片振动的一瞬间。 如果内部一直是直流电的话我们只能听到很小的一下的声音,如果需要持续的声音(就像我萌以前过生日的那种唱生日快乐歌的小玩意)应该怎么办呢?BINGO!需要一个交流的驱动电路就行。最简单的方波就可以驱动。 这里我们使用的是无源蜂鸣器, 这里的源指的是振荡源,自带BUFF的就是有源,也就是直接同直流电就可以发声,无源则需要外部送入方波信号用于驱动才行。

 

硬件连线


连线很简单,直接将正负极分别接入数字IO和GND就可以。如果觉得声音太大的话可以串联一个1K左右的电阻(具体取决于你的蜂鸣器额定电压)。

Arduino+蜂鸣器制作有趣的小音乐-开源基础软件社区

让蜂鸣器响起来


前面我们已经把数字IO连接到了蜂鸣器的正极,让蜂鸣器响起来只需要在数字IO上放入方波即可

digitalWrite(buzzerPin,HIGH); //高电平
delay(100);
digitalWrite(buzzerPin,LOW);  //低电平
delay(100);

其中的100指的是发声后延时100ms。

 

不同的旋律


原理


如果只是这样的话,只能简单的发出警报一类的声音吧?如果要发出精确的不同频率的乐音怎么办?难道还要算?

Arduino+蜂鸣器制作有趣的小音乐-开源基础软件社区

好吧,那我萌肯定知道不同的乐音有着不同的频率,这里贴一张乐音频率图。

Arduino+蜂鸣器制作有趣的小音乐-开源基础软件社区

在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);
}

 

原文作者: 计算机的感性面

 

标签
已于2020-11-3 18:46:21修改
收藏
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐