我是靠谱客的博主 虚幻树叶,最近开发中收集的这篇文章主要介绍arduino 嗡鸣器 音乐_【NO.25】用Arduino播放音乐,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本帖最后由 tahoroom 于 2014-10-15 09:32 编辑

参赛项目: 用Arduino UNO控制器通过蜂鸣器播放音乐

参赛组员:

人数:1;论坛ID:

项目简介:

用Arduino播放音乐其实很有意思,因为我们只需要写一点点代码,就可以利用最简单的蜂鸣器播放音乐了!DIY个“生日快乐”音乐给妹子庆生,岂不一洗死宅形象,进步成技术宅~作品只是抛砖引玉,相信你有更好的IDEA!

预计完成时间:

9月底

联系方式:

tahoroom@163.com

制作原理和过程:

需要用到的材料:

adruino uno一块(其他Arduino板子也可,注意引脚就行),面保线若干条,蜂鸣器或小喇叭一个。

原理:

首先讲下简单的乐理知识,知道音乐是怎么演奏出来的自然就可以通过代码来进行编排了。

1.演奏单音符的原理

一首音乐由若干音符组成,每一个音符唯一对应一个频率。如果我们知道了音符相对应的频率,再让 Arduino 按照这个频率输出到蜂鸣器或喇叭,蜂鸣器或喇叭就会发出相应频率下的声音。

Arduino官方网站给出了不同音符对应的不同频率的头文件,具体请见下文介绍。

2.音符演奏的持续时间

每个音符都会播放一定的时间,这样才能构成一首优美的曲子,而不是每个音符都播放一样长的时间。如何确定每个音符演奏的单位时间呢?我们知道,音符节奏分为1拍、1/2拍、1/4拍、1/8拍等等,我们规定一拍音符的时间为1;半拍为0.5;1/4拍为0.25;1/8拍为0.125……,所以我们可以为每个音符赋予这样的拍子播放出来,音乐就成了。

Arduino官网已经给出了像样的程序,即 Arduino 的 Tone 库。我们用它可以帮助我们快速制作音乐。

这是ArduinoTone函数的官方介绍地址:http://arduino.cc/en/Tutorial/Tone,使用函数为Tone():http://arduino.cc/en/Reference/Tone

如果要查看Tone的完整维护记录和使用说明请访问:http://code.google.com/p/rogue-code/wiki/ToneLibraryDocumentation

制作过程:

所需硬件:Arduino板子一块,小型扬声器/蜂鸣器一个,导线两根。如果扬声器声音太大,也可适当配置220欧姆电阻一个与扬声器串联。

我们将扬声器一端串联电阻后接到数字8(D8)接口,另一端接地(GND)。数字接口可以自己选择,只是在代码中要对应修改一下。

接线原理图如下:

w3oYR.png (56.78 KB, 下载次数: 298)

2014-11-25 11:09 上传

接好线之后,将以下代码粘贴到Arduino IDE中。代码如下:

[mw_shl_code=cpp,true]/*

Melody

Plays a melody

circuit:

* 8-ohm speaker on digital pin 8

created 21 Jan 2010

modified 30 Aug 2011

by Tom Igoe

This example code is in the public domain.

http://arduino.cc/en/Tutorial/Tone

*/

#include "pitches.h"

// notes in the melody:

int melody[] = {

NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};

// note durations: 4 = quarter note, 8 = eighth note, etc.:

int noteDurations[] = {

4, 8, 8, 4,4,4,4,4 };

void setup() {

// iterate over the notes of the melody:

for (int thisNote = 0; thisNote < 8; thisNote++) {

// to calculate the note duration, take one second

// divided by the note type.

//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.

int noteDuration = 1000/noteDurations[thisNote];

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

// to distinguish the notes, set a minimum time between them.

// the note's duration + 30% seems to work well:

int pauseBetweenNotes = noteDuration * 1.30;

delay(pauseBetweenNotes);

// stop the tone playing:

noTone(8);

}

}

void loop() {

// no need to repeat the melody.

}[/mw_shl_code]

该程序中使用了这两个函数:

tone(pin, frequency)

tone(pin, frequency, duration)

函数的参数说明:

pin: 你要接扬声器的接口,是整数(int 型)

frequency:频率,是一个整数(int 型)

duration: 音符持续的时间,是毫秒值,无符号长整型( unsigned long 型)

无返回值

我们还注意到上面代码中调用了头文件“pitches.h”。这个文件是什么呢?这个头文件正式上面提到的不同音符对应的不同频率的头文件。该pitches.h文件内容作为附件放在下面。

打开该文件后可以看到,这是一张类似表格的东西,里面是定义的大量的宏,即用宏名代替了频率名,对应到键盘的各个按键上。可是,不懂音乐的我们如何能够取出我们所要的音符对应的宏名呢?

首先看看钢琴大谱表与钢琴琴键的对照表:

ypQuI.png (316 KB, 下载次数: 348)

2014-11-25 11:09 上传

