Подключение мембранной клавиатуры 4×3 и 4×4 к Arduino
Если вы когда-нибудь хотели добавить кнопки в свой проект на Arduino — будь то для ввода пароля, управления роботом или навигации по меню — мембранная клавиатура станет отличным решением. Такие клавиатуры недорогие, прочные и даже водонепроницаемые, что делает их идеальными для множества DIY-проектов в электронике.
Мембранные клавиатуры выпускаются в нескольких размерах, но наиболее распространённые — это клавиатура 4×3 и клавиатура 4×4. Их раскладка аналогична телефонной, что делает их знакомыми и удобными для использования.
Несмотря на различия в размерах, все мембранные клавиатуры работают одинаково. Как только вы поймёте, как они подключаются и взаимодействуют с Arduino, вы сможете использовать их в самых разных творческих и полезных проектах.
Итак, давайте разберёмся, как работают эти клавиатуры и как подключить одну из них к вашему Arduino!
Конструкция мембранной клавиатуры
Мембранная клавиатура изготовлена из тонкого гибкого материала и обычно состоит из шести основных слоёв. Эти слои работают вместе, обеспечивая правильное функционирование клавиатуры. Вот описание каждого слоя:
Графическое покрытие — это верхний слой, который вы видите и касаетесь. Обычно он изготавливается из полиэстера, поскольку полиэстер служит дольше и лучше гнётся, чем альтернативные материалы, такие как поликарбонат.
Металлические купола — прямо под верхним слоем расположены небольшие металлические или пластиковые купола, которые создают ощущение «щелчка» при нажатии кнопки.
Верхний слой цепи — этот слой содержит специальные электрические дорожки, выполненные из полиэстера с нанесёнными на него проводящими чернилами на основе серебра. Он переходит в гибкий шлейф, соединяющий клавиатуру с другими электронными устройствами.
Разделитель — этот слой удерживает верхний и нижний слои цепи на расстоянии друг от друга. Это гарантирует, что кнопка остаётся в состоянии «выключено», пока вы её не нажмёте. При нажатии клавиши верхний и нижний слои соприкасаются, позволяя электрическому току протекать.
Нижний слой цепи — аналогичен верхнему слою цепи, этот слой также содержит электрические дорожки из проводящих чернил на основе серебра. Он также переходит в гибкий шлейф для подключения к электронным устройствам.
Задний клеевой слой — нижний слой является липким, что позволяет прикрепить клавиатуру практически к любой поверхности. Это делает мембранные клавиатуры очень универсальными и простыми в установке.
Если снять защитную бумагу с мембранной клавиатуры, можно увидеть, как все эти слои уложены друг на друга, образуя полную клавиатуру.
Интересная особенность мембранных клавиатур — способ подключения кнопок. Все строки и столбцы кнопок соединены в виде сетки. Такое продуманное решение уменьшает количество необходимых контактов. Например, без такой сетевой организации клавиатуре с 16 кнопками потребовалось бы 17 контактов (по одному на каждую кнопку плюс один для земли). Располагая кнопки в строках и столбцах, для всей клавиатуры 4×4 нужно всего 8 контактов. Этот умный метод управления множеством кнопок с помощью меньшего количества контактов называется «Мультиплексирование».
Как работает матричная клавиатура?
Матричная клавиатура состоит из кнопок, расположенных в строках и столбцах. Каждая кнопка находится именно на пересечении строки и столбца.
На схеме ниже показано, как провода внутри матричной клавиатуры 4×3 соединяют каждую строку с каждым столбцом.
Когда вы нажимаете кнопку, она соединяет одну из строк с одним из столбцов, позволяя электрическому току протекать между ними. Например, при нажатии клавиши «4» соединяются столбец 1 и строка 2.
Определив, какая строка соединена с каким столбцом, мы можем точно узнать, какая кнопка была нажата.
Сканирование клавиатуры
Для определения нажатой кнопки микроконтроллер использует технику под названием «сканирование». Вот как это работает:
Сначала микроконтроллер настраивает линии строк как выходы, а линии столбцов как входы.
Затем он включает подтягивающие резисторы на линиях столбцов. Эти резисторы обеспечивают, что столбцы обычно читаются как HIGH. Если что-то соединяет столбец с землёй, этот столбец будет читаться как LOW.
Далее микроконтроллер посылает сигнал LOW на одну строку за раз, удерживая все остальные строки в состоянии HIGH. Затем он проверяет каждый столбец, чтобы увидеть, не перешёл ли какой-либо из них в состояние LOW.
Если и строка, и столбец одновременно находятся в состоянии LOW, это означает, что кнопка на их пересечении была нажата.
Например, если микроконтроллер посылает сигнал LOW на вторую строку и обнаруживает, что второй столбец тоже перешёл в LOW, он понимает, что была нажата кнопка «5» (на пересечении строки 2 и столбца 2).
После обнаружения нажатия кнопки микроконтроллер ожидает её отпускания. Затем он определяет, какой именно символ был нажат, обращаясь к специальному списку, называемому массивом раскладки (keymap). Этот массив сообщает, какой символ (например, «4», «A», «#» и т.д.) соответствует каждой комбинации строка-столбец.
Процесс сканирования выполняется очень быстро и повторяется для каждой строки по очереди. Таким образом, микроконтроллер может уловить любое нажатие клавиши практически мгновенно.
Распиновка мембранной клавиатуры 4×3 и 4×4
Мембранная клавиатура поставляется с гнездовым разъёмом Dupont. Если смотреть на переднюю часть клавиатуры, контакты строк расположены слева, а контакты столбцов — справа.
Вот расположение контактов:
Подключение мембранной клавиатуры 4×3 и 4×4 к Arduino
Теперь, когда вы понимаете, как работает мембранная клавиатура, пришло время подключить её к плате Arduino. На самом деле это довольно просто, потому что порядок контактов клавиатуры совпадает с порядком цифровых выводов Arduino, которые вы будете использовать.
Начните с подключения контакта 1 клавиатуры к цифровому выводу 9 Arduino. Затем последовательно подключайте каждый следующий контакт клавиатуры к следующему цифровому выводу Arduino: контакт 2 к выводу 8, контакт 3 к выводу 7 и так далее, пока все контакты не будут подключены.
В таблице ниже приведён полный список подключений:
| Keypad | Arduino | |
| R1 | 9 | |
| R2 | 8 | |
| R3 | 7 | |
| R4 | 6 | |
| C1 | 5 | |
| C2 | 4 | |
| C3 | 3 | |
| C4 | 2 |
Примечание: выделенное подключение в таблице относится только к клавиатурам 4×4, поскольку клавиатура 4×3 имеет на один столбец меньше.
Самый простой и аккуратный способ подключить клавиатуру к Arduino — использовать 8-жильный ленточный кабель Dupont типа «папа-папа». Такой кабель обеспечивает аккуратную сборку и помогает избежать путаницы с проводами.
Схема подключения клавиатуры 4×3 к Arduino
Схема подключения клавиатуры 4×4 к Arduino
Установка библиотеки
Чтобы определить, какая клавиша на клавиатуре была нажата, программа должна постоянно сканировать все строки и столбцы. К счастью, это не нужно делать вручную. Специальная библиотека Keypad была создана для автоматического выполнения этой задачи и значительного упрощения работы.
Для установки библиотеки:
Сначала откройте программу Arduino IDE. Затем нажмите на значок Менеджер библиотек на левой боковой панели.
Введите «keypad» в поле поиска для фильтрации результатов.
Найдите библиотеку Keypad от Mark Stanley, Alexander Brevig.
Нажмите кнопку Install, чтобы добавить её в Arduino IDE.
Пример кода Arduino
Базовый скетч Arduino ниже определяет, какая клавиша на клавиатуре нажата, и отображает её в мониторе последовательного порта.
Код для клавиатуры 4×3
#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
{ '1', '2', '3' },
{ '4', '5', '6' },
{ '7', '8', '9' },
{ '*', '0', '#' }
};
byte rowPins[ROWS] = { 9, 8, 7, 6 }; //connect to the row pinouts of the keypad
byte colPins[COLS] = { 5, 4, 3 }; //connect to the column pinouts of the keypad
//Create an object of keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup() {
Serial.begin(9600);
}
void loop() {
char key = keypad.getKey(); // Read the key
// Print if key pressed
if (key) {
Serial.print("Key Pressed : ");
Serial.println(key);
}
}
Код для клавиатуры 4×4
#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
byte rowPins[ROWS] = { 9, 8, 7, 6 }; //connect to the row pinouts of the keypad
byte colPins[COLS] = { 5, 4, 3, 2 }; //connect to the column pinouts of the keypad
//Create an object of keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup() {
Serial.begin(9600);
}
void loop() {
char key = keypad.getKey(); // Read the key
// Print if key pressed
if (key) {
Serial.print("Key Pressed : ");
Serial.println(key);
}
}
После загрузки скетча на Arduino откройте монитор последовательного порта и установите скорость 9600 бод. При нажатии любой кнопки на клавиатуре вы увидите соответствующий символ на экране.
Объяснение кода
В начале скетча мы подключаем библиотеку Keypad. Это даёт нам доступ к встроенным функциям, которые значительно упрощают работу с клавиатурами.
#include <Keypad.h>
Далее мы определяем размер нашей клавиатуры, указывая количество строк и столбцов. Если ваша клавиатура имеет другую раскладку, вам нужно будет изменить эти числа в соответствии с вашим оборудованием.
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
Затем мы создаём массив раскладки (keymap) под названием keys. Этот двумерный массив хранит все символы, которые мы хотим отображать при нажатии кнопок.
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
В этом примере символы в массиве расположены так же, как и на самой клавиатуре. Однако вы можете настроить массив раскладки под разные проекты.
Например, если вы создаёте калькулятор, вы можете захотеть изменить символы, добавив математические операторы. Вместо стандартной раскладки вы можете определить массив следующим образом:
char keys[ROWS][COLS] = {
{'1','2','3','4'},
{'5','6','7','8'},
{'9','0','+','-'},
{'.','*','/','='}
};
После этого мы определяем ещё два массива: rowPins и colPins. Эти массивы сообщают Arduino, какие цифровые выводы подключены к строкам и столбцам клавиатуры. Важно перечислить контакты в том же порядке, что и физические подключения, чтобы программа могла правильно определить нажатую клавишу.
byte rowPins[ROWS] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
Затем мы создаём объект keypad с помощью библиотеки Keypad. Этот объект упрощает проверку нажатых кнопок без необходимости ручного сканирования оборудования. Объекту клавиатуры нужно пять параметров: раскладка, контакты строк, контакты столбцов, количество строк и столбцов.
//Create an object of keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
В функции setup() мы инициализируем последовательную связь.
void setup(){
Serial.begin(9600);
}
В функции loop() метод getKey() непрерывно проверяет, нажата ли какая-либо клавиша. Когда он обнаруживает нажатую клавишу, он сохраняет её в переменную и выводит в монитор последовательного порта. Если ни одна клавиша не нажата, программа просто продолжает проверку.
void loop() {
char key = keypad.getKey(); // Read the key
// Print if key pressed
if (key) {
Serial.print("Key Pressed : ");
Serial.println(key);
}
}
Полезные функции библиотеки Keypad
Библиотека Keypad содержит несколько полезных функций, которые вы можете использовать с объектом клавиатуры. Эти функции дают больше контроля над поведением клавиатуры и реакцией программы на нажатия клавиш. Вот некоторые из наиболее полезных:
Функция
char waitForKey()приостанавливает программу и ожидает, пока кто-нибудь не нажмёт клавишу на клавиатуре. Во время ожидания никакие другие части кода не выполняются (за исключением процедур прерываний). Будьте осторожны с этой функцией, так как она блокирует выполнение остальной части программы до нажатия клавиши.Функция
KeyState getState()возвращает текущее состояние клавиши. Существует четыре возможных состояния:IDLE,PRESSED,RELEASEDиHOLD.Функция
boolean keyStateChanged()позволяет проверить, изменилось ли состояние клавиши в последнее время. Например, она сообщит, перешла ли клавиша из нажатого состояния в отпущенное или из нажатого в удерживаемое.Функция
setHoldTime(unsigned int time)позволяет установить, как долго (в миллисекундах) клавиша должна удерживаться нажатой, прежде чем она будет считаться в состоянии HOLD.Функция
setDebounceTime(unsigned int time)устанавливает время (в миллисекундах), которое клавиатура будет ожидать перед принятием следующего нажатия клавиши. Это помогает избежать случайных двойных нажатий, вызванных дребезгом контактов.Функция
addEventListener(keypadEvent)позволяет настроить событие, которое срабатывает автоматически каждый раз, когда кто-то использует клавиатуру.