Bàn phím là một công cụ tuyệt vời để cho phép người dùng tương tác với dự án của mình. Bạn có thể sử dụng chúng để điều hướng các menu, nhập mật khẩu và điều khiển trò chơi và robot.
Trong hướng dẫn này, tôi sẽ hướng dẫn cho các bạn cách giao tiếp bàn phím với Arduino. Đầu tiên, tôi sẽ giải thích cách Arduino phát hiện các phím bấm, sau đó tôi sẽ chỉ cho bạn cách dò ra sơ đồ chân của bất kỳ bàn phím nào. Thông qua một ví dụ đơn giản, tôi sẽ chỉ cho bạn cách in các phím bấm lên màn hình nối tiếp và màn hình LCD. Cuối cùng, tôi sẽ chỉ cho bạn cách kích hoạt rơ-le 5V khi mật khẩu được nhập chính xác.
Tôi sẽ sử dụng bàn phím ma trận 4X4 trong bài viết này, nhưng cũng có chương trình và sơ đồ nối dây cho bàn phím ma trận 3X4. Tôi thích bàn phím kiểu màng vì chúng mỏng và chúng cũng có lớp chống dính để bạn có thể dán lên hầu hết các bề mặt phẳng.
Cách làm việc của bạn phím
Các nút nhấn trên bàn phím được sắp xếp theo hàng và cột. Bàn phím 3X4 có 4 hàng và 3 cột và bàn phím 4X4 có 4 hàng và 4 cột:
Bên dưới mỗi phím là một màng công tắc. Mỗi công tắc trong một hàng được kết nối với các công tắc khác trong hàng bằng một đường dẫn điện bên dưới miếng đệm. Mỗi công tắc trong một cột được kết nối theo cùng một cách – một bên của công tắc được kết nối với tất cả các công tắc khác trong cột đó bằng một đường dẫn điện. Mỗi hàng và cột được đưa ra một chân duy nhất, có tất cả 8 chân đối với bàn phím 4X4:
Khi một nút nhấn được nhấn sẽ đóng công tắc giữa một cột và đường dẫn điện một hàng, cho phép dòng điện chạy giữa một chân cột và một chân hàng.
Sơ đồ bàn phím 4X4 cho thấy cách các hàng và cột được kết nối:
Arduino phát hiện nút nhấn nào được nhấn bằng cách phát hiện chân hàng và cột mà được kết nối với nút nhấn.
Điều này xảy ra trong bốn bước:
1. Đầu tiên, khi không có nút nào được nhấn, tất cả các chân cột được giữ ở mức CAO và tất cả các chân hàng được giữ ở mức THẤP:
2. Khi một nút được nhấn, chân cột được kéo xuống THẤP vì vậy dòng điện từ cột mức CAO chảy sang chân hàng mức THẤP:
3. Arduino bây giờ biết nút nhấn nào nằm trong cột, vì vậy bây giờ nó chỉ cần tìm hàng của nút nhấn đó. Nó thực hiện điều này bằng cách chuyển đổi từng chân của hàng CAO, đồng thời đọc tất cả các chân cột để phát hiện chân cột nào trở về CAO:
4. Khi chân cột trở lại CAO, Arduino đã tìm thấy chân hàng được kết nối với nút nhấn đó:
Từ sơ đồ trên, bạn có thể thấy rằng sự kết hợp của hàng 2 và cột 2 có nghĩa là chỉ có thể nút nhấn số 5 đã được nhấn.
Kết nối bàn phím với Arduino
Bố trí chân của hầu hết các bàn phím màng sẽ như thế này:
Thực hiện theo các sơ đồ bên dưới để kết nối bàn phím với Arduino Uno, tùy thuộc vào việc bạn sử dụng bàn phím là 3X4 hay 4X4:
Làm thế nào để tìm sơ đồ chân của bàn phím
Nếu bàn phím của bạn có bố trí chân không giống với những cái ở trên, bạn có thể tìm dò ra các chân. Bạn cần phải sử dụng một mạch thử nghiệm bằng cách kết nối một đèn LED và điện trở giới hạn dòng điện với Arduino (hoặc bất kỳ nguồn điện 5V nào) như thế này:
Đầu tiên, tìm ra các chân bàn phím được kết nối với các nút nhấn hàng. Cắm dây nối đất (màu đen) vào chân đầu tiên bên trái. Nhấn và giữ bất kỳ nút nhấn nào trong hàng 1. Bây giờ cắm dây dương (màu đỏ) vào từng chân khác. Nếu đèn LED sáng lên ở một trong các chân, nhấn và giữ nút khác ở hàng 1, sau đó cắm dây dương vào từng chân khác. Nếu đèn LED sáng lên trên một chân khác, điều đó có nghĩa là dây nối đất được lắp vào chân 1 hàng. Nếu không có nút nhấn nào trong hàng 1 làm đèn LED sáng lên, dây nối đất không được kết nối với hàng 1. Bây giờ di chuyển dây nối đất sang chân tiếp theo, nhấn một nút ở một hàng khác và lặp lại quy trình trên cho đến khi bạn tìm thấy chân cho mỗi hàng.
Để tìm ra các chân mà các cột được kết nối, cắm dây nối đất vào chân mà bạn biết là hàng 1. Bây giờ hãy nhấn và giữ bất kỳ một trong các nút trong hàng đó. Bây giờ cắm dây dương vào từng chân còn lại. Chân làm cho đèn LED sáng lên là chân mà kết nối với cột của nút nhấn đó. Bây giờ nhấn xuống một nút khác trong cùng một hàng và cắm dây dương vào từng chân khác. Lặp lại quy trình này cho từng cột khác cho đến khi bạn xác định được tất cả các chân của bàn phím.
Lập trình bàn phím
Để minh họa cơ bản về cách thiết lập bàn phím, tôi chỉ cho bạn cách in từng phím bấm ra màn hình nối tiếp.
Cài đặt thư viện
Chúng ta sẽ sử dụng thư viện Keypad của Mark Stanley và Alexander Brevig. Thư viện này đảm nhiệm việc thiết lập các chân và kiểm tra vòng cho các cột và hàng khác nhau. Để cài đặt thư viện Keypad, bạn hãy mở phần mềm Arduino IDE, sau đó chọn menu Sketch >> Include Library >> Manage Libraries và tìm kiếm với từ khóa “keypad”. Nhấp chọn thư viện cần cài đặt trong danh sách tìm kiếm, sau đó bấm install.
Chương trình
Sau khi thư viện Keypad đã được cài đặt, bạn có thể nạp chương trình này vào Arduino nếu bạn sử dụng bàn phím 4X4:
#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[ROWS][COLS] = {
{‘1’, ‘2’, ‘3’, ‘A’},
{‘4’, ‘5’, ‘6’, ‘B’},
{‘7’, ‘8’, ‘9’, ‘C’},
{‘*’, ‘0’, ‘#’, ‘D’}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup(){
Serial.begin(9600);
}
void loop(){
char customKey = customKeypad.getKey();
if (customKey){
Serial.println(customKey);
}
}
Nếu bạn sử dụng bàn phím 3×4, bạn có thể sử dụng chương trình này:
#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 3;
char hexaKeys[ROWS][COLS] = {
{‘1’, ‘2’, ‘3’},
{‘4’, ‘5’, ‘6’},
{‘7’, ‘8’, ‘9’},
{‘*’, ‘0’, ‘#’}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup(){
Serial.begin(9600);
}
void loop(){
char customKey = customKeypad.getKey();
if (customKey){
Serial.println(customKey);
}
}
Dòng 3 và 4 trong chương trình trên thiết lập số lượng hàng và cột trên bàn phím.
Các dòng 6-11 xác định các ký tự được in khi nhấn một nút nhấn cụ thể trên bàn phím. Các ký tự được in ra giống như chúng xuất hiện trên bàn phím. Nếu bàn phím của bạn có bố cục khác, bạn có thể xác định các ký tự được in khi nhấn nút. Ví dụ: giả sử bàn phím của bạn có một cột các chữ cái ở bên trái thay vì bên phải. Bạn chỉ cần thay đổi nó thành như thế này:
char hexaKeys[ROWS][COLS] = {
{‘A’, ‘1’, ‘2’, ‘3’},
{‘B’, ‘4’, ‘5’, ‘6’},
{‘C’, ‘7’, ‘8’, ‘9’},
{‘D’, ‘*’, ‘0’, ‘#’}
};
Sau khi bạn nạp chương trình, mở serial monitor. Khi bạn nhấn một phím, giá trị sẽ được in ra:
Sử dụng LCD với bàn phím
Bây giờ, hãy để xem cách in các phím bấm trên màn hình LCD. Bàn phím 4X4 sử dụng 8 chân và bàn phím 3X4 sử dụng 7 chân. Điều đó chiếm rất nhiều chân, vì vậy tôi sẽ sử dụng màn hình LCD hỗ trợ I2C bởi vì nó chỉ cần 4 dây để kết nối với Arduino.
Cài đặt thư viện LiquidCrystal_I2C
Để có thể giao tiếp LCD với Arduino qua chuẩn giao tiếp I2C, bạn cần phải cài đặt thư viện LiquidCrystal I2C của Marco Schwartz. Thư viện này rất hay vì nó bao gồm hầu hết các chức năng có sẵn trong thư viện LiquidCrystal tiêu chuẩn. Để cài đặt nó, hãy tải xuống file .zip bên dưới, sau đó chọn Sketch >> Include Library >> Add .ZIP Library:
Thư viện Wire
Thư viện Wire là cần thiết để hỗ trợ thêm cho giao tiếp I2C. Nó được đóng gói với Arduino IDE, do đó, không cần phải cài đặt nó. Nhưng nếu vì một lý do nào đó, thư viện này chưa được cài đặt trên hệ thống của bạn, hãy vào Sketch >> Include Library >> Manage Libraries và tìm kiếm với từ khóa ‘wire’ để cài đặt nó.
Kết nối bàn phím với LCD
Sau khi các thư viện đã được cài đặt, bạn kết nối các chân nối đất và Vcc của LCD với Arduino, sau đó kết nối các chân SDA và SCL của LCD theo bảng bên dưới cho các board Arduino khác nhau:
Sau đó kết nối bàn phím với Arduino. Sơ đồ mạch sẽ trông giống như thế này (đối với Arduino Uno):
Chương trình hiển thị phím được nhấn lên LCD
Khi mọi thứ đã được kết nối, bạn nạp chương trình này lên Arduino:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[ROWS][COLS] = {
{‘1’, ‘2’, ‘3’, ‘A’},
{‘4’, ‘5’, ‘6’, ‘B’},
{‘7’, ‘8’, ‘9’, ‘C’},
{‘*’, ‘0’, ‘#’, ‘D’}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x21, 16, 2);
void setup(){
lcd.backlight();
lcd.init();
}
void loop(){
char customKey = customKeypad.getKey();
if (customKey){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(customKey);
}
}
Bạn cần phải thêm địa chỉ I2C trên màn hình LCD trên dòng 20:
LiquidCrystal_I2C lcd(0x21, 16, 2);
Địa chỉ I2C màn hình LCD của tôi là 0x21, nhưng có lẽ bạn sẽ khác. Địa chỉ I2C màn hình LCD của bạn sẽ được cung cấp trong datasheet, nhưng nếu không, bạn có thể tìm thấy nó bằng cách chạy chương trình I2C_Scanner này.
Sử dụng mật khẩu để kích hoạt một rơ-le
Một trong những ứng dụng hữu ích nhất của bàn phím là sử dụng nó để nhập mật khẩu. Bạn có thể thiết lập mật khẩu và yêu cầu Arduino kích hoạt rơ-le hoặc một số mô-đun khác nếu mật khẩu đúng. Đoạn chương trình sau sẽ kích hoạt rơ-le 5V khi mật khẩu được nhập chính xác:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#define Password_Length 8
int signalPin = 12;
char Data[Password_Length];
char Master[Password_Length] = “123A456”;
byte data_count = 0, master_count = 0;
bool Pass_is_good;
char customKey;
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[ROWS][COLS] = {
{‘1’, ‘2’, ‘3’, ‘A’},
{‘4’, ‘5’, ‘6’, ‘B’},
{‘7’, ‘8’, ‘9’, ‘C’},
{‘*’, ‘0’, ‘#’, ‘D’}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x21, 16, 2);
void setup(){
lcd.init();
lcd.backlight();
pinMode(signalPin, OUTPUT);
}
void loop(){
lcd.setCursor(0,0);
lcd.print(“Enter Password:”);
customKey = customKeypad.getKey();
if (customKey){
Data[data_count] = customKey;
lcd.setCursor(data_count,1);
lcd.print(Data[data_count]);
data_count++;
}
if(data_count == Password_Length-1){
lcd.clear();
if(!strcmp(Data, Master)){
lcd.print(“Correct”);
digitalWrite(signalPin, HIGH);
delay(5000);
digitalWrite(signalPin, LOW);
}
else{
lcd.print(“Incorrect”);
delay(1000);
}
lcd.clear();
clearData();
}
}
void clearData(){
while(data_count !=0){
Data[data_count–] = 0;
}
return;
}
Bạn có thể thay đổi mật khẩu trên dòng 10 bằng cách thay thế mật khẩu 123A456 bằng mật khẩu khác của riêng bạn:
char Master[Password_Length] = “123A456”;
Độ dài của mật khẩu cần được set trên dòng 5:
#define Password_Length 8
Mật khẩu trong ví dụ trên chỉ dài 7 ký tự, nhưng độ dài mật khẩu thực tế lớn hơn 7 ký tự vì có một ký tự rỗng được thêm vào cuối chuỗi. Ví dụ: nếu mật khẩu của bạn dài 5 ký tự, bạn sẽ nhập 6 cho độ dài mật khẩu.
Chân đầu ra kích hoạt rơ-le được xác định trên dòng 7:
int signalPin = 12;
Sau khi kết nối mọi thứ với Arduino, bạn sẽ có một sơ đồ mạch trông như thế này:
Tổng kết
Các bạn thấy rằng không khó để thực hiện việc giao tiếp giữa bàn phím 4×4 với Arduino phải không nào. Tôi nghĩ rằng với một chút thử nghiệm và sữa lỗi, bạn sẽ có thể sửa đổi chương trình ở trên để hoạt động với hầu hết các dự án mà bạn muốn sử dụng bàn phím. Nhưng nếu bạn gặp vấn đề, chỉ cần cho tôi biết trong phần bình luận và tôi sẽ cố gắng giúp bạn.