大 家 好 ,想 不 到 用 buzzer 播 歌 仔 也 會 有 回 響 ,那 我 就 把 Multi-function Shield 放 一 旁 ,先 多 做 一 個 同 buzzer 有 關 的 教 學 吧 。
這 一 堂 要 教 的 叫 做 light show,就 是 當 你 播 放 音 樂 的 時 候 ,同 時 增 加 一 個 燈 光 的 效 果 ,就 好 似 演 唱 會 那 些 燈 光 效 果 咁 。同 類 的 作 品 網 上 有 很 多 很 多 ,有 把 LED 燈 做 成 微 縮 舞 台 的 ,也 有 控 制 整 座 別 墅 的 室 外 聖 誕 燈 飾 的 。
我 示 範 的 ,當 然 是 那 些 最 簡 單 最 簡 單 ,你 自 己 不 到 1 小 時 就 能 做 出 來 的 。複 雜 的 那 些 ,就 留 給 大 家 自 己 去 做 了 。
叫 得 Light Show,當 然 要 控 制 LED 燈 ,第 二 課 大 家 就 學 會 了 。這 一 次 加 點 新 意 思 ,教 大 家 如 何 用 Arduino 控 制 16 顆 LED。之 前 的 教 學 ,我 們 都 是 一 顆 LED 連 接 一 個 Arduino UNO 的 digital pin。但 Arduino 能 用 的 針 腳 只 有 12 隻 ,那 要 如 何 做 呢 ?
心 水 清 的 小 朋 友 ,一 定 想 到 之 前 第 七 課 的 7-segment display 的 控 制 方 法 吧 ?無 錯 ,這 一 次 讓 我 們 只 用 3 個 pins,再 加 2 個 74HC595 shift register,去 控 制 16 顆 LED。
在 第 七 課 ,74HC595 的 第 9 pin 是 沒 有 使 用 的 ,那 是 serial data output。74HC595 本 身 只 可 以 處 理 8 個 bit,但 如 果 我 們 一 次 過 輸 出 16 個 bit 給 74HC595,那 多 出 來 的 8 個 bit 就 會 自 動 從 pin 9 再 轉 送 出 去 。聰 明 的 朋 友 一 定 想 得 到 ,用 這 個 方 法 ,我 們 就 可 以 一 直 串 聯 很 多 顆 74HC595 了 。
在 上 圖 的 電 路 中 ,第 一 顆 74HC595 ( 左 手 邊 ) 就 按 正 常 的 駁 法 ,唯 一 的 分 別 是 增 加 接 駁 了 第 9 pin ( serial data output ),就 接 到 第 二 顆 74HC595 的 serial data input ( pin 14, DS, data pin )。
至 於 第 二 顆 74HC595,clock pin ( pin 11, SH_CP ) 就 要 接 回 第 一 顆 74HC595 的 clock pin。Latch pin 亦 是 一 樣 ,第 二 顆 74HC595 的 latch pin 要 接 回 第 一 顆 的 latch pin。
除 了 以 上 ,其 他 應 該 都 沒 什 麼 問 題 。每 顆 74HC595 的 8 個 parallel data output 各 自 都 接 一 顆 LED。Vcc ( pin 16 ) 和 MR ( pin 10 ) 都 接 5v,而 GND ( pin 8 ) 和 OE ( pin 13 ) 都 接 地 。
然 後 回 到 mBlock,測 試 一 下 我 們 的 新 電 路 。
在 上 例 中 ,sendBit block 和 第 七 課 的 例 子 一 樣 ,作 用 是 每 次 發 一 個 bit 去 shift register。而 ShiftOut block,則 是 一 次 過 發 8 個 bit。74HC959 共 有 8 個 bit 的 output,一 共 的 可 能 就 有 256 個 可 能 性 。ShiftOut block 每 次 可 以 處 理 8 bit 的 資 料 ( 輸 入 的 數 據 機 為 0 – 255 ),然 後 會 將 數 值 轉 化 為 8 個 bit 的 資 料 ( 10011001 之 類 ),並 傳 送 出 去 。在 每 次 shiftOut 前 後 ,我 們 要 變 更 latch Pin 的 電 壓 ,讓 shift register 開 始 接 受 和 完 成 接 收 資 料 。
上 例 在 執 行 之 後 ,LED 燈 就 會 依 次 亮 起 ,組 成 256 個 不 同 的 組 合 ( 由 00000000 至 11111111 )。值 得 留 意 的 是 ,因 為 我 們 把 第 一 個 的 74HC575 的 serial data output ( pin 9 ),作 為 第 二 個 74HC595 的 serial data input ( pin 14 ),所 以 ,當 我 們 把 第 二 筆 之 資 料 丟 到 第 一 個 74HC595 的 時 候 ,之 前 的 第 一 筆 資 料 就 會 被 推 送 到 第 二 個 74HC595。
於 是 ,你 就 會 見 到 一 個 頗 為 有 趣 的 現 像 ,頭 8 顆 LED 正 在 顯 示 「2」( 亦 即 00000010 ) 的 時 間 ,後 8 顆 LED 就 會 顯 示 「1」( 亦 即 00000001 )。如 此 類 推 ,後 8 顆 LED 顯 示 的 永 遠 是 前 8 顆 LED 的 前 一 個 狀 態 。
現 在 我 們 是 每 次 更 新 一 個 74HC595 的 資 料 ,那 如 果 想 一 次 過 更 新 兩 個 74HC595 的 資 料 又 要 如 何 做 呢 ?其 實 亦 非 常 簡 單 ,且 看 下 例 。
在 例 子 01 的 基 礎 上 ,我 們 再 增 加 一 個 make a block lightShow。因 為 16 顆 LED 一 共 有 65536 個 組 合 ,所 以 lightShow 接 受 的 數 值 就 是 0 – 65535。而 在 兩 個 latch Pin 改 變 電 壓 的 set digital pin block 之 間 ,我 們 一 口 氣 發 送 兩 個 shiftOut。第 一 個 shiftOut 就 送 出 頭 8 bit,第 二 個 shiftOut 就 傳 送 後 8 個 bit。
在 第 二 例 中 ,因 為 lightShow 的 輸 入 用 了 亂 數 ( random number ),所 以 每 一 秒 都 會 變 換 一 個 隨 機 的 燈 光 效 果 。
把 上 面 所 學 ,和 第 九 課 的 Star War 主 題 音 樂 結 合 在 一 起 ,就 會 像 上 面 的 樣 子 。我 們 在 playTone block 裡 面 ,每 播 放 一 個 音 符 之 前 ,都 用 亂 數 隨 機 顯 示 一 個 燈 光 效 果 。
檔 案 下 載 : lesson12_lighshow.zip
最 後 ,又 是 功 課 時 間 。
1. 試 把 燈 光 效 果 改 變 為 不 是 隨 機 的 ;
2. 試 把 一 首 自 己 喜 愛 的 歌 曲 改 編 為 一 個 light show。