Giao tiếp bàn phím ma trận 4×3 và 4×4 với Arduino

Giao tiếp bàn phím ma trận 4×3 và 4×4 với Arduino

Bàn phím ma trận 4×3 và 4×4, là một sản phẩm có giá thành thấp và được sử dụng rất nhiều trong các ứng dụng như: cửa thông minh mở bằng mật khẩu, máy tính bỏ túi, điều khiển các thiết bị như đèn LED, động cơ, servo motor…

Giao tiếp bàn phím ma trận 4×3 và 4×4 với Arduino

Trong hướng dẫn này các bạn sẽ hiểu rõ về cấu trúc của keypad 4×4 và 4×3, cũng như là các thức hoạt động của chúng.

Để tạo động lực cho Team Arduino KIT ra nhiều bài viết chất lượng hơn, các bạn có thể ủng hộ mình bằng cách Donate qua MoMo, Ngân hàng, Paypal…Nhấn vào link bên dưới nhé.

Các linh kiện cần thiết cho dự án

TÊN LINH KIỆN SỐ LƯỢNG NƠI BÁN
Arduino Uno R3 1 Shopee | Cytron
Bàn phím ma trận 4×3, 4×4 1 Shopee | Cytron
Breadboard 1 Shopee | Cytron
Dây cắm (Đực – Đực) 10 – 20 Shopee | Cytron

Cấu trúc bàn phím ma trận

Bàn phím màng được làm từ một vật liệu màng mỏng, linh hoạt và thường gồm sáu lớp khác nhau:

Lớp phủ đồ họa: Lớp này thường được làm bằng polyester vì polyester có tuổi thọ uốn cong tốt hơn polycarbonate. Lớp này có chức năng thiết kế bề mặt bao gồm hình ảnh và ký tự.

Mái vòm kim loại: Lớp này chứa các mái vòm hoặc polydome kim loại, giúp tạo ra phản hồi xúc giác khi nhấn phím.

Lớp mạch trên cùng: Đây là lớp in polyester với mực dẫn điện chứa bạc.

Miếng đệm: Lớp này ngăn cách giữa các mạch trên cùng và mạch dưới cùng, cho phép công tắc vẫn ở trạng thái mở bình thường cho đến khi được nhấn từ bàn phím.

Lớp mạch dưới cùng: Đây cũng là lớp in polyester với mực dẫn điện chứa bạc.

Lớp dính phía sau: Lớp này dùng để dính bàn phím vào bề mặt khác.

Nếu bạn bóc lớp giấy phía sau bàn phím, bạn có thể nhìn thấy cấu trúc của bàn phím ma trận.

Để giảm số lượng kết nối I/O, tất cả các hàng và cột được nối với nhau. Nếu không có kết nối này, bạn sẽ cần có 17 chân I/O để giao tiếp với 16 nút bấm độc lập, một chân cho mỗi nút và một chân cho điểm chung. Nhưng bằng cách kết nối các hàng và cột, chỉ cần 8 chân để điều khiển toàn bộ bàn phím 4×4. Kỹ thuật này được gọi là ghép kênh và cho phép điều khiển một số lượng lớn đầu vào bằng cách sử dụng ít chân hơn.

Xem ngay: Hướng dẫn sử dụng module LED ma trận 8×8 MAX7219 với Arduino

Bàn phím ma trận hoạt động như thế nào?

Keypad có sự kết hợp của các tiếp điểm nút bấm và các dây dẫn của các hàng và cột. Bàn phím 4×4 có tổng cộng 8 chân, bao gồm 4 chân cho các cột và 4 chân cho các hàng. Trong khi đó, bàn phím 4×3 có tổng cộng 7 chân, gồm 4 chân cho các cột và 3 chân cho các hàng.

Hình minh họa bàn phím 4×3 cơ bản sẽ hiển thị cách dây dẫn bên trong kết nối các hàng và cột.

Giao tiếp bàn phím ma trận 4×3 và 4×4 với Arduino

Khi một nút bấm được nhấn, một hàng và một cột được kết nối với nhau, tạo ra đường dẫn dòng điện qua chúng. Ví dụ: khi nút ‘4’ được nhấn, cột 1 và hàng 2 sẽ được kết nối với nhau.

Bằng cách xác định cột và hàng tương ứng được kết nối, chúng ta có thể xác định nút bấm nào đã được nhấn.

Quét bàn phím (Keypad Scanning)

Quá trình quét bàn phím bao gồm các bước sau:

  • Đặt tất cả các hàng ở mức cao (mức logic) và cấu hình các đầu vào cột như các đầu vào với điện trở kéo lên.
  • Lặp lại từng hàng, đặt hàng đó ở mức thấp trong khi đọc các đầu vào cột.
  • Nếu phát hiện mức thấp trên bất kỳ đầu vào cột nào, điều đó cho thấy một phím trong hàng và cột tương ứng đang được nhấn.
  • Xác định phím cụ thể dựa trên kết hợp hàng và cột.
  • Lặp lại quá trình quét định kỳ để theo dõi liên tục các phím được nhấn.

