Arduino:用 Arduino 播放“生日快乐”

| 2013年11月11日

Arduino 播放音乐的原理

需要用到的材料: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欧姆电阻一个与扬声器串联。

首先看看官方的例子。

speaker_bb

该例子里,我们将扬声器一端串联电阻后接到数字8(D8)接口,另一端接地(GND)。接线原理图如下:

speaker_schem

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

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

tone(pin, frequency)

tone(pin, frequency, duration)

函数的参数说明:

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

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

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

无返回值

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

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

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

从上图我们可以将各音符的音名直观的看出来,但是,我又只会简谱,如何看呢?为了方便我自己,也希望能方便大家,我将其制作为了直观的表格,见下图:(如需要Excel格式文件的请留言联系我)

UvUSj

上图辛苦的制作过程:

Fte1R

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

自己的作品——播放生日快乐歌

最近老婆要过生日,我打算用Arduino为她做一首生日快乐送给她。(发布这篇文章的时候生日已经过了,不想早发布是怕她看见了,惊喜就没那么大了,嘿嘿!)

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

可以看到其节拍是3/4,但是我按照其节拍做下来之后觉得唱的太慢了,就没按照它的来。(灵活处理嘛)

再对照上表,制作其旋律函数为:

 

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

可以直接把上面的两个函数覆盖官方的例子,写入Arduino就行了,可以灵活的修改修改接口。不过,为了更好看起见,我添加了3个彩色自闪LED灯,一闪一闪的很好看,我想老婆会更喜欢的。所以,稍微添加了几行代码:

 

pitches.h 文件就不用再修改了。

成品出来了!看图!(为了她好拿,我用了拓展盾板,底下再粘上了一块 9V 电池,其实很简单的。本打算做个最小电路给她,由于一些原因没有及时买到晶振材料,因此作罢。)

看视频!

更多图:

老婆好高兴,她非常满意!拿去给朋友炫耀了,哈哈!

Arduino:用 Arduino 播放“生日快乐”》有12个想法

  1. kalock

    这个的程序的作者,请问可以留下邮件吗?
    我是新手希望你可以教我下这个程序的一些疑问。谢谢

    回复
  2. 星进

    感谢楼主,我也想用tone函数让arduino唱歌,楼主的文章很给力,请问可否共享excel文件?谢谢!
    jxndlym@foxmail.com
    预祝楼主新年快乐。

    回复
    1. TAHO

      谢谢,也祝你新年快乐!Excel文件已经发送到你的邮箱,希望能帮到你。

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注