7639浏览
查看: 7639|回复: 9

[项目] Nano播放音乐

[复制链接]
本帖最后由 丄帝De咗臂 于 2015-7-5 13:05 编辑

【简介】本项目中使用Nano控制压电陶瓷片和LED灯,制作具有视听效果的音乐编辑播放器,使其播放一首《传奇》。完成图如下
Nano播放音乐图3


【器材】Arduino Nano,压电陶瓷片、LE×6(白、绿、蓝、黄、橙、红),面包板,面包线
【原理】电路原理图如下
Nano播放音乐图1

【接线】接线示意图如下
Nano播放音乐图2

【程序】代码如下
  1. /*用简谱制作一首《传奇》
  2. 1=E,1=G两种调;采用了Excel表格函数将简谱的1、2、3、4、5、6、7变成频率,还把频率变成数组,统计出数组的个数
  3. 在这个基础上,做了一组音乐彩灯:用不同的频率,驱动不同的6种颜色的灯*/
  4. //6个频率指示灯的频率界值:
  5. int ledbd1=560;
  6. int ledbd2=661;
  7. int ledbd3=760;
  8. int ledbd4=880;
  9. int ledbd5=1000;
  10. /***************曲子中各个音符的频率及节拍数组*****************/
  11. //旋律的频率,按照E调,旋律中各个音符的频率值
  12. int melody[]=
  13. {
  14. 0,660,660,660,825,733,733,733,660,660,660,733,733,660,550,550,0,619,619,619,660,733,619,550,495,412,412,
  15. 0,825,733,825,825,733,733,733,660,660,733,550,550,550,733,660,0,619,619,619,660,733,733,550,495,412,
  16. 990,733,825,990,733,660,550,0,733,550,825,733,660,660,495,
  17. 990,733,825,990,733,660,550,0,733,550,825,733,660,660,733,733,
  18. 0,660,660,660,495,660,990,879,825,733,660,0,660,825,990,1100,990,1100,990,1100,990,825,825,733,825,
  19. 0,660,660,660,495,660,990,879,825,733,660,0,660,825,990,1100,990,1100,990,1100,990,825,990,990,
  20. 1188,990,879,990,1188,1320,660,879,990,1056,990,1056,990,879,879,990,
  21. 1188,990,879,990,1188,1320,1584,1320,879,990,1056,990,1056,990,879,879,990
  22. };
  23. // 各个音符的节拍,16:1/4拍;8:1/2拍;4:1拍;2:2拍;等等
  24. int noteDurations[]=
  25. {
  26. 8,16,16,8,8,8,16,16,16,8,16,8,8,16,16,2,8,16,16,8,16,5.3,8,16,8,16,2,
  27. 8,16,16,8,16,16,8,16,16,4,8,8,16,16,16,2,8,16,16,8,16,5.3,8,16,5.3,2,
  28. 5.3,5.3,8,5.3,5.3,8,2,8,5.3,5.3,8,5.3,5.3,8,2,
  29. 5.3,5.3,8,5.3,5.3,8,2,8,5.3,5.3,8,5.3,5.3,16,16,2,
  30. 8,16,16,8,16,5.3,8,8,8,5.3,2,16,16,16,16,8,16,8,5.3,8,16,16,16,8,2,
  31. 5.3,16,16,8,16,5.3,8,8,8,5.3,2,16,16,16,16,8,16,8,5.3,8,8,16,5.3,2,
  32. 3,8,8,8,8,8,1,2,8,4,16,16,16,16,16,2,
  33. 3,8,8,8,8,8,2,2,4,8,4,16,16,16,16,16,2
  34. };
  35. /************************初始化函数****************************/
  36. void setup()
  37. {
  38.   //设置数字口的输入/输出模式
  39.   for(int i=2; i<14;i++)
  40.      pinMode(i,OUTPUT);     //设置数字口D2-D13为输出口
  41. }
  42. /**************************主函数******************************/
  43. void loop()
  44. {
  45.   for(int i=3; i<12;i=i+2)//6个频率指示灯的负极接点:GND、3、5、7、9、11
  46.      digitalWrite(i,LOW);   //即熄灭所有灯
  47.   //用循环语句演奏整个旋律,要注意音符的数量(这个可以用excel表格统计出来)
  48.   for (int thisNote = 0; thisNote < 166; thisNote++)
  49.   {
  50. //用除法计算演奏时间,
  51. //用传奇录音校对节奏,采用3132毫秒,很接近
  52.     int noteDuration = 3132/noteDurations[thisNote]; //赋值
  53.     tone(14, melody[thisNote],noteDuration);//D14口-A0口,用压电陶瓷片,也可用8欧姆喇叭
  54.     int pauseBetweenNotes = noteDuration *1.2;//两个音符之间应该以最短的间隔分开,从经验中得知,延迟时间是音符的1.1~1.3倍左右
  55.     delay(pauseBetweenNotes);
  56.     noTone(14);//停止演奏
  57. //频率赋值给变量,控制相应的LED灯亮
  58.     int melodytN = melody[thisNote+1];
  59. //为了使灯与音乐保持同步,这里的melody[]必须+1
  60.     if (melodytN<ledbd1)
  61.     {                            //最低的频率区间
  62.        for (int i=2;i<13;i=i+2)
  63.        {
  64.           digitalWrite(i,LOW);    //其余灯熄灭
  65.        }
  66.       digitalWrite(2,HIGH);      //最左边的灯亮
  67.     }
  68.     if (melodytN>ledbd1&&melodytN<ledbd2)
  69.     {                            //第二个频率区间
  70.        for (int i=2;i<13;i=i+2)
  71.           digitalWrite(i,LOW);      //其余灯熄灭
  72.        digitalWrite(4,HIGH);     //从左往右第二个灯亮
  73.     }
  74.     if (melodytN>ledbd2&&melodytN<ledbd3)
  75.     {                            //第三个频率区间
  76.        for (int i=2;i<13;i=i+2)
  77.           digitalWrite(i,LOW);      //其余灯熄灭
  78.        digitalWrite(6,HIGH);     //从左往右第三个灯亮
  79.     }
  80.     if (melodytN>ledbd3&&melodytN<ledbd4)
  81.     {                             //第四个频率区间
  82.        for (int i=2;i<13;i=i+2)
  83.           digitalWrite(i,LOW);      //其余灯熄灭
  84.        digitalWrite(8,HIGH);      //从左往右第四个灯亮
  85.     }
  86.     if (melodytN>ledbd4&&melodytN<ledbd5)
  87.     {                            //第五个频率区间
  88.        for (int i=2;i<13;i=i+2)
  89.           digitalWrite(i,LOW);      //其余灯熄灭
  90.        digitalWrite(10,HIGH);    //从左往右第五个灯亮
  91.     }
  92.     if (melodytN>ledbd5)
  93.     {                             //最高的频率
  94.        for (int i=2;i<13;i=i+2)
  95.           digitalWrite(i,LOW);      //其余灯熄灭
  96.        digitalWrite(12,HIGH);    //最右边的灯亮
  97.     }
  98.   }
  99. }