Sơ đồ chân bàn phím ma trận 4×3 và 4×4

Sơ đồ đấu nối bàn phím ma trận 4×3 và 4×4 với Arduino

Arduino Bàn phím ma trận 4×3 Bàn phím ma trận 4×4
9 R1 R1
8 R2 R2
7 R3 R3
6 R4 R4
5 C1 C1
4 C2 C2
3 C3 C3
2 C4

Cài đặt thư viện Keypad.h

Mở phần mềm Arduino IDE lên, truy cập theo đường dẫn Sketch > Include Library > Manage Libraries…

Nhập từ khóa ‘keypad’ vào ô tìm kiếm, kéo xuống và tìm đến thư viện “Keypad by Mark Stanley, Alexander Brevig“, chọn phiên bản mới nhất và nhấn “Install” để tiến hành cài đặt.

Code ví dụ

Code bàn phím ma trận 4×3

#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns

char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3}; //connect to the column pinouts of the keypad

//Create an object of keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
}
  
void loop(){
  char key = keypad.getKey();// Read the key
  
  // Print if key pressed
  if (key){
    Serial.print("Key Pressed : ");
    Serial.println(key);
  }
}

Code bàn phím ma trận 4×4

#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns

char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad

//Create an object of keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
  Serial.begin(9600);
}
  
void loop(){
  char key = keypad.getKey();// Read the key
  
  // Print if key pressed
  if (key){
    Serial.print("Key Pressed : ");
    Serial.println(key);
  }
}

Kết quả, sau khi nạp code xong các bạn mở Serial Monitor lên để test xem kết quả nhé.

Giải thích Code

#include <Keypad.h>

#include – Thêm thư viện Keypad vào chương trình.

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns

Khai báo số hàng (ROWS) và số cột (COLS) của bàn phím ma trận. Trong trường hợp này, có 4 hàng và 4 cột.

char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

Mảng “keys” định nghĩa các ký tự tương ứng với từng phím trên Keypad. Mỗi phần tử của mảng là một ký tự và tạo thành một ma trận 4×4.

byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad

Mảng “rowPins” và “colPins” định nghĩa các chân kết nối với các hàng và cột trên bàn phím ma trận.

//Create an object of keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

Tạo một đối tượng “keypad” thuộc lớp Keypad với các thông số là ma trận keys, mảng rowPins, mảng colPins, số hàng (ROWS) và số cột (COLS).

void setup(){
  Serial.begin(9600);
}

Thiết lập giao tiếp với Serial Monitor ở tốc độ baud 9600.

void loop(){
  char key = keypad.getKey();// Read the key
  
  // Print if key pressed
  if (key){
    Serial.print("Key Pressed : ");
    Serial.println(key);
  }
}

Vòng lặp loop để đọc và in ra ký tự từ bàn phím ma trận.

Biến “key” lưu giữ ký tự được đọc từ bàn phím.

Nếu có ký tự được đọc (không phải giá trị NULL), in ra Serial Monitor thông báo “Key Pressed” kèm theo ký tự được nhấn.

Một số chức năng của thư viện Keypad.h

  • Hàm waitForKey(): Chờ đợi mãi mãi cho đến khi có một phím được nhấn. Lưu ý rằng hàm này sẽ chặn mọi hoạt động khác cho đến khi có phím được nhấn. Điều này có nghĩa là không có LED nhấp nháy, không có cập nhật màn hình LCD, chỉ có các hoạt động gián đoạn.
  • Hàm getState(): Trả về trạng thái hiện tại của bất kỳ phím nào trên bàn phím. Có bốn trạng thái: IDLE (trạng thái chờ), PRESSED (đã nhấn), RELEASED (đã nhả), và HOLD (đang giữ).
  • Hàm keyStateChanged(): Trả về giá trị boolean cho biết khi nào trạng thái của một phím đã thay đổi từ một trạng thái này sang một trạng thái khác. Ví dụ: thay vì chỉ kiểm tra phím hợp lệ, bạn có thể kiểm tra thời điểm nhấn phím.
  • Hàm setHoldTime(unsigned int time): Đặt thời gian (tính bằng mili giây) mà người dùng phải giữ một phím cho đến khi trạng thái HOLD được kích hoạt.
  • Hàm setDebounceTime(unsigned int time): Đặt thời gian (tính bằng mili giây) mà bàn phím sẽ đợi trước khi chấp nhận một lần nhấn phím mới hoặc sự kiện phím mới.
  • Hàm addEventListener(keypadEvent): Kích hoạt sự kiện nếu bàn phím được sử dụng.

Bài viết liên quan

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments