這 一 課 我 最 後 要 講 的 是 一 個 2-digit-display。它 的 接 法 比 較 特 別 ,它 是 由 兩 組 獨 立 的 電 路 組 成 ,每 一 組 電 路 都 是 一 個 單 位 的 七 段 數 碼 管 ,和 一 個 74HC595 移 位 暫 存 器 。所 以 ,整 個 2-digit-display 就 有 兩 個 數 碼 管 ,和 兩 個 74HC595。
如 果 大 家 仍 然 記 得 《第 七 課 》的 內 容 ,我 的 這 個 2-digit-display,其 實 就 是 串 接 了 兩 個 第 七 課 的 例 子 。這 亦 是 其 中 一 個 74HC595 很 好 玩 的 地 方 — 就 是 我 們 可 以 把 很 多 74HC595 一 個 接 一 個 地 串 聯 下 去 ,但 連 接 Arduino 的 依 舊 只 需 要 3 根 接 線 ( 這 叫 daisy chain )。
上 面 的 2-digit-display 正 正 就 運 用 了 74HC595 的 這 個 特 性 ,在 電 路 板 上 就 串 聯 了 兩 個 74HC595。而 它 除 了 左 邊 的 5 個 輸 入 之 外 ( 其 中 兩 根 是 電 源 5V 和 GND ),右 邊 也 有 5 個 輸 出 ,這 是 方 便 你 再 串 聯 另 一 個 2-digit-display 的 。就 這 樣 ,你 就 可 以 一 直 串 聯 下 去 ,組 成 一 個 十 位 ,甚 至 百 位 的 數 碼 管 顯 示 器 。
使 用 74HC595 串 接 單 位 數 碼 管 還 有 一 個 好 處 ,就 是 它 是 「靜 態 」的 多 位 數 碼 管 顯 示 。有 別 於 multiplexed 數 碼 管 ( 動 態 數 碼 管 ) 同 一 時 間 只 能 顯 示 出 其 中 一 位 數 字 ,「靜 態 」的 數 碼 管 顯 示 器 可 以 同 時 間 顯 示 所 有 位 數 的 數 字 ,我 們 便 不 需 要 頻 繁 地 刷 新 顯 示 器 。
還 記 得 在 《第 七 課 》教 過 ,我 們 是 一 次 過 把 8 個 bit 的 訊 號 ( 例 如 11001100 ) 傳 送 到 74HC595,然 後 它 會 把 轉 變 為 平 行 輸 出 訊 號 從 而 控 制 數 碼 管 上 面 的 數 字 顯 示 。如 果 串 聯 了 兩 個 74HC595 又 要 如 何 控 制 呢 ?非 常 簡 單 的 ,我 們 只 要 一 次 過 發 16 個 bit 的 訊 號 ,當 第 一 個 74HC595 接 到 多 餘 的 訊 號 時 ,就 會 自 動 的 把 多 餘 的 訊 號 傳 到 下 一 個 74HC595。就 這 樣 ,兩 個 74HC595 都 會 各 自 接 收 到 自 己 需 要 的 8 個 bit 的 訊 號 。
好 了 ,理 論 課 就 此 打 住 ,回 到 我 們 的 mBlock extension 吧 。要 寫 extension,我 們 便 要 先 找 到 Arduino 的 library,但 是 ….,恭 喜 你 ,這 個 2-digit-display 是 沒 有 library 的 。為 什 麼 ?!
答 案 很 簡 單 ,因 為 它 太 容 易 用 了 。因 為 Arduino IDE 本 身 就 內 建 了 對 74HC595 的 支 援 ,所 以 在 Arduino IDE 我 們 只 需 要 幾 行 程 式 碼 就 可 以 控 制 好 2-digit-display 的 了 。雖 然 我 們 可 以 像 《第 七 課 》一 樣 ,寫 個 很 複 雜 的 custom block 去 使 用 2-digit-display,但 如 果 有 一 個 簡 單 易 用 的 extension 就 當 然 更 好 了 。
由 於 沒 有 現 成 的 library,所 以 這 一 次 的 header 檔 和 source 檔 ( *.h 檔 和 *.cpp 檔 ) 就 要 我 自 己 寫 了 。其 實 也 沒 有 什 麼 難 的 ,就 是 用 C++ 寫 一 個 class,再 寫 幾 條 很 簡 單 的 custom function。這 個 library 做 的 ,就 是 把 使 用 者 輸 入 的 數 據 ,用 Arduino 本 身 的 shiftOut() function 發 送 出 去 。有 興 趣 的 讀 者 自 己 看 source code 吧 ( 就 在 src 目 錄 裡 面 ),很 簡 單 的 。
寫 好 了 library,就 開 始 寫 *.s2e 檔 。其 實 和 前 面 兩 課 講 的 一 樣 ,反 而 因 為 沒 有 許 多 fancy 功 能 而 簡 單 了 許 多 。我 把 這 個 extension 命 名 為 TwoDigitDisplay,其 他 資 訊 都 是 隨 意 。
這 個 extension 只 有 2 個 block,第 一 個 block 是 初 始 化 的 block,我 叫 它 做 setup。在 初 始 化 extension 的 時 候 ,我 們 要 使 用 者 輸 入 latch pin,clock pin 和 data pin 的 pin number。
第 二 個 積 木 ,就 是 顯 示 數 字 的 積 木 。
除 了 給 使 用 者 輸 入 要 顯 示 的 數 值 之 外 ,我 們 還 可 以 用 它 來 設 置 小 數 點 的 位 置 。0 就 是 不 顯 示 ,1 就 顯 示 在 第 1 位 ,2 就 顯 示 在 第 2 位 。
我 為 pin number 和 dot 這 兩 個 輸 入 都 增 加 了 選 單 ,以 方 便 使 用 者 輸 入 。這 個 部 分 就 在 menus 裡 面 。
mBlock extension 下 載 : TwoDigitDisplay.zip
修 改 好 之 後 ,我 們 就 可 以 把 整 個 folder 壓 縮 成 一 個 zip 檔 ,然 後 就 加 入 到 mBlock 當 中 。( Extensions >> Manage Extensions >> 按 下 Add Extension )
新 增 好 之 後 ,我 們 當 然 就 要 第 一 時 間 寫 個 小 程 式 去 測 試 一 下 新 的 積 木 了 。
一 切 無 誤 ,可 以 收 工 。
延 伸 閱 讀 :
1. Writing a Library for Arduino ;
2. Create Extensions for mBlock ;
3. Getting Start with mBlock (PDF) ;
4. The Programing Structure of an Arduino Sketch ;
5. Arduino – Wire Library ( I2C ) ;
6. Arduino Playground – I2C Scanner ;
7. Daisy chain (electrical engineering) ;