找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4944|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

Arduino教程-動人的歌喉

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:99556 發(fā)表于 2015-12-22 18:01 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
Hi,大家好!經(jīng)過之前的幾次學(xué)習(xí),Arduino一直保持沉默,任意聽從我們的擺布。從今天開始,我們將來點兒不一樣的!這一次,讓我們聽一聽Arduino那動人的歌喉!好!直奔主題,還是先看一看我們需要做一些什么樣的準(zhǔn)備吧!
硬件方面
圖片來源: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電路連接
這里我們要簡單的提醒一下,與揚聲器進行串聯(lián)的電阻使用的是數(shù)值為100Ω的那個,另一個10kΩ的電阻是與壓力傳感器進行串聯(lián)的。另外,注意在連接時,壓力傳感器的負(fù)級與連接到Arduino上的信號線是分開的兩根線,而且信號線是連接在壓力傳感器的負(fù)極上,也就是說呢,連接壓力傳感器一共需要四根面包線,嗯!揚聲器的連接就比較簡單了,只是期間串聯(lián)了一個100Ω的電阻。
好!最后一步!
添加幾行代碼首先,還是新建一個項目窗口。

圖片來源:Arduino官方IDE
接下來我們向其中添加如下代碼:



  1. // 為了在程序中方便對音調(diào)進行變更,
  2. // 我們提前在程序的最頂部預(yù)定義了
  3. // 四個宏變量,每個宏變量代表一個
  4. // 音調(diào),可以讓揚聲器發(fā)出不同的聲音。
  5. // 宏變量在程序運行中不得更改,
  6. // 其使用方式可以簡單理解成常量。
  7. #define NOTE_B0  31
  8. #define NOTE_AS2 117
  9. #define NOTE_AS3 233
  10. #define NOTE_D6  1175
  11. // 定義壓力傳感器的輸入針腳號為0
  12. int forceSensorPin = 0;
  13. // 對Arduino電路板或相關(guān)狀態(tài)進行初始化方法
  14. void setup(void) {
  15.   // 開啟串行通信,并設(shè)置其頻率為9600。
  16.   // 如果沒有特別要求,此數(shù)值一般都為9600。
  17.   Serial.begin(9600);
  18. }
  19. // 系統(tǒng)調(diào)用,無限循環(huán)方法
  20. void loop(void) {
  21.   // 從模擬引腳號為0的接口,讀取壓力傳感器的數(shù)值。
  22.   int forceSensorState =analogRead(forceSensorPin);
  23.   // 向調(diào)試窗口打印字符串"Analog reading = "
  24.   Serial.print("Analog reading = ");
  25.   // 緊接著上一行字符串的后面,
  26.   // 輸出當(dāng)前讀取到的壓力傳感器的數(shù)值狀態(tài)。
  27.   Serial.print(forceSensorState);
  28.   // 簡單根據(jù)壓力傳感器所受力的大小,
  29.   // 劃分了五個不同的等級。
  30.   if(forceSensorState < 10) {
  31.     // 當(dāng)壓力數(shù)值小于10時,不發(fā)出聲音,
  32.     // 并向調(diào)試窗口打印" - No pressure"字符串。
  33.     Serial.println(" - No pressure");
  34.   }else if(forceSensorState < 200) {
  35.     // 當(dāng)壓力大于10小于200時,發(fā)出聲音,
  36.     // 同時向調(diào)試窗口打印" - Light touch"字符串。
  37.     Serial.println(" - Light touch");
  38.     // tone()方法是讓歌喉發(fā)出動人聲音的方法。
  39.     // 此方法共有三個參數(shù),
  40.     // 從左邊算起,第一個參數(shù)為針腳號,此處為8,
  41.     // 也即數(shù)字信號引腳的8號引腳。
  42.     // 第二個參數(shù)為音調(diào)數(shù)值,此處為程序頂部預(yù)定義的
  43.     // 宏變量之一,例如此處為NOTE_B0。
  44.     // 第三個參數(shù)為音調(diào)的發(fā)聲時間長度,單位為毫秒,
  45.     // 此處為100毫秒。
  46.     tone(8, NOTE_B0, 100);
  47.   }else if(forceSensorState < 500) {
  48.     // 當(dāng)壓力大于200小于500時,發(fā)出聲音,
  49.     // 同時向調(diào)試窗口打印" - Light squeeze"字符串。
  50.     Serial.println(" - Light squeeze");
  51.     // tone()方法向揚聲器發(fā)送信號,讓其發(fā)出動人的聲音。
  52.     // tone()方法詳細(xì)解釋同上。
  53.     tone(8, NOTE_AS2, 100);
  54.   }else if(forceSensorState < 800) {
  55.     // 當(dāng)壓力大于500小于800時,發(fā)出聲音,
  56.     // 同時向調(diào)試窗口打印" - Medium squeeze"字符串。
  57.     // tone()方法向揚聲器發(fā)送信號,讓其發(fā)出動人的聲音。
  58.     // tone()方法詳細(xì)解釋同上。
  59.     Serial.println(" - Medium squeeze");
  60.     tone(8, NOTE_AS3, 100);
  61.   }else{
  62.     // 當(dāng)壓力大于800時,發(fā)出聲音,
  63.     // 同時向調(diào)試窗口打印" - Big squeeze"字符串。
  64.     // tone()方法向揚聲器發(fā)送信號,讓其發(fā)出動人的聲音。
  65.     // tone()方法詳細(xì)解釋同上。
  66.     Serial.println(" - Big squeeze");
  67.     tone(8, NOTE_D6, 100);
  68.   }
  69.   // 延遲1000毫秒(也即1秒鐘)進入下一次程序循環(huán)。
  70.   // 實際效果就是,每兩次發(fā)聲之間有1秒鐘的時間間隔。
  71.   delay(1000);
  72. }
復(fù)制代碼

完工!作為學(xué)習(xí)的實例,猛然看起來好像很麻煩,其實刪除中間的文字注釋,一共也不到三十行的代碼!而其中真正的新面孔說實話也就一個tone()方法而已,此方法中三個參數(shù)的解釋已經(jīng)在代碼的注釋中說過,這里就不重復(fù)解釋了。

圖片來源: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的動人歌喉變成跨時代的留聲機!


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表