自己動手做一個 Arduino Shield ( STEM project )

Arduino 的 Shields,有 一 大 類 別 叫 做 Proto-Shields,是 一 整 塊 萬 用 板 ,作 為 開 發 prototype 之 用 的 。這 一 次 ,我 來 示 範 一 下 如 何 將 一 個 麵 包 板 上 的 簡 單 電 路 ,焊 接 成 為 一 個 prototype 啦 。

這 一 類 Proto-Shield 有 很 多 不 同 款 式 的 ,有 平 也 有 貴 。我 自 己 因 為 是 買 來 自 用 ,唔 係 要 拿 去 搵 人 投 資 ,所 以 買 最 平 的 就 好 了 ,反 正 用 起 來 也 沒 分 別 。

Proto-Shield 圖

Proto-Shield 電 路 圖

從 上 圖 可 以 看 到 這 款 Proto-Shield 的 設 計 ,上 面 有 獨 立 的 孔 ,也 有 部 分 三 連 的 孔 ,方 便 你 作 不 同 的 連 接 。5V 和 GND 各 有 三 大 條 ,應 該 很 方 便 你 去 接 不 同 的 電 子 零 件 的 了 。Proto-Shield 的 左 上 角 ,還 有 一 個 可 以 焊 接 16 隻 腳 的 SMD IC 的 空 位 。除 此 之 外 ,板 上 還 有 兩 顆 LED 和 一 個 可 用 的 push button ( 另 一 個 為 reset 鍵 )。

使 用 小 平 台 的 「考 反 應 小 遊 戲 」

第 五 課 的 「考 反 應 小 遊 戲 」

還 記 得 我 們 在 第 五 課 的 「考 反 應 小 遊 戲 」麼 ?非 常 簡 單 的 電 路 ,用 它 來 示 範 再 好 不 過 。

Proto-Shield Circuit

Proto-Shield Circuit

在 焊 接 之 前 ,當 然 最 好 畫 個 電 路 圖 ,想 清 想 楚 才 落 手 ,因 為 如 果 設 計 錯 誤 ,焊 完 唔 係 咁 容 易 拆 的 。最 好 每 焊 完 一 個 零 件 ,就 用 電 錶 檢 查 一 下 。

Arduino Proto-Shield

Arduino Proto-Shield 已 裝 好 電 子 零 件 ( 正 面 )

完 成 之 後 ,就 是 這 個 樣 子 。用 「焫 雞 」我 也 是 「生 手 」,焊 得 比 較 醜 樣 ,還 好 小 朋 友 們 未 識 介 意 ,一 樣 玩 得 不 亦 樂 乎 。( 「焫 雞 」有 一 定 危 險 性 ,小 朋 友 當 然 未 玩 得 住 。 )

Arduino Proto-Shield

Arduino Proto-Shield  已 裝 好 電 子 零 件 ( 底 部 )

裝 好 在 Arduino UNO 上 面 ,就 跟 其 他 Shield 沒 什 麼 分 別 。以 後 想 玩 這 個 「考 反 應 小 遊 戲 」時 ,再 也 不 用 找 麵 包 板 出 來 重 新 砌 一 次 電 路 ,只 要 用 這 個 Shield 一 插 上 去 ,再 Upload 一 次 program 入 去 Arduino UNO 就 得 。

屎

Arduino UNO + My Proto-Shield

如 此 好 玩 的 Proto-Shield,其 實 也 有 未 裝 崁 版 本 和 空 白 版 本 。如 果 你 像 筆 者 上 面 做 的 prototype,是 完 全 沒 有 用 到 Proto-Shield 上 面 的 東 西 ,可 能 用 空 白 版 本 會 更 好 焊 接 。不 過 這 兩 個 版 本 很 少 地 方 有 得 賣 ,所 以 價 錢 就 唔 一 定 更 平 的 了 。

空 白 Proto-Shield 到 貨 之 後 ,我 又 做 了 version 2。我 還 特 意 訂 了 鍍 金 的 黃 色 針 腳 ,以 強 調 version 2 的 黃 色 theme。

第 二 版

考 反 應 小 遊 戲 Proto Shield 第 二 版

第 二 版

考 反 應 小 遊 戲 Proto Shield 第 二 版

