0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Arduino音調(diào)功能在壓電蜂鳴器或揚聲器上播放旋律

科技觀察員 ? 來源:circuitdigest ? 作者:阿斯文斯·拉吉 ? 2023-01-25 15:37 ? 次閱讀

Arduino是簡化和加速微控制器項目的絕佳方式,這要歸功于其開發(fā)人員社區(qū),他們使幾乎所有內(nèi)容看起來都很簡單。這里有很多Arduino項目供您嘗試并享受樂趣。您的某些項目可能需要一些聲音操作來通知某些內(nèi)容或只是為了給觀眾留下深刻印象。如果我告訴你,幾乎所有可以在鋼琴上演奏的主題曲都可以在一個簡單的程序和便宜的壓電揚聲器的幫助下在你的Arduino上模仿呢?

在本教程中,我們將學習使用 Arduino 音調(diào) () 功能在壓電蜂鳴器或揚聲器上播放旋律是多么簡單易行.

所需硬件

  1. Arduino(任何版本 – 此處使用 UNO)
  2. 壓電揚聲器/蜂鳴器或任何其他 8 歐姆揚聲器。
  3. 面包板
  4. 連接線
  5. 按鈕
  6. 1k 電阻器(可選)

了解 Arduino 的 Tone() 函數(shù):

在我們理解 音調(diào)()工作原理之前,我們應該知道壓電蜂鳴器是如何工作的.我們可能在我們學校了解過壓電晶體, 它只不過是一種將機械振動轉(zhuǎn)化為電能的晶體,反之亦然.在這里,我們應用一個可變的電流(頻率),晶體振動從而產(chǎn)生聲音。因此,為了使壓電蜂鳴器產(chǎn)生一些噪音,我們必須使壓電晶體振動,噪聲的音調(diào)和音調(diào)取決于晶體振動的速度.因此,可以通過改變電流頻率來控制音調(diào)和音高。

好的,那么我們?nèi)绾螐腁rduino獲得可變頻率呢?這就是音調(diào)()函數(shù)的用武之地。音調(diào)()可以在特定引腳上生成特定頻率。如果需要,也可以提及持續(xù)時間。音調(diào) () 的語法是

Syntax

tone(pin, frequency) 
tone(pin, frequency, duration)

Parameters

pin: the pin on which to generate the tone
frequency: the frequency of the tone in hertz - unsigned int
duration: the duration of the tone in milliseconds (optional) - unsigned long

引腳的值可以是您的任何數(shù)字引腳。我在這里使用了引腳 8??梢陨傻念l率取決于Arduino板中計時器的大小。對于UNO和大多數(shù)其他常見板,可以產(chǎn)生的最小頻率為31Hz,可以產(chǎn)生的最大頻率為65535Hz。然而,我們?nèi)祟愔荒苈牭?000Hz到5000Hz之間的頻率。

pitches.h 頭文件:

現(xiàn)在,我們知道如何使用arduino tone()函數(shù)產(chǎn)生一些噪音。但是,我們?nèi)绾沃烂總€頻率將產(chǎn)生什么樣的音調(diào)?

Arduino給了我們一個音符表,將每個頻率等同于特定的音符類型。這個筆記表最初是由Brett Hagman編寫的, tone() 命令是基于他的工作。我們將使用此便箋表來播放我們的主題。如果你是熟悉樂譜的人,你應該能夠理解這個表,對于像我這樣的其他人來說,這些只是另一個代碼塊。

#define NOTE_B0  31
#define NOTE_C1  33
#define NOTE_CS1 35
#define NOTE_D1  37
#define NOTE_DS1 39
#define NOTE_E1  41
#define NOTE_F1  44
#define NOTE_FS1 46
#define NOTE_G1  49
#define NOTE_GS1 52
#define NOTE_A1  55
#define NOTE_AS1 58
#define NOTE_B1  62
#define NOTE_C2  65
#define NOTE_CS2 69
#define NOTE_D2  73
#define NOTE_DS2 78
#define NOTE_E2  82
#define NOTE_F2  87
#define NOTE_FS2 93
#define NOTE_G2  98
#define NOTE_GS2 104
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951
#define NOTE_C8  4186
#define NOTE_CS8 4435
#define NOTE_D8  4699
#define NOTE_DS8 4978

在Arduino上播放音符:

要使用Arduino演奏像樣的旋律,我們應該知道這些旋律的構成。播放主題所需的三個主要因素是

  1. 注釋值
  2. 注釋持續(xù)時間
  3. 速度

我們有 pitches.h 頭文件來播放任何音符值,現(xiàn)在我們應該找出它的具體音符持續(xù)時間來播放它。節(jié)奏只不過是旋律應該演奏多快。一旦你知道音符值和音符持續(xù)時間,你可以將它們與 tone() 一起使用,比如

tone (pinName, Note Value, Note Duration);

對于本教程中播放的音調(diào),我在“themes.h”頭文件中為您提供了音符值和音符持續(xù)時間,您可以使用它們在項目中播放它們。但是,如果您的礦井中有任何特定的音調(diào),并且想在您的項目中播放它,請繼續(xù)閱讀......否則跳過這個話題,落到下一個話題。

要播放任何特定的音調(diào) ,您必須獲取該特定音樂的樂譜,并通過從中讀取音符值和音符持續(xù)時間將樂譜轉(zhuǎn)換為Arduino草圖。如果你是一個音樂專業(yè)的學生,這對你來說是小菜一碟,否則花一些時間像我一樣打破你的頭。但是在一天結束時,當您的音調(diào)在壓電蜂鳴器上播放時,您會發(fā)現(xiàn)您的努力值得.

獲得音符值和音符持續(xù)時間后,將它們加載到“themes.h”頭文件中的程序中,如下所示

//##############**"HE IS A PIRATE" Theme song of Pirates of caribbean**##############//
int Pirates_note[] = {
NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4,
NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, 
NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_D4,  
NOTE_A3, NOTE_C4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_F4, 
NOTE_F4, NOTE_G4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_C4, NOTE_C4, NOTE_D4,
0, NOTE_A3, NOTE_C4, NOTE_B3, NOTE_D4, NOTE_B3, NOTE_E4, NOTE_F4,
NOTE_F4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4,
NOTE_D4, 0, 0, NOTE_A3, NOTE_C4, NOTE_D4, NOTE_D4, NOTE_D4, NOTE_F4,
NOTE_G4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_A4, NOTE_A4, NOTE_G4,
NOTE_A4, NOTE_D4, 0, NOTE_D4, NOTE_E3, NOTE_F4, NOTE_F4, NOTE_G4, NOTE_A4, 
NOTE_D4, 0, NOTE_D4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_F4, NOTE_D4
};
int Pirates_duration[] = {
4,8,4,8,4,8,8,8,8,4,8,4,8,4,8,8,8,8,4,8,4,8,
4,8,8,8,8,4,4,8,8,4,4,8,8,4,4,8,8,
8,4,8,8,8,4,4,8,8,4,4,8,8,4,4,8,4,
4,8,8,8,8,4,4,8,8,4,4,8,8,4,4,8,8,
8,4,8,8,8,4,4,4,8,4,8,8,8,4,4,8,8
};
//###########End of He is a Pirate song#############//

上面的代碼塊顯示了電影《加勒比海盜》中“他是海盜”主題的音符值和音符持續(xù)時間。您可以像這樣添加主題。

原理圖和硬件:

這個Arduino音調(diào)發(fā)生器項目的示意圖如下圖所示:

使用 Arduino 音調(diào)功能電路在蜂鳴器上播放旋律

連接非常簡單,我們有一個壓電揚聲器,它通過 8K 電阻連接到引腳 1 和 Arduino 的接地.該 1k 電阻器是一個限流電阻器,用于將電流保持在安全限值內(nèi)。我們還有四個開關來選擇所需的旋律。開關的一端接地,另一端分別連接到引腳 2、3、4 和 5。開關將使用該軟件在內(nèi)部啟用上拉電阻。由于電路非常簡單,因此可以使用面包板進行連接,如下所示:

使用 Arduino 音調(diào)功能試驗板電路播放音調(diào)

Arduino 程序說明:

一旦你理解了這個概念,Arduino程序就非常簡單了。完整的代碼在本教程結束時給出。如果您不熟悉添加頭文件,可以從此處將代碼下載為ZIP文件,然后直接將其上傳到Arduino。

以上兩個是必須添加的頭文件。 “Pitches.h ”用于將每個音符等同于特定頻率, “themes.h” 包含所有四個音調(diào)的音符值和音符持續(xù)時間。

#include "pitches.h"
#include "themes.h"

創(chuàng)建一個函數(shù)來在需要時播放每個音調(diào)。在這里,當函數(shù) Play_Pirates() 被稱為“他是海盜”的音調(diào)將被播放。此功能由在引腳編號 8 處產(chǎn)生頻率的音調(diào)功能組成。noTone(8) 被調(diào)用以在音樂播放后停止音樂。如果要播放自己的音調(diào),請將Pirates_note和Pirates_duration更改為保存在 “themes.h” 值中的新音符和持續(xù)時間值

void Play_Pirates()
{
  for (int thisNote = 0; thisNote < (sizeof(Pirates_note)/sizeof(int)); thisNote++) {
    int noteDuration = 1000 / Pirates_duration[thisNote];//convert duration to time delay
    tone(8, Pirates_note[thisNote], noteDuration);
    int pauseBetweenNotes = noteDuration * 1.05; //Here 1.05 is tempo, increase to play it slower
    delay(pauseBetweenNotes);
    noTone(8);
    }
}

引腳 2、3、4 和 5 用于選擇要播放的特定音調(diào)。默認情況下,這些引腳使用內(nèi)部上拉電阻保持高電平,方法是使用上述代碼行。按下按鈕時,將其拉到地面。

pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);

下面的代碼塊用于在按下按鈕時播放歌曲。它讀取每個按鈕的數(shù)字值,當它變低(零)時,它假設按鈕被按下并通過調(diào)用所需的函數(shù)播放相應的音調(diào)。

if (digitalRead(2)==0)
{ Serial.println("Selected -> 'He is a Pirate' ");  Play_Pirates();  }
if (digitalRead(3)==0)
{ Serial.println("Selected -> 'Crazy Frog' ");  Play_CrazyFrog();  }
if (digitalRead(4)==0)
{ Serial.println("Selected -> 'Mario UnderWorld' ");  Play_MarioUW();  }
if (digitalRead(5)==0)
{ Serial.println("Selected -> 'He is a Pirate' ");  Play_Pirates();  }

這個旋律播放器Arduino電路的工作:

代碼和硬件準備就緒后,只需將程序刻錄到 Arduino 中,您只需按下按鈕即可播放音調(diào)。如果您有任何問題,請查看串行監(jiān)視器進行調(diào)試或使用評論部分報告問題,我很樂意為您提供幫助。

在壓電蜂鳴器上使用Arduino音調(diào)功能播放旋律

#include "pitches.h" //add Equivalent frequency for musical note

#include "themes.h" //add Note vale and duration 



void Play_Pirates()

{ 

  for (int thisNote = 0; thisNote < (sizeof(Pirates_note)/sizeof(int)); thisNote++) {


    int noteDuration = 1000 / Pirates_duration[thisNote];//convert duration to time delay

    tone(8, Pirates_note[thisNote], noteDuration);


    int pauseBetweenNotes = noteDuration * 1.05; //Here 1.05 is tempo, increase to play it slower

    delay(pauseBetweenNotes);

    noTone(8); //stop music on pin 8 

    }

}


void Play_CrazyFrog()

{

  for (int thisNote = 0; thisNote < (sizeof(CrazyFrog_note)/sizeof(int)); thisNote++) {


    int noteDuration = 1000 / CrazyFrog_duration[thisNote]; //convert duration to time delay

    tone(8, CrazyFrog_note[thisNote], noteDuration);


    int pauseBetweenNotes = noteDuration * 1.30;//Here 1.30 is tempo, decrease to play it faster

    delay(pauseBetweenNotes);

    noTone(8); //stop music on pin 8 

    }

}


