我的 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

我 的 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)
自 己 寫 個 mBlock extension (一 ) TM1637 4-digit-display
自 己 寫 個 mBlock extension (二 ) 1602 I2C LCD Module
自 己 寫 個 mBlock extension (三 ) 2-digit-display using 74HC595
[STEM] 如 何 選 購 LED
為 什 麼 安 裝 新 版 本 的 mBlock 程 式 之 後 要 重 新 安 裝 mBlock extension?
[STEM] 使 用 sensor module 和 電 子 零 件 的 分 別
mBlock / Arduino IDE com port 的 問 題
STEM - 自 己 造 個 Arduino 教 學 / 展 示 平 台
修 理 損 壞 的 Arduino NANO ( 更 換 USB diode )

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

This entry was posted in STEM and tagged , , , , , , , , . Bookmark the permalink.

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

  1. bookledge says:

    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?

    • C.T. Leung says:

      「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」( 同情地理解,我估應該係咁意思 ),明顯對件事無咩幫助。

      • bookledge says:

        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.

        • C.T. Leung says:

          你依然是沒有提供任何額外的資訊呢,唉。如果你話你安裝 extension 時沒有錯誤訊息,你使用那些積木也沒有錯誤訊息,你 compile ( 即 upload to arduino ) 時也沒有錯誤訊息,而到最後乜野反應都無,我會話係你個 Multi-function Shield 係壞既,又或者你個 Multi-function Shield 的設計 ( 線路和零件 ) 根本同 Hackatronics 所用的完全不同。

          我當然唔係話你貼晒所有錯誤訊息出黎我就一定會幫你解決問題,但你乜野都唔肯透露,真係好難估你有乜問題。

  2. Andrew says:

    你好,很喜歡你這個 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?

    謝謝

    • C.T. Leung says:

      可能我理解錯,實在係唔好意思。綜合你所寫的野,即係你用得到,但係你嫌慢。Well,你應該估得到我的答案,Arduino 是世界上最便宜的玩意之一,Arduino IDE 和 mBlock 都是免費的,你想要幾快?

      根據我個人的經驗。最大最大最大的 Arduino program,marlin firmware ( 3D 打印機 firmware ) 為例,compile + upload,都係幾分鐘時間。如果以我這些入門教學為例,compile + upload 也不會超過 1 分鐘。

      我去過很多不同的地方、不同環境,最快最慢的電腦我都用過,我也從來沒有感覺到「慢」( 淨係講緊 Arduino IDE 和 mBlock ) 。幾分鐘都等唔切,你真係夠有心急的 ( 竟然比我還心急?! )。

      我覺得,我同你係唔同世界的人!你知唔知你算係邊種人?你係創新和改革者。所以,你快快去打造一個你滿意的平台吧,造福後世 ( 同埋我 )!( Arduino IDE / Scratch / mBlock 都是開源的,你想改就可以立即改了! )

      如果世上沒有了你,世界就唔會再進步了!

Leave a Reply

Your email address will not be published. Required fields are marked *