从上图我们可以将各音符的音名直观的看出来,但是,我又只会简谱,如何看呢?为了方便我自己,也希望能方便大家,我将其制作为了直观的表格,见下图。如果有谁能用到,那我的整理就没有白费啦。

OmHon.png (238.07 KB, 下载次数: 392)

2014-11-25 12:41 上传

对照上面的表格,我们就能制作自己的音乐了。

开始

我用Arduino做了一首生日快乐。

首先找到生日快乐的简谱:

uyqtM.jpg (33.41 KB, 下载次数: 280)

2014-11-25 12:41 上传

再对照上表,制作其旋律函数为(我升高了一个八度):

[mw_shl_code=cpp,true]

int melody[] = {

NOTE_G4,//5

NOTE_G4,//5

NOTE_A4,//6

NOTE_G4,//5

NOTE_C5,//1.

NOTE_B4,//7

0,

NOTE_G4,//5

NOTE_G4,//5

NOTE_A4,//6

NOTE_G4,//5

NOTE_D5,//2.

NOTE_C5,//1.

0,

NOTE_G4,//5

NOTE_G4,//5

NOTE_G5,//5.

NOTE_E5,//3.

NOTE_C5,//1.

NOTE_B4,//7

NOTE_A4,//6

0,

NOTE_F5,//4.

NOTE_F5,//4.

NOTE_E5,//3.

NOTE_C5,//1.

NOTE_D5,//2.

NOTE_C5,//1.

0,

};[/mw_shl_code]

持续时间函数为:(注意休止符也需要时间的)

[mw_shl_code=cpp,true]int noteDurations[] = {

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

4,

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

4,

8,8,4,4,4,4,2,

8,

8,8,4,4,4,2,

4,

};

[/mw_shl_code]

可以直接把上面的两个函数覆盖官方的例子,写入Arduino就行了,可以灵活的修改修改接口,我用了D5(数字接口5)。不过,为了更好看起见,我还添加了3个彩色自闪LED灯,一闪一闪的很好看,温馨感一下就出来了,所以,在后面稍微添加了几行代码:

[mw_shl_code=cpp,true]/*

Happy Birthday Tone

Made by TAHO on 6th,Nov. 2013

www.tahoroom.com

tahoroom@163.com

version 1.2

*/

//Begin

#include "pitches.h"

void setup() {

// iterate over the notes of the melody:

pinMode(9,OUTPUT);//for light

pinMode(10,OUTPUT);//for light

pinMode(11,OUTPUT);//for light

}

void loop() {

// no need to repeat the melody.

ColorLight();//Turn on the lights

play();//Play the music.

delay(300);//Pause for a while.

}

// notes in the melody:

int melody[] = {

NOTE_G4,//5

NOTE_G4,//5

NOTE_A4,//6

NOTE_G4,//5

NOTE_C5,//1.

NOTE_B4,//7

0,

NOTE_G4,//5

NOTE_G4,//5

NOTE_A4,//6

NOTE_G4,//5

NOTE_D5,//2.

NOTE_C5,//1.

0,

NOTE_G4,//5

NOTE_G4,//5

NOTE_G5,//5.

NOTE_E5,//3.

NOTE_C5,//1.

NOTE_B4,//7

NOTE_A4,//6

0,

NOTE_F5,//4.

NOTE_F5,//4.

NOTE_E5,//3.

NOTE_C5,//1.

NOTE_D5,//2.

NOTE_C5,//1.

0,

};

//Duration time of each melody

int noteDurations[] = {

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

4,

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

4,

8,8,4,4,4,4,2,

8,

8,8,4,4,4,2,

4,

};

//Play the melody

void play()

{

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

// to calculate the note duration, take one second

// divided by the note type.

//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.

int noteDuration = 1000/noteDurations[thisNote];

tone(5, melody[thisNote],noteDuration);    //I changed this number  into 5, which means using "Digital 5"

// to distinguish the notes, set a minimum time between them.

// the note's duration + 30% seems to work well:

int pauseBetweenNotes = noteDuration * 1.30;

delay(pauseBetweenNotes);

// stop the tone playing:

noTone(8);

}

}

//Turn on the lights

void ColorLight()

{

digitalWrite(9, HIGH);

digitalWrite(10, HIGH);

digitalWrite(11, HIGH);

}

//End[/mw_shl_code]

pitches.h 头文件当然不用再修改了。

成品出来了!看图!(为了好一只手拿,我用了拓展盾板,底下再粘上了一块 9V 电池。)

14C3rD.jpg (309.23 KB, 下载次数: 283)

2014-11-25 18:15 上传

请看视频:

更多图:

xZtYU.jpg (48.68 KB, 下载次数: 269)

2014-11-25 18:15 上传

RS4up.jpg (29.24 KB, 下载次数: 279)

2014-11-25 18:22 上传

JEz88.jpg (47.21 KB, 下载次数: 251)

2014-11-25 18:22 上传

最后

以上就是虚幻树叶为你收集整理的arduino 嗡鸣器 音乐_【NO.25】用Arduino播放音乐的全部内容,希望文章能够帮你解决arduino 嗡鸣器 音乐_【NO.25】用Arduino播放音乐所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部