空 白 Proto-Shield 沒 有 了 外 面 圍 住 電 路 板 的 排 針 座 ,無 論 在 走 線 ,又 或 者 使 用 上 ,都 方 便 了 好 多 。

不 要 覺 得 特 意 去 為 了 一 個 小 program 做 個 shield 很 誇 張 。因 為 這 樣 的 一 個 shield,零 件 成 本 不 用 十 塊 錢 就 可 以 了 。

ctleung張 先 生 ,男 性 ,肖 龍 。
職 業 :I.T. Consultant
簡 介 :不 好 好 讀 書 ;七 尺 差 五 寸 ,手 長 過 膝 ,雙 耳 垂 肩 ;性 寬 和 ,寡 言 語 ,喜 怒 不 形 於 色 。據 說 少 時 曾 斬 白 蛇 於 鳳 凰 山 下 ……

我 的 STEM Project 系 列

我 的 Stem Project (一 ) Raspberry Pi 3 vs Arduino UNO
我 的 Stem Project (二 ) 使 用 Scratch 來 控 制 Arduino UNO
我 的 Stem Project (三 ) 使 用 Push Button 來 做 Input
我 的 Stem Project (四 ) Push Button 進 階 一 點 的 用 法
如 何 購 買 Arduino ?( STEM project )
我 的 Stem Project (五 ) 考 反 應 小 遊 戲
我 的 Stem Project (六 ) 用 Arduino 控 制 7 segment display (基 礎 篇 )
我 的 Stem Project (七 ) 用 Arduino 控 制 7 segment display ( 進 階 篇 )
我 的 Stem Project (八 ) 用 Arduino 控 制 7 segment display ( 簡 化 篇 )
我 的 Stem Project (九 ) 用 Arduino 控 制 Buzzer 唱 歌
我 的 Stem Project (十 ) Arduino Multi-function Shield using Scratch (1)
自 己 動 手 做 一 個 Arduino Shield ( STEM project )
我 的 Stem Project (十 一 ) Arduino Multi-function Shield using Scratch (2)
我 的 Stem Project (十 二 ) Arduino Music Light Show
Arduino 的 電 池 ( STEM project )
我 的 Stem Project (十 三 ) Arduino Multi-function Shield using Scratch (3)
Posted in STEM | Tagged , , , , , | Leave a comment

我的 Stem Project (十) Arduino Multi-function Shield using Scratch (1)

玩 了 好 多 堂 麵 包 板 ,玩 厭 未 呢 ?接 著 這 幾 課 ,我 們 搞 搞 新 意 思 ,嘗 試 接 觸 一 下 Arduino 的 Shields。Arduino Shields 是 指 一 些 可 以 直 接 插 在 Arduino 上 面 使 用 的 擴 展 板 。由 於 接 駁 相 當 的 方 便 ,價 錢 又 平 ,所 以 亦 受 到 廣 大 Arduino 使 用 者 的 歡 迎 。

這 一 次 我 用 的 是 Arduino Multi-function Shield,這 件 小 東 西 很 多 地 方 都 在 賣 ,國 內 和 外 國 都 有 不 少 ,最 初 的 出 處 似 乎 已 經 不 可 考 。我 自 己 手 頭 上 ,就 有 兩 片 明 顯 是 不 同 生 產 商 的 Multi-function Shields

我 們 先 來 看 看 這 塊 Multi-function Shield 有 什 麼 好 玩 的 ?

213

Multi-function Shield 能 直 接 插 入 Arduino UNO 使 用

1. 4 個 LED 燈 ( 貼 片 LED,紅 色 );
2. 1 個 4 位 數 碼 管 ( 使 用 2 個 74HC595 連 接 );
3. 3 個 push button ( 另 外 有 一 個 reset 鍵 );
4. 1 個 buzzer ( 蜂 鳴 器 );
5. 1 個 3296 potentiometer ( 可 變 電 阻 ,接 在 A0 作 Analog 輸 入 );

然 後 它 又 有 一 堆 可 以 連 接 模 塊 式 電 子 零 件 ( 又 稱 電 子 積 木 ) 的 接 口 ,方 便 外 接 其 他 東 西 ,例 如 溫 度 計 ,藍 牙 等 等 。

