• 沒有找到結果。

第9章蜂鳴器9章蜂鳴器

N/A
N/A
Protected

Academic year: 2023

Share "第9章蜂鳴器9章蜂鳴器"

Copied!
50
0
0

加載中.... (立即查看全文)

全文

(1)

第 9 章

蜂鳴器

(2)

9-1 功能簡介

本次實驗主要介紹發聲元件-蜂鳴器,希望透過 Arduino 開發環 境的 Serial Monitor ,輸入不同的音階代碼,讓蜂鳴器發出所 指定的單一音階聲音,或是連續的音階聲音;本實驗系統方塊圖如 圖 9-1 所示。

(3)

9-2 電路說明

喇叭( Speaker )與蜂鳴器( Buzzer )是一種將電氣信號轉換 為聲音的轉換裝置,是電子產品中常用的發聲元件,例如音響喇叭

、主機板上的蜂鳴器等。喇叭的基本動作原理,主要是利用電流通 過線圈時的磁極物理作用,作反磁或相吸運動讓音盆進行往復運動

,當音盆振動空氣時,即會以空氣為媒介傳遞至人類耳膜而感受到 聲音,其中通過線圈的電流大小決定聲音的大小、往復運動的快慢

(次 / 秒; Hz )決定聲調的高低,振動聲波持續的時間決定聲 音的音長。

蜂鳴器與喇叭的發聲原理很像,但使用不同的材質;蜂鳴器分為電 磁式及壓電式二大類,在耗電流、尺寸、頻率、驅動方式上有些不 同,本實驗使用電磁式蜂鳴器,所使用的工作電壓為 3V ~

7.5V ,其原理是通電時將金屬振動膜吸下,不通電時依振動膜的 彈力彈回的電磁原理,耗電量較壓電式大,但使用較低的電壓即可 工作。

(4)

9-2 電路說明

蜂鳴器只要給定頻率即能發出聲音, 例如要發出低音 La 的聲音

( 440Hz ,週期 2.27ms ),只要送半週期高準位、半週期低準 位,並持續輸出方波給蜂鳴器即可發聲,如圖 9‑2 所示。

(5)

9-2 電路說明

但要如何計算其它音階的頻率呢?首先以低音 A ( La )頻率

440Hz 為基準,然後每隔半度音之頻率是前一個音的 12 2 ≒ 1.059463 倍為原則來計算即可,表 9-1 為音階與頻率表;其 中需注意的是 Mi 到 Fa 、 Si 到 Do 為半度音, 其餘皆為一個 全音, 例如 La 到 Si 為一個全音, 因此 Si 的頻率為

440×1.059×1.059 ≒ 494Hz , Si 到 Do 為半音, 因此 Do 的頻率為 494×1.059 ≒ 523Hz ,比對圖 9-3 鋼琴上所示的鍵 盤便可清晰了解。

(6)

9-2 電路說明

(7)

9-2 電路說明

(8)

9-2 電路說明

圖 9‑4 為本實習 的電路圖,只要將 蜂鳴器的正端接至 Arduino 的 D10

,負端接地即可進 行實驗。

(9)

9-2 電路說明

(10)

9-2 電路說明

本實驗使用的蜂鳴器工作電壓為 3V ~ 7.5V , 以 Arduino 輸出的電壓 5V ,可順利推動蜂鳴器。如果選用的蜂鳴器(或喇 叭)驅動電壓或電流過大時,請務必在蜂鳴器前接上電晶體或達靈 頓電路,才能順利推動蜂鳴器。另請注意蜂鳴器接腳上的正負端,

有註明十字符號者為正端與 D10 相接,另一端則接地,如果蜂鳴 器未標示正負,則接腳較長端為正端。

(11)

9-2 電路說明

1. Arduino Leonardo + 麵包板的接線圖

如圖 9-6 所示,本電路使用 USB 提供的 5V ,不需外加電源。

(12)

9-2 電路說明

2. 圖 9-7 為 Leonardo 板(或 OZONE ) +Arminno 多功 能實驗板接線情況,為簡化顯示,圖 9-7 只畫出多功能實驗板 的區塊 5 及區塊 15 。

