Arduino Bàn phím

Bàn phím số được sử dụng rộng rãi trong nhiều thiết bị như khóa cửa, máy rút tiền tự động (ATM), máy tính bỏ túi...

Trong hướng dẫn này, chúng ta sẽ học:

Phần cứng cần chuẩn bị

1×Arduino Uno R3
1×USB 2.0 cable type A/B (for USB-A PC)
1×USB 2.0 cable type C/B (for USB-C PC)
1×Bàn phím ma trận 3x4 and 4x4 Kit
1×(Hoặc) Bàn phím ma trận 3x4
1×(Hoặc) Bàn phím ma trận 4x4
1×dây jumper
1×(Khuyến nghị) Screw Terminal Block Shield for Arduino Uno
1×(Khuyến nghị) Breadboard Shield for Arduino Uno
1×(Khuyến nghị) Enclosure for Arduino Uno
1×(Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về bàn phím số

bàn phím số

Bàn phím là một tập hợp các nút được sắp xếp thành hàng và cột (gọi là ma trận). Mỗi nút được gọi là phím.

Bàn phím có nhiều loại. Hai loại phổ biến cho các dự án tự làm là bàn phím ma trận 3x4 (12 phím) và bàn phím ma trận 4x4 (16 phím).

Bố trí chân pin

Các chân của keypad được chia thành hai nhóm: hàng và cột.

Bàn phím ma trận 3x4 có 7 chân: 4 chân hàng (R1, R2, R3, R4) và 3 chân cột (C1, C2, C3).

Bàn phím ma trận 4x4 có 8 chân: 4 chân hàng (R1, R2, R3, R4) và 4 chân cột (C1, C2, C3, C4).

sơ đồ các chân của bàn phím ma trận

Cách hoạt động

Phần này chứa thông tin nâng cao có thể gây quá tải. Nếu bạn chưa chắc về nội dung, hãy bỏ qua và chuyển sang phần tiếp theo.

Quá trình phát hiện nhấn phím được gọi là quét bàn phím.

Nó được gọi là “quét” vì nó kiểm tra từng phím một.

Các chân hàng được kết nối với các chân đầu ra của Arduino.

Các chân cột được kết nối với các pin đầu vào của Arduino (INPUT_PULLUP, ở trạng thái này, giá trị của pin đầu vào sẽ là HIGH khi phím chưa được nhấn).

Đối với mỗi hàng:

  • Thiết lập tất cả các chân hàng ở mức HIGH.
  • Chỉ thiết lập chân hàng hiện tại ở mức LOW.
  • đọc trạng thái của từng cột.
    • Nếu một chân cột ở mức HIGH ⇒ phím tại (hàng, cột) KHÔNG được ấn.
    • Nếu một chân cột ở mức LOW ⇒ phím tại (hàng, cột) được ấn.
  • Lặp lại quá trình trên cho các chân hàng tiếp theo.

※ Lưu ý:

Phần ở trên đây là một trong những phương pháp quét bàn phím. Ta có thể đảo ngược mọi tín hiệu HIGH thành LOW và mọi tín hiệu LOW thành HIGH để quét bàn phím.

Tại sao bàn phím được bố trí và kết nối theo ma trận? Điều này khiến quá trình quét trở nên phức tạp. Tại sao không dùng mỗi phím như một nút độc lập, khi đó trạng thái của phím sẽ được xác định một cách đơn giản bằng cách đọc trạng thái của một nút?

⇒ Như chúng ta đã biết, một nút độc lập đòi hỏi một chân của Arduino và GND. Hãy lấy bàn phím ma trận 4×4 làm ví dụ. Nếu mỗi phím được xem như một nút độc lập, nó sẽ yêu cầu 16 chân Arduino cho 16 phím kèm với một chân GND. Nếu ta sắp xếp các phím thành dạng ma trận liên kết, ta chỉ cần dùng 8 chân Arduino, từ đó có thể tiết kiệm số chân của Arduino. Tóm lại, câu trả lời là: để tiết kiệm các chân của Arduino.

Sơ đồ đấu dây

sơ đồ nối dây bàn phím ma trận Arduino

This image is created using Fritzing. Click to enlarge image

Cách Lập Trình Cho Bàn Phím Số

Nhờ thư viện Keypad library, việc sử dụng keypad với Arduino dễ như ăn bánh, bất kể bạn có hiểu cách hoạt động của keypad hay không.

Mã Arduino

Bàn phím số 3x4

#include <Keypad.h> const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 3; //three columns char keys[ROW_NUM][COLUMN_NUM] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad byte pin_column[COLUMN_NUM] = {5, 4, 3}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM ); void setup(){ Serial.begin(9600); } void loop(){ char key = keypad.getKey(); if (key){ Serial.println(key); } }

Bàn phím ma trận 4x4

#include <Keypad.h> const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 4; //four columns char keys[ROW_NUM][COLUMN_NUM] = { {'1','2','3', 'A'}, {'4','5','6', 'B'}, {'7','8','9', 'C'}, {'*','0','#', 'D'} }; byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM ); void setup(){ Serial.begin(9600); } void loop(){ char key = keypad.getKey(); if (key){ Serial.println(key); } }

Hướng dẫn từng bước

  • Điều hướng đến biểu tượng Thư viện ở thanh bên trái của Arduino IDE.
  • Tìm kiếm “keypad”, sau đó tìm thư viện keypad của Mark Stanley, Alexander Brevig
  • Nhấn Cài đặt nút để cài đặt thư viện keypad.
thư viện bàn phím Arduino
  • Sao chép mã ở trên và mở bằng Arduino IDE
  • Nhấn nút Tải lên trên Arduino IDE để tải mã lên Arduino
  • Mở Serial Monitor
  • Nhấn một số phím trên bàn phím số
  • Xem kết quả trong Serial Monitor
COM6
Send
3 6 9 4 * #
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Bàn phím số và Mật khẩu

Một ứng dụng phổ biến của bàn phím số là nhập mật khẩu. Trong ứng dụng này, chúng ta xác định hai phím đặc biệt:

  • Một phím để bắt đầu nhập mật khẩu hoặc nhập lại từ đầu. Ví dụ, phím "*"
  • Một phím để kết thúc việc nhập mật khẩu. Ví dụ, phím "#"

Mật khẩu sẽ là một chuỗi chứa các phím còn lại, ngoại trừ hai phím đặc biệt được chọn.

Khi một phím được nhấn.

  • Nếu phím không phải '*' và cũng không phải '#', thêm ký tự đó vào chuỗi mật khẩu đã nhập của người dùng.
  • Nếu phím là '#', so sánh chuỗi mật khẩu đã nhập của người dùng với mật khẩu để xác định mật khẩu nhập có đúng hay không, và sau đó làm rỗng chuỗi mật khẩu đã nhập của người dùng.
  • Nếu phím là '*', làm rỗng chuỗi mật khẩu đã nhập của người dùng.

Bàn phím số - Mã mật khẩu

/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-keypad */ #include <Keypad.h> const int ROW_NUM = 4; //four rows const int COLUMN_NUM = 3; //three columns char keys[ROW_NUM][COLUMN_NUM] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'*','0','#'} }; byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad byte pin_column[COLUMN_NUM] = {5, 4, 3}; //connect to the column pinouts of the keypad Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM ); const String password = "1234"; // change your password here String input_password; void setup(){ Serial.begin(9600); input_password.reserve(32); // maximum input characters is 33, change if needed } void loop(){ char key = keypad.getKey(); if (key){ Serial.println(key); if(key == '*') { input_password = ""; // clear input password } else if(key == '#') { if(password == input_password) { Serial.println("password is correct"); // DO YOUR WORK HERE } else { Serial.println("password is incorrect, try again"); } input_password = ""; // clear input password } else { input_password += key; // append new character to input password string } } }
  • Chạy đoạn mã ở trên
  • Mở Serial Monitor
  • Nhấn các phím "123456" và nhấn "#"
  • Nhấn các phím "1234" và nhấn "#"
  • Xem kết quả trên Serial Monitor
COM6
Send
password is incorrect, try again password is correct
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Video Tutorial

Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.

Thách thức bản thân

  • Hiển thị phím đã nhấn từ bàn phím lên LCD. Gợi ý: Tham khảo Arduino - Màn hình LCD
  • Tạo ổ khóa cửa có bảo mật bằng mật khẩu sử dụng bàn phím.