|
Hi,大家好!上一次,我們享受到了Arduino那動(dòng)人的歌喉,可惜的是,她唱出來(lái)的音律是一個(gè)一個(gè)的,能不能將這些單個(gè)的音律連起來(lái)形成一首優(yōu)美的歌曲呢?當(dāng)然是可以的啦!好,那既然是可以的,我們這次一起學(xué)習(xí)一下,如何做一款跨時(shí)代的留聲機(jī)!
閑話(huà)不多說(shuō),先讓我們看一下,完成這樣一款留聲機(jī),我們需要做哪些準(zhǔn)備吧!
硬件方面
arduino-phonograph-parts.jpg (139.23 KB, 下載次數(shù): 133)
下載附件
2015-12-22 18:03 上傳
圖片來(lái)源:Arduino電路配件
具體包括如下:
- Arduino UNO電路板(1塊)
- 面包板(1塊)
- 100Ω電阻(1個(gè))
- 8Ω揚(yáng)聲器(1個(gè))
- 面包線(若干)
配件看起來(lái)是不是很眼熟?而且還少了幾個(gè),比之前還簡(jiǎn)單了呢!好的,硬件就這些。之前都見(jiàn)過(guò),就不多說(shuō)了。
軟件方面Arduino官方提供的IDE。
連接電路
arduino-phonograph.jpg (115.36 KB, 下載次數(shù): 160)
下載附件
2015-12-22 18:03 上傳
圖片來(lái)源:Arduino電路連接
嗯,連接電路看起來(lái)是不是也很眼熟?其實(shí)就是在上一次學(xué)習(xí)的基礎(chǔ)上,把壓力傳感器去掉了而已!就這么簡(jiǎn)單!嗯!
順利抵達(dá)最后一步!
添加幾行代碼首先,新建一個(gè)項(xiàng)目窗口。
arduino-ide-new.jpg (70.98 KB, 下載次數(shù): 120)
下載附件
2015-12-22 18:03 上傳
圖片來(lái)源:Arduino官方IDE
接下來(lái)我們向其中添加如下代碼:
- // 為了在程序中方便對(duì)音調(diào)進(jìn)行變更,
- // 我們提前在程序的最頂部預(yù)定義了
- // 四個(gè)宏變量,每個(gè)宏變量代表一個(gè)
- // 音調(diào),可以讓揚(yáng)聲器發(fā)出不同的聲音。
- // 宏變量在程序運(yùn)行中不得更改,
- // 其使用方式可以簡(jiǎn)單理解成常量。
- #define NOTE_C4 262
- #define NOTE_G3 196
- #define NOTE_A3 220
- #define NOTE_B3 247
- // 定義音樂(lè)所包含的發(fā)音
- int melody[] = {
- NOTE_C4, NOTE_G3,
- NOTE_G3, NOTE_A3,
- NOTE_G3, 0,
- NOTE_B3, NOTE_C4
- };
- // 定義音樂(lè)的節(jié)拍
- int noteDurations[] = {
- 4, 8, 8, 4, 4, 4, 4, 4
- };
- // 對(duì)Arduino電路板或相關(guān)狀態(tài)進(jìn)行初始化方法
- void setup() {
- // 遍歷整首音樂(lè)的樂(lè)譜
- for (int thisNote = 0; thisNote < 8; thisNote++) {
- // 計(jì)算每個(gè)發(fā)音的節(jié)拍,也就是每個(gè)發(fā)音的長(zhǎng)短。
- // 例如,四分之一拍 = 1000 / 4,八分之一拍 = 1000/8
- // 注意:此處的1000指的是1000毫秒,也就是1秒的時(shí)間。
- int noteDuration = 1000 / noteDurations[thisNote];
- // 向8號(hào)數(shù)字引腳發(fā)送信號(hào),
- // 發(fā)音為 melody[thisNote],
- // 每個(gè)發(fā)音的時(shí)間長(zhǎng)度為 noteDuration。
- tone(8, melody[thisNote], noteDuration);
- // 為了能夠清晰的區(qū)分兩個(gè)臨近的發(fā)音,
- // 需要設(shè)置一個(gè)合理的時(shí)間間隔,
- // 此處我們將每個(gè)發(fā)音節(jié)拍的時(shí)間延長(zhǎng)30%,
- // 以此作為兩個(gè)發(fā)音的間隔時(shí)間,聽(tīng)起來(lái)效果還不錯(cuò)。
- int pauseBetweenNotes = noteDuration * 1.30;
- // 每個(gè)發(fā)音之間延遲 pauseBetweenNotes 時(shí)長(zhǎng)。
- delay(pauseBetweenNotes);
- // 延遲時(shí)間到了之后,
- // 向8號(hào)數(shù)字引腳發(fā)送信號(hào),
- // 終止此引腳上的揚(yáng)聲器繼續(xù)發(fā)音。
- noTone(8);
- }
- }
- // 系統(tǒng)調(diào)用,無(wú)限循環(huán)方法
- void loop() {
- // 此處木有代碼,開(kāi)心嗎?
- }
復(fù)制代碼
大功告成!這次的代碼要比上一次少的多的多,而且在系統(tǒng)調(diào)用的loop()方法里一行代碼也木有哦!是不是很開(kāi)心?這里只出現(xiàn)了一個(gè)新面孔,那就是noTone()方法,這個(gè)方法的作用,就是讓特定數(shù)字引腳上的揚(yáng)聲器繼續(xù)發(fā)聲。它與tone()是雙胞胎,要配合使用。
arduino-menu.jpg (9.87 KB, 下載次數(shù): 141)
下載附件
2015-12-22 18:03 上傳
圖片來(lái)源:Arduino官方IDE的文件編輯菜單選項(xiàng)
點(diǎn)擊上圖中標(biāo)有向右指向的箭頭圖標(biāo),將編寫(xiě)完成的代碼燒入Arduino電路板。一旦燒入完成,Arduino瞬間即可變成一個(gè)跨時(shí)代的留聲機(jī),將會(huì)播放一首蘇格蘭風(fēng)情的調(diào)調(diào)。嗯,盡情享受吧~
總結(jié)這次,我們完成了一個(gè)跨時(shí)代的留聲機(jī),碰到了tone()方法的親兄弟,noTone方法。前一個(gè)是播放音樂(lè),后一個(gè)是停止播放音樂(lè)。
下期預(yù)告我們已經(jīng)做出了跨時(shí)代的留聲機(jī),但這個(gè)留聲機(jī)只有一個(gè)揚(yáng)聲器。現(xiàn)在問(wèn)題來(lái)了,如果我想要多個(gè)揚(yáng)聲器一起播放聲音,那么應(yīng)該如何才能做到讓它們之間彼此有序的進(jìn)行配合呢?好!下一次看看如何解決這個(gè)問(wèn)題!
|
|