极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 36386|回复: 9

(arduino)详解蜂鸣器演奏音乐并配有LED闪烁实验

[复制链接]
发表于 2013-9-28 16:02:12 | 显示全部楼层 |阅读模式
本帖最后由 mybag1 于 2013-9-28 16:05 编辑

一、本次实验所需器材

1、Arduino板

2、无源蜂鸣器:一种一体化结构的电子讯响器,分为有源蜂鸣器与无源蜂鸣器。这里的“源”不是指电源,而是指震荡源,有源蜂鸣器内部带震荡源,所以只要一通电就会响,而无源内部不带震荡源,所以如果仅用直流信号无法令其鸣叫,必须用2K-5K的方波去驱动它。从外观上看,两种蜂鸣器区别不大,但将两种蜂鸣器的引脚都朝上放置时,可以看出有绿色电路板的一种是无源蜂鸣器,没有电路板而用黑胶封闭的一种是有源蜂鸣器。如图:
3、LED:一个

4、杜邦线:若干

5、面包板:一个
二、无源蜂鸣器发声实验

    通过上网查询参数,得到其工作电压为5V,和arduino控制板数字端口输出电压一致,所以不需要接电阻,于是其与arduino的布线图和原理图如下:

把下面的代码上传到arduino控制板上:


  1. int  tonepin=6;//设置控制蜂鸣器的数字6脚
  2.     void setup()
  3.     {
  4.       pinMode(tonepin,OUTPUT);//设置数字IO脚模式,OUTPUT为输出
  5.     }
  6.     void loop()
  7.     {
  8.       unsigned char i,j;
  9.       while(1)
  10.       {
  11.         for(i=0;i<80;i++)//输出一个频率的声音
  12.         {
  13.           digitalWrite(tonepin,HIGH);//发声音
  14.           delay(1);//延时1ms
  15.           digitalWrite(tonepin,LOW);//不发声音
  16.           delay(1);//延时ms
  17.         }
  18.         for(i=0;i<100;i++)//输出另一个频率的声音,这里的100与前面的80一样,用来控制频率,可以自己调节
  19.         {
  20.           digitalWrite(tonepin,HIGH);
  21.           delay(2);
  22.           digitalWrite(tonepin,LOW);
  23.           delay(2);
  24.         }
  25.       }
  26.     }

复制代码

从上面的代码可以看出,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

第五,有的两个连续的音符上面带弧线,表示连音,可以稍微改下连音后面那个音的频率,比如减少或增加一些数值(需自己调试),这样表现会更流畅,其实不做处理,影响也不大。

