連接一個4×4薄膜鍵盤要佔用8個數位腳,若數位腳不夠用,大致有下列幾個解決方法:
- 使用專屬IC連接鍵盤,像74C922,是一個16鍵的解碼IC,能將8個鍵盤輸入腳,降低成5個接腳(4個資料輸出腳,1個「有新的資料」訊號腳)。
- 擴充數位腳,例如,利用PCF8574這個IC,透過I2C匯流排擴充數位介面,從這裡可下載Arduino的PCF8574程式庫。“I2C port Expander and 74C922 Keypad Decoders”這篇文章介紹了使用PCF8574擴充Arduino的數位腳,並採用74C922解碼鍵盤訊號的例子。
- 使用並列轉串列的IC(位移暫存器),像74HC165,這一篇文章包含使用74HC165連接10個按鈕輸入的例子。
把4×4按鍵轉換成類比訊號輸出
還有一種簡單、經濟的解決方法:使用數個電阻構成分壓電路,不同的按鍵將產生不同的電壓輸出,因此只須佔用一個Arduino的類比輸入腳。
此電路的運作原理如下:若按下按鍵“1”,電阻1KΩ將和10KΩ構成分壓電路:
若按下按鍵“5”,則是1KΩ+1KΩ+220Ω,共2220Ω和10KΩ形成分壓電路:
按鍵的分壓電阻值可以自行配置,不一定要採用上圖的1KΩ和220Ω電阻值,底下是另一個功能相同的電路(取自Microchip論壇的這一篇討論文),電阻值配置不同,按鍵產生的電壓值也和上圖不同,你要自行測試每個按鍵被Arduino的analogRead()指令讀取到的數值。這個電路的輸出端連接一個由電阻和電容構成的簡易消除彈跳(濾波)電路:
實驗材料與麵包板接線示範
本單元的實驗材料如下:
- Arduino Uno控制板,一片
- 4×4薄膜鍵盤(或者類似款式的鍵盤)×1
- 電阻:220Ω(紅紅棕)×3、1KΩ(棕黑紅)×4、10KΩ(棕黑橙)×1
麵包板接線示範:
輸出類比訊號的按鍵程式
本單元程式採用ExperimentalTechnik網站的Matrix Keypad文章提供的程式庫,這個程式庫必須搭配上面的電阻配置。請先下載AnalogMatrixKeypad程式庫,將它解壓縮到Arduino的libraries資料夾,再上傳這個程式碼:
#include <AnalogMatrixKeypad.h> // 初始化鍵盤物件,按鍵電路接在A0腳。 AnalogMatrixKeypad keypad(A0); void setup(){ Serial.begin(9600); } void loop(){ char key = keypad.readKey(); // 讀取按鍵輸入 if (key != KEY_NOT_PRESSED) { // 如果不是「沒有按鍵被按下」… Serial.println(key); // 顯示按鍵的字元 } }
編譯並上傳程式碼之後,開啟序列埠監控視窗,再按下薄膜鍵盤的任何按鍵,將能在序列埠監控視窗顯示該按鍵的字元。
未完,待續…
赵老师,我是湖北省钟祥市的一名高中信息技术老师,现在指导学生开展arduino活动,由于之前没有接触过单片机知识,自学过程中,偶然找到您的帖子,感觉耳目一新,深入浅出,生动形象,很好理解,感觉您的书确是一本难得的学习教材。
可是,由于大陆书店没有您的作品销售,不能抚本夜读,甚是遗憾!能否直接帮忙邮寄一本?我可以通过微信或者支付宝直接付款给您。
若如可行,三生有幸!
谢谢老师,我自己都觉得不好意思啦~
本书有简体中文版,在当当或亚马逊等书店都买得到:
《完美图解Arduino互动设计入门》
作者: 赵英杰
出版社: 科学出版社
敬祝
教安!
thanks,
jeffrey
那個AnalogMatrixKeypad程式庫好像下不了,
可以幫幫忙修正一下嗎?謝謝
原作者的網站似乎停擺了,請在此下載AnalogMatrixKeypad程式庫。
thanks,
jeffrey
想請問一下趙老師
我執行的結果鍵盤讀取到的值會往左偏一個
按左上的1變成2 按A無反應
4行都是
可能是哪邊有問題呢?
請檢察電路圖下方,220Ω和10KΩ的接線。
thanks,
jeffrey
這個方法回應不好, 我同一個按鍵要按好多次,才會顯示
的確沒有用IC解碼好。
thanks,
jeffrey