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