Ардуино: подключение матричной клавиатуры

В мире электроники клавиатурой называют устройство, состоящее из отдельных кнопок, которое позволяет вводить информацию в компьютер или в иной электронный прибор.

Клавиатуры имеют массу вариантов исполнения. На старых персональных компьютерах использовались клавиатуры с механическими клавишами, которые имели большой ход и были почти также удобны как клавиши на старых печатных машинках. Последние 15-20 лет широко применяются мембранные клавиатуры, которые проще и дешевле в изготовлении. Именно такую клавиатуру мы будем подключать к Ардуино.

Популярная в Ардуино проектах матричная мембранная клавиатура имеет 12 или 16 кнопок. С нижней части клавиатуры выходит шлейф, заканчивающийся dupont розеткой.

Устройство матричной клавиатуры

Матричная клавиатура состоит из кнопок, образующих матрицу mxn, т.е. таблицу, где m — количество строк, а n — количество столбцов. Для урока мы воспользуемся клавиатурой 4х3. Если мы рассмотрим её шлейф, то увидим, что он состоит из 7 дорожек. Дорожки с номерами 1-4 (обозначим их Row1-Row4) — это строки матрицы с первой по четвёртую, а дорожки с номерами 5-7 (Col1-Col3) — столбцы с первого по третий.

Каждая кнопка — это область пересечения токопроводящих дорожек. При нажатии на участок, обозначающий кнопку, происходит соединению дорожек и замыкание одного из выводов строк 1-4 с одним из выводов  столбцов 1-3.

Подключение матричной клавиатуры к Ардуино

Для отображения вводимой с клавиатуры информации мы воспользуемся жк дисплеем c I2C интерфейсом. Благодаря этому интерфейсу, схема не будет перегружена проводами. Подробно о дисплеях для Ардуино рассказывается в одном из предыдущих уроков — Ардуино: вывод текста на ЖК дисплей.

Подключение дисплея с шиной I2C осуществляется по следующей схеме:

ЖК дисплей GND VCC SDA SCL
Ардуино Уно GND +5V A4 A5

Матричная клавиатура имеет 7 выводов, которые подключаются к любым цифровым выводам. В нашем примере мы задействуем выводы 2-8. Выводы 0 и 1, как правило, не используют при подключении клавиатуры, поскольку они предназначены для UART интерфейса.

Схема подключения клавиатуры к Ардуино:

Матричная клавиатура Row1 Row2 Row3 Row4 Col1 Col2 Col3
Ардуино Уно 8 7 6 5 4 3 2

Внешний вид макета:

Программа:

Чтобы работать с клавиатурой можно воспользоваться библиотекой Keypad.

#include <Wire.h>
#include <Key.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);
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] = {8, 7, 6, 5}; // к каким выводам подключаем управление строками
byte colPins[COLS] = {4, 3, 2}; // к каким выводам подключаем управление столбцами
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup(){
Serial.begin(9600);
lcd.init(); // Инициализируем экран
lcd.backlight();
}
void loop(){
lcd.setCursor(0,0); // устанавливаем курсор на начало первой строки
lcd.print("Press any key!");
char customKey = customKeypad.getKey();
if (customKey){
Serial.println(customKey);
lcd.setCursor(0,1); // устанавливаем курсор на начало второй строки
lcd.print(customKey);
}
}

В этой программе также используются библиотеки <Wire.h> и <LiquidCrystal_I2C.h>, т.к. для вывода информации мы воспользовались LCD-дисплеем с интерфейсом I2C.

Кодовый замок

Используя макет, который мы собрали, можно сделать устройство, позволяющее вводить пароль с клавиатуры. Для примера напишем простой код, работающий с паролем из четырёх цифр.

#include <Wire.h>
#include <Key.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);
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] = {8, 7, 6, 5}; // к каким выводам подключаем управление строками
byte colPins[COLS] = {4, 3, 2}; // к каким выводам подключаем управление столбцами

char pass[4] = {'7', '3', '1', '5'}; // верный пароль
char buttons[5]; // массив нажатых кнопок
int k = 0; // счетчик нажатий

Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup() {
Serial.begin(9600);
lcd.init(); // инициализируем экран
lcd.backlight();
}

void loop() {
lcd.setCursor(0, 0); // устанавливаем курсор на начало первой строки
lcd.print("Enter password!");
lcd.setCursor(0, 1); // устанавливаем курсор на начало второй строки
char customKey = customKeypad.getKey();
if (customKey) {
buttons[k] = customKey; // сохраняем значение кнопки в массиве
lcd.setCursor(k, 1);
lcd.print('*'); // выводим на экран символ '*' вместо значения кнопки
k = k + 1; // увеличиваем счётчик нажатий на 1
if (k == 4) {
if (buttons[0] == pass[0] && buttons[1] == pass[1] && buttons[2] == pass[2] && buttons[3] == pass[3])
{
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Access granted!"); // если пароль совпал
}
else {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Access denied!"); // если пароль не верен
}
}
}
}

Результат нашей работы:

 

Полезные ссылки

Библиотека Keypad

Библиотека LiquidCrystal-I2C

0

Изменено: