轉載請注明:@小五義 http://www.cnblogs.com/xiaowuyi
歡迎加入討論群 64770604
一、本次實驗所需器材
1、Arduino板 https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-15820725129.16.AtgoEm&id=545093340395
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的分配,使其看上去更合拍。






