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

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

Клавиатуры имеют массу вариантов исполнения. На старых персональных компьютерах использовались клавиатуры с механическими клавишами, которые имели большой ход и были почти также удобны как клавиши на старых печатных машинках. Последние 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 осуществляется по следующей схеме:

ЖК дисплейGNDVCCSDASCL
Ардуино УноGND+5VA4A5

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

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

Матричная клавиатураRow1Row2Row3Row4Col1Col2Col3
Ардуино Уно8765432

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

Программа:

Чтобы работать с клавиатурой можно воспользоваться библиотекой 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


Изменено:

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

  1. Главный принцип ардуинщика — найти и подключить нужную библиотеку. Как работает устройство — вообще не обязательно знать… Я все правильно понял?

    • Сильно зависит от поставленной задачи. Если применение готовой библиотеки полностью решает вашу задачу, то знать её содержимое необязательно. Однако, когда требуется получить от устройства больше, чем даёт чья-то библиотека, тогда стоит изучить спецификацию на устройство и написать свой код с нуля.

  2. Здравствуйте. А как сделать что б код набранный на клавиатуре проверялся после нажатия * и сбрасывался при нажатии # ?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.