(13)

9-3 程式設計

本實驗的程式主要是處理字串,依據 Serial Monitor 中所傳 送的文字列進行逐字判斷,其中文字列的 1 ~ 7 代表要讓蜂鳴器發 出第 4 八度音的 Do ~ Si ,字母 C 、 D 、 E 、 F 、 G 、 A 、 B 代表要發出第 5 八度音的 Do ~ Si ,每個單字音的音長固定為 200ms ,所有單字發聲完畢後停止發聲,回至等待使用者輸入的狀 態,整個程序如圖 9-8 所示。

(14)

9-3 程式設計

(15)

9-3 程式設計

本程式分為二個檔案,以下分別介紹。

1.音調標頭檔(程式 \ 第 9 章 \chap9_1 \pitches.h )音調 標頭檔中定義了 8 個八度音所有音調的音名及頻率,例如

NOTE_C4 代表第 4 八度音的 C ( Do ),頻率為 262Hz ,方便 在主程式中引用;由於 pitches.h 內容很多,下列僅列出第 4 及第 5 八度音的定義。

(16)

9-3 程式設計

(17)

9-3 程式設計

(18)

9-3 程式設計

本程式分為二個檔案,以下分別介紹。

2.主程式(檔名:程式 \ 第 9 章 \chap9_1 \chap9_1.in o )

(19)

9-3 程式設計

(20)

9-3 程式設計

1. #define :定義宣告

#define 是一個很有用的指令,它允許程式在編譯前,賦予 一個名稱對應一個恆定值或計算式的功能,此命令與常數宣告 指令 const 功能很像,適合定義一些在執行期間數值不會變 動的常數;不同於 const 指令的是 #define 為定義,不需 指定資料型態,使用上彈性較大。

2. 標頭檔 pitches.h

標頭檔 pitches.h 可在書籍光碟→程式→第 9

章 \chap9_1 \ 中找到,可在開啟的 Arduino IDE 中,

點選 Sketch → Add File ,將此檔案加入即可,加入後可 看到 Arduino IDE 中增加一個檔案頁籤。)

(21)

9-3 程式設計

(22)

9-3 程式設計

3. #include :引入標頭檔

一個專案的常數或定義通常都很多,而且是主程式、副程式共 同使用,因此可將這些常數或定義儲存在一個標頭檔中(副屬 檔名為 .h ),方便主副程式使用。當標頭檔建立完成,要引 入使用,只要在 Arduino IDE 中點選 Sketch → Add File 加入標頭檔,然後在主程式中,利用 #include 指令即可引用

(23)

9-3 程式設計

4. tone(pin, frequency, duration) :音調產生指令 此指令可在指定的 pin 腳輸出一個工作週期 50% , 頻率為 frequencyHz 的方波,持續輸出 duration (單位 ms )後 關閉( tone 指令的音調產生為背景動作,執行 tone 指令 後主控權會立即交回主程式,並非等待 duration 後才交 回);參數 duration 若省略,代表會持續發聲,直到執行 noTone(pin) 指令時關閉。

(24)

9-3 程式設計

1. 字元資料型態的運算:程式中宣告了 chr 及 index 為字元 資料型態, chr 變數儲存從串列埠緩衝區讀取下一個有效的單 一字元資料,在運算上,可利用 ASCII 的特性進行加減運算

,判斷 chr 是否為 '1' ~ '7' 間的字元,或是 'A' ~ 'G' 間的字元。例如 chr='0' , 其 ASCII 為 48 , '1' 的 ASCII 為 49 , '7' 的 ASCII 為 55 ,代入底下的判斷 式可知 (chr-'1')>=0 與 (chr-'7')<=0 均不成立,因此 可知 chr='0' 未介於 '1' ~ '7' 間。

(25)

9-3 程式設計

2. 行號 22 、 26 的 tone 發聲長度為 200ms ,理論上行號 31 的 delay 應也是 200ms ,但經由實驗測試,若同樣為

200ms ,各音調間連在一起並不好聽,多 30% 的 delay ,可 讓各音調間有些斷音,聽起來比較正常。

(26)

9-4 實驗成果

一切準備就緒後,即可開始進行編譯程式,以及下載、燒錄、測試 的工作;燒錄成功後,請點選 Tools → Serial Monitor ,並 開始底下的測試:

1.單音測試:在 Serial Monitor 輸入 1 , 按 Enter 鍵或按 Send ,

應可聽到單音的 Do , 且在 Serial Monitor

上顯示 Tone 1 ,接著可試試 輸入 2 ,按 Enter 或 Send , 可聽到 Re ,如右圖所示。

(27)

9-4 實驗成果

2. 連續音調測試:在 Serial Monitor 輸入 CDEFGAB ,然後 按 Enter ,聽聽程式是否會依續發出第 5 八度音的 Do ~ Si ;由於 Serial Monitor 具有串列緩衝區,因此不管在 Serial Monitor 中輸入多少字元,程式皆會逐一讀入字元

,並逐一處理及發聲。

3. 輸入音調以外的字元測試:在 Serial Monitor 輸入 533x422x1234555 ,然後按 Enter ,聽聽程式中指定字 元 '1' ~ '7' , 'A' ~ 'G' 外的字元是如何處理的,

其實由程式即可看得很清楚,指定字元外的字元是不發聲,但 延遲一樣時間,故變成靜音。試一下下列兩個字串,可以聽出 是什麼歌嗎?

(1) 533x422x1234555x533x422x13551 (2)

11135555666C5x4446333322225x511135555666C5x444 6333322231

(28)

9-5 延伸應用與練習

9-5.1 音樂盒

延伸本章蜂鳴器的發聲練習,思考一下,加上音長控制後,如何做 出一個完整的音樂播放程式呢?請修改 chap9_1.ino 的程式,

完成開機後自動播放「新不了情」歌曲的實驗,製作方式及說明如 下,可依自己的喜好,搜尋欲編碼的曲目來練習。

(29)

9-5 延伸應用與練習

1. 音樂盒的音樂資料編碼有二個資訊很重要,一是音高表(每個 樂音的頻率值),二是歌譜表(含每個音的音高及音長),本 實驗以歌曲「新不了情」的一小段為例,說明如何進行歌譜資 料的編碼。

2. 首先制訂音高表,可根據歌譜中涵蓋的最高及最低音,整理成 程式中的音高陣列,例如「新不了情」只需第 4 、第 5 兩個 八度音即可完成,故本程式的音高陣列 pitch[] 可宣告如下

,第一筆資料放 0 只是為了方便歌譜的編碼,使 pitch[1]

代表中音的 Do , itch[1+7] 代表高音的 Do 。

(30)

9-5 延伸應用與練習

3. 接著制訂程式的歌譜表編碼格式,歌譜表陣列格式設計為 { 第 1 個音的音高 , 第 1 個音的音長 , 第 2 個音的音高 , 第 2 個音的音長… , 第 n 個音的音高 , 第 n 個音的音

長 , -1} ,若有 n 個音,則會有 2×n+1 筆資料,最後一筆 的 -1 是歌譜的結束代碼。

4. 音長部分為了方便編碼,以 1 拍為基本單位,可以使用小數 點,因此若音長資料為 0.25 ,代表的是 0.25 拍(四分之一 拍),若是三連音,則每個音為 0.33 拍。

5. 圖 9-10 為「新不了情」的一小段簡譜,此音樂一小節有 4 拍,首先必須會算拍子,以「回憶過去」的四個音為例,其拍 子依序為「 1 拍、 1.5 拍、 0.5 拍、 1 拍」,故此四個 音的音長編碼應為「 1 、 1.5 、 0.5 、 1 」,實際編碼到歌 譜陣列內容應為 {5,1, 3+7,1.5, 6,0.5, 6,1} ,其中 +7 代表升高一個八度音,故 3+7 為高音的 Mi 。

(31)

9-5 延伸應用與練習

6. 歌譜中「痛苦的」為 3 連音占一拍,因此皆為 1/3 拍,實際 編碼到歌曲陣列內容應為 {6,0.33, 7, 0.33, 1+7,0.33}

7. 歌譜中 0 為休止符(蜂鳴器不發聲),故程式中需有休止符 的處理。

8. 以「回憶過去痛苦的相思忘不了為何你還來撥動我心跳。愛你 怎麼能了,今夜的你應該明了」為例,編碼的結果如下,最後 一筆資料 -1 為此首歌的結束代碼。 song 陣列中的每一行 代表一小節的歌譜,方便萬一唱錯音時,可與歌譜比對除錯。

(32)

9-5 延伸應用與練習

6. 歌譜中「痛苦的」為 3 連音占一拍,因此皆為 1/3 拍,實際 編碼到歌曲陣列內容應為 {6,0.33, 7, 0.33, 1+7,0.33}

7. 歌譜中 0 為休止符(蜂鳴器不發聲),故程式中需有休止符 的處理。

8. 以「回憶過去痛苦的相思忘不了為何你還來撥動我心跳。愛你 怎麼能了,今夜的你應該明了」為例,編碼的結果如下,最後 一筆資料 -1 為此首歌的結束代碼。 song 陣列中的每一行 代表一小節的歌譜,方便萬一唱錯音時,可與歌譜比對除錯。

(33)

9-5 延伸應用與練習

(34)

9-5 延伸應用與練習

(35)

9-5 延伸應用與練習

(36)

9-5 延伸應用與練習

(37)

9-5 延伸應用與練習

音樂盒程式中最精髓的部分是音高表 pitch 的設定與歌譜表

song 的編碼,完成後,只要在迴圈程式 loop() 中使用 index 指標,依序讀出音高值存入 song_tone ,讀出音長值並計算發音 時間後存入 SoungLeng 變數,然後進行二種音高值的條件判斷 即可,分別是結束識別碼、休止符,其餘皆為正常要發音的音調。

為了讓各音調間有些斷音,實際延遲的時間比發聲時間多了 30% 。

(38)

9-5 延伸應用與練習

一切準備就緒後,接著就可開始進行編譯程式,以及下載燒錄、測 試的工作。燒錄完成後應可正常聽到「新不了情」這首歌的片段,

若有不正確的音高或音長,可針對歌譜表 song 部分進行修改。

(39)

9-5 延伸應用與練習

9-5.2 摩斯電碼

1.摩斯電碼( morse code )是一種時通時斷的數位訊號代碼,

分為短音(滴)與長音(答)二種,透過不同的滴答滴答排列可用 來表達不同的字母、數字或標點符號,在早期通訊及無線電界用的 很多,此種滴答滴答聲音對喜愛看電影或電視劇的人來說應該不陌 生。

2.請使用本章的蜂鳴器電路,完成一個可透過 Serial Monitor 控制,發出指定摩斯電碼的控制,其特性要求如下:

(1)摩斯電碼有短音(滴)與長音(答)兩種狀態,假設短音 的頻率為 440Hz ,音長為 0.1 秒,而長音是三個短音的

長度。

(2) 同一個字元中,短音與長音的間隔為 1 個短音的長度,

元與字元間的間隔為 3 個短音的長度。

3.試完成在 Serial Monitor 中傳送不同字元,蜂鳴器可對應 發出如表 9‑4 所示的信號。收到 A ~ Z 以外的字元或未收到 任何字元時,蜂鳴器不發聲。圖 9‑11 為傳送一個字組 ABC 的 示意圖。

(40)

9-5 延伸應用與練習

3. 試完成在 Serial Monitor 中傳送不同字元,蜂鳴器可對應 發出如表 9‑4 所示的信號。收到 A ~ Z 以外的字元或未 收到任何字元時,蜂鳴器不發聲。圖 9‑11 為傳送一個字組 ABC 的示意圖。

(41)

9-5 延伸應用與練習

觀察表 9‑4 的字元與摩斯電碼對照表可發現,每個字元的電碼 長度不同,因此本小節的程式應用,主要在解決不同長度編碼、讀 值,以及最後發聲的問題。

1. 編 碼

1) 為了方便程式處理,首先宣告摩斯電碼的字元陣列,其 中 "0" 代表滴, "1" 代表答,故字元 A 可宣告