复制代码
【效果】最终效果如下


hnyzcj  版主

发表于 2015-7-5 15:28:04

广告时间为啥是100秒?额
回复

使用道具 举报

hnyzcj  版主

发表于 2015-7-5 15:29:23

能收集齐如此之多的LED,楼主真是费了 不少功夫。
回复

使用道具 举报

丄帝De咗臂  高级技匠
 楼主|

发表于 2015-7-5 15:59:38

hnyzcj 发表于 2015-7-5 15:29
能收集齐如此之多的LED,楼主真是费了 不少功夫。

六个颜色还多
回复

使用道具 举报

hnyzcj  版主

发表于 2015-7-5 16:16:38


不多不多
回复

使用道具 举报

丄帝De咗臂  高级技匠
 楼主|

发表于 2015-7-5 19:03:45

回复

使用道具 举报

大连林海  初级技神

发表于 2015-7-5 21:55:56

做一个流水  哈哈或者连接cube呢
回复

使用道具 举报

丄帝De咗臂  高级技匠
 楼主|

发表于 2015-7-5 21:59:30

大连林海 发表于 2015-7-5 21:55
做一个流水  哈哈或者连接cube呢

我用的是6个LED,音符不是1-7吗,共形成6个区间,分别是1-2、2-3、3-4、4-5、5-6、6-7,给压电陶瓷片的不同频率时,相应区间的 LED就会被点亮,所以这其实是声光互动、视听盛宴,而非流水灯:victory:
回复

使用道具 举报

丄帝De咗臂  高级技匠
 楼主|

发表于 2015-7-5 22:02:18

大连林海 发表于 2015-7-5 21:55
做一个流水  哈哈或者连接cube呢

cube效果应该更好,不过手头木有
回复

使用道具 举报

20060606  高级技匠

发表于 2020-8-22 19:51:52

好创意赞一个
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail