极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 90154|回复: 15

arduino学习笔记22 - 扬声器实验

[复制链接]
发表于 2011-10-12 22:29:12 | 显示全部楼层 |阅读模式
实验材料:
arduino duemilanove一块
8Ω 0.5W 喇叭一个
电位器一个
面包板一个
面包板连接线若干

电位器作用就是调节音量,一般是要求与喇叭阻抗匹配,本次实验没找到小阻值电位器,所以用了一个5K的。

注意:因为扬声器驱动电压要求比较小,远远小于5V,所以需要在扬声器上串联一个大于10uf的电解电容,电解电容负极连接喇叭的正极,电容正极连接另外一端。不接电容长时间使用,会烧毁扬声器。串联一个100Ω电阻也可以(因为电位器最小电阻为0)

上硬件连接图:






本次实验arduino命令中最重要的就是tone()命令。

tone()

tone(pin, frequency, duration)
tone(pin, frequency)
*pin代表连接扬声器的引脚,frequency代表发声频率,duration代表持续的时间,单位是毫秒。

描述:
在一个端口生成一个特定频率的方波,可以指定持续的时间。如果没有指定持续时间,就需要使用noTone()命令终止。端口用来连接到蜂鸣器或者是喇叭播放特定频率声音。

在同一时间,只能产生一个音调。如果已经有音调在某个端口播放,那这时再使用tone()命令将没有效果。如果新的tone()命令是作用在同一端口,将用新的音调替代。

使用tone()命令会干扰3号与11号的PWM输出(除mega以外的其他板子)。

注意:如果想要在不同的端口发出不同的音调,需要在下一个tone()命令前,先使用noTone()命令终止前面音调。

把下面的代码编译后上传进入arduino控制板:
  1. /*
  2. Play Super Mario theme song with Arduino and speaker

  3. circuit:
  4. * 8-ohm speaker on digital pin 8

  5. created 4 June 2011
  6. by naozhendang.com

  7. reference:

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

  9. */
  10. #define NOTE_B0  31
  11. #define NOTE_C1  33
  12. #define NOTE_CS1 35
  13. #define NOTE_D1  37
  14. #define NOTE_DS1 39
  15. #define NOTE_E1  41
  16. #define NOTE_F1  44
  17. #define NOTE_FS1 46
  18. #define NOTE_G1  49
  19. #define NOTE_GS1 52
  20. #define NOTE_A1  55
  21. #define NOTE_AS1 58
  22. #define NOTE_B1  62
  23. #define NOTE_C2  65
  24. #define NOTE_CS2 69
  25. #define NOTE_D2  73
  26. #define NOTE_DS2 78
  27. #define NOTE_E2  82
  28. #define NOTE_F2  87
  29. #define NOTE_FS2 93
  30. #define NOTE_G2  98
  31. #define NOTE_GS2 104
  32. #define NOTE_A2  110
  33. #define NOTE_AS2 117
  34. #define NOTE_B2  123
  35. #define NOTE_C3  131
  36. #define NOTE_CS3 139
  37. #define NOTE_D3  147
  38. #define NOTE_DS3 156
  39. #define NOTE_E3  165
  40. #define NOTE_F3  175
  41. #define NOTE_FS3 185
  42. #define NOTE_G3  196
  43. #define NOTE_GS3 208
  44. #define NOTE_A3  220
  45. #define NOTE_AS3 233
  46. #define NOTE_B3  247
  47. #define NOTE_C4  262
  48. #define NOTE_CS4 277
  49. #define NOTE_D4  294
  50. #define NOTE_DS4 311
  51. #define NOTE_E4  330
  52. #define NOTE_F4  349
  53. #define NOTE_FS4 370
  54. #define NOTE_G4  392
  55. #define NOTE_GS4 415
  56. #define NOTE_A4  440
  57. #define NOTE_AS4 466
  58. #define NOTE_B4  494
  59. #define NOTE_C5  523
  60. #define NOTE_CS5 554
  61. #define NOTE_D5  587
  62. #define NOTE_DS5 622
  63. #define NOTE_E5  659
  64. #define NOTE_F5  698
  65. #define NOTE_FS5 740
  66. #define NOTE_G5  784
  67. #define NOTE_GS5 831
  68. #define NOTE_A5  880
  69. #define NOTE_AS5 932
  70. #define NOTE_B5  988
  71. #define NOTE_C6  1047
  72. #define NOTE_CS6 1109
  73. #define NOTE_D6  1175
  74. #define NOTE_DS6 1245
  75. #define NOTE_E6  1319
  76. #define NOTE_F6  1397
  77. #define NOTE_FS6 1480
  78. #define NOTE_G6  1568
  79. #define NOTE_GS6 1661
  80. #define NOTE_A6  1760
  81. #define NOTE_AS6 1865
  82. #define NOTE_B6  1976
  83. #define NOTE_C7  2093
  84. #define NOTE_CS7 2217
  85. #define NOTE_D7  2349
  86. #define NOTE_DS7 2489
  87. #define NOTE_E7  2637
  88. #define NOTE_F7  2794
  89. #define NOTE_FS7 2960
  90. #define NOTE_G7  3136
  91. #define NOTE_GS7 3322
  92. #define NOTE_A7  3520
  93. #define NOTE_AS7 3729
  94. #define NOTE_B7  3951
  95. #define NOTE_C8  4186
  96. #define NOTE_CS8 4435
  97. #define NOTE_D8  4699
  98. #define NOTE_DS8 4978

  99. // notes in the melody:
  100. int melody[] = {
  101. NOTE_E4, NOTE_E4, NOTE_E4, NOTE_C4, NOTE_E4, NOTE_G4, NOTE_G3,
  102. NOTE_C4, NOTE_G3, NOTE_E3, NOTE_A3, NOTE_B3, NOTE_AS3, NOTE_A3, NOTE_G3, NOTE_E4, NOTE_G4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_E4, NOTE_C4, NOTE_D4, NOTE_B3,
  103. NOTE_C4, NOTE_G3, NOTE_E3, NOTE_A3, NOTE_B3, NOTE_AS3, NOTE_A3, NOTE_G3, NOTE_E4, NOTE_G4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_E4, NOTE_C4, NOTE_D4, NOTE_B3,
  104. NOTE_G4, NOTE_FS4, NOTE_E4, NOTE_DS4, NOTE_E4, NOTE_GS3, NOTE_A3, NOTE_C4, NOTE_A3, NOTE_C4, NOTE_D4, NOTE_G4, NOTE_FS4, NOTE_E4, NOTE_DS4, NOTE_E4, NOTE_C5, NOTE_C5, NOTE_C5,
  105. NOTE_G4, NOTE_FS4, NOTE_E4, NOTE_DS4, NOTE_E4, NOTE_GS3, NOTE_A3, NOTE_C4, NOTE_A3, NOTE_C4, NOTE_D4, NOTE_DS4, NOTE_D4, NOTE_C4,
  106. NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_C4, NOTE_A3, NOTE_G3, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4,
  107. NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_C4, NOTE_A3, NOTE_G3
  108. };

  109. // note durations: 4 = quarter note, 8 = eighth note, etc.:
  110. int noteDurations[] = {
  111. 8,4,4,8,4,2,2,
  112. 3,3,3,4,4,8,4,8,8,8,4,8,4,3,8,8,3,
  113. 3,3,3,4,4,8,4,8,8,8,4,8,4,3,8,8,2,
  114. 8,8,8,4,4,8,8,4,8,8,3,8,8,8,4,4,4,8,2,
  115. 8,8,8,4,4,8,8,4,8,8,3,3,3,1,
  116. 8,4,4,8,4,8,4,8,2,8,4,4,8,4,1,
  117. 8,4,4,8,4,8,4,8,2
  118. };

  119. void setup() {
  120. // iterate over the notes of the melody:
  121. for (int thisNote = 0; thisNote < 98; thisNote++) {

  122. // to calculate the note duration, take one second
  123. // divided by the note type.
  124. //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
  125. int noteDuration = 1000/noteDurations[thisNote];
  126. tone(8, melody[thisNote],noteDuration);

  127. // to distinguish the notes, set a minimum time between them.
  128. // the note's duration + 30% seems to work well:
  129. int pauseBetweenNotes = noteDuration * 1.30;
  130. delay(pauseBetweenNotes);
  131. // stop the tone playing:
  132. noTone(8);
  133. }
  134. }

  135. void loop() {
  136. // no need to repeat the melody.
  137. }