要 使 用 它 ,直 接 把 它 插 在 Arduino UNO 上 面 就 行 了 。連 接 線 都 唔 洗 ,真 的 太 爽 了 ,連 電 路 圖 都 慳 返 。試 想 想 ,如 果 這 一 大 堆 東 西 ,全 部 同 時 要 裝 在 麵 包 板 上 ,真 係 少 D 心 機 接 線 都 唔 得 ,而 且 ,分 分 鐘 連 一 塊 大 的 麵 包 板 都 放 唔 晒 ,要 兩 塊 才 行 。

回 到 mBlock,我 們 究 竟 要 如 何 用 scratch 去 控 制 這 個 Multi-Function Shield 呢 ?首 先 ,還 是 得 要 看 看 它 把 元 件 接 在 那 些 接 口 上 。

Milti-function ShieldArduino UNO [ Pin Number ]
LED 113
LED 212
LED 311
LED 410
Buzzer3
Latch Pin ( 7-segment Display )4
CLK Pin ( 7-segment Display )7
Data Pin ( 7-segment Display )8
PotentiometerA0
Button 1A1
Button 2A2
Button 3A3

知 道 了 Pin number 就 簡 單 得 多 了 ,先 試 試 那 幾 顆 LED 吧 。

Lesson 10 - Scratch 01

Lesson 10 – Scratch 01

然 後 就 Upload to Arduino 吧 ,咦 ?怎 麼 沒 有 反 應 的 呢 ?原 來 這 片 Multi-function Shield 的 接 法 都 像 是 「共 陽 數 碼 管 」那 樣 的 ,我 們 的 pin 要 set 做 LOW 才 會 亮 燈 的 。

Lesson 10 - Scratch 02

Lesson 10 – Scratch 02

好 了 ,現 在 應 該 都 亮 著 了 吧 ?

Lesson 10 - Scratch 03

Lesson 10 – Scratch 03

Buzzer 也 是 同 理 ,set 做 LOW 才 會 響 的 。上 面 的 例 子 ,就 會 令 到 buzzer 響 0.5 秒 ,就 是 咇 了 一 聲 。

但 是 ,這 樣 子 用 ,有 什 麼 好 呢 ?比 起 我 們 之 前 用 麵 包 板 根 本 沒 差 別 啊 。是 的 ,因 為 我 們 還 沒 有 安 裝 那 個 Shield 的 library,亦 即 是 mBlock 的 extension。

Multi-function Shield 的 library 每 家 廠 都 有 ,但 總 的 來 說 ,都 及 不 上 Hackatronics 系 列 文 章 裡 面 的 Multi-function Shield library ( v1.2 )。

筆 者 就 將 那 套 library 改 寫 成 了 mBlock 的 Multi-function Shield extension。

檔 案 下 載 : MultiFunctionShield.zip

要 在 mBlock 安 裝 新 的 extension,首 先 去 Extensions > Manage Extensions,然 後 按 Add Extension。然 後 在 檔 案 類 型 選 zip file,再 選 擇 剛 剛 下 載 的  MultiFunctionShield.zip 即 可 。

101

完 成 之 後 ,重 啟 一 次 mBlock。就 會 在 Extensions 裡 面 見 得 到 MultiFunctionShield,勾 選 它 便 可 以 使 用 。

102

然 後 在 Robots 分 類 ,就 會 見 到 Multi-function Shield 專 用 的 blocks。

103

好 了 ,讓 我 依 次 講 解 一 下 每 一 個 block 的 用 法 吧 。先 講 LED。

scratch_04

Lesson 10 – Scratch 04 ( LED )

關 LED 事 的 有 兩 個 blocks,Turn ON/OFF LED X block 可 以 設 定 LED 的 開 和 關 ( ON / OFF )。而 Set Blinking ON/OFF for LED X block 則 可 以 設 定 LED 為 「閃 爍 」定 「唔 閃 爍 」。

這 兩 個 blocks 是 根 據 Hackatronics 的 library 「照 抄 」的 ,所 以 對 初 學 者 可 能 不 好 理 解 。簡 而 言 次 ,Set Blinking block 是 和 LED 的 「開 」和 「關 」無 關 的 ,那 只 是 設 定 LED 亮 著 的 方 式 。好 了 ,如 果 唔 明 白 ,就 看 以 下 程 式 吧 。

Lesson 10 - Scratch 05

Lesson 10 – Scratch 05 ( LED 2 )

在 以 上 的 例 子 ,程 序 一 開 始 時 ,我 們 分 別 設 定 LED 1 和 2 的 亮 燈 方 式 ,LED 1 是 blinking = ON,LED 2 是 blinking = OFF。然 後 ,每 隔 5 秒 鐘 ,把 LED 1 和 2 開 關 一 次 。當 LED 1 和 2 都 關 上 的 時 候 ,兩 者 當 然 是 一 樣 的 。但 當 兩 者 都 「亮 著 」( Turn ON ) 之 後 ,你 就 會 見 到 一 顆 是 長 亮 ,一 顆 是 blinking。自 此 之 後 ,每 顆 LED 都 有 三 個 顯 示 的 方 式 ( 熄 滅 、長 亮 、閃 爍 ),很 方 便 吧 ?

然 後 就 是 buzzer,我 為 大 家 準 備 了 幾 個 常 用 響 法 ,包 括  BeepLong BeepQuick AlarmSlow Alarm,省 卻 了 要 計 很 多 時 值 的 麻 煩 。

Lesson 10 - Scratch 04

Lesson 10 – Scratch 06 ( Beep )

大 家 要 留 心 的 是 ,Hackatronics 這 個 library 的 beep 功 能 ,是 用 Arduino 的 Timer1 ( TimerOne ) library 裡 面 的 interrupt 寫 成 的 ,是 所 謂 的 non-blocking code。你 可 以 比 較 Slow Alarm block 和 上 一 課 buzzer 裡 面 的 「歌 曲 」block,「歌 曲 」block 是 要 播 晒 成 首 歌 ,才 會 執 行 下 一 行 程 式 碼 的 ,但 本 課 的 Slow Alarm block,開 始 了 就 會 馬 上 執 行 下 一 行 的 程 式 碼 。

而 因 為 beep blocks 是 non-blocking code,所 以 如 果 唔 想 下 一 步 干 擾 上 一 步 ,就 要 在 兩 步 之 間 加 入 wait block,確 保 上 一 步 完 成 了 ,才 開 始 執 行 下 一 步 。

用 interrupt 的 好 處 是 程 序 執 行 起 來 會 順 暢 得 多 ,而 且 唔 會 比 單 一 一 個 步 驟 鎖 住 整 個 程 序 。除 了 beep 功 能 外 ,Hackatronics library 裡 面 的 7-segment display、LED blinking 和 幾 個 輸 入 功 能 ,都 是 用 interrupt 寫 出 來 的 。

如 果 想 要 在 7-segment display 顯 示 數 字 又 要 點 做 呢 ?當 然 亦 是 非 常 簡 單 。

Lesson 10 - Scratch 07

Lesson 10 – Scratch 07 ( 7-segment Display )

用 於 顯 示 的 blocks 有 三 個 ,Display Text block可 以 顯 示 文 字 ,包 括 0-9, a-z。但 當 然 英 文 不 能 指 定 大 細 寫 ,而 且 也 會 有 重 覆 ,例 如 9 和 g。這 個 block 可 以 用 來 顯 示 一 些 簡 單 的 訊 息 。

Display Number block 則 可 顯 示 帶 有 小 數 位 的 數 值 ,例 如 23.6。而 且 你 還 可 以 指 定 小 數 點 後 幾 多 位 ,佢 會 自 動 幫 你 4 捨 5 入 。這 個 block 方 便 用 來 顯 示 溫 度 和 距 離 等 資 料 。

Display Integer block 就 是 顯 示 正 整 數 ,它 與 Display Text block 的 主 要 分 別 ,就 是 會 在 前 面 補 零 自 動 補 零 。除 了 顯 示 整 數 ,這 個 block 也 方 便 用 在 顯 示 時 間 ( 08:00 )。

以 上 幾 個 Display block,如 果 輸 入 了 不 能 顯 示 的 東 西 ( 例 如 abcde,12345,12.345 等 等 ),它 就 會 顯 示 E,即 是 error。

Lesson 10 - Scratch 08

