好 了 ,怎 麼 還 是 講 seven-segment display 呢 ?因 為 它 還 有 一 種 玩 法 ,就 是 用 seven-segment display driver。筆 者 手 頭 上 就 有 一 個 4 位 時 鐘 顯 示 的 數 碼 管 模 塊 ,它 使 用 了 TM1637 數 碼 管 控 制 晶 片 。這 個 專 門 的 控 制 晶 片 ,比 上 一 堂 我 們 使 用 過 的 shift register 更 利 害 ,只 要 兩 根 接 線 ,就 可 以 控 制 整 個 4 位 數 碼 管 。
除 了 可 以 少 用 很 多 接 線 之 外 ,購 買 這 一 類 的 模 塊 ,都 會 附 有 廠 家 開 發 的 library,可 以 大 大 簡 化 我 們 寫 程 式 的 部 分 。以 我 的 那 個 四 位 數 碼 管 為 例 ,下 載 回 來 的 Arduino library 就 像 下 面 這 個 樣 子 。
要 使 用 的 話 ,亦 很 簡 單 。在 Arduino IDE 裡 面 ,只 要 把 library include 入 去 我 們 的 project ,然 後 直 接 使 用 library 裡 面 的 function 就 可 以 了 。
在 mBlock 裡 面 ,要 使 用 別 人 提 供 的 library 的 話 ,我 們 要 先 把 它 轉 變 為 mBlock 專 用 的 Extension。這 部 分 如 果 你 有 一 點 點 寫 Arduino Programming Language 的 經 驗 的 話 ,其 實 亦 唔 係 好 難 ,以 後 有 機 會 才 再 教 大 家 吧 。下 面 是 我 改 好 了 的 extension。
檔 案 下 載 ( mBlock Extension for Digital Tube, Arduino Mode ONLY ): DigitalTube.zip
如 何 在 mBlock 安 裝 extension 呢 ?超 級 簡 單 的 。
首 先 在 menu 選 取 Extensions > Manage Extensions。
然 後 按 Add Extension。
先 在 「檔 案 類 型 」選 擇 zip file,再 選 剛 才 下 載 的 DigitalTube.zip,再 按 「open」。
完 成 之 後 ,重 啟 mBlock。然 後 在 Extensions 裡 面 ,應 該 會 見 到 新 增 的 DigitalTube,勾 選 它 便 可 以 使 用 它 了 。
現 在 再 去 Robots 分 類 ,就 可 以 見 到 多 了 3 個 新 的 blocks 了 。
好 吧 ,先 建 立 這 一 課 要 使 用 的 電 路 。因 為 直 接 使 用 模 塊 ,少 了 許 多 接 線 ,所 以 線 路 簡 單 了 不 少 。
基 本 上 ,使 用 TM1637 的 模 塊 ,就 只 有 四 隻 腳 ,分 別 是 Vcc ( 供 電 ,接 5V ),GND ( 接 地 ),CLK pin 和 DIO pin。CLK 和 DIO 你 喜 歡 接 Arduino 的 任 何 一 個 digital pin 都 可 以 的 。在 上 例 中 ,我 的 CLK 接 了 pin 6,DIO 接 了 pin 5。
另 外 ,我 加 了 一 個 push button 在 這 一 課 的 最 後 做 counter ( 計 數 器 ) 之 用 。
完 成 電 路 之 後 ,我 們 回 到 mBlock 試 玩 一 下 我 們 的 新 積 木 吧 。
首 先 ,一 開 始 ,我 們 必 須 要 用 Set CLK pin x DIO pin x blcok 來 設 定 好 CLK pin 和 DIO pin。Set Display Brightness x 就 是 用 來 調 較 光 暗 的 ,0 為 最 暗 ,7 為 最 亮 。
Display Number x at Digit_X block 則 可 以 把 數 字 x 顯 示 在 數 碼 管 的 第 幾 位 。你 也 許 會 覺 得 這 個 block 好 奇 怪 ,但 因 為 這 是 廠 家 的 library,我 也 只 是 「照 抄 」的 。
上 面 的 程 序 執 行 之 後 ,就 會 以 不 同 的 亮 度 去 顯 示 0000, 1111, 2222, 3333,很 簡 單 吧 ?
我 們 可 以 自 己 寫 個 Make a Block 來 進 一 步 簡 化 library 的 使 用 。
displayNumber 直 接 計 算 出 輸 入 數 值 的 第 1, 2, 3 和 4 位 數 的 數 字 ,然 後 用 四 個 display Number x AT Digit_X 來 顯 示 。
大 家 可 以 比 較 一 下 第 六 課 和 第 七 課 的 程 式 碼 ,同 樣 是 顯 示 一 個 數 字 ,是 不 是 簡 單 了 超 多 呢 ?每 個 數 字 唔 洗 我 地 自 己 去 「編 碼 」,又 唔 洗 去 不 停 循 環 顯 示 ,又 唔 洗 去 理 會 鬼 影 ,連 調 軷 光 暗 都 唔 洗 自 己 寫 。這 其 實 是 因 為 用 了 TM1637 這 種 專 用 的 數 碼 管 driver,它 代 替 我 們 處 理 了 大 量 的 相 關 工 作 。當 然 ,廠 方 的 library 寫 得 好 唔 好 用 ,亦 是 另 一 個 重 點 。
好 ,現 在 我 們 加 一 點 變 化 ,做 個 數 字 流 動 的 效 果 。
Upload 到 Arduino 之 後 ,就 會 見 到 數 字 0123456789 不 停 由 右 向 左 移 動 。好 玩 吧 ?
好 了 ,再 看 看 加 了 push button 又 如 何 。
同 之 前 兩 課 一 樣 ,我 們 用 變 數 buttonState 和 lastButtonState 去 記 錄 按 鍵 狀 態 的 變 化 ,如 果 有 人 按 動 按 鈕 ,變 數 counter 就 會 加 1,然 後 就 用 displayNumber 把 新 的 counter 顯 示 出 來 。
做 完 全 相 同 的 事 ,但 我 們 可 以 寫 少 90% 的 程 式 碼 ,這 就 是 使 用 模 塊 式 的 電 子 零 件 的 優 勢 了 。有 了 模 塊 和 library,我 們 可 以 省 回 很 多 開 發 的 時 間 ,小 朋 友 可 以 集 中 精 力 去 寫 他 們 喜 歡 寫 的 東 西 。
本 課 的 例 子 都 很 短 ,就 不 放 出 來 給 大 家 了 。又 到 了 功 課 時 間 :1. 試 試 把 之 前 兩 課 ( 第 七 課 和 第 八 課 ) 的 例 子 ,用 這 一 課 教 的 方 法 重 做 出 來 吧 。
雖 然 有 Arduino library 的 模 塊 是 非 常 非 常 的 多 ,但 Arduino library 始 終 不 是 mBlock extension。如 果 想 學 習 如 何 自 己 寫 mBlock extensions 的 話 ,可 以 參 考 mBlock 的 官 方 文 件 。
但 如 果 你 真 係 唔 識 ,又 或 者 唔 想 寫 ,開 發 mBlock 的 公 司 Makeblock 也 有 推 出 好 多 不 同 的 模 塊 ,mBlock 直 接 支 援 ,大 家 也 可 以 買 來 玩 玩 。