玩 了 好 多 堂 麵 包 板 ,玩 厭 未 呢 ?接 著 這 幾 課 ,我 們 搞 搞 新 意 思 ,嘗 試 接 觸 一 下 Arduino 的 Shields。Arduino Shields 是 指 一 些 可 以 直 接 插 在 Arduino 上 面 使 用 的 擴 展 板 。由 於 接 駁 相 當 的 方 便 ,價 錢 又 平 ,所 以 亦 受 到 廣 大 Arduino 使 用 者 的 歡 迎 。
這 一 次 我 用 的 是 Arduino Multi-function Shield,這 件 小 東 西 很 多 地 方 都 在 賣 ,國 內 和 外 國 都 有 不 少 ,最 初 的 出 處 似 乎 已 經 不 可 考 。我 自 己 手 頭 上 ,就 有 兩 片 明 顯 是 不 同 生 產 商 的 Multi-function Shields。
我 們 先 來 看 看 這 塊 Multi-function Shield 有 什 麼 好 玩 的 ?

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 Shield | Arduino UNO [ Pin Number ] |
---|---|
LED 1 | 13 |
LED 2 | 12 |
LED 3 | 11 |
LED 4 | 10 |
Buzzer | 3 |
Latch Pin ( 7-segment Display ) | 4 |
CLK Pin ( 7-segment Display ) | 7 |
Data Pin ( 7-segment Display ) | 8 |
Potentiometer | A0 |
Button 1 | A1 |
Button 2 | A2 |
Button 3 | A3 |
知 道 了 Pin number 就 簡 單 得 多 了 ,先 試 試 那 幾 顆 LED 吧 。
然 後 就 Upload to Arduino 吧 ,咦 ?怎 麼 沒 有 反 應 的 呢 ?原 來 這 片 Multi-function Shield 的 接 法 都 像 是 「共 陽 數 碼 管 」那 樣 的 ,我 們 的 pin 要 set 做 LOW 才 會 亮 燈 的 。
好 了 ,現 在 應 該 都 亮 著 了 吧 ?
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 即 可 。
完 成 之 後 ,重 啟 一 次 mBlock。就 會 在 Extensions 裡 面 見 得 到 MultiFunctionShield,勾 選 它 便 可 以 使 用 。
然 後 在 Robots 分 類 ,就 會 見 到 Multi-function Shield 專 用 的 blocks。
好 了 ,讓 我 依 次 講 解 一 下 每 一 個 block 的 用 法 吧 。先 講 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 亮 著 的 方 式 。好 了 ,如 果 唔 明 白 ,就 看 以 下 程 式 吧 。
在 以 上 的 例 子 ,程 序 一 開 始 時 ,我 們 分 別 設 定 LED 1 和 2 的 亮 燈 方 式 ,LED 1 是 blinking = ON,LED 2 是 blinking = OFF。然 後 ,每 隔 5 秒 鐘 ,把 LED 1 和 2 開 關 一 次 。當 LED 1 和 2 都 關 上 的 時 候 ,兩 者 當 然 是 一 樣 的 。但 當 兩 者 都 「亮 著 」( Turn ON ) 之 後 ,你 就 會 見 到 一 顆 是 長 亮 ,一 顆 是 blinking。自 此 之 後 ,每 顆 LED 都 有 三 個 顯 示 的 方 式 ( 熄 滅 、長 亮 、閃 爍 ),很 方 便 吧 ?
然 後 就 是 buzzer,我 為 大 家 準 備 了 幾 個 常 用 響 法 ,包 括 Beep、Long Beep、Quick Alarm 和 Slow Alarm,省 卻 了 要 計 很 多 時 值 的 麻 煩 。
大 家 要 留 心 的 是 ,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 顯 示 數 字 又 要 點 做 呢 ?當 然 亦 是 非 常 簡 單 。
用 於 顯 示 的 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。
我 們 也 可 以 像 控 制 LED 閃 爍 一 樣 的 控 制 7-segment display 閃 爍 ,就 是 使 用 Blink Display ON/OFF block,用 法 和 Set Blinking for LED block 是 一 樣 的 。
我 們 還 可 以 調 整 7-segment display 的 光 暗 ,用 的 就 是 Set Display Brightness X,0 就 是 最 光 ,3 就 是 最 暗 。
然 後 到 如 何 讀 取 三 個 push button 的 狀 態 了 ,這 部 分 不 是 那 麼 的 直 觀 ,部 分 讀 者 可 能 花 點 時 間 去 理 解 ,但 其 實 Hackatronics 的 library 在 detect 按 鍵 這 方 面 是 寫 得 很 不 錯 的 。
雖 然 我 們 有 三 個 按 鈕 ( BTN_1, BTN_2, BTN_3 ),但 和 按 鍵 有 關 的 block 就 只 有 兩 個 。getButton 是 用 來 取 得 現 時 的 按 鍵 狀 態 ,第 二 個 邏 輯 比 對 的 block,就 是 方 便 我 們 不 用 記 著 每 一 個 狀 態 的 數 值 。讓 我 們 在 下 面 的 例 子 看 看 它 們 的 用 法 。
我 們 先 增 加 一 個 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 就 會 熄 滅 。超 級 方 便 吧 ?
其 實 你 也 不 一 定 要 用 我 那 個 「按 鈕 比 對 」block 的 ,用 上 圖 的 code 一 樣 行 得 通 ,但 硬 是 要 次 次 查 表 才 知 道 193 = BTN_1_LONG_RELEASE 也 會 很 煩 吧 ?
至 於 其 餘 兩 個 讀 取 sensor 的 blocks,因 為 要 配 合 特 定 的 sensor 模 塊 使 用 ,就 留 待 下 一 課 再 講 吧 。
好 了 ,有 了 這 麼 多 好 用 易 用 的 blocks,我 們 來 做 點 什 麼 好 呢 ?哈 哈 ,再 來 做 一 個 counter 計 數 器 吧 。
上 圖 是 很 典 型 的 機 械 計 數 器 ,在 點 人 數 時 十 分 好 用 。它 們 基 本 上 都 有 一 個 3 位 或 4 位 的 數 字 顯 示 ,每 按 一 下 計 數 鍵 就 加 1 ,而 按 一 下 reset 就 會 歸 零 。
在 上 圖 的 例 子 中 ,因 為 我 們 的 Multi-function Shield 有 三 個 按 鍵 ,係 「唔 好 浪 費 」的 情 況 下 ,就 加 多 了 一 個 「減 數 鍵 」的 功 能 。是 不 是 很 爽 呢 ?短 短 幾 行 程 式 碼 ,就 可 以 模 擬 一 個 計 數 器 出 來 。
然 後 ,我 們 可 以 加 入 不 同 的 beep 聲 ,來 回 饋 使 用 者 的 輸 入 。用 別 人 寫 好 的 library 來 開 發 程 序 ,實 在 是 輕 鬆 太 多 ,可 以 把 精 力 都 留 給 自 己 想 寫 的 功 能 。
好 了 ,又 到 功 課 時 間 。1. 試 為 上 例 中 的 變 數 counter,加 上 0 – 9999 的 限 制 ;2. 嘗 試 使 用 另 外 兩 個 Display block 來 顯 示 counter 變 數 ,並 講 出 它 們 的 分 別 。
其 實 這 個 Multi-function Shield 要 和 Arduino UNO + 透 明 外 殼 使 用 ,是 要 有 些 竅 門 的 。這 些 Arduino Shields 的 底 部 ,其 實 那 些 電 子 零 件 的 腳 是 凸 出 來 的 ,它 們 是 會 頂 住 外 殼 ,做 成 接 觸 不 良 的 。
其 實 我 們 可 以 用 一 些 專 門 用 來 剪 腳 的 「電 子 零 件 斜 口 剪 鉗 」,可 以 把 那 些 焊 接 完 的 針 腳 剪 得 很 平 整 。
下 圖 就 是 我 自 己 「修 剪 」之 後 的 樣 子 。
「修 剪 」之 後 ,就 算 有 使 用 Arduino UNO 外 殼 ,Multi-function Shield 也 不 會 頂 住 。
Multi-function Shield 的 7-segment display 背 面 的 針 腳 ,會 有 機 會 頂 住 USB 頭 而 造 成 短 路 ,所 以 我 會 在 USB 頭 上 貼 一 片 厚 厚 的 膠 布 。
Hackatronics Series – Arduino Multi-function Shield
thanks for your information about mblock and multifuctional shield.
multifuction shield has invert signal problem.
when I inputed “high” on digital led pin, it turned off.
so I expected your “multifuctionshield library”, but after I installed your library, it didn’t work any thing. how can I do?
「invert signal problem」,這並不是一個 problem。當你連接多顆 LED 時( 7-segment display, RGB LED, LED matrix 等等 ),都會遇到「common anode vs common cathode」這個問題,兩者只是接駁的方法有所不同,對應不同的應用情況,並沒有說那個接法比較好的,你 google 一下就會了解。
Multi-Fuction Shield Library 並不是我寫的,關於它的問題你可以去返 官網 那裡問。我做的是把 Multi-Fuction Shield Library 改造成 mBlock 的 extension,以方便使用 mBlock 的同好。
你用唔到,想要人幫,你應該要提供多一點點資料。就只是一句「didn’t work at all」( 同情地理解,我估應該係咁意思 ),明顯對件事無咩幫助。
thanks for your reply.
I’m curious that your article says Mutifuctionshield extension is Ok, but it’s not Ok to my system. I want to know what are the differences. I followed your instructions – I think. but any block in mutifuctionshield extension didn’t run.
How can I modify the extension code in Hackatronics site.
你依然是沒有提供任何額外的資訊呢,唉。如果你話你安裝 extension 時沒有錯誤訊息,你使用那些積木也沒有錯誤訊息,你 compile ( 即 upload to arduino ) 時也沒有錯誤訊息,而到最後乜野反應都無,我會話係你個 Multi-function Shield 係壞既,又或者你個 Multi-function Shield 的設計 ( 線路和零件 ) 根本同 Hackatronics 所用的完全不同。
我當然唔係話你貼晒所有錯誤訊息出黎我就一定會幫你解決問題,但你乜野都唔肯透露,真係好難估你有乜問題。
你好,很喜歡你這個 arduino 教程,受益良多
按照你的教程開始一點一點學習,目前遇到幾個問題,想請教一下
1. 我開始是用 mBlock v5 browser 版本,upload 速度非常快,可是後來到 shield部分要 add extension 就沒辦法,下載 PC mBlock v5 版本也一樣,最後換到 PC mBlock v3 版本,才成功加入 extension
2. 開始使用PC v3 版本後,發現 upload 速度非常慢,每次 upload 要等很久,比 browser 版本慢很多,嘗試切換到 Arduino IDE 界面,切換 tools – programmer 模式,有的速度就快很多,可是 在 mBlock v3 裡頭還是速度非常慢
3. 到 https://www.arduino.cc 用 web 版本,一直無法 include library (extension),compile upload 速度也很慢
不好意思,寫的很亂,主要想解決 upload 在 mBlock 裡頭的速度,或者 在 mBlock v5 版本要如何加入 extension?
謝謝
可能我理解錯,實在係唔好意思。綜合你所寫的野,即係你用得到,但係你嫌慢。Well,你應該估得到我的答案,Arduino 是世界上最便宜的玩意之一,Arduino IDE 和 mBlock 都是免費的,你想要幾快?
根據我個人的經驗。以我遇到過最大最大最大的 Arduino program,marlin firmware ( 3D 打印機 firmware ) 為例,compile + upload,都係幾分鐘時間。如果以我這些入門教學為例,compile + upload 也不過幾十秒鐘。
我去過很多不同的地方、不同環境,最快最慢的電腦我都用過,我也從來沒有感覺到「慢」( 淨係講緊 Arduino IDE 和 mBlock ) 。幾分鐘都等唔切,你真係夠有心急的 ( 竟然比我還心急?! )。
我覺得,我同你係唔同世界的人!你知唔知你算係邊種人?你係創新和改革者。所以,你快快去打造一個你滿意的平台吧,造福後世 ( 同埋我 )!( Arduino IDE / Scratch / mBlock 都是開源的,你想改就可以立即改了! )
如果世上沒有了你,世界就唔會再進步了!