學習目標 : 認識faya數位式蜂鳴器模組的功能及使用方式
學習時間 : 30min
示範模組 : (1) faya brickNano
(2) 按鍵模組
(3) faya數位式蜂鳴器模組
工具 : (1) 樂高積木底板 (相容)
====================功能介紹====================
faya 數位式蜂鳴器模組擁有一個數位輸入埠Vin,只要輸入數位訊號,就能發出固定音頻,這一類的蜂鳴器主要目的在分擔控制器的工作量,他的輸出音頻固定,通常出現在簡單的應用上,和faya蜂鳴器模組使用時機不同。
- 當輸入HIGH至Vin埠時,蜂鳴器產生音頻
- 當輸入LOW至Vin埠時,蜂鳴器靜音
====================原理知識====================
以下解釋提供給需要知道背後原理的人:
蜂鳴器的種類有壓電式和電磁式兩種,依驅動方式有可分為自激和他激式,以下兩個連結有非常詳細的說明與比較:
壓電式和電磁式蜂鳴器的比較
自激與他激式蜂鳴器的差別
faya數位式蜂鳴器模組所採用的是自激-壓電式蜂鳴器,內建了震盪電路用來激發蜂鳴器,因此體積會比他激式大一些,優點就是控制容易,也可分擔控制器的工作。但由於內建震盪電路的輸出頻率是固定的,因此蜂鳴器產生的音頻也是固定的。
fayalab還有另一款[蜂鳴器模組],採用的是他激-電磁式的蜂鳴器,能夠利用Arduino產生不同的音頻,大家可以參考連結。
模組的電路圖如下,自激式的蜂鳴器內建一555震盪IC,電阻電容用來決定輸出頻率的高低,由於電阻電容值已經固定了,因此輸出頻率也是固定的。
===================範例實作(1)===================
了解模組功能(原理)後,我們用以下範例來展示模組的功能:
目標:
(1) 利用faya數位式蜂鳴器模組模擬按鍵音
接線:
(1) 電源線連接
如下圖所示,連接的說明請看這篇文章 或簡易版
(2) 訊號線連接
Arduino_D6 ===> 按鍵模組_PB0
Arduino_D7 ===> 按鍵模組_PB1
Arduino_D8 ===> 按鍵模組_PB2
Arduino_D9 ===> 按鍵模組_PB3
Arduino_D10 ===> 按鍵模組_PB4
Arduino_D13 ===> 數位式蜂鳴器模組_Vin
範例程式:
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
// 2018/3/12 | |
// Faya-Nugget 範例程式 (PEBuzzer_1.ino) | |
// 單元: 模組介紹-faya數位式蜂鳴器模組 | |
// 網址: https://fayalab.blogspot.com/2018/03/PEBuzzer.html | |
// 目標 (1) 利用數位式蜂鳴器模組模擬按鍵音 | |
// 接線: Arduino ==> faya模組 | |
// 6 ==> PB0 (按鍵模組) | |
// 7 ==> PB1 (按鍵模組) | |
// 8 ==> PB2 (按鍵模組) | |
// 9 ==> PB3 (按鍵模組) | |
// 10 ==> PB4 (按鍵模組) | |
// 13 ==> BZ (數位式蜂鳴器模組) | |
// 腳位設定 | |
int TACT_PB0 = 6; | |
int TACT_PB1 = 7; | |
int TACT_PB2 = 8; | |
int TACT_PB3 = 9; | |
int TACT_PB4 = 10; | |
int Buzzer_Pin_BZ = 13; | |
void setup() | |
{ | |
Serial.begin(9600); | |
pinMode(TACT_PB0, INPUT); | |
pinMode(TACT_PB1, INPUT); | |
pinMode(TACT_PB2, INPUT); | |
pinMode(TACT_PB3, INPUT); | |
pinMode(TACT_PB4, INPUT); | |
pinMode(Buzzer_Pin_BZ,OUTPUT); | |
digitalWrite(Buzzer_Pin_BZ, LOW); //讓蜂鳴器靜音 | |
} | |
void loop() { | |
if(digitalRead(TACT_PB0) == HIGH) | |
{ | |
buzzerOut(); // 產生按鍵音 | |
Serial.println("PB0 Pressed"); | |
while(digitalRead(TACT_PB0)); //等待放開按鍵 | |
delay(75); // 除彈跳 | |
} | |
if(digitalRead(TACT_PB1) == HIGH) | |
{ | |
buzzerOut(); // 產生按鍵音 | |
Serial.println("PB1 Pressed"); | |
while(digitalRead(TACT_PB1)); //等待放開按鍵 | |
delay(75); // 除彈跳 | |
} | |
if(digitalRead(TACT_PB2) == HIGH) | |
{ | |
buzzerOut(); // 產生按鍵音 | |
Serial.println("PB2 Pressed"); | |
while(digitalRead(TACT_PB2)); | |
delay(75); // 除彈跳 | |
} | |
if(digitalRead(TACT_PB3) == HIGH) | |
{ | |
buzzerOut(); // 產生按鍵音 | |
Serial.println("PB3 Pressed"); | |
while(digitalRead(TACT_PB3)); | |
delay(75); // 除彈跳 | |
} | |
if(digitalRead(TACT_PB4) == HIGH) | |
{ | |
buzzerOut(); // 產生按鍵音 | |
Serial.println("PB4 Pressed"); | |
while(digitalRead(TACT_PB4)); | |
delay(75); // 除彈跳 | |
} | |
} | |
void buzzerOut() //按鍵音副程式 | |
{ | |
digitalWrite(Buzzer_Pin_BZ, HIGH); | |
delay(50); | |
digitalWrite(Buzzer_Pin_BZ, LOW); | |
} | |
備註:
- L77~L82: 短促的按鍵音副程式,提供按下五個按鍵時呼叫
- L32: 在setup時,輸入Low給蜂鳴器,使其靜音
- L38: 一按下按鍵後,第一件事情先撥放按鍵音,讓使用者知道已經按下按鈕,這邊可以忽略機械彈跳造成的影響,因為接下來MCU會執行指定的指令,沒有時間處理機械彈掉造成的影響。
- L40: 由於每個人按下按鍵的時間不一定,有的人按鍵時間長,有的人按鍵時間短,加此行可以讓程式持續停在這一行,直到手指離開按鍵為止。
- L41: 由於機械式的按鍵結構,放開按鍵時會產生彈跳現象,因此加一個延遲時兼直到彈跳結束 。
範例結果:
討論:
- 我們在這個範例利用數位式蜂鳴器的特色模擬了按鍵音,大家可以把
(1) 第40行刪除,然後長按PB0,觀察會發生什麼事?
(2) 回復第40行,刪除第41行,長按PB0,然後放開的時候會發什麼事 ? (需要多試幾次才能觀察到現象)
歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================
fayalab 粉絲團
FB本篇留言版
沒有留言:
張貼留言