Arduino入门笔记(4):用蜂鸣器演奏音乐并配有LED闪烁
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi
欢迎加入讨论群 64770604
一、本次实验所需器材
1、Arduino板 https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-15820725129.16.AtgoEm&id=545093340395
2、无源蜂鸣器:一种一体化结构的电子讯响器,分为有源蜂鸣器与无源蜂鸣器。这里的“源”不是指电源,而是指震荡源,有源蜂鸣器内部带震荡源,所以只要一通电就会响,而无源内部不带震荡源,所以如果仅用直流信号无法令其鸣叫,必须用2K-5K的方波去驱动它。从外观上看,两种蜂鸣器区别不大,但将两种蜂鸣器的引脚都朝上放置时,可以看出有绿色电路板的一种是无源蜂鸣器,没有电路板而用黑胶封闭的一种是有源蜂鸣器。如图:

3、LED:一个
4、杜邦线:若干
5、面包板:一个
二、无源蜂鸣器发声实验
通过上网查询参数,得到其工作电压为5V,和arduino控制板数字端口输出电压一致,所以不需要接电阻,于是其与arduino的布线图和原理图如下:

把下面的代码上传到arduino控制板上:
int tonepin=;//设置控制蜂鸣器的数字6脚
void setup()
{
pinMode(tonepin,OUTPUT);//设置数字IO脚模式,OUTPUT为输出
}
void loop()
{
unsigned char i,j;
while()
{
for(i=;i<;i++)//输出一个频率的声音
{
digitalWrite(tonepin,HIGH);//发声音
delay();//延时1ms
digitalWrite(tonepin,LOW);//不发声音
delay();//延时ms
}
for(i=;i<;i++)//输出另一个频率的声音,这里的100与前面的80一样,用来控制频率,可以自己调节
{
digitalWrite(tonepin,HIGH);
delay();
digitalWrite(tonepin,LOW);
delay();
}
}
}
从上面的代码可以看出,for语句中的80、100控制了频率,delay控制了时长,类似与音乐中的节拍。
实验视频如下:
三、无线蜂鸣器演奏音乐
从上面的实验看,如果我们能够控制好频率和节拍,那就有可能演奏出动听的音乐。因此,我们首先需要搞清楚各音调的频率,具体见下表:
低音:
|
音调 音符 |
1# |
2# |
3# |
4# |
5# |
6# |
7# |
|
A |
221 |
248 |
278 |
294 |
330 |
371 |
416 |
|
B |
248 |
278 |
294 |
330 |
371 |
416 |
467 |
|
C |
131 |
147 |
165 |
175 |
196 |
221 |
248 |
|
D |
147 |
165 |
175 |
196 |
221 |
248 |
278 |
|
E |
165 |
175 |
196 |
221 |
248 |
278 |
312 |
|
F |
175 |
196 |
221 |
234 |
262 |
294 |
330 |
|
G |
196 |
221 |
234 |
262 |
294 |
330 |
371 |
中音:
|
音调 音符 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
A |
441 |
495 |
556 |
589 |
661 |
742 |
833 |
|
B |
495 |
556 |
624 |
661 |
742 |
833 |
935 |
|
C |
262 |
294 |
330 |
350 |
393 |
441 |
495 |
|
D |
294 |
330 |
350 |
393 |
441 |
495 |
556 |
|
E |
330 |
350 |
393 |
441 |
495 |
556 |
624 |
|
F |
350 |
393 |
441 |
495 |
556 |
624 |
661 |
|
G |
393 |
441 |
495 |
556 |
624 |
661 |
742 |
高音:
|
音调 音符 |
1# |
2# |
3# |
4# |
5# |
6# |
7# |
|
A |
882 |
990 |
1112 |
1178 |
1322 |
1484 |
1665 |
|
B |
990 |
1112 |
1178 |
1322 |
1484 |
1665 |
1869 |
|
C |
525 |
589 |
661 |
700 |
786 |
882 |
990 |
|
D |
589 |
661 |
700 |
786 |
882 |
990 |
1112 |
|
E |
661 |
700 |
786 |
882 |
990 |
1112 |
1248 |
|
F |
700 |
786 |
882 |
935 |
1049 |
1178 |
1322 |
|
G |
786 |
882 |
990 |
1049 |
1178 |
1322 |
1484 |
我们知道了音调的频率后,下一步就是控制音符的演奏时间。每个音符都会播放一定的时间,这样才能构成一首优美的曲子,而不是生硬的一个调的把所有的音符一股脑的都播放出来。音符节奏分为一拍、半拍、1/4拍、1/8拍,我们规定一拍音符的时间为1;半拍为0.5;1/4拍为0.25;1/8拍为0.125……,所以我们可以为每个音符赋予这样的拍子播放出来,音乐就成了。
这里我们具体以《欢乐颂》为例:

