2011年1月30日 星期日

Arduino 筆記 – Lab18 讀取 3x4 Keypad 的輸入

實驗目的

練習使用 3x4 Keypad (矩陣鍵盤, Matrix Keypad)。寫一個簡單的程式,讀取 Keypad 的輸入並列印到 Serial Port 上。

Keypad 簡介

image

(圖片來源: Sparkfun)

Keypad 是很常見的輸入介面,生活周遭中就可以看到很多用到 Keypad 的物品,例如計算機、手機、收銀機等。Keypad 有很多種型式,有 12 個按鍵的 3x4 Keypad,有 4x4 的 Keypad 等等。

一般來說,Keypad 同一行(Column)的所有按鍵會接在同一條線路上,而同一列(Row)的所有按鍵也會接在同一條線路上。要判斷按鍵有沒被按下,就對某一行(Column)的線路送出電壓,然後檢查每一列(Row)的線路看看是否有電流通過,假如有電流通過的話,就代表按鍵有被按下,接著換到下一行(Column),然後依序檢查每一列的線路,照著這個步驟做,就可以對 Keypad 上所有按鍵的狀態整個檢查一遍。這個方法叫做鍵盤掃瞄(Matrix Keypad scan)。

識別 Keypad 的接腳

由於 Keypad 的腳位定義並沒有標準,所以,在使用 Keypad 前,必須先找出 Keypad 行(Column)與列(Row)線路所在的接腳。一個方法是用電表,對 Keypad 所有接腳兩兩量測,這部份可參考 Keypad Tutorial 的說明。另一個則是土法煉鋼的方法,把螺絲取下直接打開 Keypad 看它的電路。

image

以本實驗所用的 3x4 Keypad 為例,這個 Keypad 總共有 7 支接腳,上圖即 Keypad 拆開後的照片,它的電路結構很簡單,循著線路看就可以查出行(Column)與列(Row)線路所在的接腳,三個行(Columns)由左而右依序是 3, 1, 5 接腳,而四個列 (Rows) 從上而下依序是 2, 7, 6, 4 接腳。如下圖右下角的電路圖所示,可以拿個紙筆把你所用的 Keypad 行列所在的接腳抄寫下來,方便記憶。

image

(圖片來源: arduino.cc)

材料
  • 麵包板 x 1
  • Arduino 主板 x 1
  • 3x4 Keypad
  • 單心線 x N
接線

照下表連接 Arduino 與 Keypad 的接腳:

Keypad 接腳 Arduino 接腳 說明
1 12 Column1
2 11 Row0
3 10 Column0
4 9 Row3
5 8 Column2
6 7 Row2
7 6 Row1

接線圖如下:

image 

Keypad 函式庫

Keypad 鍵盤掃瞄程序原本是有一點繁瑣的,必須控制輸出訊號、判斷輸入訊號、處理接觸彈跳(debounce)避免將機械的彈跳誤判為按鍵輸入等…,Keypad Library 已經把事情變簡單了,現在只要安裝 Keypad Library,就可以很輕鬆地讀取 Keypad 的輸入,而且 Keypad Library 支援 3x4, 4x4 等各種型式的 Keypad。

Keypad Library 的安裝辦法很簡單,到官網下載函式庫後,把檔案解壓縮放到 Arduino 的 Libraries 資料夾底下即可:

image

程式碼

底下是一個簡單的範例(HelloKeypad.pde),這支程式的功能只是讀取 Keypad 的輸入並列印到 Serial Port 上:

編譯程式,然後把程式上傳到 Arduino 後,打開 Serial Monitor 並依序按下 Keypad 上的 12 個按鍵,就會看到底下的結果:

image

在使用 Keypad Library 的時候,要特別注意 Keypad 與 Arduino 接腳的對應關係:

Keypad 接腳 Arduino 接腳 說明
1 12 Column1
2 11 Row0
3 10 Column0
4 9 Row3
5 8 Column2
6 7 Row2
7 6 Row1

一定要按照上表把行(Column)與列(Row)所在的 "Arduino 接腳" 依序填寫到陣列變數中,例如 Row0~Row3 的接腳依序是 11, 6, 7, 9,而 Column0~Column2 的接腳依序是 10, 12, 8:

如果你用的 Keypad 其 Column0~Column2 是在 Keypad 的 1, 2, 3 接腳,而 Row0~Row3 是在 Keypad 的 4, 5, 6, 7 接腳,可照下表定義 Keypad 與 Arduino 接腳的對應關係:

Keypad 接腳 Arduino 接腳 說明
1 12 Column0
2 11 Column1
3 10 Column2
4 9 Row0
5 8 Row1
6 7 Row3
7 6 Row4

那麼程式就要改成這個樣子:

參考資料

5 意見:

芭蕉葉上聽雨聲 提到...

這個範例要用掉Arduino 7隻腳位,這樣的做法有點浪費腳位, 請問有沒有更好的方法能節省腳位?
據我所知好像有一種判斷電阻值的方式可以利用很少的腳位來達到目的.

coopermaa 提到...

你說的沒錯,有一種判斷電阻值的方法可以節省腳位
方法是利用 Analog Input,而且只需要一根 Analog Input 然後再拉 +5V 和 Gnd 就可以辦到,這裏有一篇教學 (PS: 我沒試過):

http://www.instructables.com/id/Arduino-3-wire-Matrix-Keypad/

coopermaa 提到...

這篇也可以參考一下:

http://tronixstuff.wordpress.com/2012/02/29/tutorial-analog-input-for-multiple-buttons-part-two/

Sigh Chen 提到...

Hi 你好, 近幾週都在這駐足受益匪淺,目前連假帶板子回家玩,要下載涵式庫時卻跑出 : The page "Keypad/Zip" doesn't exist.
我急忙去官方論壇提問 : http://arduino.cc/forum/index.php/topic,158311.0.html 但現在好像是歐美凌晨五點多,所以我直接來這邊詢問您有沒有其他下載處:D?




Cooper Maa 提到...

你好,官網連結真的斷了,好像也沒人反應問題

不過,作者可能把 code 搬到 github 上了,你可以抓這個版本試試:

https://github.com/Nullkraft/Keypad

歡迎常來啊
另外也建議到 Openlab Taipei Facebook 和大家一起交流,那邊人多,回覆的速度比較快