|
Hi,大家好!經(jīng)過之前的幾次學(xué)習(xí),Arduino一直保持沉默,任意聽從我們的擺布。從今天開始,我們將來點(diǎn)兒不一樣的!這一次,讓我們聽一聽Arduino那動(dòng)人的歌喉!好!直奔主題,還是先看一看我們需要做一些什么樣的準(zhǔn)備吧!
硬件方面
arduino-beautiful-voice-parts.jpg (136.79 KB, 下載次數(shù): 138)
下載附件
2015-12-22 18:03 上傳
圖片來源:Arduino電路配件
具體包括如下:
- Arduino UNO電路板(1塊)
- 面包板(1塊)
- 10kΩ電阻(1個(gè))
- 100Ω電阻(1個(gè))
- 8Ω揚(yáng)聲器(1個(gè))
- 壓力傳感器(1個(gè))
- 面包線(若干)
這一次出現(xiàn)了兩個(gè)新面孔,一個(gè)是壓力傳感器,另一個(gè)是8Ω的揚(yáng)聲器。別擔(dān)心,雖然都是新面孔,上手還是超級(jí)簡(jiǎn)單的。一般來說,壓力傳感器輸出的信號(hào)為連續(xù)模擬信號(hào),所以要想接收壓力傳感器發(fā)出的信號(hào)變化,需要將其連接到模擬信號(hào)引腳上。壓力傳感器的數(shù)值變化范圍一般為0~1023之間。
普通的8Ω揚(yáng)聲器就是一個(gè)數(shù)字輸出設(shè)備,所以需要將其連接到數(shù)字信號(hào)引腳上。通過這個(gè)揚(yáng)聲器,馬上我們就將可以感受到Arduino那美麗而動(dòng)人的歌喉!
軟件方面Arduino官方提供的IDE。
好的!下面來連接電路。
連接電路
arduino-beautiful-voice.jpg (146.77 KB, 下載次數(shù): 141)
下載附件
2015-12-22 18:03 上傳
圖片來源:Arduino電路連接
這里我們要簡(jiǎn)單的提醒一下,與揚(yáng)聲器進(jìn)行串聯(lián)的電阻使用的是數(shù)值為100Ω的那個(gè),另一個(gè)10kΩ的電阻是與壓力傳感器進(jìn)行串聯(lián)的。另外,注意在連接時(shí),壓力傳感器的負(fù)級(jí)與連接到Arduino上的信號(hào)線是分開的兩根線,而且信號(hào)線是連接在壓力傳感器的負(fù)極上,也就是說呢,連接壓力傳感器一共需要四根面包線,嗯!揚(yáng)聲器的連接就比較簡(jiǎn)單了,只是期間串聯(lián)了一個(gè)100Ω的電阻。
好!最后一步!
添加幾行代碼首先,還是新建一個(gè)項(xiàng)目窗口。
arduino-menu.jpg (9.87 KB, 下載次數(shù): 137)
下載附件
2015-12-22 18:03 上傳
圖片來源:Arduino官方IDE
接下來我們向其中添加如下代碼:
- // 為了在程序中方便對(duì)音調(diào)進(jìn)行變更,
- // 我們提前在程序的最頂部預(yù)定義了
- // 四個(gè)宏變量,每個(gè)宏變量代表一個(gè)
- // 音調(diào),可以讓揚(yáng)聲器發(fā)出不同的聲音。
- // 宏變量在程序運(yùn)行中不得更改,
- // 其使用方式可以簡(jiǎn)單理解成常量。
- #define NOTE_B0 31
- #define NOTE_AS2 117
- #define NOTE_AS3 233
- #define NOTE_D6 1175
- // 定義壓力傳感器的輸入針腳號(hào)為0
- int forceSensorPin = 0;
- // 對(duì)Arduino電路板或相關(guān)狀態(tài)進(jìn)行初始化方法
- void setup(void) {
- // 開啟串行通信,并設(shè)置其頻率為9600。
- // 如果沒有特別要求,此數(shù)值一般都為9600。
- Serial.begin(9600);
- }
- // 系統(tǒng)調(diào)用,無限循環(huán)方法
- void loop(void) {
- // 從模擬引腳號(hào)為0的接口,讀取壓力傳感器的數(shù)值。
- int forceSensorState =analogRead(forceSensorPin);
- // 向調(diào)試窗口打印字符串"Analog reading = "
- Serial.print("Analog reading = ");
- // 緊接著上一行字符串的后面,
- // 輸出當(dāng)前讀取到的壓力傳感器的數(shù)值狀態(tài)。
- Serial.print(forceSensorState);
- // 簡(jiǎn)單根據(jù)壓力傳感器所受力的大小,
- // 劃分了五個(gè)不同的等級(jí)。
- if(forceSensorState < 10) {
- // 當(dāng)壓力數(shù)值小于10時(shí),不發(fā)出聲音,
- // 并向調(diào)試窗口打印" - No pressure"字符串。
- Serial.println(" - No pressure");
- }else if(forceSensorState < 200) {
- // 當(dāng)壓力大于10小于200時(shí),發(fā)出聲音,
- // 同時(shí)向調(diào)試窗口打印" - Light touch"字符串。
- Serial.println(" - Light touch");
- // tone()方法是讓歌喉發(fā)出動(dòng)人聲音的方法。
- // 此方法共有三個(gè)參數(shù),
- // 從左邊算起,第一個(gè)參數(shù)為針腳號(hào),此處為8,
- // 也即數(shù)字信號(hào)引腳的8號(hào)引腳。
- // 第二個(gè)參數(shù)為音調(diào)數(shù)值,此處為程序頂部預(yù)定義的
- // 宏變量之一,例如此處為NOTE_B0。
- // 第三個(gè)參數(shù)為音調(diào)的發(fā)聲時(shí)間長(zhǎng)度,單位為毫秒,
- // 此處為100毫秒。
- tone(8, NOTE_B0, 100);
- }else if(forceSensorState < 500) {
- // 當(dāng)壓力大于200小于500時(shí),發(fā)出聲音,
- // 同時(shí)向調(diào)試窗口打印" - Light squeeze"字符串。
- Serial.println(" - Light squeeze");
- // tone()方法向揚(yáng)聲器發(fā)送信號(hào),讓其發(fā)出動(dòng)人的聲音。
- // tone()方法詳細(xì)解釋同上。
- tone(8, NOTE_AS2, 100);
- }else if(forceSensorState < 800) {
- // 當(dāng)壓力大于500小于800時(shí),發(fā)出聲音,
- // 同時(shí)向調(diào)試窗口打印" - Medium squeeze"字符串。
- // tone()方法向揚(yáng)聲器發(fā)送信號(hào),讓其發(fā)出動(dòng)人的聲音。
- // tone()方法詳細(xì)解釋同上。
- Serial.println(" - Medium squeeze");
- tone(8, NOTE_AS3, 100);
- }else{
- // 當(dāng)壓力大于800時(shí),發(fā)出聲音,
- // 同時(shí)向調(diào)試窗口打印" - Big squeeze"字符串。
- // tone()方法向揚(yáng)聲器發(fā)送信號(hào),讓其發(fā)出動(dòng)人的聲音。
- // tone()方法詳細(xì)解釋同上。
- Serial.println(" - Big squeeze");
- tone(8, NOTE_D6, 100);
- }
- // 延遲1000毫秒(也即1秒鐘)進(jìn)入下一次程序循環(huán)。
- // 實(shí)際效果就是,每?jī)纱伟l(fā)聲之間有1秒鐘的時(shí)間間隔。
- delay(1000);
- }
復(fù)制代碼
完工!作為學(xué)習(xí)的實(shí)例,猛然看起來好像很麻煩,其實(shí)刪除中間的文字注釋,一共也不到三十行的代碼!而其中真正的新面孔說實(shí)話也就一個(gè)tone()方法而已,此方法中三個(gè)參數(shù)的解釋已經(jīng)在代碼的注釋中說過,這里就不重復(fù)解釋了。
arduino-serial-beautiful-voice.jpg (128.53 KB, 下載次數(shù): 159)
下載附件
2015-12-22 18:03 上傳
圖片來源:Arduino官方IDE的文件編輯菜單選項(xiàng)
好的!最后點(diǎn)擊上圖中標(biāo)有向右指向的箭頭圖標(biāo),將編寫好的代碼燒入Arduino UNO電路板。然后單擊上圖中最右側(cè)的放大鏡圖標(biāo),打開串口調(diào)試窗口,如下圖所示。
圖片來源:Arduino串口調(diào)試窗口
在上圖窗口中,你將會(huì)看到每隔1秒鐘打印一條描述信息。如果電路連接一切正常,此時(shí)用手去按壓連接好的壓力傳感器,立刻就會(huì)聽到Arduino那動(dòng)人的歌喉!壓力傳感器會(huì)根據(jù)按壓的力道,會(huì)從歌喉里傳出不同的美妙音律!
總結(jié)我們通過這次學(xué)習(xí),碰到了兩個(gè)新的硬件,一個(gè)是揚(yáng)聲器,另一個(gè)是壓力傳感器。壓力傳感器的電路連接,一開始可能看起來有些復(fù)雜,不過思路想清楚之后也還是比較簡(jiǎn)單的。揚(yáng)聲器的連接,期間串聯(lián)了一個(gè)電阻。軟件方面,為了讓揚(yáng)聲器發(fā)聲,程序中我們遇到了一個(gè)新面孔,那就是tone()方法。對(duì)于這個(gè)方法的使用,我們?cè)趯?shí)例代碼的注釋中也已經(jīng)詳細(xì)說明。嗯,差不多這次主要就是這些!
下期預(yù)告
既然我們可以借助壓力傳感器讓揚(yáng)聲器發(fā)出不同的聲音,那我們可不可以拋棄壓力傳感器,直接讓揚(yáng)聲器發(fā)出聲音呢?答案當(dāng)然是可以!好!下一次,就讓我們把Arduino的動(dòng)人歌喉變成跨時(shí)代的留聲機(jī)!
|
|