2010年12月21日 星期二

Arduino 筆記 - Lab2 使用按鍵控制 LED 燈號

實驗目的
使用按鍵 (PushButton)控制 LED 燈號的開關,當按鍵被按下時打開 LED 燈號,按鍵放開時關閉 LED 燈號。
材料
  • Arduino 主板 x 1
  • LED x 1
  • PushButton 或 Switch 開關 x 1
  • 10K 電阻 x 1
  • 麵包板 x 1
  • 單心線 x N
接線
  1. 把 LED 接到 pin13,長腳(陽極)接到 pin13,短腳(陰極)接到 GND
  2. PushButton 一支腳接到 +5V
  3. pin2 接到 Pushbutton 的另一支腳,同一支腳位接一個 10K 電阻連到 GND
image
電路圖
image
程式碼

說明:
  • L01~L02: 定義按鍵與 LED 的腳位,按鍵接在 pin2, 而 LED 接在 pin13
  • L16: 讀取按鍵的狀態並保存到 buttonState 變數裏
  • L20~L26: 這支程式的目的是按下按鍵時要打開 LED 燈號,放開按鍵時要關閉 LED 燈號,因此,假如 buttonState 為 HIGH,代表按鍵狀態是按下(pressed)的,此時要打開 LED,反之,假如 buttonState 為 LOW,代表按鍵狀態是放開的,此時要關閉 LED

註:這支是 Arduino 內建的範例程式,點選 File > Examples > 2.Digital > Button 就可以找到。

範例照片/影片

Youtube 上正好有段講解使用按鍵控制 LED 的影片,我們來看看他的示範:

注意!影片所用的範例程式,它是按下按鍵時關閉 LED 燈號,放開按鍵時打開 LED 燈號,邏輯與本文的範例相反。

動動腦
在不修改程式碼的條件下,讓 LED 變成在正常情況下是亮的,而當按下按鍵時讓 LED 燈號關掉。提示:條件是不能修改程式碼,要改變這支程式的行為,你只能夠動接線。

8 意見:

Cloud Sky 提到...

不好意思,小弟寡聞,不知是要移動那條線方能使電路邏輯相反呢?

Cooper Maa 提到...

Hi,

這會用到 Active-Low 的概念,可以參考這篇的說明:
http://www.arduino.cc/en/Tutorial/Pushbutton

基本上,方法就是用一顆 pull-up 電阻把 button 一支腳接到 +5V。也就是說,(1) 把這篇的電阻換到 +5v,然後 (2) pin2 本來跟 Gnd 接在一起,現在改接到 +5v 就可以了。

相關的概念可以參考「低態動作 LED (Active Low LED)」這篇:
http://coopermaa2nd.blogspot.com/2011/05/led-active-low-led.html

Cooper Maa 提到...

麵包板電路:
http://bitly.com/HJqmgV

艾瑞克的回憶錄 提到...

您好^^最近因Arduino的實驗品而購買了for Arduino Button Module搞了好幾天才發現到~這類型的模組接線與您教學的方法截然不同,當然發現到模組的方法簡單許多,我也記錄了一下分享給您。
http://www.dotblogs.com.tw/erichuang223/archive/2012/09/03/74554.aspx

Cooper Maa 提到...

你買的那個按鈕,是按下為 LOW 放開為 HIGH 嗎?
看一下那個按鈕的電路,有可能它是把電阻接到 VCC,這樣就變成 pull up resistor 了

感謝你的分享

高誌壕 提到...

版主你好 我想應該有很多人跟我有一樣的疑問 在材料方面10K電阻這個值是怎樣計算來的 看了很多例子都有用到電阻 只是非本科系的我不太懂電阻採用的標準為何 如何計算 比如前一個例子讓led發亮 你的例子裡簡略了電阻的使用 我看官網的例子裡採用220歐姆 只是也沒有如何計算及量測 可以幫我解答一下嗎

Cooper Maa 提到...

Hi,

「為什麼 LED 要用 220 歐姆限流的電阻?」,這個你可以參考一下葉難這篇說明: http://yehnan.blogspot.tw/2012/03/arduinoled220-ohm.html

至於這篇為什麼要用一顆 10k 的電阻 (在這裏又稱為 pull-down 下拉電阻)
簡略的說,是為了讓按鈕未被按下時保持訊號穩定 (不能不接電阻,不然按鈕沒按下時
power 會直接接到 GND 形成短路),用 10k 電阻的話,5v / 10000 = 0.0005A
耗損的電流很小,所以通訊選 10k 就夠用了。

上面兩個問題用文字說明可能不太好懂,改天若有空再整理篇比較好懂的 post

Cooper Maa 提到...

你是說,按鈕「按下又放開」也就是「按一下 (Click)」時只做 LED ON 或 OFF 其中一個動作嗎?

可以的,只是要處理按鈕彈跳的問題 (debounce) 會比較好
建議試試 clickbutton 這個 library
clickbutton library 可以辨識出 click, double clicks 事件