Lesson 10 – Scratch 08 ( blink display )

我 們 也 可 以 像 控 制 LED 閃 爍 一 樣 的 控 制 7-segment display 閃 爍 ,就 是 使 用 Blink Display ON/OFF block,用 法 和 Set Blinking for LED block 是 一 樣 的 。

Lesson 10 - brightness

Lesson 10 – display brightness

我 們 還 可 以 調 整 7-segment display 的 光 暗 ,用 的 就 是 Set Display Brightness X,0 就 是 最 光 ,3 就 是 最 暗 。

然 後 到 如 何 讀 取 三 個 push button 的 狀 態 了 ,這 部 分 不 是 那 麼 的 直 觀 ,部 分 讀 者 可 能 花 點 時 間 去 理 解 ,但 其 實 Hackatronics 的 library 在 detect 按 鍵 這 方 面 是 寫 得 很 不 錯 的 。

Lesson 10 - Scratch 10 ( Button press )

Lesson 10 – Scratch 10 ( Button )

雖 然 我 們 有 三 個 按 鈕 ( BTN_1, BTN_2, BTN_3 ),但 和 按 鍵 有 關 的 block 就 只 有 兩 個 。getButton 是 用 來 取 得 現 時 的 按 鍵 狀 態 ,第 二 個 邏 輯 比 對 的 block,就 是 方 便 我 們 不 用 記 著 每 一 個 狀 態 的 數 值 。讓 我 們 在 下 面 的 例 子 看 看 它 們 的 用 法 。

Lesson 10 - Scratch 11 ( button )

Lesson 10 – Scratch 11 ( button )

我 們 先 增 加 一 個 forever block,然 後 在 每 個 loop 的 開 始 就 讀 取 button 的 狀 態 ( getButton ),並 把 它 儲 存 到 變 數 buttonState 中 。然 後 我 們 用 button 比 對 那 個 block,去 檢 驗 buttonState 的 值 ,看 看 是 發 生 那 一 個 「事 件 」。

在 Hackatroins 的 library 裡 面 ,它 為 每 一 個 鍵 都 定 義 了 PRESSED, SHORT_RELEASE, LONG_PRESSED, LONG_RELEASE 四 個 事 件 。在 上 例 中 ,執 行 之 後 的 結 果 就 是 ,短 按 一 下 BTN_1 ( 最 左 手 邊 的 ,連 接 A1 pin 的 那 個 ),LED 1 就 會 亮 起 ,長 按 BTN_1,LED 2 就 會 亮 起 ,短 按 BTN_2,LED 1 就 熄 滅 ,長 按 BTN_2,LED 2 就 會 熄 滅 。超 級 方 便 吧 ?

Lesson 10 - Scratch 13

Lesson 10 – Scratch 13 ( button )

其 實 你 也 不 一 定 要 用 我 那 個 「按 鈕 比 對 」block 的 ,用 上 圖 的 code 一 樣 行 得 通 ,但 硬 是 要 次 次 查 表 才 知 道 193 = BTN_1_LONG_RELEASE 也 會 很 煩 吧 ?

321

Lesson 10 – Scratch 12 ( Sensor Block )

至 於 其 餘 兩 個 讀 取 sensor 的 blocks,因 為 要 配 合 特 定 的 sensor 模 塊 使 用 ,就 留 待 下 一 課 再 講 吧 。

好 了 ,有 了 這 麼 多 好 用 易 用 的 blocks,我 們 來 做 點 什 麼 好 呢 ?哈 哈 ,再 來 做 一 個 counter 計 數 器 吧 。

上 圖 是 很 典 型 的 機 械 計 數 器 ,在 點 人 數 時 十 分 好 用 。它 們 基 本 上 都 有 一 個 3 位 或 4 位 的 數 字 顯 示 ,每 按 一 下 計 數 鍵 就 加 1 ,而 按 一 下 reset 就 會 歸 零 。

Lesson 10 - Counter 01

Lesson 10 – Counter 01

在 上 圖 的 例 子 中 ,因 為 我 們 的 Multi-function Shield 有 三 個 按 鍵 ,係 「唔 好 浪 費 」的 情 況 下 ,就 加 多 了 一 個 「減 數 鍵 」的 功 能 。是 不 是 很 爽 呢 ?短 短 幾 行 程 式 碼 ,就 可 以 模 擬 一 個 計 數 器 出 來 。

