之 前 幾 課 講 了 有 點 複 雜 的 七 段 顯 示 管 ,今 堂 回 歸 到 簡 單 一 點 的 電 子 零 件 ,Buzzer ( 蜂 鳴 器 )。
Buzzer,又 叫 Piezo Buzzer,Piezo Speaker,其 全 名 是 Piezoelectric speaker。蜂 鳴 器 是 通 過 壓 電 效 應 ( piezoelectric effect ) 來 發 聲 的 裝 置 。蜂 鳴 器 內 的 電 晶 體 ,會 隨 著 所 施 加 的 電 場 而 變 型 ,而 通 過 施 加 特 定 頻 率 的 電 流 ,就 可 令 其 發 聲 。
Buzzer 有 兩 大 類 ,有 源 蜂 鳴 器 ( Active ) 和 無 源 蜂 鳴 器 ( Passive )。有 源 蜂 鳴 器 只 有 固 定 的 音 高 ,我 們 只 能 控 制 它 beep 定 唔 beep。而 無 源 蜂 鳴 器 ,就 可 以 通 過 輸 出 電 流 的 頻 率 來 令 到 它 發 出 不 同 的 音 高 ,來 令 到 它 播 放 音 樂 。這 一 課 我 們 用 的 是 無 源 蜂 鳴 器 ,大 家 不 要 買 錯 了 。
Passive Buzzer 的 接 法 相 當 簡 單 ,把 負 極 接 地 ,把 正 極 接 到 任 何 一 個 Arduino UNO 的 Digital Pin。不 過 ,其 實 Passive Buzzer 是 「無 極 性 」的 ,就 是 無 分 正 負 ,反 轉 接 亦 是 可 以 的 。
回 到 mBlock,mBlock 本 身 就 已 經 內 建 了 play tone pin X1 on notes X2 beat X3 block 來 播 放 聲 音 。這 個 block 的 三 個 參 數 ,第 一 個 就 是 指 定 pin number,第 二 個 是 音 高 ,第 三 個 就 是 節 拍 。
在 第 一 個 例 子 中 ,我 們 設 定 一 個 variable buzzerPin 來 設 定 用 了 那 一 個 Arduino Pin,因 為 製 作 音 樂 歌 曲 ,通 常 會 牽 涉 到 大 量 的 「音 符 」,所 以 完 成 之 後 萬 一 想 把 buzzer 接 到 另 一 個 pin,就 會 很 大 工 程 了 。
按 Upload to Arduino 之 後 ,就 會 聽 到 類 似 「響 鬧 」的 效 果 。
如 果 想 播 一 首 歌 ,又 要 點 做 呢 ?且 看 下 面 第 二 例 。
你 可 以 想 像 每 一 個 play tone block 就 是 一 個 音 符 ,你 要 設 定 音 高 和 長 短 。簡 單 而 言 ,如 果 首 歌 有 100 個 音 符 ,你 就 要 製 作 100 個 block。上 面 我 用 一 個 Make a Block London 來 儲 起 整 首 歌 ,方 便 可 以 重 複 使 用 。我 亦 在 London 加 了 一 個 數 字 參 數 ,來 設 定 播 放 幾 多 次 。第 二 例 播 放 的 是 什 麼 歌 ,你 聽 得 出 來 麼 ?
再 多 看 一 個 例 子 吧 。
例 三 是 另 一 首 歌 ,旋 律 ,拍 子 都 不 一 樣 ,基 本 上 都 要 從 頭 製 作 ,沒 有 捷 徑 ,不 能 copy & paste。
如 果 你 有 一 定 的 音 樂 底 子 的 話 ,就 會 發 玩 play tone block 的 問 題 。首 先 ,在 音 高 方 面 ,它 只 支 援 C 大 調 的 音 階 ( C D E F G A B ),其 他 大 小 調 和 半 音 欠 奉 。第 二 個 是 拍 子 ,它 只 提 供 了 「全 音 符 」( whole ),「二 分 音 符 」( half ),「四 分 音 符 」( quarter ),「八 分 音 符 」( eighth )和 「兩 個 全 音 符 」( double ),如 果 想 要 附 點 又 如 何 呢 ?第 三 是 它 的 速 度 ( tempo ) 是 固 定 的 ,一 個 「全 音 符 」永 遠 是 1 秒 ,不 能 加 快 ,也 不 能 減 慢 。
但 mBlock 的 play tone block 其 實 是 有 另 類 的 用 法 的 。它 的 音 高 和 拍 子 ,其 實 都 接 受 數 值 輸 入 的 。
音 高 其 實 就 是 頻 率 ,例 如 middle C ( C4 ) 是 262 Hz,A4 是 440 Hz。而 拍 子 ( 時 值 長 度 ) 的 單 位 則 是 ms ( 毫 秒 ),一 千 毫 秒 就 是 一 秒 了 。有 了 這 一 個 另 類 用 法 ,其 實 任 何 歌 都 可 以 播 放 的 了 。
在 第 五 例 中 ,我 們 用 了 幾 個 variable,補 齊 了 歌 曲 所 需 的 音 高 ( Ab3 = A flat 3, Bb3 = B flat 3, Db4 = D flat 4, …., Ab4 = A flat 4 ),和 拍 子 ( QplusE = Quarter + Eighth = 375 ms )。
然 後 ,我 們 直 接 把 那 幾 個 variables ( Ab3, Bb3, Db4, … , QplusE ) 使 用 到 play tone block 上 面 去 就 可 以 了 。
很 方 便 吧 ,哈 哈 哈 。大 家 一 起 下 載 來 看 看 究 竟 The Imperial March 在 mBlock / Scratch 上 面 是 什 麼 樣 子 的 吧 。
檔 案 下 載 : lesson09.zip
功 課 時 間 :1. 試 試 把 程 序 改 為 接 鍵 才 開 始 播 放 吧 。2. 試 試 把 一 首 自 己 喜 愛 的 歌 曲 編 程 在 Arduino 上 播 放 。
Star War — The Imperial March ( Darth Vader’s Theme )