前往
大廳
主題

[arduino學堂]需要更多按鈕!矩陣鍵盤篇

白鷗 | 2021-01-17 22:38:08 | 巴幣 46 | 人氣 1615

誒嘿,是好久不見的arduino學堂重新開課啦~

今天來介紹的是矩陣鍵盤

事實上不管是電話鍵盤、電腦鍵盤這些最早都是用矩陣鍵盤來實現的,不然一顆鍵盤控制器要接上一百多根線也太痛苦了,雖然現在電腦鍵盤為了改良矩陣鍵盤的缺點後續又有許多不同的設計,不過那些不是本篇的重點,所以就不多談了

今天只會介紹最基本的矩陣鍵盤原理以及實作部分

下圖是一個3x4的12鍵矩陣鍵盤的電路架構,有3根輸入腳以及4根輸出腳,灰底部分是實際的矩陣鍵盤,其他都是外設電路

使用的方式也非常簡單,只要不斷的輪流給三根輸入腳低電位(另外兩根給高電位),然後讀取個輸出腳的電位即可

這是沒有按鈕按下的情況:

這是有一顆按鈕被按下的情況:(只有中間的輸入腳輸入低電位時,才會在第二根輸出腳讀到低電位,由此能推算出第二行第二列的按鈕有被按下)

接著來解釋原理,首先將上面的動圖停下來看個仔細

除了藍線的路徑外,任意讀取腳無法從其他路徑和輸入腳相連,因此我們把其他部份去掉來看個仔細

在讀取腳上,上方透過電阻連接VCC的作法被稱作"上拉電阻",用途是防止當按鈕放開時,讀取腳上沒有連接任何東西,就會變成薛丁格的輸入,因為你不知道他會讀到啥,因此我們藉由用一個電阻接到VCC確保當接腳懸空時我們會讀到VCC也就是高電位,而當我們將此讀取腳接上GND(或是低電位)時,因為分壓的關係(往VCC的電阻較大,往GND的電阻趨近於0)因此會讀到低電位

然而,仔細看就發現,上圖中在讀取腳中間隔了一個意義不明的二極體,不過不用擔心,因為現在二極體處於"順向偏壓",因此兩邊壓降大約只有0.7v所以讀取腳還是會判定為低電位


以上就是矩陣鍵盤基本原理的介紹(有夠粗糙!)

那你可能就想問,那個二極體到底幹嘛用的?如果你去查其他人的矩陣鍵盤+微控器的教學,基本上都不會有那個二極體

事實上,如果一次只按一個鍵的話,沒有二極體還是會一樣的工作(如下圖)


但是!但是!如果你一次按下兩個鍵呢?
這時如果沒有二極體,就可能導致讀取腳同時接上了高電位和低電位,那讀取腳到底會讀到高電位還是低電位??
一樣將讀取腳能接到輸入腳的路徑單獨拿出來看,此時更能輕鬆看出這高電位跟低電位根本短路了...不小心可能還會破壞I/O腳

為了解決這個問題,因此就在輸入腳裝上二極體來確保當輸入腳接上高電位時不論是否按下對應按鈕都能保持斷路狀態(因為上拉電阻會使得輸入低電位的輸入腳上的二極體為順向偏壓>此時讀取腳電壓為二極體跨壓0.7v左右>因遠小於高電位,因此輸入高電位的輸入腳上的二極體為逆向偏壓,視為斷路)
上面這就是雙鍵衝突以及其解決方式,不過這種跟電腦鍵盤常說的"鬼鍵"又不太一樣,詳情推薦這篇文:

好啦那以上就是電路原理的部分

接著是程式的部分

程式也沒什麼啦,基本的演算法就是:
先設定兩個和矩陣鍵盤大小一樣的boolen陣列,像我的這個就是
bool buttom[3][4],buttom_pre[3][4];
(一個存現在狀態,一個存前一次的狀態,用來判斷按鈕是剛被按下或是一直按著)

1.將其中一隻輸入腳設為低電位,其他設為高電位
2.讀取所有讀取腳,將讀到的值存入對應位置
3.換下一隻腳

4.讀完一輪後,你就有一組按鍵狀態的資料,後面就看你如何運用囉~

下面是我的小小實作,配合支援HID功能的SparkFun Pro Micro 來實現簡單的電腦鍵盤

然後程式我塞在這裡~

最後放個意義不明的動圖結束

創作回應

喔哇@あくあ☆
打卡
2021-01-17 23:55:16
小路(,,・ω・,,)
好多腳...
2021-01-21 20:52:56

更多創作