Arduino是簡化和加速微控制器項(xiàng)目的絕佳方式,這要?dú)w功于其開發(fā)人員社區(qū),他們使幾乎所有內(nèi)容看起來都很簡單。這里有很多Arduino項(xiàng)目供您嘗試并享受樂趣。您的某些項(xiàng)目可能需要一些聲音操作來通知某些內(nèi)容或只是為了給觀眾留下深刻印象。如果我告訴你,幾乎所有可以在鋼琴上演奏的主題曲都可以在一個(gè)簡單的程序和便宜的壓電揚(yáng)聲器的幫助下在你的Arduino上模仿呢?
在本教程中,我們將學(xué)習(xí)使用 Arduino 音調(diào) () 功能在壓電蜂鳴器或揚(yáng)聲器上播放旋律是多么簡單易行.
所需硬件:
- Arduino(任何版本 – 此處使用 UNO)
- 壓電揚(yáng)聲器/蜂鳴器或任何其他 8 歐姆揚(yáng)聲器。
- 面包板
- 連接線
- 按鈕
- 1k 電阻器(可選)
了解 Arduino 的 Tone() 函數(shù):
在我們理解 音調(diào)() 的工作原理之前,我們應(yīng)該知道壓電蜂鳴器是如何工作的.我們可能在我們學(xué)校了解過壓電晶體, 它只不過是一種將機(jī)械振動(dòng)轉(zhuǎn)化為電能的晶體,反之亦然.在這里,我們應(yīng)用一個(gè)可變的電流(頻率),晶體振動(dòng)從而產(chǎn)生聲音。因此,為了使壓電蜂鳴器產(chǎn)生一些噪音,我們必須使壓電晶體振動(dòng),噪聲的音調(diào)和音調(diào)取決于晶體振動(dòng)的速度.因此,可以通過改變電流頻率來控制音調(diào)和音高。
好的,那么我們?nèi)绾螐腁rduino獲得可變頻率呢?這就是音調(diào)()函數(shù)的用武之地。音調(diào)()可以在特定引腳上生成特定頻率。如果需要,也可以提及持續(xù)時(shí)間。音調(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板中計(jì)時(shí)器的大小。對(duì)于UNO和大多數(shù)其他常見板,可以產(chǎn)生的最小頻率為31Hz,可以產(chǎn)生的最大頻率為65535Hz。然而,我們?nèi)祟愔荒苈牭?000Hz到5000Hz之間的頻率。
pitches.h 頭文件:
現(xiàn)在,我們知道如何使用arduino tone()函數(shù)產(chǎn)生一些噪音。但是,我們?nèi)绾沃烂總€(gè)頻率將產(chǎn)生什么樣的音調(diào)?
Arduino給了我們一個(gè)音符表,將每個(gè)頻率等同于特定的音符類型。這個(gè)筆記表最初是由Brett Hagman編寫的, tone() 命令是基于他的工作。我們將使用此便箋表來播放我們的主題。如果你是熟悉樂譜的人,你應(yīng)該能夠理解這個(gè)表,對(duì)于像我這樣的其他人來說,這些只是另一個(gè)代碼塊。
#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演奏像樣的旋律,我們應(yīng)該知道這些旋律的構(gòu)成。播放主題所需的三個(gè)主要因素是
- 注釋值
- 注釋持續(xù)時(shí)間
- 速度
我們有 pitches.h 頭文件來播放任何音符值,現(xiàn)在我們應(yīng)該找出它的具體音符持續(xù)時(shí)間來播放它。節(jié)奏只不過是旋律應(yīng)該演奏多快。一旦你知道音符值和音符持續(xù)時(shí)間,你可以將它們與 tone() 一起使用,比如
tone (pinName, Note Value, Note Duration);
對(duì)于本教程中播放的音調(diào),我在“themes.h”頭文件中為您提供了音符值和音符持續(xù)時(shí)間,您可以使用它們?cè)陧?xiàng)目中播放它們。但是,如果您的礦井中有任何特定的音調(diào),并且想在您的項(xiàng)目中播放它,請(qǐng)繼續(xù)閱讀......否則跳過這個(gè)話題,落到下一個(gè)話題。
要播放任何特定的音調(diào) ,您必須獲取該特定音樂的樂譜,并通過從中讀取音符值和音符持續(xù)時(shí)間將樂譜轉(zhuǎn)換為Arduino草圖。如果你是一個(gè)音樂專業(yè)的學(xué)生,這對(duì)你來說是小菜一碟,否則花一些時(shí)間像我一樣打破你的頭。但是在一天結(jié)束時(shí),當(dāng)您的音調(diào)在壓電蜂鳴器上播放時(shí),您會(huì)發(fā)現(xiàn)您的努力值得.
獲得音符值和音符持續(xù)時(shí)間后,將它們加載到“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ù)時(shí)間。您可以像這樣添加主題。
原理圖和硬件:
這個(gè)Arduino音調(diào)發(fā)生器項(xiàng)目的示意圖如下圖所示:
連接非常簡單,我們有一個(gè)壓電揚(yáng)聲器,它通過 8K 電阻連接到引腳 1 和 Arduino 的接地.該 1k 電阻器是一個(gè)限流電阻器,用于將電流保持在安全限值內(nèi)。我們還有四個(gè)開關(guān)來選擇所需的旋律。開關(guān)的一端接地,另一端分別連接到引腳 2、3、4 和 5。開關(guān)將使用該軟件在內(nèi)部啟用上拉電阻。由于電路非常簡單,因此可以使用面包板進(jìn)行連接,如下所示:
Arduino 程序說明:
一旦你理解了這個(gè)概念,Arduino程序就非常簡單了。完整的代碼在本教程結(jié)束時(shí)給出。如果您不熟悉添加頭文件,可以從此處將代碼下載為ZIP文件,然后直接將其上傳到Arduino。
以上兩個(gè)是必須添加的頭文件。 “Pitches.h ”用于將每個(gè)音符等同于特定頻率, “themes.h” 包含所有四個(gè)音調(diào)的音符值和音符持續(xù)時(shí)間。
#include "pitches.h"
#include "themes.h"
創(chuàng)建一個(gè)函數(shù)來在需要時(shí)播放每個(gè)音調(diào)。在這里,當(dāng)函數(shù) Play_Pirates() 被稱為“他是海盜”的音調(diào)將被播放。此功能由在引腳編號(hào) 8 處產(chǎn)生頻率的音調(diào)功能組成。noTone(8) 被調(diào)用以在音樂播放后停止音樂。如果要播放自己的音調(diào),請(qǐng)將Pirates_note和Pirates_duration更改為保存在 “themes.h” 值中的新音符和持續(xù)時(shí)間值
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)。默認(rèn)情況下,這些引腳使用內(nèi)部上拉電阻保持高電平,方法是使用上述代碼行。按下按鈕時(shí),將其拉到地面。
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
下面的代碼塊用于在按下按鈕時(shí)播放歌曲。它讀取每個(gè)按鈕的數(shù)字值,當(dāng)它變低(零)時(shí),它假設(shè)按鈕被按下并通過調(diào)用所需的函數(shù)播放相應(yīng)的音調(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(); }
這個(gè)旋律播放器Arduino電路的工作:
代碼和硬件準(zhǔn)備就緒后,只需將程序刻錄到 Arduino 中,您只需按下按鈕即可播放音調(diào)。如果您有任何問題,請(qǐng)查看串行監(jiān)視器進(jìn)行調(diào)試或使用評(píng)論部分報(bà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(); }
}
-
揚(yáng)聲器
+關(guān)注
關(guān)注
29文章
1287瀏覽量
62714 -
Arduino
+關(guān)注
關(guān)注
187文章
6457瀏覽量
186501 -
壓電蜂鳴器
+關(guān)注
關(guān)注
0文章
69瀏覽量
3048
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論