复制代码
实验效果如下:

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2014-11-26 21:31:49 | 显示全部楼层
你好,请问扬声器频率和音乐谱子的对应关系你是怎么知道的呢?
比如多少的频率对应do,多少频率对应ri。
另外,回帖验证码好难看清楚。。。
回复 支持 1 反对 0

使用道具 举报

发表于 2012-5-18 17:16:09 | 显示全部楼层
效果很理想,就是声音有点小。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-18 19:08:00 | 显示全部楼层
davidce 发表于 2012-5-18 17:16
效果很理想,就是声音有点小。

不知道。。三极管扩流管用不。。。加电阻限制最大音量。
回复 支持 反对

使用道具 举报

发表于 2012-8-30 21:25:13 | 显示全部楼层
学习了就是编一首歌很麻烦
回复 支持 反对

使用道具 举报

发表于 2012-10-28 19:58:36 | 显示全部楼层
弘毅 发表于 2012-5-18 19:08
不知道。。三极管扩流管用不。。。加电阻限制最大音量。

感觉很长的程序啊。
回复 支持 反对

使用道具 举报

发表于 2013-2-15 15:37:25 | 显示全部楼层
请问能不能调音啊,比如调成钢琴的音色什么的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-17 15:59:26 | 显示全部楼层
Bravo!东东 发表于 2013-2-15 15:37
请问能不能调音啊,比如调成钢琴的音色什么的

介个。。。貌似这个函数不行。
回复 支持 反对

使用道具 举报

发表于 2013-4-19 11:16:59 | 显示全部楼层
这是游戏音乐。。
回复 支持 反对

使用道具 举报

发表于 2014-11-17 22:49:57 | 显示全部楼层
我用 uno了 上传,但是无声音的,但是我用的是一般的那些蜂鸣器而已
回复 支持 反对

使用道具 举报

发表于 2015-4-10 21:30:55 | 显示全部楼层
布列松 发表于 2014-11-17 22:49
我用 uno了 上传,但是无声音的,但是我用的是一般的那些蜂鸣器而已

那种小黑无源蜂鸣器也能用,正极在8号接口,负极GND,适当的电阻(220欧姆以上)能听到示例一样的声音,试一试~
回复 支持 反对

使用道具 举报

发表于 2015-9-8 19:49:27 | 显示全部楼层
如果想用三极管放大,应该怎么接呢?
4欧和8欧的喇叭,小功率和大功率的喇叭,又有什么不同的接法呢?
回复 支持 反对

使用道具 举报

发表于 2016-5-9 17:54:24 | 显示全部楼层
好资料,研究下,
回复 支持 反对

使用道具 举报

发表于 2016-5-9 17:55:36 | 显示全部楼层
好资料,研究下,
回复 支持 反对

使用道具 举报

发表于 2017-11-5 00:08:47 | 显示全部楼层
本帖最后由 Stormer 于 2017-11-5 13:01 编辑
注意:因为扬声器驱动电压要求比较小,远远小于5V,所以需要在扬声器上串联一个大于10uf的电解电容,电解电容负极连接喇叭的正极,电容正极连接另外一端。不接电容长时间使用,会烧毁扬声器。串联一个100Ω电阻也可以


接这个电容的目的是什么?   是隔断直流吗?  音频是通过数字口输出的PWM方波。 这个方波算是交流电? 如果它还是直流的话,那么加电容不就把信号都阻隔了吗?  小白不明白。
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 21:40 , Processed in 0.047782 second(s), 33 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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