學習目標 : 認識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
範例程式:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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() { | |
} |
備註:
- 第一個範例很簡單,我們呼叫tone()函式,並填入腳位、頻率、時間。
範例結果:
成功上傳後蜂鳴器就會發出3秒鐘的第5階Do(C5)音,很直覺的結果,這邊就不提供錄影檔了!
===================範例實作(2)===================
目標:
(1) 建立一C5到C6的音階陣列
(2) 利用tone函示重複撥每個音階,每個音長度0.5秒,間隔0.2秒
接線:
和上一範例相同,無須更改
範例程式:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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秒 | |
} | |
} |
備註:
- 這個範例我們把tone()程式從setup{ }區塊裡挪到loop{ }區塊,這樣loop{ }區塊裡面的程式就會一直重複執行。
- L21~L25利用for迴圈,輪流撥放C5notes[]陣列內的八個音階
範例結果:
===================範例實作(3)===================
目標:
(1) 利用Arduino所提供的pitch.h音階列表,撥放小星星
接線:
和上一範例相同,無須更改
範例程式:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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秒 | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/************************************************* | |
* 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 | |
備註:
- L10: 將Arduino內建的 "pitches.h"檔案中內建了每個音符的音階(含升降音),記得把這個檔案和範例檔案(EMBuzzer_3.ino)放在同一個資料夾。
- 每個音符需要有音階(發出哪個頻率)和音長(多久時間)資訊,才能完整的撥放一個音,我們建立了兩個陣列,star[ ]和beat[ ]分別存放小星星的音階和每個音階的音長資訊,在L40行的時候一個一個輪流讀取放到tone()函式撥放。
範例結果:
我們在這篇範例裡面從一個音開始,一步一步的引導到讓蜂鳴器唱一首歌,希望大家未來能善用蜂鳴器模組,讓自己的作品更生動!
歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================
fayalab 粉絲團
FB本篇留言版
沒有留言:
張貼留言