iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
Modern Web

你渴望連結嗎?將 Web 與硬體連上線吧!系列 第 12

D11 - 「數位×IN×OUT」:Arduino 數位功能(digital)

  • 分享至 

  • xImage
  •  

本系列文已改編成書「Arduino 自造趣:結合 JavaScript x Vue x Phaser 輕鬆打造個人遊戲機」,本書改用 Vue3 與 TypeScript 全面重構且加上更詳細的說明,

在此感謝 iT 邦幫忙、博碩文化與編輯小 p 的協助,歡迎大家前往購書,鱈魚在此感謝大家 (。・∀・)。

若想 DIY 卻不知道零件去哪裡買的讀者,可以參考此連結 。( •̀ ω •́ )✧


數位 I/O 視窗當然是要有數位訊號相關功能啦。

數位 I/O 功能

Supported Modes 中,可以看到所有支援功能:

DIGITAL_INPUT      (0x00)
DIGITAL_OUTPUT     (0x01)
ANALOG_INPUT       (0x02)
PWM                (0x03)
SERVO              (0x04)
SHIFT              (0x05)
I2C                (0x06)
ONEWIRE            (0x07)
STEPPER            (0x08)
ENCODER            (0x09)
SERIAL             (0x0A)
INPUT_PULLUP       (0x0B)

SPI                (0x0C)
SONAR              (0x0D)
TONE               (0x0E)
DHT                (0x0F)

其中與數位 I/O 相關功能為:

DIGITAL_INPUT      (0x00)
DIGITAL_OUTPUT     (0x01)
INPUT_PULLUP       (0x0B)

以下依序介紹功能。

數位輸入(Digital Input)

https://ithelp.ithome.com.tw/upload/images/20240116/20140213xxgPTGKJOY.png

Uno 的每一隻腳位都可以作為數位輸入使用,也就是每一隻腳位都可以接收 0 至 5V 的電壓。

數位輸出(Digital Output)

和輸入相反,Uno 的每一隻腳位也可以作為數位輸出使用,也就是可以輸出 0 至 5V 的電壓。

上拉輸入(Input Pullup)

基本上和數位輸入相同,都是輸入數位訊號,差別在 Uno 會在內部啟用上拉電阻,

甚麼是上拉電阻?我們可以先來談討以下問題。

https://ithelp.ithome.com.tw/upload/images/20240116/20140213DwOS0mUwa4.png

電子助教:「一定是 0 吧」

鱈魚:「答案是『不一定』。」

