我的 Stem Project (十二) Arduino Music Light Show

大 家 好 ,想 不 到 用 buzzer 播 歌 仔 也 會 有 回 響 ,那 我 就 把 Multi-function Shield 放 一 旁 ,先 多 做 一 個 同 buzzer 有 關 的 教 學 吧 。

這 一 堂 要 教 的 叫 做 light show,就 是 當 你 播 放 音 樂 的 時 候 ,同 時 增 加 一 個 燈 光 的 效 果 ,就 好 似 演 唱 會 那 些 燈 光 效 果 咁 。同 類 的 作 品 網 上 有 很 多 很 多 ,有 把 LED 燈 做 成 微 縮 舞 台 的 ,也 有 控 制 整 座 別 墅 的 室 外 聖 誕 燈 飾 的 。

我 示 範 的 ,當 然 是 那 些 最 簡 單 最 簡 單 ,你 自 己 不 到 1 小 時 就 能 做 出 來 的 。複 雜 的 那 些 ,就 留 給 大 家 自 己 去 做 了 。

叫 得 Light Show,當 然 要 控 制 LED 燈 ,第 二 課 大 家 就 學 會 了 。這 一 次 加 點 新 意 思 ,教 大 家 如 何 用 Arduino 控 制 16 顆 LED。之 前 的 教 學 ,我 們 都 是 一 顆 LED 連 接 一 個 Arduino UNO 的 digital pin。但 Arduino 能 用 的 針 腳 只 有 12 隻 ,那 要 如 何 做 呢 ?

74HC595-Pinouts

74HC595-Pinouts

心 水 清 的 小 朋 友 ,一 定 想 到 之 前 第 七 課 的 7-segment display 的 控 制 方 法 吧 ?無 錯 ,這 一 次 讓 我 們 只 用 3 個 pins,再 加 2 個 74HC595 shift register,去 控 制 16 顆 LED

Lesson 12 - circuit

Lesson 12 – circuit

在 第 七 課 ,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,測 試 一 下 我 們 的 新 電 路 。

Lesson 12 - Scratch 01

Lesson 12 – Scratch 01

在 上 例 中 ,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 的 資 料 又 要 如 何 做 呢 ?其 實 亦 非 常 簡 單 ,且 看 下 例 。

Lesson 12 - Scratch 02

Lesson 12 – Scratch 02

在 例 子 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 ),所 以 每 一 秒 都 會 變 換 一 個 隨 機 的 燈 光 效 果 。

Lesson 12 - Star War Light Show

Lesson 12 – Star War Light Show

把 上 面 所 學 ,和 第 九 課 的 Star War 主 題 音 樂 結 合 在 一 起 ,就 會 像 上 面 的 樣 子 。我 們 在 playTone block 裡 面 ,每 播 放 一 個 音 符 之 前 ,都 用 亂 數 隨 機 顯 示 一 個 燈 光 效 果 。

檔 案 下 載 :   lesson12_lighshow.zip

最 後 ,又 是 功 課 時 間 。
1. 試 把 燈 光 效 果 改 變 為 不 是 隨 機 的 ;
2. 試 把 一 首 自 己 喜 愛 的 歌 曲 改 編 為 一 個 light show。

ctleung張 先 生 ,男 性 ,肖 龍 。
職 業 :I.T. Consultant
簡 介 :不 好 好 讀 書 ;七 尺 差 五 寸 ,手 長 過 膝 ,雙 耳 垂 肩 ;性 寬 和 ,寡 言 語 ,喜 怒 不 形 於 色 。據 說 少 時 曾 斬 白 蛇 於 鳳 凰 山 下 ……
Posted in STEM | Tagged , , , , , , , , , , | Leave a comment

我的 Stem Project (十一) Arduino Multi-function Shield using Scratch (2)

上 一 課 就 說 了 ,還 有 兩 個 sensor blocks 未 講 ,留 給 今 堂 。Multi-Function Shield 預 留 了 一 個 專 用 的 接 口 給 LM35,LM35 的 data pin 是 接 到 Arduino UNO 的 A4 pin。

LM35 是 一 種 很 常 見 ,使 用 T0-92 封 裝 的 溫 度 感 應 晶 片 。它 特 別 的 地 方 在 於 它 輸 出 的 電 壓 ,和 攝 氏 溫 度 成 正 比 的 關 係 ,0 mV = 0 ℃,1000 mV ( 1V )  = 100 ℃。所 以 它 很 受 喜 歡 顯 示 攝 氏 度 的 用 家 歡 迎 。

而 用 在 Arduino 上 ,因 為 Arduino 的 Analog Input 是 0V – 5V,1024 級 ,所 以 一 般 我 們 都 會 作 如 下 處 理 。

temp = (5.0 * analogRead(tempPin) * 100.0) / 1024;

有 了 HackatronicsMulti-function Shield 的 library,所 有 麻 煩 事 ,當 然 唔 洗 我 地 計 。而 且 ,library 還 做 了 一 重 過 濾 ,令 到 輸 出 的 數 值 更 加 平 穩 。

Arduino + LM35

Multi-function Shield + LM35

LM35 一 定 要 按 上 圖 的 方 法 插 ,不 要 插 反 了 ,而 且 要 移 除 ( 即 斷 開 )  Jumper J1。據 Hackatronics 文 章 說 ,如 果 插 反 了 ,是 有 機 會 弄 壞 Arduino Board 的 ,切 記 切 記 。

LM35

Multi-function Shield + LM35 (2)

接 好 了 sensor,我 們 就 可 以 回 到 mBlock 看 看 可 以 如 何 使 用 它 。如 果 未 安 裝 好 mBlock Multi-function Shield extension 的 朋 友 們 ,可 以 參 考 上 一 課 的 教 學 。

Lesson 10 - Termometer

Lesson 10 – Termometer

有 了 Hackatronics Library 的 加 持 ,使 用 上 當 然 相 當 的 簡 單 。只 要 用 get LM35 temperature block,就 可 以 得 到 LM35 感 測 的 溫 度 ,不 過 Hackatronics library 的 單 位 比 較 奇 特 ,是 0.1 ℃,所 以 ,我 們 要 把 得 出 的 數 值 除 以 10,才 顯 示 出 來 。顯 示 溫 度 的 時 候 ,我 們 設 定 為 顯 示 1 位 小 數 。

第 二 個 sensor 積 木 ,則 要 配 合 超 聲 波 測 距 模 塊 來 使 用 。

現 時 坊 間 的 Ultrasonic sensor,都 是 以 HC-SR04 為 主 。Hackatronics 的 library 就 是 以 這 個 模 塊 來 編 寫 的 。話 雖 如 此 ,但 畢 竟 還 是 有 其 他 超 聲 波 模 塊 ,外 觀 上 也 非 常 之 類 似 ,所 以 大 家 購 買 時 要 留 意 ,唔 好 買 錯 了 。

HC-SR04 有 四 個 接 腳 ,Vcc 是 供 電 ,GND 是 接 地 。另 外 兩 pins 分 別 是 Trigger pin 和 Echo pin。這 兩 個 pins 可 以 接 到 Arduino UNO 上 面 的 任 何 digital 接 腳 ,Trigger pin 要 設 定 為 輸 出 ( output pin ),Echo pin 就 要 設 定 為 輸 入 ( input pin )。

Ultrasonic Sensor Equations

Ultrasonic Sensor Equations

超 聲 波 模 塊 測 量 距 離 的 原 理 ,是 當 你 在 Trigger pin 輸 出 一 個 訊 號 ,Ultrasonic sensor 就 會 發 射 一 個 40 kHz 的 超 聲 波 ( 超 聲 波 一 樣 是 聲 波 ,只 是 超 出 人 耳 聽 到 的 範 圍 )。當 超 聲 波 遇 到 障 礙 物 時 ,便 會 反 彈 ,當 Sensor 收 到 反 彈 的 訊 號 ,就 會 通 過 Echo pin 來 通 知 我 們 。

由 於 聲 音 在 空 氣 中 傳 播 的 速 率 是 很 固 定 的 ( 此 速 度 被 稱 為 音 速 ,大 概 是 每 秒 340 米 ),所 以 我 們 可 以 通 過 計 算 超 聲 波 來 回 的 時 間 ,算 出 物 件 的 距 離 。

Lesson 10 - Rangefinder

Lesson 10 – Rangefinder

因 為 使 用 了 Hackatronics library,上 面 所 有 的 算 式 ,當 然 就 與 我 們 無 緣 了 。要 得 出 距 離 ,我 們 只 要 使 用 get SONAR Distance TrigPin X EchoPin Y block 就 可 以 了 。而 它 會 傳 回 以 cm 為 單 位 的 整 數 距 離 。

Multi-function shield and HC-SR04

Multi-function shield and HC-SR04

在 上 面 的 例 子 中 ,每 按 一 次 BTN_1,就 會 測 一 次 距 離 ,而 傳 回 的 數 值 就 會 顯 示 在 4 位 數 碼 管 上 。為 了 讓 使 用 者 知 道 自 己 按 了 鍵 ,所 以 按 鍵 時 亦 會 beep 一 聲 。

Multi-Function Shield

Multi-Function Shield

Multi-function Shield 本 身 就 佔 用 了 很 多 針 腳 ,最 後 有 飛 線 出 來 外 接 其 他 模 塊 的 接 腳 就 只 有 pins 5, 6 和 9 了 。所 以 ,get SONAR Distance block 亦 只 可 以 選 擇 pins 5, 6 和 9 了 。

compare

其 實 mBlock 本 身 亦 內 建 了 read ultrasonic sensor block 的 ,我 們 也 可 以 用 用 看 ,比 較 hackatronics 的 library 和 mBlock 的 library 究 竟 那 一 個 比 較 好 。

Lesson 11 - Scratch 03

Lesson 11 – Compare Library

上 例 我 們 應 用 了 Multi-function Shield 有 多 個 按 鍵 的 特 性 ,按 BTN_1 就 使 用 Hackatronics 的 library,按 BTN_2 則 用 回 mBlock 本 身 的 library。值 得 一 提 的 是 ,hacktronics 是 傳 回 正 整 數 的 ,但 mBlock 卻 是 傳 回 floating number,我 們 正 好 運 用 Display Number block 的 Decimal Point 功 能 ,把 mBlock 傳 回 來 的 floating number 四 捨 五 入 到 一 位 小 數 。

用 了 上 面 的 程 序 ,我 們 可 以 很 方 便 地 在 完 全 相 同 的 位 置 ,分 別 用 兩 套 library 來 進 行 測 距 。按 照 我 個 人 的 情 況 ,在 HC-SR04 Ultrasonic Sensor 這 一 部 分 ,是 mBlock 比 較 好 用 ,而 且 測 出 來 的 距 離 也 比 較 精 準 。

distance

我 的 Ultrasonic Range Finder

只 要 幾 行 程 式 碼 ,就 可 以 將 你 的 Arduino 變 成 電 子 溫 度 計 和 數 碼 測 距 儀 ,係 唔 係 好 滿 足 呢 ?

最 後 又 是 功 課 時 間 。
1. 試 把 電 子 溫 度 計 的 程 序 ,棄 用 wait block 而 改 用 timer block;
2. 在 按 動 BTN_1 時 ,把 溫 度 的 單 位 轉 變 為 華 氏 度 ( ℉  ) ,再 按 一 次 又 轉 變 回 攝 氏 度 ( ℃ )。
3. 試 從 你 的 超 聲 波 模 塊 的 說 明 文 件 ,找 出 該 模 塊 的 可 以 探 測 的 距 離 範 圍 ,和 精 準 度 ;
4. 根 據 問 題 3 的 答 案 ,找 出 3 個 合 適 的 距 離 ,來 測 量 你 自 己 的 測 距 儀 的 誤 差 有 多 少 ;
5. 按 照 問 題 4 測 量 出 來 的 誤 差 ,去 修 正 你 自 己 的 mBlock 程 序 。

參 考 資 料 :
Arduino Playground – LM35 Higher Resolution

Arduino – Ping
Arduino Playground – NewPing Library
HC-SR04: tests on accuracy, precision and resolution of ultrasonic measurement

 

ctleung張 先 生 ,男 性 ,肖 龍 。
職 業 :I.T. Consultant
簡 介 :不 好 好 讀 書 ;七 尺 差 五 寸 ,手 長 過 膝 ,雙 耳 垂 肩 ;性 寬 和 ,寡 言 語 ,喜 怒 不 形 於 色 。據 說 少 時 曾 斬 白 蛇 於 鳳 凰 山 下 ……
Posted in STEM | Tagged , , , , , , , , , , , , , , , | Leave a comment