上 一 課 就 說 了 ,還 有 兩 個 sensor blocks 未 講 ,留 給 今 堂 。Multi-Function Shield 預 留 了 一 個 專 用 的 接 口 給 LM35,LM35 的 data pin 是 接 到 Arduino UNO 的 A4 pin。
LM35 是 一 種 很 常 見 ,使 用 T0-92 封 裝 的 溫 度 感 應 晶 片 。它 特 別 的 地 方 在 於 它 輸 出 的 電 壓 ,和 攝 氏 溫 度 成 正 比 的 關 係 ,0 mV = 0 ℃,1000 mV ( 1V ) = 100 ℃。所 以 它 很 受 喜 歡 顯 示 攝 氏 度 的 用 家 歡 迎 。
而 用 在 Arduino 上 ,因 為 Arduino 的 Analog Input 是 0V – 5V,1024 級 ,所 以 一 般 我 們 都 會 作 如 下 處 理 。
temp = (5.0 * analogRead(tempPin) * 100.0) / 1024;
有 了 Hackatronics 的 Multi-function Shield 的 library,所 有 麻 煩 事 ,當 然 唔 洗 我 地 計 。而 且 ,library 還 做 了 一 重 過 濾 ,令 到 輸 出 的 數 值 更 加 平 穩 。
LM35 一 定 要 按 上 圖 的 方 法 插 ,不 要 插 反 了 ,而 且 要 移 除 ( 即 斷 開 ) Jumper J1。據 Hackatronics 文 章 說 ,如 果 插 反 了 ,是 有 機 會 弄 壞 Arduino Board 的 ,切 記 切 記 。
接 好 了 sensor,我 們 就 可 以 回 到 mBlock 看 看 可 以 如 何 使 用 它 。如 果 未 安 裝 好 mBlock Multi-function Shield extension 的 朋 友 們 ,可 以 參 考 上 一 課 的 教 學 。
有 了 Hackatronics Library 的 加 持 ,使 用 上 當 然 相 當 的 簡 單 。只 要 用 get LM35 temperature block,就 可 以 得 到 LM35 感 測 的 溫 度 ,不 過 Hackatronics library 的 單 位 比 較 奇 特 ,是 0.1 ℃,所 以 ,我 們 要 把 得 出 的 數 值 除 以 10,才 顯 示 出 來 。顯 示 溫 度 的 時 候 ,我 們 設 定 為 顯 示 1 位 小 數 。
第 二 個 sensor 積 木 ,則 要 配 合 超 聲 波 測 距 模 塊 來 使 用 。
現 時 坊 間 的 Ultrasonic sensor,都 是 以 HC-SR04 為 主 。Hackatronics 的 library 就 是 以 這 個 模 塊 來 編 寫 的 。話 雖 如 此 ,但 畢 竟 還 是 有 其 他 超 聲 波 模 塊 ,外 觀 上 也 非 常 之 類 似 ,所 以 大 家 購 買 時 要 留 意 ,唔 好 買 錯 了 。
HC-SR04 有 四 個 接 腳 ,Vcc 是 供 電 ,GND 是 接 地 。另 外 兩 pins 分 別 是 Trigger pin 和 Echo pin。這 兩 個 pins 可 以 接 到 Arduino UNO 上 面 的 任 何 digital 接 腳 ,Trigger pin 要 設 定 為 輸 出 ( output pin ),Echo pin 就 要 設 定 為 輸 入 ( input pin )。
超 聲 波 模 塊 測 量 距 離 的 原 理 ,是 當 你 在 Trigger pin 輸 出 一 個 訊 號 ,Ultrasonic sensor 就 會 發 射 一 個 40 kHz 的 超 聲 波 ( 超 聲 波 一 樣 是 聲 波 ,只 是 超 出 人 耳 聽 到 的 範 圍 )。當 超 聲 波 遇 到 障 礙 物 時 ,便 會 反 彈 ,當 Sensor 收 到 反 彈 的 訊 號 ,就 會 通 過 Echo pin 來 通 知 我 們 。
由 於 聲 音 在 空 氣 中 傳 播 的 速 率 是 很 固 定 的 ( 此 速 度 被 稱 為 音 速 ,大 概 是 每 秒 340 米 ),所 以 我 們 可 以 通 過 計 算 超 聲 波 來 回 的 時 間 ,算 出 物 件 的 距 離 。
因 為 使 用 了 Hackatronics library,上 面 所 有 的 算 式 ,當 然 就 與 我 們 無 緣 了 。要 得 出 距 離 ,我 們 只 要 使 用 get SONAR Distance TrigPin X EchoPin Y block 就 可 以 了 。而 它 會 傳 回 以 cm 為 單 位 的 整 數 距 離 。
在 上 面 的 例 子 中 ,每 按 一 次 BTN_1,就 會 測 一 次 距 離 ,而 傳 回 的 數 值 就 會 顯 示 在 4 位 數 碼 管 上 。為 了 讓 使 用 者 知 道 自 己 按 了 鍵 ,所 以 按 鍵 時 亦 會 beep 一 聲 。
Multi-function Shield 本 身 就 佔 用 了 很 多 針 腳 ,最 後 有 飛 線 出 來 外 接 其 他 模 塊 的 接 腳 就 只 有 pins 5, 6 和 9 了 。所 以 ,get SONAR Distance block 亦 只 可 以 選 擇 pins 5, 6 和 9 了 。
其 實 mBlock 本 身 亦 內 建 了 read ultrasonic sensor block 的 ,我 們 也 可 以 用 用 看 ,比 較 hackatronics 的 library 和 mBlock 的 library 究 竟 那 一 個 比 較 好 。
上 例 我 們 應 用 了 Multi-function Shield 有 多 個 按 鍵 的 特 性 ,按 BTN_1 就 使 用 Hackatronics 的 library,按 BTN_2 則 用 回 mBlock 本 身 的 library。值 得 一 提 的 是 ,hacktronics 是 傳 回 正 整 數 的 ,但 mBlock 卻 是 傳 回 floating number,我 們 正 好 運 用 Display Number block 的 Decimal Point 功 能 ,把 mBlock 傳 回 來 的 floating number 四 捨 五 入 到 一 位 小 數 。
用 了 上 面 的 程 序 ,我 們 可 以 很 方 便 地 在 完 全 相 同 的 位 置 ,分 別 用 兩 套 library 來 進 行 測 距 。按 照 我 個 人 的 情 況 ,在 HC-SR04 Ultrasonic Sensor 這 一 部 分 ,是 mBlock 比 較 好 用 ,而 且 測 出 來 的 距 離 也 比 較 精 準 。
只 要 幾 行 程 式 碼 ,就 可 以 將 你 的 Arduino 變 成 電 子 溫 度 計 和 數 碼 測 距 儀 ,係 唔 係 好 滿 足 呢 ?
最 後 又 是 功 課 時 間 。
1. 試 把 電 子 溫 度 計 的 程 序 ,棄 用 wait block 而 改 用 timer block;
2. 在 按 動 BTN_1 時 ,把 溫 度 的 單 位 轉 變 為 華 氏 度 ( ℉ ) ,再 按 一 次 又 轉 變 回 攝 氏 度 ( ℃ )。
3. 試 從 你 的 超 聲 波 模 塊 的 說 明 文 件 ,找 出 該 模 塊 的 可 以 探 測 的 距 離 範 圍 ,和 精 準 度 ;
4. 根 據 問 題 3 的 答 案 ,找 出 3 個 合 適 的 距 離 ,來 測 量 你 自 己 的 測 距 儀 的 誤 差 有 多 少 ;
5. 按 照 問 題 4 測 量 出 來 的 誤 差 ,去 修 正 你 自 己 的 mBlock 程 序 。
參 考 資 料 :
Arduino Playground – LM35 Higher Resolution
Arduino – Ping
Arduino Playground – NewPing Library