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