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