void Play_MarioUW()

{

    for (int thisNote = 0; thisNote < (sizeof(MarioUW_note)/sizeof(int)); thisNote++) {


    int noteDuration = 1000 / MarioUW_duration[thisNote];//convert duration to time delay

    tone(8, MarioUW_note[thisNote], noteDuration);


    int pauseBetweenNotes = noteDuration * 1.80;

    delay(pauseBetweenNotes);

    noTone(8); //stop music on pin 8 

    }

}


void Play_Titanic()

{

    for (int thisNote = 0; thisNote < (sizeof(Titanic_note)/sizeof(int)); thisNote++) {


    int noteDuration = 1000 / Titanic_duration[thisNote];//convert duration to time delay

    tone(8, Titanic_note[thisNote], noteDuration);


    int pauseBetweenNotes = noteDuration * 2.70;

    delay(pauseBetweenNotes);

    noTone(8); //stop music on pin 8 

    }

}


void setup() {

pinMode(2, INPUT_PULLUP); //Button 1 with internal pull up

pinMode(3, INPUT_PULLUP); //Button 2 with internal pull up

pinMode(4, INPUT_PULLUP); //Button 3 with internal pull up

pinMode(5, INPUT_PULLUP); //Button 4 with internal pull up

Serial.begin(9600);

}


void loop() {

    if (digitalRead(2)==0)

      { Serial.println("Selected -> 'He is a Pirate' ");  Play_Pirates();  }

    if (digitalRead(3)==0)

      { Serial.println("Selected -> 'Crazy Frog' ");  Play_CrazyFrog();  }

    if (digitalRead(4)==0)

      { Serial.println("Selected -> 'Mario UnderWorld' ");  Play_MarioUW();  }

    if (digitalRead(5)==0)

      { Serial.println("Selected -> 'Titanic' ");  Play_Titanic();  }

}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 揚聲器
    +關注

    關注

    29

    文章

    1285

    瀏覽量

    62482
  • Arduino
    +關注

    關注

    187

    文章

    6455

    瀏覽量

    186366
  • 壓電蜂鳴器
    +關注

    關注

    0

    文章

    69

    瀏覽量

    3044
收藏 人收藏

    評論

    相關推薦

    arduino學習筆記22 - 揚聲器實驗

    一個5K的。注意:因為揚聲器驅(qū)動電壓要求比較小,遠遠小于5V,所以需要在揚聲器串聯(lián)一個大于10uf的電解電容,電解電容負極連接喇叭的正極,電容正極連接另外一端。不接電容長時間使用,會燒毀揚聲
    發(fā)表于 10-24 10:19

    請教multisim中揚聲器要怎么才能發(fā)聲?

    本帖最后由 abeyond 于 2015-7-6 14:23 編輯 大家好,我是剛開始學習使用multisim,畫了一個“雙音調(diào)電子門鈴”的仿真圖,揚聲器只有一個引腳,接上以后始終都沒有反應,用蜂鳴器可以響,但是卻沒有雙
    發(fā)表于 07-06 14:11

    FPGA擴展揚聲器問題,求大神賜教+_+??!

    新手初用FPGA,用的開發(fā)板沒有蜂鳴器揚聲器;現(xiàn)在已經(jīng)能有音頻脈沖產(chǎn)生,急需外加蜂鳴器或者揚聲器等一切能發(fā)出聲音的東東。。。板子上有GPI
    發(fā)表于 01-08 20:43

    【項目分享】教你用Arduino、Micro SD制作一個簡單的音樂播放器

    電路圖。注意該電路圖只展示了Arduino Uno與SD卡模塊間的連線,并加入了與Arduino相連的3個按鈕,這幾個按鈕來控制其播放功能,比如播放
    發(fā)表于 09-27 17:20

    請問如何實現(xiàn)新型壓電陶瓷揚聲器的設計?

    如何實現(xiàn)新型壓電陶瓷揚聲器的設計?壓電陶瓷揚聲器的工作原理是什么?動圈揚聲器的工作原理是什么?采用陶瓷
    發(fā)表于 04-14 06:43

    什么是壓電MEMS揚聲器?壓電MEMS揚聲器UT-P 2016的應用有哪些?

    什么是壓電MEMS揚聲器?壓電MEMS揚聲器UT-P 2016的指標規(guī)格有哪些?壓電MEMS揚聲器
    發(fā)表于 06-16 08:50

    制作便攜式揚聲器的方法,DIY制作便攜式揚聲器的教程

      你們都見過便攜式揚聲器現(xiàn)在變得流行,但其中大多數(shù)都非常昂貴,所以我將向您展示如何用最少的零件制作自己的便攜式揚聲器。制作和測試只需要 1小時,并且可以在任何常用的 USB 充電器運行。所以
    發(fā)表于 07-31 16:18

    MP4播放器揚聲器

    MP4播放器揚聲器              揚聲器分為內(nèi)
    發(fā)表于 12-21 16:24 ?1183次閱讀

    同軸揚聲器,同軸揚聲器是什么意思

    同軸揚聲器,同軸揚聲器是什么意思 什么是“同軸揚聲器(同軸音箱)”?與傳統(tǒng)的揚聲器有何區(qū)別,什么是“共點同軸揚聲器”?
    發(fā)表于 03-31 10:40 ?4920次閱讀

    新型陶瓷壓電揚聲器驅(qū)動的設計

    本文對比傳統(tǒng)動圈型揚聲器,分析了新型陶瓷壓電揚聲器的特點及對所需音頻功率放大器的要求,得出使用Boost升壓結構,配合D類音頻功率放大器驅(qū)動新型陶瓷壓電
    發(fā)表于 12-19 10:17 ?1.7w次閱讀
    新型陶瓷<b class='flag-5'>壓電</b><b class='flag-5'>揚聲器</b>驅(qū)動的設計

    蜂鳴器揚聲器的區(qū)別是什么

    蜂鳴器揚聲器最大的區(qū)別是喇叭的頻率響應要比蜂鳴器好得多,蜂鳴器只在一個很窄的頻率范圍內(nèi)電聲功率轉(zhuǎn)換比較高。
    發(fā)表于 03-31 09:54 ?2.2w次閱讀

    如何使用arduino壓電蜂鳴器制作簡單的驅(qū)蚊

    在本教程中,我們將學習如何使用arduino壓電蜂鳴器制作簡單的驅(qū)蚊。 硬件組件: Arduino UNO1個
    的頭像 發(fā)表于 12-07 13:52 ?2907次閱讀

    使用揚聲器模塊/Arduino UNO板/香蕉來播放音調(diào)

    電子發(fā)燒友網(wǎng)站提供《使用揚聲器模塊/Arduino UNO板/香蕉來播放音調(diào).zip》資料免費下載
    發(fā)表于 10-19 14:18 ?0次下載
    使用<b class='flag-5'>揚聲器</b>模塊/<b class='flag-5'>Arduino</b> UNO板/香蕉來<b class='flag-5'>播放音調(diào)</b>

    如何連接壓電蜂鳴器/揚聲器以便在按下按鈕時播放鈴鐺

    電子發(fā)燒友網(wǎng)站提供《如何連接壓電蜂鳴器/揚聲器以便在按下按鈕時播放鈴鐺.zip》資料免費下載
    發(fā)表于 11-01 10:03 ?0次下載
    如何連接<b class='flag-5'>壓電</b><b class='flag-5'>蜂鳴器</b>/<b class='flag-5'>揚聲器</b>以便在按下按鈕時<b class='flag-5'>播放</b>鈴鐺

    使用Arduino播放不同頻率的音調(diào)

    電子發(fā)燒友網(wǎng)站提供《使用Arduino播放不同頻率的音調(diào).zip》資料免費下載
    發(fā)表于 06-27 09:46 ?0次下載
    使用<b class='flag-5'>Arduino</b><b class='flag-5'>播放</b>不同頻率的<b class='flag-5'>音調(diào)</b>