找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5153|回复: 1
打印 上一主题 下一主题
收起左侧

Arduino教程-跨时代的留声机

[复制链接]
跳转到指定楼层
楼主
Hi,大家好!上一次,我们享受到了Arduino那动人的歌喉,可惜的是,她唱出来的音律是一个一个的,能不能将这些单个的音律连起来形成一首优美的歌曲呢?当然是可以的啦!好,那既然是可以的,我们这次一起学习一下,如何做一款跨时代的留声机!
闲话不多说,先让我们看一下,完成这样一款留声机,我们需要做哪些准备吧!
硬件方面
图片来源:Arduino电路配件
具体包括如下:
  • Arduino UNO电路板(1块)
  • 面包板(1块)
  • 100Ω电阻(1个)
  • 8Ω扬声器(1个)
  • 面包线(若干)
配件看起来是不是很眼熟?而且还少了几个,比之前还简单了呢!好的,硬件就这些。之前都见过,就不多说了。
软件方面Arduino官方提供的IDE。
连接电路
图片来源:Arduino电路连接
嗯,连接电路看起来是不是也很眼熟?其实就是在上一次学习的基础上,把压力传感器去掉了而已!就这么简单!嗯!
顺利抵达最后一步!
添加几行代码首先,新建一个项目窗口。

图片来源:Arduino官方IDE
接下来我们向其中添加如下代码:


  1. // 为了在程序中方便对音调进行变更,
  2. // 我们提前在程序的最顶部预定义了
  3. // 四个宏变量,每个宏变量代表一个
  4. // 音调,可以让扬声器发出不同的声音。
  5. // 宏变量在程序运行中不得更改,
  6. // 其使用方式可以简单理解成常量。
  7. #define NOTE_C4 262
  8. #define NOTE_G3 196
  9. #define NOTE_A3 220
  10. #define NOTE_B3 247
  11. // 定义音乐所包含的发音
  12. int melody[] = {
  13.   NOTE_C4, NOTE_G3,
  14.   NOTE_G3, NOTE_A3,
  15.   NOTE_G3, 0,
  16.   NOTE_B3, NOTE_C4
  17. };
  18. // 定义音乐的节拍
  19. int noteDurations[] = {
  20.   4, 8, 8, 4, 4, 4, 4, 4
  21. };
  22. // 对Arduino电路板或相关状态进行初始化方法
  23. void setup() {
  24.   // 遍历整首音乐的乐谱
  25.   for (int thisNote = 0; thisNote < 8; thisNote++) {
  26.     // 计算每个发音的节拍,也就是每个发音的长短。
  27.     // 例如,四分之一拍 = 1000 / 4,八分之一拍 = 1000/8
  28.     // 注意:此处的1000指的是1000毫秒,也就是1秒的时间。
  29.     int noteDuration = 1000 / noteDurations[thisNote];
  30.     // 向8号数字引脚发送信号,
  31.     // 发音为 melody[thisNote],
  32.     // 每个发音的时间长度为 noteDuration。
  33.     tone(8, melody[thisNote], noteDuration);
  34.     // 为了能够清晰的区分两个临近的发音,
  35.     // 需要设置一个合理的时间间隔,
  36.     // 此处我们将每个发音节拍的时间延长30%,
  37.     // 以此作为两个发音的间隔时间,听起来效果还不错。
  38.     int pauseBetweenNotes = noteDuration * 1.30;
  39.     // 每个发音之间延迟 pauseBetweenNotes 时长。
  40.     delay(pauseBetweenNotes);
  41.     // 延迟时间到了之后,
  42.     // 向8号数字引脚发送信号,
  43.     // 终止此引脚上的扬声器继续发音。
  44.     noTone(8);
  45.   }
  46. }
  47. // 系统调用,无限循环方法
  48. void loop() {
  49.   // 此处木有代码,开心吗?
  50. }
复制代码

大功告成!这次的代码要比上一次少的多的多,而且在系统调用的loop()方法里一行代码也木有哦!是不是很开心?这里只出现了一个新面孔,那就是noTone()方法,这个方法的作用,就是让特定数字引脚上的扬声器继续发声。它与tone()是双胞胎,要配合使用。

图片来源:Arduino官方IDE的文件编辑菜单选项
点击上图中标有向右指向的箭头图标,将编写完成的代码烧入Arduino电路板。一旦烧入完成,Arduino瞬间即可变成一个跨时代的留声机,将会播放一首苏格兰风情的调调。嗯,尽情享受吧~
总结这次,我们完成了一个跨时代的留声机,碰到了tone()方法的亲兄弟,noTone方法。前一个是播放音乐,后一个是停止播放音乐。
下期预告我们已经做出了跨时代的留声机,但这个留声机只有一个扬声器。现在问题来了,如果我想要多个扬声器一起播放声音,那么应该如何才能做到让它们之间彼此有序的进行配合呢?好!下一次看看如何解决这个问题!


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:101586 发表于 2016-1-3 08:40 | 只看该作者
非常精彩,学习了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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