arduino音乐播放器(蜂鸣器版)
蜂鳴器是我們常見的一個電子元器件,它可以發(fā)出類似蜂鳴的聲音,采用低電壓直流供電,廣泛運(yùn)用于計算機(jī)、打印機(jī)、報警器、電子玩具等眾多場合,一般作為提示、警報較多;
我們不以結(jié)構(gòu)論述,以工作原理可將其分為有源蜂鳴器和無源蜂鳴器;注意這里的源指的不是電源,而是振蕩源,即有源蜂鳴器內(nèi)部自帶振蕩源,通電就能發(fā)出聲音;而無源蜂鳴器不帶振蕩源,必須用2-5k的方波去驅(qū)動;
?
蜂鳴器的發(fā)聲裝置由震動裝置和諧振裝置組成;
無源蜂鳴器的工作原理:方波信號輸入諧振裝置,轉(zhuǎn)換為聲音信號輸出;
有源蜂鳴器的工作原理:直流電源輸入經(jīng)過振蕩系統(tǒng)的放大取樣電路,在諧振裝置的作用下產(chǎn)生聲音信號;
?
有源蜂鳴器和無源蜂鳴器的區(qū)別:
引腳朝上,可以看見綠色電路板的是無源蜂鳴器,用黑膠封起來的是有源蜂鳴器;
無源蜂鳴器的優(yōu)點(diǎn):
有源蜂鳴器的優(yōu)點(diǎn):程序控制簡單
?
好了,說了這么多,接下來我們就開始動手制作吧!
材料:arduino Nano*1、無源蜂鳴器、面板板*2、導(dǎo)線若干
硬件連線:
- 蜂鳴器正極(蜂鳴器上會標(biāo)注+)→Nano 數(shù)字端口3
- 蜂鳴器負(fù)極 → Nano GND
- 外接電源(6V)正極 → Vin
- 外接電源負(fù)極 → GND
實(shí)現(xiàn)原理:
在開始制作之前,我們先來看看音樂簡譜,看看在我們平常唱歌需要哪些信息:
這是一首我們最早接觸的童謠,他本身也非常簡單,我們就通過他來學(xué)習(xí)如何容蜂鳴器奏響這首音樂;我們通過上面的簡譜可以得到如下信息:
好了,到這里我們可以總結(jié)一下了,我們想要唱一首歌,我們需要知道每個字應(yīng)該用什么樣的音去唱,這就需要音調(diào)和音符的配合了,兩者結(jié)合就知道該用怎么樣的音;光有了調(diào)子可不行,我們還得知道每個音應(yīng)該發(fā)出多長時間,這就是節(jié)拍的作用;
我們一步一步來解決,第一個問題,蜂鳴器怎么知道每個音符應(yīng)該發(fā)出什么樣的聲音呢?這就需要我們得到每個音的對應(yīng)頻率,然后讓蜂鳴器按照頻率發(fā)聲就可以了;
對照音符和頻率表,我們就可以很輕松的知道每個音的頻率了(看音符是否帶點(diǎn),點(diǎn)在上還是在下到表中查找就可以了)
比如第一小節(jié)就是:262,262,393,393
頻率的問題解決了,接下來就是節(jié)拍的問題了;這首歌是4/4,意思就是以四分音符為一拍,每小節(jié)有四拍;我們把一拍看做是單位1,那么1/2就是0.5,1/4就是0.25,1/8就是0.125;所以我們的每個音符配合這樣的拍子演奏出來,就是我們想要的音樂啦;
程序?qū)崿F(xiàn):
這里可能會問了,為什么要建立兩個數(shù)組來處理頻率,不能直接轉(zhuǎn)換過來嘛?當(dāng)然可以,但是直接轉(zhuǎn)換的話會比較麻煩,現(xiàn)在的音符比較少,后面復(fù)雜的音樂轉(zhuǎn)換一下保準(zhǔn)你看的眼花繚亂,所以還是讓單片機(jī)幫我們轉(zhuǎn)換吧,我們只需要將音符告訴他就好啦;
那么yindiao數(shù)組的最后一個元素為什么是-1呢?這是空拍,我們用-1代替;
tone()函數(shù)可以產(chǎn)生固定頻率的PWM信號來驅(qū)動揚(yáng)聲器發(fā)聲,這也是為什么蜂鳴器需要連接在數(shù)字端口3的原因,或者連接在其他復(fù)用PWM功能的端口。 tone()函數(shù)有兩種用法:tone(端口, 頻率)? ? ? ? ? ? ? ? //沒有定義時間,我們就需要自己手動用noTone()停止發(fā)聲,不然他會一直發(fā)聲tone(3,262);delay(1000);noTone(3);tone(端口, 頻率, 時間)tone(3,262,200);delay(200);
Arduino一次只能發(fā)出聲音信號,當(dāng)一個引腳正在通過tone()函數(shù)產(chǎn)生發(fā)聲信號,那么第二個引腳想同時發(fā)聲是不可能的;
(注意:使用tone()函數(shù)時會影響引腳3和引腳11的PWM信號輸出)
這一部分就是通過簡譜,對照頻率表,轉(zhuǎn)換成每個音符的對應(yīng)頻率;先從music數(shù)組中將音符提取出來(1 do),然后對應(yīng)yindiao數(shù)組進(jìn)行轉(zhuǎn)換(yindiao[1-1]→262)
設(shè)置每個音的時間,這里的700指的是每個拍子的時間(毫秒)
這里為什么是1-48呢?因?yàn)檫@首小星星一共是48個音符,我們需要發(fā)出48個音,所以是1-48;
long yindiao[]={262,294,330,350,393,441,495,-1};float time[]={1,0.5,0.25,0.125};long music[]={1,1,5,5,6,6,5,8,4,4,3,3,2,2,1,8,5,5,4,4,3,3,2,8,5,5,4,4,3,3,2,8,1,1,5,5,6,6,5,8,4,4,3,3,2,2,1,8};void setup() {pinMode(3, OUTPUT);digitalWrite(3,LOW); }void loop(){for (int i = 1; i <= 48; i = i + (1)) {tone(3, yindiao[(int)(music[(int)(i - 1)] - 1)], time[(int)(0)] * 700);delay((time[(int)(0)] * 700));} }
?
總結(jié)
以上是生活随笔為你收集整理的arduino音乐播放器(蜂鸣器版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 清华操作系统实验课程实验一:系统软件启动
- 下一篇: 微信获得用户信息