下面,看具体代码:


  1. #define NTD0 -1
  2. #define NTD1 294
  3. #define NTD2 330
  4. #define NTD3 350
  5. #define NTD4 393
  6. #define NTD5 441
  7. #define NTD6 495
  8. #define NTD7 556

  9. #define NTDL1 147
  10. #define NTDL2 165
  11. #define NTDL3 175
  12. #define NTDL4 196
  13. #define NTDL5 221
  14. #define NTDL6 248
  15. #define NTDL7 278

  16. #define NTDH1 589
  17. #define NTDH2 661
  18. #define NTDH3 700
  19. #define NTDH4 786
  20. #define NTDH5 882
  21. #define NTDH6 990
  22. #define NTDH7 112
  23. //列出全部D调的频率

  24. #define WHOLE 1
  25. #define HALF 0.5
  26. #define QUARTER 0.25
  27. #define EIGHTH 0.25
  28. #define SIXTEENTH 0.625
  29. //列出所有节拍
  30. int tune[]=                 //根据简谱列出各频率
  31. {
  32.   NTD3,NTD3,NTD4,NTD5,
  33.   NTD5,NTD4,NTD3,NTD2,
  34.   NTD1,NTD1,NTD2,NTD3,
  35.   NTD3,NTD2,NTD2,
  36.   NTD3,NTD3,NTD4,NTD5,
  37.   NTD5,NTD4,NTD3,NTD2,
  38.   NTD1,NTD1,NTD2,NTD3,
  39.   NTD2,NTD1,NTD1,
  40.   NTD2,NTD2,NTD3,NTD1,
  41.   NTD2,NTD3,NTD4,NTD3,NTD1,
  42.   NTD2,NTD3,NTD4,NTD3,NTD2,
  43.   NTD1,NTD2,NTDL5,NTD0,
  44.   NTD3,NTD3,NTD4,NTD5,
  45.   NTD5,NTD4,NTD3,NTD4,NTD2,
  46.   NTD1,NTD1,NTD2,NTD3,
  47.   NTD2,NTD1,NTD1
  48. };
  49. float durt[]=                   //根据简谱列出各节拍
  50. {
  51.   1,1,1,1,
  52.   1,1,1,1,
  53.   1,1,1,1,
  54.   1+0.5,0.5,1+1,
  55.   1,1,1,1,
  56.   1,1,1,1,
  57.   1,1,1,1,
  58.   1+0.5,0.5,1+1,
  59.   1,1,1,1,
  60.   1,0.5,0.5,1,1,
  61.   1,0.5,0.5,1,1,
  62.   1,1,1,1,
  63.   1,1,1,1,
  64.   1,1,1,0.5,0.5,
  65.   1,1,1,1,
  66.   1+0.5,0.5,1+1,
  67. };
  68. int length;
  69. int tonepin=6;   //得用6号接口
  70. void setup()
  71. {
  72.   pinMode(tonepin,OUTPUT);
  73.   length=sizeof(tune)/sizeof(tune[0]);   //计算长度
  74. }
  75. void loop()
  76. {
  77.   for(int x=0;x<length;x++)
  78.   {
  79.     tone(tonepin,tune[x]);
  80.     delay(500*durt[x]);   //这里用来根据节拍调节延时,500这个指数可以自己调整,在该音乐中,我发现用500比较合适。
  81.     noTone(tonepin);
  82.   }
  83.   delay(2000);
  84. }

复制代码

实验视频如下:

四、LED灯伴随音乐闪烁

        结何入门笔记(3)(http://wikicode.net/?p=163或者http://www.cnblogs.com/xiaowuyi/p/3337739.html),做一个LED灯伴随音乐进行闪烁。实验布线图和原理图如下:

实验代码为:


  1. #define NTD0 -1
  2. #define NTD1 294
  3. #define NTD2 330
  4. #define NTD3 350
  5. #define NTD4 393
  6. #define NTD5 441
  7. #define NTD6 495
  8. #define NTD7 556

  9. #define NTDL1 147
  10. #define NTDL2 165
  11. #define NTDL3 175
  12. #define NTDL4 196
  13. #define NTDL5 221
  14. #define NTDL6 248
  15. #define NTDL7 278

  16. #define NTDH1 589
  17. #define NTDH2 661
  18. #define NTDH3 700
  19. #define NTDH4 786
  20. #define NTDH5 882
  21. #define NTDH6 990
  22. #define NTDH7 112
  23. //c pinlv
  24. #define WHOLE 1
  25. #define HALF 0.5
  26. #define QUARTER 0.25
  27. #define EIGHTH 0.25
  28. #define SIXTEENTH 0.625

  29. int tune[]=
  30. {
  31.   NTD3,NTD3,NTD4,NTD5,
  32.   NTD5,NTD4,NTD3,NTD2,
  33.   NTD1,NTD1,NTD2,NTD3,
  34.   NTD3,NTD2,NTD2,
  35.   NTD3,NTD3,NTD4,NTD5,
  36.   NTD5,NTD4,NTD3,NTD2,
  37.   NTD1,NTD1,NTD2,NTD3,
  38.   NTD2,NTD1,NTD1,
  39.   NTD2,NTD2,NTD3,NTD1,
  40.   NTD2,NTD3,NTD4,NTD3,NTD1,
  41.   NTD2,NTD3,NTD4,NTD3,NTD2,
  42.   NTD1,NTD2,NTDL5,NTD0,
  43.   NTD3,NTD3,NTD4,NTD5,
  44.   NTD5,NTD4,NTD3,NTD4,NTD2,
  45.   NTD1,NTD1,NTD2,NTD3,
  46.   NTD2,NTD1,NTD1
  47. };
  48. float durt[]=
  49. {
  50.   1,1,1,1,
  51.   1,1,1,1,
  52.   1,1,1,1,
  53.   1+0.5,0.5,1+1,
  54.   1,1,1,1,
  55.   1,1,1,1,
  56.   1,1,1,1,
  57.   1+0.5,0.5,1+1,
  58.   1,1,1,1,
  59.   1,0.5,0.5,1,1,
  60.   1,0.5,0.5,1,1,
  61.   1,1,1,1,
  62.   1,1,1,1,
  63.   1,1,1,0.5,0.5,
  64.   1,1,1,1,
  65.   1+0.5,0.5,1+1,
  66. };
  67. int length;
  68. int tonepin=6;
  69. int ledp=1;
  70. void setup()
  71. {
  72.   pinMode(tonepin,OUTPUT);
  73.   pinMode(ledp,OUTPUT);
  74.   length=sizeof(tune)/sizeof(tune[0]);
  75. }
  76. void loop()
  77. {
  78.   for(int x=0;x<length;x++)
  79.   {
  80.     tone(tonepin,tune[x]);
  81.     digitalWrite(ledp, HIGH);
  82.     delay(400*durt[x]);//与前一代码不同之处,这里将原来的500分为了400和100,分别控制led的开与关,对于蜂鸣器来说依然是500.
  83.     digitalWrite(ledp, LOW);
  84.     delay(100*durt[x]);
  85.     noTone(tonepin);
  86.    
  87.   }
  88.   delay(2000);
  89. }

复制代码

实验视频为:

从视频来看,LED的闪烁还有点不合节奏,可以调整下程序中400和100的分配,使其看上去更合拍。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-1-8 20:49:34 | 显示全部楼层
  太爽了,这样就可以自己谱曲了
回复 支持 反对

使用道具 举报

发表于 2014-1-9 20:51:16 | 显示全部楼层
{:soso_e179:}这样改下去是不是可以直接导入MP3用蜂鸣器播放~
回复 支持 反对

使用道具 举报

发表于 2014-1-10 08:59:50 | 显示全部楼层
SaorUicnext 发表于 2014-1-9 20:51
这样改下去是不是可以直接导入MP3用蜂鸣器播放~

不是,蜂鸣器是不能播放MP3
回复 支持 反对

使用道具 举报

发表于 2014-4-2 15:45:20 | 显示全部楼层
楼主能否帮这个试验发我邮箱[email protected],做毕业课程关于arduino,刚入门,现在找资料留着参考,谢谢楼主了!
回复 支持 反对

使用道具 举报

发表于 2015-8-28 14:37:27 | 显示全部楼层
     

mark……
回复 支持 反对

使用道具 举报

发表于 2015-9-8 20:26:09 | 显示全部楼层
不错不错,非常适合初学者
回复 支持 反对

使用道具 举报

发表于 2015-9-8 20:26:33 | 显示全部楼层
不错不错,非常适合初学者,收藏了
回复 支持 反对

使用道具 举报

发表于 2018-10-13 14:50:45 | 显示全部楼层
NTD0和NTD1是何用处?
回复 支持 反对

使用道具 举报

发表于 2018-10-24 14:15:38 | 显示全部楼层
哇塞,楼主写的不错,我正好在研究音乐的问题,谢谢楼主给解疑了,大大的赞!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 22:18 , Processed in 0.045088 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表