我 們 初 初 接 觸 Arduino,見 到 市 面 上 可 以 連 接 Arduino 的 sensor、摩 打 、零 件 一 大 堆 ,成 千 上 萬 的 ,究 竟 要 怎 麼 選 呢 ?
首 先 ,我 會 把 所 有 東 西 分 成 兩 大 類 。第 一 類 我 叫 它 們 做 電 子 零 件 ,第 二 類 我 叫 它 們 做 Arduino 模 組 ( modules )。電 子 零 件 就 是 指 一 般 的 電 子 零 件 ( electronic components ),它 們 並 不 是 專 門 為 Arduino 而 設 計 的 ,絕 大 部 分 的 電 子 零 件 並 不 能 單 獨 使 用 ,通 常 都 要 為 它 們 建 立 一 個 簡 單 電 路 ( circuit ),而 建 立 電 路 的 好 幫 手 就 是 麵 包 板 ( breadboard )。
而 Arduino 模 組 呢 ,就 是 專 門 為 Arduino 而 設 計 ,直 接 插 到 Arduino 上 面 就 可 以 使 用 ( 但 為 了 更 方 便 接 駁 ,通 常 都 會 加 一 片 sensor module shield )。模 組 通 常 都 會 是 一 片 小 小 的 電 路 板 ,有 齊 了 電 路 所 需 要 的 各 個 電 子 零 件 ,然 後 會 有 一 個 杜 邦 接 頭 ( DuPont connector ),用 幾 根 杜 邦 接 線 就 可 以 連 接 到 Arduino 上 面 使 用 。
就 咁 講 ,大 家 都 可 能 無 咩 頭 緒 。所 以 下 面 我 會 用 一 個 我 很 喜 歡 的 例 子 ,光 敏 電 阻 ,來 說 明 使 用 電 子 零 件 和 Arduino 模 組 的 分 別 。
光 敏 電 阻 是 利 用 光 電 導 效 應 的 一 種 特 殊 的 電 阻 。它 的 電 阻 值 和 光 線 的 強 弱 有 直 接 關 係 。光 強 度 增 加 ,則 電 阻 值 減 小 ;光 強 度 減 小 ,則 電 阻 值 增 大 。 — 維 基 百 科
光 敏 電 阻 作 為 一 粒 電 子 零 件 ,它 並 不 是 為 Arduino 而 設 計 的 ,所 以 ,為 了 令 到 它 可 以 和 Arduino 一 起 使 用 ,我 們 就 要 自 己 建 立 一 個 簡 單 的 小 電 路 。
上 面 這 個 簡 單 的 電 路 ,應 用 了 Arduino 的 幾 個 特 性 。電 路 使 用 了 Arduino 的 A0 針 腳 來 讀 取 數 據 ,A0 針 腳 是 Arduino 的 Analog Input Pin。Arduino 的 Analog Input Pin 的 運 作 方 式 像 是 一 個 小 型 電 壓 計 ,它 可 以 量 度 0 – 5V 的 電 壓 ,再 經 過 一 個 內 建 的 analog-to-digital (A/D) converter,就 會 將 讀 取 到 的 電 壓 轉 化 成 0 – 1023 的 數 值 。
上 圖 的 電 路 ,也 應 用 了 Arduino 主 板 所 提 供 的 5V 電 源 輸 出 ( 5V 針 腳 和 Gnd 針 腳 ),再 加 上 一 粒 100KΩ 的 電 阻 ,就 組 成 了 一 個 簡 單 的 voltage divider 電 路 。
Voltage divider 電 路 的 輸 出 電 壓 ( V out ),就 是 由 電 路 中 的 兩 個 電 阻 的 比 值 來 決 定 。
這 個 簡 單 的 電 路 使 用 了 Arduino 的 5V 輸 出 作 為 V in,再 用 Arduino 的 Analog input pin 讀 取 V out,簡 簡 單 單 就 令 到 Arduino 可 以 讀 取 得 到 環 境 的 光 暗 度 ( 因 為 Arduino 本 身 唔 係 電 阻 錶 ohmmeter,所 以 係 唔 可 能 直 接 讀 取 到 光 敏 電 阻 的 電 阻 值 )。
在 這 個 電 路 中 ,Z1 就 是 我 們 的 光 敏 電 阻 ,而 Z2 就 是 那 個 100KΩ 的 電 阻 。當 光 照 強 時 ,光 敏 電 阻 的 電 阻 值 ( Z1 ) 就 會 減 少 ,於 是 V out 就 會 越 接 近 V in,即 是 5V。於 是 Arduino 就 會 讀 取 到 較 大 的 數 值 ( 例 如 我 自 己 的 室 內 環 境 ,Arduino 讀 取 到 的 數 值 就 大 概 是 900 左 右 。 )。
而 當 光 照 變 弱 時 ,光 敏 電 阻 的 電 阻 值 ( Z1 ) 就 會 增 加 ,於 是 V out 就 會 下 降 ,於 是 Arduino 讀 取 到 的 數 值 亦 會 下 降 。
有 了 環 境 光 暗 的 讀 數 ,我 們 便 可 以 利 用 它 來 寫 個 小 程 式 ,例 如 自 動 按 照 環 境 光 暗 來 開 關 的 小 夜 燈 。
上 圖 的 程 式 很 簡 單 ,如 果 光 照 強 度 低 於 700,就 會 把 連 接 到 digital pin 13 的 LED 亮 著 ( 亦 即 是 Arduino 主 板 內 建 的 「L」LED );而 當 光 照 強 度 回 復 到 700 或 以 上 時 ,LED 就 會 熄 滅 。如 果 控 制 內 建 的 「L」LED 唔 夠 過 癮 ,懂 電 工 的 大 朋 友 們 亦 可 以 在 數 位 針 腳 13 加 個 繼 電 器 模 組 ,去 控 制 一 個 燈 泡 ,甚 至 乎 一 個 座 地 燈 、書 枱 燈 。
好 ,玩 完 電 子 零 件 了 ,那 換 成 Arduino 模 組 又 如 何 呢 ?
最 簡 單 的 光 敏 電 阻 模 組 就 像 上 面 的 這 一 款 ,基 本 上 只 是 把 我 們 麵 包 板 上 的 電 路 ,照 搬 到 電 路 板 ( PCB,Printed circuit board ) 之 上 。
光 敏 電 阻 模 組 的 接 駁 方 法 亦 是 一 模 一 樣 ,一 根 線 接 5V,一 根 線 接 Gnd,一 根 線 接 Analog Input Pin ( 要 注 意 模 組 上 標 明 的 接 法 ,S = Signal,+ = 5V,- = Gnd,不 要 接 錯 )。仲 可 以 省 回 一 塊 麵 包 板 。
至 於 傳 回 的 讀 數 ,因 為 這 款 光 敏 電 阻 模 組 使 用 了 10kΩ 阻 值 的 電 阻 ,和 我 們 麵 包 板 的 電 路 不 相 同 ,所 以 傳 回 的 讀 數 也 會 有 所 不 同 。換 了 這 款 光 敏 電 阻 模 組 ,相 同 的 室 內 環 境 光 度 ,讀 數 大 概 是 500 左 右 ,所 以 ,小 夜 燈 程 式 也 要 作 出 相 應 的 改 動 。
從 上 面 兩 個 例 子 ,可 以 看 到 使 用 模 組 的 好 處 。我 們 可 以 不 用 自 己 設 計 和 建 造 電 路 ,更 不 用 怕 用 錯 電 子 零 件 和 接 錯 電 路 。模 組 是 為 Arduino 而 設 ,接 上 Arduino 就 用 得 ,比 起 使 用 麵 包 板 是 簡 單 方 便 了 許 多 。
不 過 使 用 電 子 零 件 也 有 好 處 ,通 過 自 己 建 立 電 路 可 以 學 到 更 多 和 電 路 相 關 的 知 識 。而 我 們 也 可 以 自 行 更 換 電 路 上 的 電 子 零 件 ,令 到 電 路 更 切 合 我 們 的 應 用 。用 回 上 面 的 例 子 ,通 過 更 換 不 同 電 阻 值 的 電 阻 ( Z2 ),我 們 可 以 令 電 路 對 某 個 光 照 度 更 加 敏 感 。例 如 室 內 用 的 小 夜 燈 ,和 室 外 用 的 夜 燈 ,就 應 該 使 用 不 同 的 電 阻 。
在 上 面 的 小 夜 燈 程 式 ,有 一 個 用 來 控 制 開 關 的 臨 界 值 ( threshold ),在 第 一 例 是 700,在 第 二 例 是 300。這 個 臨 界 值 ,明 顯 不 是 universal 的 。就 是 同 一 個 小 夜 燈 程 式 ,在 你 家 用 ,和 在 我 家 用 ,這 個 threshold 肯 定 不 同 。意 思 就 是 上 面 這 個 程 式 ,在 每 一 個 運 行 的 地 點 都 要 先 調 較 過 才 能 正 確 運 行 ,這 不 是 很 煩 麼 ?
這 確 實 是 很 煩 的 。所 以 世 界 上 就 有 聰 明 人 ,將 這 個 threshold 轉 移 到 模 組 上 ,讓 我 們 的 程 式 可 以 寫 得 更 簡 單 和 不 需 要 時 常 作 出 改 動 。
上 面 的 這 款 光 敏 電 阻 模 組 的 電 路 ,比 起 我 們 的 麵 包 板 電 路 不 知 道 要 複 雜 了 多 少 倍 。不 過 它 使 用 起 來 卻 相 當 的 簡 單 。相 比 起 之 前 的 光 敏 電 阻 模 組 ,這 個 模 組 只 有 一 個 digital output ( 針 腳 DO )。Digital output 的 意 思 ,就 是 它 只 會 輸 出 0 或 者 1,夠 簡 單 吧 ?
如 果 環 境 光 照 的 強 度 足 夠 ,DO 針 腳 就 輸 出 high ( 1 );如 果 環 境 光 照 未 達 到 足 夠 的 強 度 ,DO 針 腳 就 輸 出 low ( 0 )。我 們 可 以 通 過 模 組 上 面 的 可 變 電 阻 ,去 調 較 感 應 器 的 敏 感 度 。
連 接 方 面 ,因 為 它 只 有 一 個 digital output,所 以 我 們 順 理 成 章 把 它 連 接 到 Arduino 的 digital input 針 腳 。在 上 圖 中 ,我 們 用 了 digital pin 7 作 為 例 子 。
至 於 程 式 方 面 ,因 為 這 款 模 組 是 直 接 輸 出 high 或 者 low,所 以 就 可 以 簡 化 許 多 。如 果 在 程 式 中 讀 取 到 high ( 亦 即 是 1,亦 即 是 true ),即 是 夠 光 ,那 我 們 便 熄 滅 LED 燈 。否 則 ,程 式 就 會 點 亮 LED 燈 。
因 為 我 們 可 以 在 模 組 上 面 直 接 調 較 敏 感 度 ,所 以 這 個 程 式 無 論 去 到 那 個 地 點 應 用 ,都 是 不 需 要 作 出 修 改 的 。
利 害 吧 ?選 一 個 好 的 模 組 ,不 單 止 可 以 不 用 自 己 建 立 電 路 ,更 可 以 連 程 式 都 大 大 簡 化 。不 過 呢 ,其 實 上 面 這 一 款 光 敏 電 阻 模 組 ,都 仲 未 係 最 好 的 。我 自 己 就 會 買 下 面 這 一 種 ,有 4 個 針 腳 的 光 敏 電 阻 模 組 。因 為 它 有 齊 digital output 和 analog output,它 的 用 途 是 最 廣 泛 的 。
Arduino 專 用 的 模 組 好 處 多 多 ,可 以 大 大 節 省 我 們 的 開 發 時 間 。所 以 除 非 你 的 目 的 是 學 習 建 立 電 路 方 面 的 知 識 ,否 則 的 話 還 是 應 該 多 多 使 用 Arduino 的 專 用 模 組 。加 上 很 多 時 候 ,專 用 模 組 更 會 附 帶 Arduino Library,讓 我 們 的 程 式 寫 起 來 更 加 事 半 功 倍 。
不 過 可 惜 的 是 ,Arduino 的 專 用 模 組 其 實 也 沒 有 想 像 的 那 麼 多 。所 以 去 到 後 來 ,如 果 你 自 己 想 要 做 一 些 比 較 特 別 的 project,市 面 上 沒 有 所 需 要 的 module,就 很 可 能 又 要 回 到 用 麵 包 板 自 己 砌 prototype 電 路 的 樣 子 。