В мире электроники клавиатурой называют устройство, состоящее из отдельных кнопок, которое позволяет вводить информацию в компьютер или в иной электронный прибор.
Клавиатуры имеют массу вариантов исполнения. На старых персональных компьютерах использовались клавиатуры с механическими клавишами, которые имели большой ход и были почти также удобны как клавиши на старых печатных машинках. Последние 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!"); // если пароль не верен
}
}
}
}
Результат нашей работы:
У вас на рисунке I2C модуль подключён от VCC к GND а нужно VCC в 5V. Исправьте.
Спасибо, не заметил, что не туда на схеме подключил. Исправлено.
Главный принцип ардуинщика — найти и подключить нужную библиотеку. Как работает устройство — вообще не обязательно знать… Я все правильно понял?
Сильно зависит от поставленной задачи. Если применение готовой библиотеки полностью решает вашу задачу, то знать её содержимое необязательно. Однако, когда требуется получить от устройства больше, чем даёт чья-то библиотека, тогда стоит изучить спецификацию на устройство и написать свой код с нуля.
Здравствуйте. А как сделать что б код набранный на клавиатуре проверялся после нажатия * и сбрасывался при нажатии # ?