从简谱看,该音乐是D调的,这里的各音符对应的频率对应的是上表中D调的部分。另外,该音乐为四分之四拍,每个对应为1拍。几个特殊音符说明如下:
第一,普通音符。如第一个音符3,对应频率350,占1拍。
第二,带下划线音符,表示0.5拍。
第三,有的音符后带一个点,表示多加0.5拍,即1+0.5
第四,有的音符后带一个—,表示多加1拍,即1+1
第五,有的两个连续的音符上面带弧线,表示连音,可以稍微改下连音后面那个音的频率,比如减少或增加一些数值(需自己调试),这样表现会更流畅,其实不做处理,影响也不大。
下面,看具体代码:
#define NTD0 -1
#define NTD1 294
#define NTD2 330
#define NTD3 350
#define NTD4 393
#define NTD5 441
#define NTD6 495
#define NTD7 556 #define NTDL1 147
#define NTDL2 165
#define NTDL3 175
#define NTDL4 196
#define NTDL5 221
#define NTDL6 248
#define NTDL7 278 #define NTDH1 589
#define NTDH2 661
#define NTDH3 700
#define NTDH4 786
#define NTDH5 882
#define NTDH6 990
#define NTDH7 112
//列出全部D调的频率
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625
//列出所有节拍
int tune[]= //根据简谱列出各频率
{
NTD3,NTD3,NTD4,NTD5,
NTD5,NTD4,NTD3,NTD2,
NTD1,NTD1,NTD2,NTD3,
NTD3,NTD2,NTD2,
NTD3,NTD3,NTD4,NTD5,
NTD5,NTD4,NTD3,NTD2,
NTD1,NTD1,NTD2,NTD3,
NTD2,NTD1,NTD1,
NTD2,NTD2,NTD3,NTD1,
NTD2,NTD3,NTD4,NTD3,NTD1,
NTD2,NTD3,NTD4,NTD3,NTD2,
NTD1,NTD2,NTDL5,NTD0,
NTD3,NTD3,NTD4,NTD5,
NTD5,NTD4,NTD3,NTD4,NTD2,
NTD1,NTD1,NTD2,NTD3,
NTD2,NTD1,NTD1
};
float durt[]= //根据简谱列出各节拍
{
,,,,
,,,,
,,,,
+0.5,0.5,+,
,,,,
,,,,
,,,,
+0.5,0.5,+,
,,,,
,0.5,0.5,,,
,0.5,0.5,,,
,,,,
,,,,
,,,0.5,0.5,
,,,,
+0.5,0.5,+,
};
int length;
int tonepin=; //得用6号接口
void setup()
{
pinMode(tonepin,OUTPUT);
length=sizeof(tune)/sizeof(tune[]); //计算长度
}
void loop()
{
for(int x=;x<length;x++)
{
tone(tonepin,tune[x]);
delay(*durt[x]); //这里用来根据节拍调节延时,500这个指数可以自己调整,在该音乐中,我发现用500比较合适。
noTone(tonepin);
}
delay();
}
实验视频如下:
四、LED灯伴随音乐闪烁
结何入门笔记(3)(http://wikicode.net/?p=163或者http://www.cnblogs.com/xiaowuyi/p/3337739.html),做一个LED灯伴随音乐进行闪烁。实验布线图和原理图如下:

实验代码为:
#define NTD0 -1
#define NTD1 294
#define NTD2 330
#define NTD3 350
#define NTD4 393
#define NTD5 441
#define NTD6 495
#define NTD7 556 #define NTDL1 147
#define NTDL2 165
#define NTDL3 175
#define NTDL4 196
#define NTDL5 221
#define NTDL6 248
#define NTDL7 278 #define NTDH1 589
#define NTDH2 661
#define NTDH3 700
#define NTDH4 786
#define NTDH5 882
#define NTDH6 990
#define NTDH7 112
//c pinlv
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625 int tune[]=
{
NTD3,NTD3,NTD4,NTD5,
NTD5,NTD4,NTD3,NTD2,
NTD1,NTD1,NTD2,NTD3,
NTD3,NTD2,NTD2,
NTD3,NTD3,NTD4,NTD5,
NTD5,NTD4,NTD3,NTD2,
NTD1,NTD1,NTD2,NTD3,
NTD2,NTD1,NTD1,
NTD2,NTD2,NTD3,NTD1,
NTD2,NTD3,NTD4,NTD3,NTD1,
NTD2,NTD3,NTD4,NTD3,NTD2,
NTD1,NTD2,NTDL5,NTD0,
NTD3,NTD3,NTD4,NTD5,
NTD5,NTD4,NTD3,NTD4,NTD2,
NTD1,NTD1,NTD2,NTD3,
NTD2,NTD1,NTD1
};
float durt[]=
{
,,,,
,,,,
,,,,
+0.5,0.5,+,
,,,,
,,,,
,,,,
+0.5,0.5,+,
,,,,
,0.5,0.5,,,
,0.5,0.5,,,
,,,,
,,,,
,,,0.5,0.5,
,,,,
+0.5,0.5,+,
};
int length;
int tonepin=;
int ledp=;
void setup()
{
pinMode(tonepin,OUTPUT);
pinMode(ledp,OUTPUT);
length=sizeof(tune)/sizeof(tune[]);
}
void loop()
{
for(int x=;x<length;x++)
{
tone(tonepin,tune[x]);
digitalWrite(ledp, HIGH);
delay(*durt[x]);//与前一代码不同之处,这里将原来的500分为了400和100,分别控制led的开与关,对于蜂鸣器来说依然是500.
digitalWrite(ledp, LOW);
delay(*durt[x]);
noTone(tonepin); }
delay();
}
实验视频为:
从视频来看,LED的闪烁还有点不合节奏,可以调整下程序中400和100的分配,使其看上去更合拍。
Arduino入门笔记(4):用蜂鸣器演奏音乐并配有LED闪烁的更多相关文章
- Arduino入门笔记(3):单LED闪烁
转载请注明:@小五义http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 在搭建好arduino开发环境(http://www.cnblogs.com/xi ...
- Arduino入门笔记(6):温度传感器及感温杯实验
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino板 :https://item.taob ...
- Arduino入门笔记(7):利用1602、1302实现时钟和定时器
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 常常听到老妈在做饭时说“开锅15分钟后叫我一下”,为何不做个定时器,来提醒老妈呢 ...
- Arduino入门笔记(1):认识Arduino
转载请注明:@小五义http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 各种网站论坛里经常看到网友DIY各种遥控小车.机器人什么的,一直很好奇,很想学习一 ...
- Arduino入门笔记(2):Arduino的开发和virtualbreadboard仿真环境
欢迎加入讨论群 64770604 1.开发环境 (1)下载开发环境 Arduino的开发环境从http://arduino.cc/en/Main/Software官网下载即可,分为windows版本. ...
- Arduino入门笔记【1】
刚刚接触这个东西只知道这是类似于单片机的开发板,可以做一些单片机实现或者不能实现的东西,但是比单片机要简单得多. Arduino到底是什么? 维基百科上的描述是:Arduino是一块开发板的微控制器和 ...
- Arduino入门笔记(5):1602液晶实验(实现时钟)
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino板 https://item.taoba ...
- Arduino入门笔记(9):蓝牙模块及第一辆蓝牙遥控小车
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino UNO板 https://item.t ...
- Arduino入门笔记(8):利用12864和ADXL345学习重力感应控制
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino UNO板 https://item.t ...
随机推荐
- HDU4662(SummerTrainingDay03-B)
MU Puzzle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- C++ 的那些坑 (Day 2)
虚函数调用的例外 我们知道在通过基类的指针或者引用调用某个对象的函数时,如果这个对象是一个派生类而且该方法是一个虚方法那么一般情况下就会调用派生类的虚方法实现.这个过程是C++的多态.然而这之中有些例 ...
- python-命令模式
源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明: 命令在发送方被激活,而在接收方被响应.一个对象既可以作为命令的发送方,也可以作为 ...
- 第三十三天- 线程创建、join、守护线程、死锁
1.线程,线程创建 概念:在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程,线程顾名思义,就是一条流水线工作的过程,一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责 ...
- 洛谷P3248 [HNOI2016]树(主席树 倍增 )
题意 题目链接 Sol 从上午九点淦到现在qwq 思路比较简单,就是把每次加入的一坨点看成一个,然后直接倍增搞.. 然后慢慢调就可以了... 最后数量级会到达\(10^{10}\),所以应该开long ...
- HTML meta 标签总结
本文转载自:http://www.cnblogs.com/lovesong/p/5745893.html meta标签作用 META标签是HTML标记HEAD区的一个关键标签,提供文档字符集.使用语言 ...
- VMware 创建VMware9虚拟机及设置详细教程
创建VMware9虚拟机及设置详细教程 by:授客 QQ:1033553122 1.点击Create a New Virtual Machine图标按钮,或者file->new virtual ...
- Linux笔记(一):CentOS-7安装
(一) 安装环境 VMware® Workstation 12 Pro,安装到物理机的话还需要做个U盘启动盘 (二) 下载 https://www.centos.org/download/ ...
- 几个python函数
迭代器 fun函数 过滤作用 s=['a', 'b', 'c'] def fun1(s): if s!='a': return s ret filter(fun1, str) print(ret) ...
- 从零自学Java-2.初步理解Java程序使如何工作的
1.学习Java应用程序是如何工作的 2.构成一个应用程序 3.向应用程序传递参数 4.学习Java程序是如何组织的 5.在应用程序中创建一个对象 程序Root:输出225的正平方根 package ...