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