新闻中心

EEPW首页 > 消费电子 > 设计应用 > 基于Arduino的电子音乐发声器设计

基于Arduino的电子音乐发声器设计

作者:赵云娥 吴振强时间:2017-02-28来源:电子产品世界
编者按:Arduino 是一块基于开放原始代码的Simple I/O平台,具有使用简单,功能多样,价格低廉等优点,广泛应用于电子系统设计和互动产品开发方面。系统以ArduinoUNO开发平台为控制核心,充分利用其内部Tone 库,以数组形式组织乐曲的音高和节拍数据,通过串口和外围无源蜂鸣器进行通信,实现了电子音乐播放,随音乐节拍亮灭的LED为设计添加了温馨感。本系统成本低廉,可靠性高,可实现乐曲DIY,有良好的扩展性。

作者 赵云娥1 吴振强2 1.青海建筑职业技术学院(青海 西宁 810012) 2.陕西师范大学计算机科学学院(陕西 西安 710119)

本文引用地址:http://www.eepw.com.cn/article/201702/344566.htm

摘要 是一块基于开放原始代码的Simple I/O平台,具有使用简单,功能多样,价格低廉等优点,广泛应用于电子系统设计和互动产品开发方面。系统以UNO开发平台为控制核心,充分利用其内部Tone 库,以数组形式组织乐曲的数据,通过串口和外围无源蜂鸣器进行通信,实现了电子音乐播放,随音乐亮灭的LED为设计添加了温馨感。本系统成本低廉,可靠性高,可实现乐曲DIY,有良好的扩展性。

引言

   是一个基于开放原始代码的Simple I/O平台,由硬件(MCU及外围电路)和软件(编程接口和语言)两部分组成。它基于单片机系统开发,具有使用简单,功能多样,价格低廉等优点,广泛应用于电子系统设计和互动产品开发方面。目前市场所见电子调节不便,价格较高,不能很好地实现和使用者的交互。本电子的设计以ArduinoUNO板为控制核心,在相关乐理基础知识上,充分利用Arduino编辑器自带Tone扩展库,以数组形式输出各音符的指定频率和,送到无源蜂鸣器和彩色LED,实现了音乐播放和随音乐节奏亮灭的LED效果。在操作方面,可以通过简单修改数组数据(和节拍)实现电子音乐的DIY,在欣赏美妙音乐的同时,充分发挥使用者的创造性。

1 系统硬件设计

  本发声器以ArduinoUNO为控制核心,外部电路包括控制电路、蜂鸣器电路、LED显示节奏电路,系统硬件电路图如图1所示。开关S1对整个电路起控制作用,当检测到开关按下,即D3端口为高电平时,电路开始工作。预先组织好的音符数据(和节拍)通过数字端口D8发送到5V无源蜂鸣器J1,无源蜂鸣器接收到特定频率的(即特定的音高)方波去驱动它,可以发出“Do Re Mi Fa Sol La Si”的音乐效果。各数据加上延时(即节拍数据)即可实现乐曲的播放。无源蜂鸣器的优点是声音频率可控,可以和LED复用一个控制口。所以,D8端口的数据同时加到LED1、LED2、LED3上时,其节奏性的亮灭实现了节拍的显示。

2 软件设计

2.1 乐曲播放原理

  2.1.1 单音符的演奏原理

  一首乐曲由若干音符组成。从物理的角度来说,每一个音符唯一对应一个发声频率。Arduino只要把这个频率数据发送给蜂鸣器或喇叭,就会发出对应的音符。Arduino IDE自带的头文件“pitches.h”中以宏定义的形式给出了各个音符和频率的对应关系表。例如“#define NOTE_C4 262”语句给出了钢琴标准键盘小字一组C4(唱名为Do)按键对应的频率是262Hz。因此,只要能够识别给定的乐谱,就能得到一组对应该乐曲的频率数据,即制作出其数组形式的韵律函数。

  2.1.2 节拍

  除了音高,构成旋律的另一个重要因素是节拍,即音符演奏的持续时间。它决定了音乐进行的快慢程度。本发声器的设计中,通过读取旋律的节拍速度,来确定基本的延时单位。如二分音符为一拍,每拍延时1/2秒,则四分音符延时1/4秒,八分音符延时为1/8秒,均为基本延时的偶数倍。最终,采用了noteDurations[thisNote]数组来存放每个音符的节拍数据。在应用过程中,我们也可以通过调节基本延时来调节乐曲速度。频率数据按照节拍数据的延时来驱动蜂鸣器,就实现了一首乐曲的播放。

2.2 乐曲播放的软件实现

  ArduinoIDE包含的Tone库可以很方便地帮助用户制作音乐。本设计主要采用了Tone(pin, frequency, duration)函数来产生电子音乐。此函数中,pin表示频率数据的数字输出接口,int型;frequency是音符频率,int型;duration是节拍数据,单位是毫秒,unsigned long型。只要把上述频率和节拍数据连续赋值给Tone函数,就可以实现乐曲的播放,系统软件实现的程序流程图见图2。

  Arduino语言是以setup( )开头,loop( )作为主体的一个程序构架。本发声器的软件实现过程中, loop( )函数内部包含了控制按键判断函数,乐曲播放函数和延时函数。其中,乐曲播放函数play( )是发声器软件实现的核心语句,函数内所有语句周而复始地循环执行。下面以《生日快乐歌》(简谱见图3)的第一小节为例,给出了play( )函数的实现过程。

  int melody[] = {

  NOTE_G4,//5

  NOTE_G4,//5

  NOTE_A4,//6

  NOTE_G4,//5

  NOTE_C5,//1.

  NOTE_B4,//7

  0,

  ……};

  int noteDurations[] = {

  8,8,4,4,4,4,

  4,

  ……

  };

  void play()

  {

  for (int thisNote = 0; thisNote < 29; thisNote++)

  {

  int noteDuration = 1000/noteDurations[thisNote];

  tone(8, melody[thisNote],noteDuration);

  int pauseBetweenNotes = noteDuration * 1.30;

  delay(pauseBetweenNotes);

  noTone(8);

  }}

3 结论

  本系统利用了目前较为流行的Arduino电子互动平台,通过对ARDUINO IDE平台进行软件开发来控制外围部件,实现了电子音乐的播放和节奏的显示。Arduino是基于源代码的软硬件平台,具有价格便宜,互动多样,支持实时ISP在线烧录等特点。因此,本发声器价格低廉,操作简单,编辑方便,节拍速度可以调节,灵活性较高。该发声器功能可以进一步拓展,如果使用者具有一定的音乐素养,可以实现电子音乐DIY,为生活添加乐趣。

参考文献:

  [1]赵英杰.Arduino互动设计入门[M].北京:科学出版社,2014.

  [2]Michael McRoberts,Begin Arduino[M].杨继志,郭敬译.北京:电子工业出版社,2013.

  [3]杨继志,杨宇环.基于Arduino的网络互动产品创新设计[J].机电产品开发与创新,2012,25(1):99-100.

  [4]蔡睿妍.Arduino 的原理及应用[J].电子工程设计,2012,20(16):155-157.

  [5]赵云娥,陈学煌.基于AT89C51的电子节拍器设计[J].电子测量技术,2008,31(3):176-179.


本文来源于《电子产品世界》2017年第2期第36页,欢迎您写论文时引用,并注明出处。



评论

技术专区

关闭