在 上 一 課 ,我 們 學 會 了 如 何 使 用 Arduino 的 digital pin 作 為 output,非 常 的 容 易 。這 一 次 ,我 們 增 加 一 點 點 難 度 ,嘗 試 把 digital pin 變 為 input。
這 次 我 們 使 用 的 電 子 零 件 ,叫 做 tactile switch,又 叫 push button,是 開 關 ( switch ) 的 其 中 一 種 。在 電 路 裡 面 ,開 關 的 功 能 就 是 閉 合 和 斷 開 電 路 。電 路 要 閉 合 時 ,才 會 有 電 流 流 動 。電 路 中 的 開 關 分 為 兩 大 類 ,toggle switch 和 momentary switch。Push button 就 是 屬 於 momentary switch。
這 類 輕 觸 式 按 鈕 開 關 ,一 般 會 有 四 隻 腳 。四 隻 腳 會 分 成 兩 組 ,每 組 自 己 本 身 都 會 通 電 的 。而 當 按 鈕 按 下 ,就 四 隻 腳 都 會 通 電 。而 一 放 手 ,又 會 回 復 到 分 成 兩 組 的 狀 態 。
輕 觸 式 按 鈕 開 關 有 大 有 小 ,有 些 可 以 加 上 鍵 帽 。如 果 是 給 孩 子 玩 ,個 人 建 議 按 鈕 可 以 買 大 一 點 的 ,再 加 上 大 一 點 的 鍵 帽 ,按 起 來 會 舒 服 很 多 。
Tactile button 的 大 小 是 按 mm 算 的 ,常 見 是 6 x 6mm,一 般 我 會 買 大 一 點 12 x 12mm 的 。不 管 是 那 一 個 大 小 ,Tactile button 都 可 以 直 接 插 在 麵 包 板 上 使 用 ,方 便 得 很 。Tactile button 通 常 會 有 圓 形 和 正 方 形 的 顏 色 鍵 帽 ,鍵 帽 上 面 可 以 再 加 透 明 帽 蓋 。
讓 我 們 先 按 照 下 圖 建 立 我 們 這 一 課 要 用 的 電 路 。
LED 還 是 照 舊 接 在 Pin 13。至 於 新 的 Tactile button,接 法 有 點 特 別 ,可 能 不 是 那 麼 的 直 觀 。Tactile button 有 四 個 pin,在 同 一 邊 ,相 鄰 的 兩 個 pin 是 不 通 的 ,但 在 對 邊 ,跟 自 己 成 一 直 線 的 兩 個 pin,則 是 互 通 的 ( A-B 是 通 的 ,C-D 是 通 的 )。
我 們 先 把 tactile button 的 其 中 一 pin ( pin A ) 接 到 Arduino UNO 的 Pin2,我 們 以 Pin 2 作 為 我 們 的 input pin。為 了 在 沒 有 按 鍵 的 狀 態 給 Pin 2 一 個 LOW 的 信 號 ,我 們 要 把 Tactile button 相 連 的 那 一 pin ( pin B ) 接 到 GND。而 Tactile button 的 另 一 邊 ( pin D ),我 們 要 連 接 到 5V,於 是 ,當 按 鍵 被 按 下 ,Pin 2 就 會 接 收 到 一 個 HIGH 的 信 號 。
以 上 的 這 一 個 設 置 ,pin B 接 地 的 時 候 必 須 要 加 上 一 個 電 阻 ,以 防 止 按 鈕 時 短 路 ,燒 毀 Arduino。我 們 這 樣 以 一 個 電 阻 把 input pin 在 沒 有 輸 入 時 接 地 的 接 駁 方 法 ,那 個 電 阻 ,就 叫 做 pull down resistor。
建 立 好 電 路 之 後 ,讓 我 們 看 看 程 式 的 部 分 。
在 程 式 裡 ,我 們 建 立 了 一 個 無 限 循 環 。在 循 環 裡 面 ,我 們 不 停 去 檢 查 pin 2 的 值 。如 果 訊 號 是 HIGH 的 話 ,它 就 會 傳 回 True。如 果 是 LOW,它 就 會 傳 回 False。我 們 用 一 個 if block 去 判 斷 ,如 果 True,就 點 亮 pin 13 的 LED,如 果 False,就 熄 滅 之 。
完 成 程 式 之 後 就 按 Upload to Arduino。完 成 之 後 ,當 你 按 下 電 路 中 的 按 鍵 ,LED 燈 就 會 亮 起 。當 你 放 手 ,LED 就 會 熄 滅 。
在 前 面 的 例 子 ,我 們 把 input pin 接 到 ground,中 間 加 一 個 pull down resistor。其 實 ,做 input 還 有 另 外 一 種 接 法 的 ,且 看 下 圖 。
第 二 個 接 法 ,我 們 會 把 pin 2 在 沒 有 按 鍵 的 時 候 接 到 5V / 3.3V,令 input pin 長 期 處 於 一 個 HIGH 的 訊 號 。而 Tactile button 的 另 一 邊 ,我 們 會 接 地 。於 是 ,當 按 鍵 按 下 時 ,pin 2 就 會 接 地 而 令 訊 號 變 成 LOW。在 這 個 方 法 ,我 們 把 電 阻 連 接 到 高 電 壓 的 一 邊 ,所 以 這 個 電 阻 就 叫 做 pull up resistor。
在 第 二 種 接 法 ,亦 即 是 使 用 pull up resistor 的 接 法 ,HIGH 和 LOW 的 訊 號 會 和 之 前 相 反 。所 以 ,我 們 的 程 式 亦 要 作 出 相 應 的 調 整 。在 pull up 的 接 法 ,不 按 鍵 時 是 True ( HIGH ),按 鈕 時 才 是 False ( LOW )。
雖 然 按 鈕 的 接 法 不 同 ,程 序 也 不 同 ,但 最 後 用 起 來 是 完 全 一 樣 的 。按 鍵 時 LED 會 亮 著 ,放 手 時 LED 會 熄 滅 ,大 家 不 要 搞 錯 了 。
就 這 樣 ,你 便 學 識 了 如 何 用 Tactile button 在 Arduino 上 面 做 input,而 且 仲 係 兩 種 唔 同 的 方 法 ,係 唔 係 好 開 心 呢 ?現 在 ,大 家 可 以 用 按 鈕 來 嘗 試 觸 發 不 同 的 事 件 。( 功 課 :1. 按 鍵 時 LED 閃 動 ,不 按 鈕 時 LED 熄 滅 ;2. 使 用 兩 顆 LED,按 鍵 時 A 亮 B 滅 ,不 按 鍵 時 A 滅 B 亮 ; 3. 使 用 兩 顆 LED 和 兩 個 按 鈕 ,按 A 鍵 時 LED A 亮 ,按 B 鍵 時 LED B 亮 。)
pull up 和 pull down 兩 種 方 法 ,究 竟 那 一 個 比 較 好 呢 ?個 人 覺 得 應 該 是 沒 有 差 別 的 。但 基 於 某 種 神 秘 原 因 ( 也 許 是 歷 史 遺 留 的 原 因 ? ),在 現 實 世 界 ,pull up 是 比 pull down 常 見 許 多 許 多 的 。
甚 至 乎 ,Arduino 使 用 的 ATmega328p 晶 片 ,本 身 就 內 建 了 20K pull up resistor 可 供 input pin 使 用 。在 Arduino IDE,我 們 只 要 設 定 pinMode 為 INPUT_PULLUP 就 可 以 直 接 使 用 ,連 接 按 鈕 和 其 他 sensor 就 簡 單 得 多 。
pinMode( pin , INPUT ); // 不 使 用 internal pull up resistor
pinMode( pin , INPUT_PULLUP ); // 啟 用 internal pull up resistor
不 過 ,可 惜 的 是 ,mBlock 並 沒 有 供 我 們 啟 用 internal pull up resistor 的 選 項 ,我 們 還 是 乖 乖 的 自 行 外 接 pull up 又 或 者 pull down resistor 吧 。
Arduino 的 documentation 建 議 我 們 使 用 10KΩ 的 電 阻 ,作 為 pull up 或 者 pull down resistor。