基于A(yíng)rduino的電子音樂(lè )發(fā)聲器設計
作者 趙云娥1 吳振強2 1.青海建筑職業(yè)技術(shù)學(xué)院(青海 西寧 810012) 2.陜西師范大學(xué)計算機科學(xué)學(xué)院(陜西 西安 710119)
本文引用地址:http://dyxdggzs.com/article/201702/344566.htm摘要:Arduino 是一塊基于開(kāi)放原始代碼的Simple I/O平臺,具有使用簡(jiǎn)單,功能多樣,價(jià)格低廉等優(yōu)點(diǎn),廣泛應用于電子系統設計和互動(dòng)產(chǎn)品開(kāi)發(fā)方面。系統以ArduinoUNO開(kāi)發(fā)平臺為控制核心,充分利用其內部Tone 庫,以數組形式組織樂(lè )曲的音高和節拍數據,通過(guò)串口和外圍無(wú)源蜂鳴器進(jìn)行通信,實(shí)現了電子音樂(lè )播放,隨音樂(lè )節拍亮滅的LED為設計添加了溫馨感。本系統成本低廉,可靠性高,可實(shí)現樂(lè )曲DIY,有良好的擴展性。
引言
Arduino 是一個(gè)基于開(kāi)放原始代碼的Simple I/O平臺,由硬件(MCU及外圍電路)和軟件(編程接口和語(yǔ)言)兩部分組成。它基于單片機系統開(kāi)發(fā),具有使用簡(jiǎn)單,功能多樣,價(jià)格低廉等優(yōu)點(diǎn),廣泛應用于電子系統設計和互動(dòng)產(chǎn)品開(kāi)發(fā)方面。目前市場(chǎng)所見(jiàn)電子音樂(lè )發(fā)聲器調節不便,價(jià)格較高,不能很好地實(shí)現和使用者的交互。本電子音樂(lè )發(fā)聲器的設計以ArduinoUNO板為控制核心,在相關(guān)樂(lè )理基礎知識上,充分利用Arduino編輯器自帶Tone擴展庫,以數組形式輸出各音符的指定頻率和節拍,送到無(wú)源蜂鳴器和彩色LED,實(shí)現了音樂(lè )播放和隨音樂(lè )節奏亮滅的LED效果。在操作方面,可以通過(guò)簡(jiǎn)單修改數組數據(音高和節拍)實(shí)現電子音樂(lè )的DIY,在欣賞美妙音樂(lè )的同時(shí),充分發(fā)揮使用者的創(chuàng )造性。
1 系統硬件設計
本發(fā)聲器以ArduinoUNO為控制核心,外部電路包括控制電路、蜂鳴器電路、LED顯示節奏電路,系統硬件電路圖如圖1所示。開(kāi)關(guān)S1對整個(gè)電路起控制作用,當檢測到開(kāi)關(guān)按下,即D3端口為高電平時(shí),電路開(kāi)始工作。預先組織好的音符數據(音高和節拍)通過(guò)數字端口D8發(fā)送到5V無(wú)源蜂鳴器J1,無(wú)源蜂鳴器接收到特定頻率的(即特定的音高)方波去驅動(dòng)它,可以發(fā)出“Do Re Mi Fa Sol La Si”的音樂(lè )效果。各數據加上延時(shí)(即節拍數據)即可實(shí)現樂(lè )曲的播放。無(wú)源蜂鳴器的優(yōu)點(diǎn)是聲音頻率可控,可以和LED復用一個(gè)控制口。所以,D8端口的數據同時(shí)加到LED1、LED2、LED3上時(shí),其節奏性的亮滅實(shí)現了節拍的顯示。
2 軟件設計
2.1 樂(lè )曲播放原理
2.1.1 單音符的演奏原理
一首樂(lè )曲由若干音符組成。從物理的角度來(lái)說(shuō),每一個(gè)音符唯一對應一個(gè)發(fā)聲頻率。Arduino只要把這個(gè)頻率數據發(fā)送給蜂鳴器或喇叭,就會(huì )發(fā)出對應的音符。Arduino IDE自帶的頭文件“pitches.h”中以宏定義的形式給出了各個(gè)音符和頻率的對應關(guān)系表。例如“#define NOTE_C4 262”語(yǔ)句給出了鋼琴標準鍵盤(pán)小字一組C4(唱名為Do)按鍵對應的頻率是262Hz。因此,只要能夠識別給定的樂(lè )譜,就能得到一組對應該樂(lè )曲的頻率數據,即制作出其數組形式的韻律函數。
2.1.2 節拍
除了音高,構成旋律的另一個(gè)重要因素是節拍,即音符演奏的持續時(shí)間。它決定了音樂(lè )進(jìn)行的快慢程度。本發(fā)聲器的設計中,通過(guò)讀取旋律的節拍速度,來(lái)確定基本的延時(shí)單位。如二分音符為一拍,每拍延時(shí)1/2秒,則四分音符延時(shí)1/4秒,八分音符延時(shí)為1/8秒,均為基本延時(shí)的偶數倍。最終,采用了noteDurations[thisNote]數組來(lái)存放每個(gè)音符的節拍數據。在應用過(guò)程中,我們也可以通過(guò)調節基本延時(shí)來(lái)調節樂(lè )曲速度。頻率數據按照節拍數據的延時(shí)來(lái)驅動(dòng)蜂鳴器,就實(shí)現了一首樂(lè )曲的播放。
2.2 樂(lè )曲播放的軟件實(shí)現
ArduinoIDE包含的Tone庫可以很方便地幫助用戶(hù)制作音樂(lè )。本設計主要采用了Tone(pin, frequency, duration)函數來(lái)產(chǎn)生電子音樂(lè )。此函數中,pin表示頻率數據的數字輸出接口,int型;frequency是音符頻率,int型;duration是節拍數據,單位是毫秒,unsigned long型。只要把上述頻率和節拍數據連續賦值給Tone函數,就可以實(shí)現樂(lè )曲的播放,系統軟件實(shí)現的程序流程圖見(jiàn)圖2。
Arduino語(yǔ)言是以setup( )開(kāi)頭,loop( )作為主體的一個(gè)程序構架。本發(fā)聲器的軟件實(shí)現過(guò)程中, loop( )函數內部包含了控制按鍵判斷函數,樂(lè )曲播放函數和延時(shí)函數。其中,樂(lè )曲播放函數play( )是發(fā)聲器軟件實(shí)現的核心語(yǔ)句,函數內所有語(yǔ)句周而復始地循環(huán)執行。下面以《生日快樂(lè )歌》(簡(jiǎn)譜見(jiàn)圖3)的第一小節為例,給出了play( )函數的實(shí)現過(guò)程。
int melody[] = {
NOTE_G4,//5
NOTE_G4,//5
NOTE_A4,//6
NOTE_G4,//5
NOTE_C5,//1.
NOTE_B4,//7
0,
……};
int noteDurations[] = {
8,8,4,4,4,4,
4,
……
};
void play()
{
for (int thisNote = 0; thisNote < 29; thisNote++)
{
int noteDuration = 1000/noteDurations[thisNote];
tone(8, melody[thisNote],noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(8);
}}
3 結論
本系統利用了目前較為流行的Arduino電子互動(dòng)平臺,通過(guò)對ARDUINO IDE平臺進(jìn)行軟件開(kāi)發(fā)來(lái)控制外圍部件,實(shí)現了電子音樂(lè )的播放和節奏的顯示。Arduino是基于源代碼的軟硬件平臺,具有價(jià)格便宜,互動(dòng)多樣,支持實(shí)時(shí)ISP在線(xiàn)燒錄等特點(diǎn)。因此,本發(fā)聲器價(jià)格低廉,操作簡(jiǎn)單,編輯方便,節拍速度可以調節,靈活性較高。該發(fā)聲器功能可以進(jìn)一步拓展,如果使用者具有一定的音樂(lè )素養,可以實(shí)現電子音樂(lè )DIY,為生活添加樂(lè )趣。
參考文獻:
[1]趙英杰.Arduino互動(dòng)設計入門(mén)[M].北京:科學(xué)出版社,2014.
[2]Michael McRoberts,Begin Arduino[M].楊繼志,郭敬譯.北京:電子工業(yè)出版社,2013.
[3]楊繼志,楊宇環(huán).基于A(yíng)rduino的網(wǎng)絡(luò )互動(dòng)產(chǎn)品創(chuàng )新設計[J].機電產(chǎn)品開(kāi)發(fā)與創(chuàng )新,2012,25(1):99-100.
[4]蔡睿妍.Arduino 的原理及應用[J].電子工程設計,2012,20(16):155-157.
[5]趙云娥,陳學(xué)煌.基于A(yíng)T89C51的電子節拍器設計[J].電子測量技術(shù),2008,31(3):176-179.
本文來(lái)源于《電子產(chǎn)品世界》2017年第2期第36頁(yè),歡迎您寫(xiě)論文時(shí)引用,并注明出處。
評論