2017年5月23日 星期二

模組介紹 : faya蜂鳴器模組


學習目標 : 認識faya蜂鳴器模組的功能及使用方式
學習時間 : 50min
示範模組 : (1) fayaduino UNO
                 (2) faya 電源底板
                 (3) faya蜂鳴器模組
工具 : (1) 樂高積木底板 (相容)


====================功能介紹====================
faya 蜂鳴器模組擁有1個數位輸入埠BZ,只要給他規律的頻率,就能輸出對應的音頻,規律的頻率可利用Arduino中的tone()函式達成

    • 當輸入nHz的頻率至BZ埠時,蜂鳴器產生nHz的音頻
    • tone(腳位, 頻率, 輸出時間-微秒)

      註1 : NC代表 No Connection,沒有作用
      註2 : 蜂鳴器廠商大多在表面貼一張貼紙,降低輸出音量,使用者可視情況撕下 

       

      下表為常見用的音頻頻率,Arduino將8個音階的頻率定義在pitches.h 檔裏,可參考範例程式



      ====================原理知識====================
      以下解釋提供給有需要知道背後原理的人:

      蜂鳴器種類有壓電式和電磁式兩種,依驅動方式有可分為自激和他激式,以下兩個連結有非常詳細的說明與比較:

      壓電式和電磁式蜂鳴器的比較
      自激與他激式蜂鳴器的差別

      faya蜂鳴器模組採用的蜂鳴器是他激-電磁式蜂鳴器,因此體積較小,但需要外部的方波訊號讓蜂鳴器產生音頻,這部分的工作就交給Arduino了,也是我們本文討論的重點。fayalab還有另一款[數位式蜂鳴器模組],採用的是自激-壓電式的蜂鳴器,大家可以參考連結文章。

      模組電路很單純,方波訊號由BZ埠輸入經放大後推動蜂鳴器,產生和方波同樣頻率的音頻


      由於蜂鳴器屬於電感式負載,電晶體經輸入方波切換時會因為楞次定律產生逆電壓,此時需要並聯一顆二極體 (fly black diode),消除逆電流,不然對電晶體會造成損害,解釋於下圖中:

      Qon : 輸入方波High周期,電晶體導通,電流方向往下流 ,負載上的電壓上正下負。(下圖左)
      Qff: 方波進入Low周期,電晶體截止瞬間,負載上的電壓因楞次效應變成上負下正,此時如果沒有對地迴路,正端的電壓會穿透半導體空乏區產生對地的電流,造成電晶體損壞,因此我們增加一個二極體讓電流往Vcc回流。(下圖中、右)


      ===================範例實作(1)===================
      了解模組功能(原理)後,我們用以下範例來展示模組的功能:

      目標:
      (1) 利用tone函示讓蜂鳴器產生3秒鐘的Do

      接線:
      (1) 電源線連接
           如下圖所示,連接的說明請看這篇文章 簡易版


      (2) 訊號線連接
            Arduino_8    ===>  蜂鳴器_BZ


      範例程式:
      // 2017/5/13
      // Faya-Nugget 範例程式 (EMBuzzer_1.ino)
      // 單元: 模組介紹-faya蜂鳴器模組
      // 網址: http://fayalab.blogspot.com/2017/05/faya_11.html
      // 目標 (1) 利用tone函示讓蜂鳴器產生3秒鐘的Do
      // 接線: Arduino ==> faya模組
      // 8 ==> BZ (蜂鳴器模組)
      // 蜂鳴器腳位設定
      int Buzzer_Pin_BZ = 8;
      void setup()
      {
      pinMode(Buzzer_Pin_BZ,OUTPUT);
      tone(Buzzer_Pin_BZ,523,3000);
      }
      void loop() {
      }
      view raw EMBuzzer_1.ino hosted with ❤ by GitHub

      備註:
      - 第一個範例很簡單,我們呼叫tone()函式,並填入腳位、頻率、時間。

      範例結果:
      成功上傳後蜂鳴器就會發出3秒鐘的第5階Do(C5)音,很直覺的結果,這邊就不提供錄影檔了!

       ===================範例實作(2)===================
      目標:
      (1) 建立一C5到C6的音階陣列
      (2) 利用tone函示重複撥每個音階,每個音長度0.5秒,間隔0.2秒

      接線:
      和上一範例相同,無須更改

      範例程式:
      // 2017/5/13
      // Faya-Nugget 範例程式 (EMBuzzer_2.ino)
      // 單元: 模組介紹-faya蜂鳴器模組
      // 網址: http://fayalab.blogspot.com/2017/05/faya_11.html
      // 目標 (1) 建立一C5到C6的音階陣列
      // (2) 利用tone函示重複撥放每個音階,每個音長度0.5秒,間隔0.2秒
      // 接線: Arduino ==> faya模組
      // 8 ==> BZ (蜂鳴器模組)
      // 蜂鳴器腳位設定
      int Buzzer_Pin_BZ = 8;
      int C5notes[8] = {523, 587, 659, 698, 784, 880, 988, 1047};
      void setup()
      {
      pinMode(Buzzer_Pin_BZ,OUTPUT);
      }
      void loop() {
      for(int i=0; i<=7; i++)
      {
      tone(Buzzer_Pin_BZ, C5notes[i], 500); // 播放C5,D5,E5,F5,G5,A5,B5,C6,各0.5秒
      delay(200); // 每個音間隔0.2秒
      }
      }
      view raw EMBuzzer_2.ino hosted with ❤ by GitHub

      備註:
      - 這個範例我們把tone()程式從setup{ }區塊裡挪到loop{ }區塊,這樣loop{ }區塊裡面的程式就會一直重複執行。
      - L21~L25利用for迴圈,輪流撥放C5notes[]陣列內的八個音階

      範例結果:



      ===================範例實作(3)===================
      目標:
      (1) 利用Arduino所提供的pitch.h音階列表,撥放小星星

      接線:
      和上一範例相同,無須更改

      範例程式:
      // 2017/5/13
      // Faya-Nugget 範例程式 (EMBuzzer_3.ino)
      // 單元: 模組介紹-faya蜂鳴器模組
      // 網址: http://fayalab.blogspot.com/2017/05/faya_11.html
      // 目標 (1) 利用Arduino所提供的pitch.h音階列表,撥放小星星
      // 接線: Arduino ==> faya模組
      // 8 ==> BZ (蜂鳴器模組)
      #include "pitches.h"
      // 蜂鳴器腳位設定
      int Buzzer_Pin_BZ = 8;
      //小星星的音階
      int star[]={NOTE_C4,NOTE_C4,NOTE_G4,NOTE_G4,NOTE_A4,NOTE_A4,NOTE_G4, \
      NOTE_F4,NOTE_F4,NOTE_E4,NOTE_E4,NOTE_D4,NOTE_D4,NOTE_C4, \
      NOTE_G4,NOTE_G4,NOTE_F4,NOTE_F4,NOTE_E4,NOTE_E4,NOTE_D4, \
      NOTE_G4,NOTE_G4,NOTE_F4,NOTE_F4,NOTE_E4,NOTE_E4,NOTE_D4, \
      NOTE_C4,NOTE_C4,NOTE_G4,NOTE_G4,NOTE_A4,NOTE_A4,NOTE_G4, \
      NOTE_F4,NOTE_F4,NOTE_E4,NOTE_E4,NOTE_D4,NOTE_D4,NOTE_C4};
      //每個音階的長度
      int beat[]={4,4,4,4, 4,4,2, \
      4,4,4,4, 4,4,2, \
      4,4,4,4, 4,4,2, \
      4,4,4,4, 4,4,2, \
      4,4,4,4, 4,4,2, \
      4,4,4,4, 4,4,2};
      void setup()
      {
      pinMode(Buzzer_Pin_BZ,OUTPUT);
      }
      void loop() {
      for(int i=0; i<=41; i++)
      {
      int duration = 1000/beat[i];
      tone(Buzzer_Pin_BZ, star[i], duration); // 播放C5,D5,E5,F5,G5,A5,B5,C6,各0.5秒
      int pauseBetweenNote=duration * 1.15;
      delay(pauseBetweenNote); // 每個音間隔0.2秒
      }
      }
      view raw EMBuzzer_3.ino hosted with ❤ by GitHub
      /*************************************************
      * Public Constants
      *************************************************/
      #define NOTE_B0 31
      #define NOTE_C1 33
      #define NOTE_CS1 35
      #define NOTE_D1 37
      #define NOTE_DS1 39
      #define NOTE_E1 41
      #define NOTE_F1 44
      #define NOTE_FS1 46
      #define NOTE_G1 49
      #define NOTE_GS1 52
      #define NOTE_A1 55
      #define NOTE_AS1 58
      #define NOTE_B1 62
      #define NOTE_C2 65
      #define NOTE_CS2 69
      #define NOTE_D2 73
      #define NOTE_DS2 78
      #define NOTE_E2 82
      #define NOTE_F2 87
      #define NOTE_FS2 93
      #define NOTE_G2 98
      #define NOTE_GS2 104
      #define NOTE_A2 110
      #define NOTE_AS2 117
      #define NOTE_B2 123
      #define NOTE_C3 131
      #define NOTE_CS3 139
      #define NOTE_D3 147
      #define NOTE_DS3 156
      #define NOTE_E3 165
      #define NOTE_F3 175
      #define NOTE_FS3 185
      #define NOTE_G3 196
      #define NOTE_GS3 208
      #define NOTE_A3 220
      #define NOTE_AS3 233
      #define NOTE_B3 247
      #define NOTE_C4 262
      #define NOTE_CS4 277
      #define NOTE_D4 294
      #define NOTE_DS4 311
      #define NOTE_E4 330
      #define NOTE_F4 349
      #define NOTE_FS4 370
      #define NOTE_G4 392
      #define NOTE_GS4 415
      #define NOTE_A4 440
      #define NOTE_AS4 466
      #define NOTE_B4 494
      #define NOTE_C5 523
      #define NOTE_CS5 554
      #define NOTE_D5 587
      #define NOTE_DS5 622
      #define NOTE_E5 659
      #define NOTE_F5 698
      #define NOTE_FS5 740
      #define NOTE_G5 784
      #define NOTE_GS5 831
      #define NOTE_A5 880
      #define NOTE_AS5 932
      #define NOTE_B5 988
      #define NOTE_C6 1047
      #define NOTE_CS6 1109
      #define NOTE_D6 1175
      #define NOTE_DS6 1245
      #define NOTE_E6 1319
      #define NOTE_F6 1397
      #define NOTE_FS6 1480
      #define NOTE_G6 1568
      #define NOTE_GS6 1661
      #define NOTE_A6 1760
      #define NOTE_AS6 1865
      #define NOTE_B6 1976
      #define NOTE_C7 2093
      #define NOTE_CS7 2217
      #define NOTE_D7 2349
      #define NOTE_DS7 2489
      #define NOTE_E7 2637
      #define NOTE_F7 2794
      #define NOTE_FS7 2960
      #define NOTE_G7 3136
      #define NOTE_GS7 3322
      #define NOTE_A7 3520
      #define NOTE_AS7 3729
      #define NOTE_B7 3951
      #define NOTE_C8 4186
      #define NOTE_CS8 4435
      #define NOTE_D8 4699
      #define NOTE_DS8 4978
      view raw pitches.h hosted with ❤ by GitHub

      備註:
      - L10: 將Arduino內建的 "pitches.h"檔案中內建了每個音符的音階(含升降音),記得把這個檔案和範例檔案(EMBuzzer_3.ino)放在同一個資料夾。
      - 每個音符需要有音階(發出哪個頻率)和音長(多久時間)資訊,才能完整的撥放一個音,我們建立了兩個陣列,star[ ]和beat[ ]分別存放小星星的音階和每個音階的音長資訊,在L40行的時候一個一個輪流讀取放到tone()函式撥放。

      範例結果:


      我們在這篇範例裡面從一個音開始,一步一步的引導到讓蜂鳴器唱一首歌,希望大家未來能善用蜂鳴器模組,讓自己的作品更生動!

      歡迎大家在底下留言或到我們的粉絲團留言喔!
      ====================================
      fayalab 粉絲團
      FB本篇留言版


       

      沒有留言:

      張貼留言