到 了 第 六 課 ,我 們 可 以 開 始 學 習 用 Arduino 去 控 制 複 雜 一 點 的 電 子 零 件 。這 一 課 我 們 會 集 中 去 了 解 一 下 seven-segment display。
Seven-segment display ( 七 段 數 碼 管 ) 是 一 種 常 用 於 顯 示 數 字 的 電 子 元 件 。它 的 構 造 非 常 簡 單 ,每 一 個 segment 其 實 就 是 一 顆 LED,所 以 ,要 控 制 它 去 顯 示 數 字 ,和 之 前 我 們 去 控 制 多 顆 LED 是 完 全 一 樣 的 。
通 過 點 亮 ( 和 熄 滅 ) 特 定 位 置 的 LED ( segment ),我 們 就 可 以 顯 示 特 定 的 數 字 ( 以 及 某 些 英 文 字 母 )。
Seven-segment display 會 把 由 外 圍 到 中 間 標 示 為 A 至 G 一 共 7 個 部 分 ,每 一 部 分 都 是 一 顆 LED 可 以 獨 立 發 光 。現 在 買 得 到 的 七 段 數 碼 管 ,大 多 數 都 會 附 有 小 數 點 的 ,它 也 是 獨 立 的 一 顆 LED,一 般 就 叫 做 DP ( decimal point )。
每 顆 LED 都 有 兩 隻 腳 ,分 別 是 正 極 和 負 極 。但 七 段 數 碼 管 都 不 會 有 齊 16 隻 腳 的 ,因 為 它 們 都 會 把 所 有 負 極 接 在 一 起 ,又 或 者 將 所 有 正 極 接 在 一 起 。
把 全 部 負 極 接 在 一 起 的 ,就 叫 「共 陰 數 碼 管 」( common cathode ),而 把 所 有 正 極 接 在 一 起 的 ,就 叫 「共 陽 數 碼 管 」( common anode )。
上 圖 是 一 個 典 型 的 共 陽 數 碼 管 的 接 駁 方 法 。雖 然 9 pin 就 足 夠 ,但 按 照 一 般 電 子 零 件 的 慣 例 ,數 碼 管 都 會 補 足 10 個 pin 的 。當 中 pins 3 和 8 都 是 正 極 ,其 他 8 個 pins 就 分 別 控 制 A 至 G 和 DP。
先 按 上 圖 建 立 我 們 這 一 課 用 的 電 路 。首 先 ,把 一 個 共 陽 數 碼 管 接 到 Arduino UNO:數 碼 管 的 pins 3 或 8 接 到 5V,然 後 其 他 8 個 pins 分 別 接 到 Arduino digital pins 6 – 13。然 後 ,再 把 兩 個 push button 以 pull down resistor 的 接 法 分 別 接 到 digital pins 的 2 和 3,作 為 稍 後 輸 入 之 用 。
要 記 得 ,Arduino 有 自 己 的 pin number,數 碼 管 ( 以 及 其 他 電 子 零 件 ) 亦 有 自 己 的 pin number。有 時 大 家 溝 通 的 時 候 ,最 好 說 清 楚 一 點 。例 如 說 pin 3,那 究 竟 是 Arduino 的 pin 3 還 是 數 碼 管 的 pin 3 呢 ?
數 碼 管 本 身 一 樣 是 LED,所 以 current limiting resistor 是 不 可 避 免 。每 顆 LED 接 一 個 resistor 才 是 正 確 的 接 法 ,可 以 確 保 每 一 顆 LED 的 亮 度 是 一 樣 。不 同 的 seven-segment display 會 使 用 不 同 的 LED,所 以 resistor 的 電 阻 值 當 然 不 一 樣 。如 果 唔 清 楚 手 頭 上 的 數 碼 管 的 規 格 的 話 ,使 用 300Ω 的 resistor 會 是 一 個 很 安 全 的 做 法 ( 電 阻 用 大 了 ,只 會 令 LED 稍 為 暗 淡 ,不 能 發 揮 最 高 的 亮 度 )。
至 於 push button 的 電 阻 ,則 和 之 前 一 樣 ,用 10KΩ 的 即 可 。
完 成 之 後 就 回 到 mBlock,我 們 先 學 習 如 何 控 制 那 個 數 碼 管 。因 為 我 們 使 用 的 是 共 陽 數 碼 管 ,pin 3 接 了 5V,而 其 他 pins 要 接 地 ,才 會 有 電 流 通 過 ,才 會 亮 起 。所 以 ,我 們 在 程 序 開 始 時 把 所 有 Arduino pins 的 輸 出 都 設 定 成 HIGH,令 到 數 碼 管 熄 滅 。如 果 想 那 一 個 segment 亮 著 ,就 把 相 應 的 pin 設 定 為 LOW 即 可 。
在 這 一 課 ,我 是 不 會 用 到 小 數 點 的 ,所 以 DP ( 亦 即 數 碼 管 的 pin 5 ) 接 不 接 也 可 以 。
按 照 我 們 電 路 圖 的 接 法 ,Arduino 的 pin 6 就 控 制 B,pin 7 就 控 制 A,pin 8 就 控 制 DP,pin 9 就 控 制 C,pin 10 就 控 制 D,pin 11 就 控 制 E,pin 12 就 控 制 G,pin 13 就 控 制 F。
7-segment Display [ Pin Number ] | 7-segment Display [ Segment ] | Arduino UNO [ Pin Number ] |
---|---|---|
7 | A | 7 |
6 | B | 6 |
4 | C | 9 |
2 | D | 10 |
1 | E | 11 |
9 | F | 13 |
10 | G | 12 |
5 | DP | 8 |
3, 8 | Anode ( positive ) | 5V |
如 果 想 顯 示 1,就 是 B 和 C 要 亮 著 ,所 以 是 要 pin 6 和 pin 9 是 LOW,其 他 都 要 HIGH。如 此 類 推 ,就 會 得 出 displayNumber 那 個 Make a Block。
然 後 ,我 在 Arduino Program 加 入 一 個 forever block,每 一 秒 顯 示 一 個 數 字 。然 後 upload 到 Arduino UNO,就 可 以 成 功 在 數 碼 管 顯 示 數 字 了 。
如 果 ,數 碼 管 顯 示 的 數 值 有 錯 誤 ,又 或 者 變 了 亂 碼 ,記 得 要 檢 查 是 不 是 接 線 接 錯 了 、接 漏 了 。另 一 個 可 能 性 是 你 用 的 數 碼 管 和 筆 者 手 上 的 並 不 一 樣 ,你 必 須 要 按 照 你 自 己 的 數 碼 管 的 接 駁 方 法 去 修 改 你 的 程 序 。
如 果 能 夠 成 功 在 數 碼 管 上 顯 示 0 – 9,那 我 們 可 以 進 入 下 一 步 ,加 點 小 變 化 ,令 到 數 碼 管 變 成 一 個 計 數 器 ( counter )。
首 先 ,我 們 接 照 第 四 課 的 方 法 ,加 入 關 於 按 鍵 的 變 數 和 程 式 碼 。這 次 不 同 的 是 我 們 有 兩 個 輕 觸 開 關 ,所 以 我 們 要 有 兩 組 變 數 。當 按 動 接 在 pin 3 的 按 鈕 時 ,counter 會 加 1,當 按 動 接 在 pin 2 的 按 鈕 時 ,counter 會 減 1。
我 另 外 加 入 了 ,如 果 兩 個 按 鈕 同 時 按 下 的 話 ( 兩 者 的 buttonState 都 是 1 ),那 程 序 就 會 reset counter ( 即 set counter = 0 )。
最 後 ,我 在 displayNumber 裡 面 加 入 了 ,如 果 要 顯 示 的 值 不 是 0 – 9,就 顯 示 「E」( 代 表 error )。由 於 displayNumber 太 長 ,截 圖 不 好 顯 示 ,所 以 就 把 程 序 放 出 來 給 大 家 下 載 。
又 到 了 功 課 時 間 。1. 除 了 顯 示 數 字 ,seven-segment display 也 可 以 用 來 顯 示 英 文 字 母 ( 不 是 全 部 )。大 家 試 試 用 seven-segment display 來 循 環 顯 示 「HELLO」吧 。2. 試 把 計 數 器 改 為 16 進 數 。3. 當 計 數 器 的 數 字 超 出 上 限 時 ,自 動 讓 計 數 器 歸 零 。
其 實 用 數 碼 管 是 顯 示 不 了 太 多 訊 息 的 ,為 了 顯 示 更 多 不 同 的 字 母 ,所 以 後 來 又 出 現 了 9-segment,14-segment,16-segment 等 不 同 排 列 的 數 碼 管 。不 過 ,因 為 數 碼 管 1. 唔 夠 液 晶 體 省 電 ,2. 又 唔 夠 點 陣 式 顯 示 屏 能 顯 示 更 多 訊 息 ,所 以 數 碼 管 是 逐 漸 被 淘 汰 了 。( 當 然 ,電 影 裡 面 的 計 時 炸 彈 還 是 經 常 性 使 用 數 碼 管 的 ,呵 呵 )
檔 案 下 載 : lesson06.zip