Lesson 10 - Counter 02

Lesson 10 – Counter 02

然 後 ,我 們 可 以 加 入 不 同 的 beep 聲 ,來 回 饋 使 用 者 的 輸 入 。用 別 人 寫 好 的 library 來 開 發 程 序 ,實 在 是 輕 鬆 太 多 ,可 以 把 精 力 都 留 給 自 己 想 寫 的 功 能 。

好 了 ,又 到 功 課 時 間 。1. 試 為 上 例 中 的 變 數 counter,加 上 0 – 9999 的 限 制 ;2. 嘗 試 使 用 另 外 兩 個 Display block 來 顯 示 counter 變 數 ,並 講 出 它 們 的 分 別 。

其 實 這 個 Multi-function Shield 要 和 Arduino UNO + 透 明 外 殼 使 用 ,是 要 有 些 竅 門 的 。這 些 Arduino Shields 的 底 部 ,其 實 那 些 電 子 零 件 的 腳 是 凸 出 來 的 ,它 們 是 會 頂 住 外 殼 ,做 成 接 觸 不 良 的 。

before

修 剪 之 前

其 實 我 們 可 以 用 一 些 專 門 用 來 剪 腳 的 「電 子 零 件 斜 口 剪 鉗 」,可 以 把 那 些 焊 接 完 的 針 腳 剪 得 很 平 整 。

下 圖 就 是 我 自 己 「修 剪 」之 後 的 樣 子 。

After

修 剪 之 後

「修 剪 」之 後 ,就 算 有 使 用 Arduino UNO 外 殼 Multi-function Shield 也 不 會 頂 住 。

修 剪 之 後 非 常 貼 服

修 剪 之 後 Multi-function Shield 會 非 常 貼 服

Multi-function Shield 的 7-segment display 背 面 的 針 腳 ,會 有 機 會 頂 住 USB 頭 而 造 成 短 路 ,所 以 我 會 在 USB 頭 上 貼 一 片 厚 厚 的 膠 布 。

123

為 免 短 路 ,最 好 在 USB 頭 上 貼 一 片 膠 紙 來 絕 緣

Hackatronics Series – Arduino Multi-function Shield

Create Extensions for mBlock

ctleung張 先 生 ,男 性 ,肖 龍 。
職 業 :I.T. Consultant
簡 介 :不 好 好 讀 書 ;七 尺 差 五 寸 ,手 長 過 膝 ,雙 耳 垂 肩 ;性 寬 和 ,寡 言 語 ,喜 怒 不 形 於 色 。據 說 少 時 曾 斬 白 蛇 於 鳳 凰 山 下 ……

我 的 STEM Project 系 列

我 的 Stem Project (一 ) Raspberry Pi 3 vs Arduino UNO
我 的 Stem Project (二 ) 使 用 Scratch 來 控 制 Arduino UNO
我 的 Stem Project (三 ) 使 用 Push Button 來 做 Input
我 的 Stem Project (四 ) Push Button 進 階 一 點 的 用 法
如 何 購 買 Arduino ?( STEM project )
我 的 Stem Project (五 ) 考 反 應 小 遊 戲
我 的 Stem Project (六 ) 用 Arduino 控 制 7 segment display (基 礎 篇 )
我 的 Stem Project (七 ) 用 Arduino 控 制 7 segment display ( 進 階 篇 )
我 的 Stem Project (八 ) 用 Arduino 控 制 7 segment display ( 簡 化 篇 )
我 的 Stem Project (九 ) 用 Arduino 控 制 Buzzer 唱 歌
我 的 Stem Project (十 ) Arduino Multi-function Shield using Scratch (1)
自 己 動 手 做 一 個 Arduino Shield ( STEM project )
我 的 Stem Project (十 一 ) Arduino Multi-function Shield using Scratch (2)
我 的 Stem Project (十 二 ) Arduino Music Light Show
Arduino 的 電 池 ( STEM project )
我 的 Stem Project (十 三 ) Arduino Multi-function Shield using Scratch (3)
Posted in STEM | Tagged , , , , , , , , | Leave a comment