本帖最后由 mybag1 于 2013-9-28 16:05 编辑
一、本次实验所需器材
1、Arduino板
2、无源蜂鸣器:一种一体化结构的电子讯响器,分为有源蜂鸣器与无源蜂鸣器。这里的“源”不是指电源,而是指震荡源,有源蜂鸣器内部带震荡源,所以只要一通电就会响,而无源内部不带震荡源,所以如果仅用直流信号无法令其鸣叫,必须用2K-5K的方波去驱动它。从外观上看,两种蜂鸣器区别不大,但将两种蜂鸣器的引脚都朝上放置时,可以看出有绿色电路板的一种是无源蜂鸣器,没有电路板而用黑胶封闭的一种是有源蜂鸣器。如图:
3、LED:一个
4、杜邦线:若干
5、面包板:一个
二、无源蜂鸣器发声实验
通过上网查询参数,得到其工作电压为5V,和arduino控制板数字端口输出电压一致,所以不需要接电阻,于是其与arduino的布线图和原理图如下:
把下面的代码上传到arduino控制板上: - int tonepin=6;//设置控制蜂鸣器的数字6脚
- void setup()
- {
- pinMode(tonepin,OUTPUT);//设置数字IO脚模式,OUTPUT为输出
- }
- void loop()
- {
- unsigned char i,j;
- while(1)
- {
- for(i=0;i<80;i++)//输出一个频率的声音
- {
- digitalWrite(tonepin,HIGH);//发声音
- delay(1);//延时1ms
- digitalWrite(tonepin,LOW);//不发声音
- delay(1);//延时ms
- }
- for(i=0;i<100;i++)//输出另一个频率的声音,这里的100与前面的80一样,用来控制频率,可以自己调节
- {
- digitalWrite(tonepin,HIGH);
- delay(2);
- digitalWrite(tonepin,LOW);
- delay(2);
- }
- }
- }
复制代码
从上面的代码可以看出,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[]= //根据简谱列出各节拍
- {
- 1,1,1,1,
- 1,1,1,1,
- 1,1,1,1,
- 1+0.5,0.5,1+1,
- 1,1,1,1,
- 1,1,1,1,
- 1,1,1,1,
- 1+0.5,0.5,1+1,
- 1,1,1,1,
- 1,0.5,0.5,1,1,
- 1,0.5,0.5,1,1,
- 1,1,1,1,
- 1,1,1,1,
- 1,1,1,0.5,0.5,
- 1,1,1,1,
- 1+0.5,0.5,1+1,
- };
- int length;
- int tonepin=6; //得用6号接口
- void setup()
- {
- pinMode(tonepin,OUTPUT);
- length=sizeof(tune)/sizeof(tune[0]); //计算长度
- }
- void loop()
- {
- for(int x=0;x<length;x++)
- {
- tone(tonepin,tune[x]);
- delay(500*durt[x]); //这里用来根据节拍调节延时,500这个指数可以自己调整,在该音乐中,我发现用500比较合适。
- noTone(tonepin);
- }
- delay(2000);
- }
复制代码
实验视频如下:
四、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[]=
- {
- 1,1,1,1,
- 1,1,1,1,
- 1,1,1,1,
- 1+0.5,0.5,1+1,
- 1,1,1,1,
- 1,1,1,1,
- 1,1,1,1,
- 1+0.5,0.5,1+1,
- 1,1,1,1,
- 1,0.5,0.5,1,1,
- 1,0.5,0.5,1,1,
- 1,1,1,1,
- 1,1,1,1,
- 1,1,1,0.5,0.5,
- 1,1,1,1,
- 1+0.5,0.5,1+1,
- };
- int length;
- int tonepin=6;
- int ledp=1;
- void setup()
- {
- pinMode(tonepin,OUTPUT);
- pinMode(ledp,OUTPUT);
- length=sizeof(tune)/sizeof(tune[0]);
- }
- void loop()
- {
- for(int x=0;x<length;x++)
- {
- tone(tonepin,tune[x]);
- digitalWrite(ledp, HIGH);
- delay(400*durt[x]);//与前一代码不同之处,这里将原来的500分为了400和100,分别控制led的开与关,对于蜂鸣器来说依然是500.
- digitalWrite(ledp, LOW);
- delay(100*durt[x]);
- noTone(tonepin);
-
- }
- delay(2000);
- }
复制代码
实验视频为:
从视频来看,LED的闪烁还有点不合节奏,可以调整下程序中400和100的分配,使其看上去更合拍。
|