電子助教:「怎麼那麼多不一定 (´・ω・`) ... 」

鱈魚:「就像人生一樣嘛」

電子助教:「... 」

當 Uno 腳位為數位輸入時會進入高阻抗狀態,此時如果輸入腳位斷路,沒有任何電壓接入,就會處於「浮接(Floating)」狀態。

這個時候腳位非常容易受到外部磁場干擾,變成像天線一般的存在,為了避免這種情況,就需要「上拉電阻」登場了。

上拉電阻會在開關斷開後,將電壓固定至指定電壓(Uno 為 5V),而下拉電阻則是固定至 GND(0V)。

https://ithelp.ithome.com.tw/upload/images/20240116/20140213Gkmy9d6cpf.png

想閱讀更詳細說明的朋友可以參考以下連結:
浮接 Floating 是甚麼? 電路的不確定因素

硬體實作

終於要來實際接電路了!

首先需要準備以下設備與零件:

  • 三用電表 * 1

  • 麵包板 * 1

  • 按鈕 * 1

    推薦使用這種兩隻腳的按鈕。

https://ithelp.ithome.com.tw/upload/images/20240116/20140213BxBQ2MRK4z.jpg

https://ithelp.ithome.com.tw/upload/images/20240116/20140213OD75KaWJTn.png

  • LED * 1

    全名「發光二極體(light-emitting diode)」,功能與燈泡相同,通電就會發亮。

    準備甚麼顏色都可以。

https://ithelp.ithome.com.tw/upload/images/20240116/201402130pnusVF76U.jpg

https://ithelp.ithome.com.tw/upload/images/20240116/20140213B8uTcRWEjU.png

  • 電阻 220 歐姆 * 1

    用來分配電路中的電壓、電流。

https://ithelp.ithome.com.tw/upload/images/20240116/20140213ysWnBokivH.jpg

https://ithelp.ithome.com.tw/upload/images/20240116/20140213RaeKjWU7Dp.png

檢查硬體

開始連接電路前必須先確認每一個硬體都能正常運作,讓除錯更有效率,如同單元測試的概念一般。

按鈕

利用三用電表確認按鈕是否能夠正常通導。

https://ithelp.ithome.com.tw/upload/images/20240116/20140213fTAvda1ZT9.png

如果電表都沒有發出嗶嗶聲,那就換一個按鈕試試看。

LED

利用三用電表確認 LED 是否能夠正常發光。

https://ithelp.ithome.com.tw/upload/images/20240116/20140213l3qDme22pu.png

LED 沒有亮的話,可以試試看:

  • 探棒交換連結長短腳
  • 確保金屬接觸良好
  • 換一個 LED

電阻

利用三用電表確認電阻選用是否正確且功能正常。

https://ithelp.ithome.com.tw/upload/images/20240116/20140213KyHxjD87OU.png

如果數值都一直顯示 1,可以試試看:

  • 確認量測檔位正確
  • 確保金屬接觸良好
  • 換一個電阻

電子助教:「為甚麼量出來和 220 差有點多?」

鱈魚:「因為是便宜貨嘛 ╮(′~‵〞)╭」

電子助教:(憐憫的眼神 (´● ω ●`))

鱈魚:「亮個 LED 用不著精密電阻啦 ⎝(・ω´・⎝),才不是因為我買不起好嘛!」

電阻依其品質有其允許誤差範圍,具體判讀方式可以參考連結:電阻色碼

連接電路

以下為參考接線方式,可以不用完全相同,只要效果相同即可。

使用 Uno 板子上的 5V 為 +、GND 為 -。

數位輸入

我們希望訊號平常狀態為「低電位(0)」,按下狀態為「高電位(1)」,所以這裡採用下拉電阻。

https://ithelp.ithome.com.tw/upload/images/20240116/201402132p18PA7AcM.png

上拉輸入

因為 Uno 啟動內部上拉,所以不需要任何上下拉電阻。

https://ithelp.ithome.com.tw/upload/images/20240116/201402131lLSorOk7P.png

數位輸出

長腳一定要接在與 Pin 連接的位置,因為我們要由 Uno 輸出高電壓推動 LED 燈,所以 Pin 需要連接 LED 的正極。

https://ithelp.ithome.com.tw/upload/images/20240116/20140213SGoK5vYvje.png

補充說明

為何 LED 需要串聯電阻

如果流經 LED 的電流過大,會導致 LED 過熱燒毀,所以需要電阻進行「限流」,不要讓電流過大。

換個比喻,電阻就像是河流中的石頭,可以減緩水流(減少電流),保護水車(LED)不會被衝壞(燒壞)。

https://ithelp.ithome.com.tw/upload/images/20240116/20140213dINQoot1Ly.png

更好的元件驅動方式

其實驅動元件最好的方式應為「透過額外的電晶體(BJT 或 MOSDET 等等)驅動,Uno 只負責提供控制訊號」。

根據官方資料 Uno 所有 I/O 腳位輸出總電流不能超過 200mA,若超過容易造成 Uno 損壞,但為了簡單呈現效果且只有 1 個 LED 也不會超載,所以在此使用腳位驅動。

https://ithelp.ithome.com.tw/upload/images/20240116/20140213rg6k049x5F.png

總結

  • 了解 Firmata 支援的基本數位功能
  • 完成數位輸入、輸出電路

上一篇
D10 - 「數位×IN×OUT」
下一篇
D12 - 「數位×IN×OUT」:建立控制組件
系列文
你渴望連結嗎?將 Web 與硬體連上線吧!33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言