為 "01" ,字元 B 可宣告為 "1000" ,以此類推。

2) 由於 A ~ Z 的字元陣列長度不一, 故需宣告一個字元 指標陣列 *morse ,將這 26 個字的字元陣列組合起來,

讓程式可以很方便的指到 "01" 的開頭,或是 "1000"

的開頭,宣告的內容如下。(有關指標的基本指令說明參閱 第 3-2.8 節)

(42)

9-5 延伸應用與練習

(43)

9-5 延伸應用與練習

2. 讀 值

1)宣告一個如下所示的字元指標變數 *ptr 。

2)若 ptr=morse[0] ,代表指標 ptr 指到 "01" 的開頭,此時

*ptr 可讀到 "0" 的字元, *(ptr+1) 可讀到 "1" 的字元,

*(ptr+2) 可讀到字元陣列結尾 \0 的字元。

3)同理,若 ptr=morse[5] ,代表指標 ptr 指到 "0010" 的開 頭,此時 *ptr 可讀到 "0" 的字元, *(ptr+4) 可讀到字元陣 列結尾 \0 的字元。

4)透過此種指標讀取的方式,可藉由判斷是否讀取到字元陣列結 尾 \0 知道該字元的摩斯電碼是否結束。

(44)

9-5 延伸應用與練習

3. 發聲控制

1) 藉由讀值程序中所讀到的 "0" 或 "1" 字元,決定發聲的 長度, "0" 為 0.1s ,頻率 440Hz 的聲音, "1" 為 0.3s ,頻率 440Hz 的聲音。

2) 短音與長音間需有 0.1s 的延遲(不發聲)。

3) 字元間的間隔為 0.3s 的延遲(不發聲)。

(45)

9-5 延伸應用與練習

(46)

9-5 延伸應用與練習

(47)

9-5 延伸應用與練習

(48)

9-5 延伸應用與練習

(49)

9-5 延伸應用與練習

接著,請編譯並下載程式至 Arduino Leonardo 控制板,並點 選 Tools→ Serial Monitor ,依以下流程測試結果是否正常。

1.請輸入單一字元,對應表 9‑4 的字元與摩斯電碼對照表,測 試結果是否正確,例如輸入 S ,然後按 Enter 或 ,蜂鳴 器應會發出滴滴滴的聲音。接著可測試其它的單一字元。

2.輸入連續字元,測試結果是否正確,例如輸入 ABC ,應可聽到圖 9‑11 的結果。

3.無線電摩斯電碼的對話中,常以縮寫來表示如下,可測試一下喔

!可在網路上找到更多( http://zh.wikipedia.org/wiki/

摩斯電碼)相關內容。

(1) ABT 代表大約( about )。

(2) AGN 代表再一次( again )。

(3) CY 代表抄收( copy )。

(4) SOS 代表求救訊號。

(50)

9-5 延伸應用與練習

參考文獻

相關文件

VAB 使用者無法使用 RIDE 提供的 Filter Design 公用程式設計濾波器,但是 使用 VAB 的 Filter 元件時,在元件特性選單可以直接指定此濾波器的規格,使用

 虛線A構成一個自保回路。當X0 ON時,Y0 ON且自 保,此時縱使X0回復OFF狀態,Y0仍持續保持為ON..

單晶片電路接受到 A/D 轉換器的信號後,即將此數位信號由顥示器 顯示。此時單晶片 IC 並將此一 A/D 轉換器與指撥設定開關做比較,A/D 轉換器的信號高於設定值時,即由 OUT CONTROL

[r]

工 作 任 務 工 作 活 動 工 作 產 出 行 為 指 標

雙壓力閥在何時才有壓力(訊號)輸出(A) 其中一個輸入口有壓力(訊號)輸出 (B) 經指定的一 個輸入口有壓力(訊號),並且另一個輸入口沒有壓力(訊號) (C)

接收器: 目前敲擊回音法所採用的接收 器為一種寬頻的位移接收器 其與物體表

之意,此指依照命令動作的意義。所謂伺服 系統,就是依照指示命令動作所構成的控制