Arduino入門筆記(4):用蜂鳴器演奏音樂並配有LED閃爍


轉載請注明:@小五義 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的方波去驅動它。從外觀上看,兩種蜂鳴器區別不大,但將兩種蜂鳴器的引腳都朝上放置時,可以看出有綠色電路板的一種是無源蜂鳴器,沒有電路板而用黑膠封閉的一種是有源蜂鳴器。如圖:

youwuyuan

3、LED:一個

4、杜邦線:若干

5、面包板:一個

二、無源蜂鳴器發聲實驗

    通過上網查詢參數,得到其工作電壓為5V,和arduino控制板數字端口輸出電壓一致,所以不需要接電阻,於是其與arduino的布線圖和原理圖如下:

    buxian       yuanli

 

把下面的代碼上傳到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……,所以我們可以為每個音符賦予這樣的拍子播放出來,音樂就成了。

這里我們具體以《歡樂頌》為例:

225316812

        從簡譜看,該音樂是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燈伴隨音樂進行閃爍。實驗布線圖和原理圖如下:

buxian2 yuanli2

 

實驗代碼為:

#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的分配,使其看上去更合拍。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM