Матричная клавиатура 4х4: принцип работы и подключение

Матричная клавиатура 4х4: принцип работы и подключение

Как 16 кнопок обслуживаются восемью пинами, что такое динамическое сканирование и как подключить две клавиатуры через сдвиговые регистры.

Идея матрицы

Одной кнопке обычно нужен отдельный пин контроллера. Пока кнопок две-три, это не проблема, но для ввода пароля или настройки прибора со множеством параметров их требуется намного больше, а свободных выводов у Arduino немного. Самый распространённый выход — матричное включение: кнопки ставят в узлы сетки из проводников-рядов и проводников-столбцов.

Нажатая кнопка замыкает один конкретный ряд с одним конкретным столбцом, и такая пара у каждой кнопки своя. Клавиатуре 4х4 хватает восьми контактов на 16 кнопок, то есть экономится 8 пинов; матрица 5х5 сберегла бы уже 15.

Динамическое сканирование

Подать сигнал сразу на все ряды и смотреть на столбцы нельзя: так удастся узнать только столбец, но не саму кнопку. Поэтому сигнал подают на ряды по очереди. Пока активен один ряд, на столбцах видны лишь его кнопки, остальные на результат не влияют. Быстро перебрав все ряды, программа получает полную картину. Этот приём и называют динамическим сканированием.

Какие бывают клавиатуры

Механическая матричная клавиатура

Механические клавиатуры надёжны, долговечны и поддаются ремонту. Плёночные распространены больше: они недороги, тонкие, легко клеятся на плоскую поверхность двухсторонним скотчем, частично герметичны, не боятся брызг и пыли, их контакты не окисляются. Обратная сторона — меньший ресурс при интенсивном использовании.

Плёночные матричные клавиатуры разных форматов

Готовая клавиатура не обязательна: матрицу можно собрать из отдельных кнопок, причём физически располагать их прямоугольником не требуется — важен лишь логический порядок соединений. А вот сенсорные клавиатуры 3х4 и 4х4 работают иначе: число выходов у них равно числу кнопок.

Подключение 4х4 к Arduino

Плёночная клавиатура 4х4 с цифрами, буквами A–D, звёздочкой и решёткой

На клавиатуре 4х4 расположены десять цифр, буквы A, B, C, D, звёздочка и решётка. В примере ряды подключены к пинам 11, 10, 9 и 8, столбцы — к пинам 7, 6, 5 и 4; номера можно менять, если так же поправить их в программе. Столбцы подтянуты к +5 В резисторами по 1 кОм, поэтому при отпущенных кнопках на них высокий уровень, а «бегущим» сигналом на рядах служит ноль.

Схема подключения клавиатуры 4х4 к Arduino с диодами и подтягивающими резисторами

Выходные пины соединены с клавиатурой через диоды. Они защищают плату на случай, если кто-то нажмёт сразу несколько кнопок в одном столбце: без диодов два выхода с разными уровнями замкнулись бы накоротко, что грозит перезагрузкой контроллера или потерей порта.

Логика программы

Скетч настраивает пины рядов как выходы с высоким уровнем, а пины столбцов — как входы с подтяжкой (INPUT_PULLUP). Опрос построен на двух вложенных циклах: внешний по очереди опускает один ряд в ноль, внутренний читает четыре столбца и ищет низкий уровень. По найденным координатам символ берётся из двумерного массива k4x4, повторяющего раскладку клавиатуры, и выводится в последовательный порт на скорости 9600.

Сканирование запускается раз в 50 мс. При более редком опросе можно пропустить короткое нажатие, при более частом — принять за нажатие дребезг контактов. Сам проход занимает около 107 мкс. Его можно ускорить примерно в десять раз прямым обращением к портам, но на фоне паузы в 50 мс выигрыш почти незаметен, разве что уменьшится размер кода.

Директива #define ALONE в первой строке выбирает режим. Если она активна, удержание клавиши считается одним нажатием; если её закомментировать, символ выдаётся при каждом опросе, пока кнопка нажата. Первый вариант подходит для набора кода, второй — например, для управления движением робота. Опрос можно вызывать и по прерыванию таймера с периодом 50 мс, но тогда функцию лучше переписать на работу с портами, чтобы она выполнялась как можно быстрее. Для проверки пароля принятые символы складывают в буфер и сравнивают с эталоном.

Две клавиатуры на четырёх пинах

Чтобы обслуживать две клавиатуры и при этом занять вдвое меньше выводов, применяют сдвиговые регистры: выходной 74HC595 и входной 74HC165, по восемь линий у каждого. Запись и чтение происходят в разное время, поэтому линии данных DATA (пин 10) и тактов CLOCK (пин 12) у регистров общие, а защёлки LATCH разведены по отдельным пинам 9 и 11. Линия DATA при этом попеременно переключается из режима OUTPUT в INPUT и обратно.

Программа сначала отправляет в 74HC595 один из заранее подготовленных байтов-«кадров» из массива scan_OUT, в котором нули расставлены одинаково для обеих клавиатур, затем считывает байт из 74HC165 и разбирает его: одна половина битов относится к первой клавиатуре, другая — ко второй. Полный проход по двум клавиатурам занимает 1,2 мс. В таком виде программа работает только в режиме повторения; одиночное нажатие нужно дорабатывать по образцу первого примера, запоминая последнюю кнопку для каждой клавиатуры отдельно.

Пример: простой калькулятор

Для калькулятора понадобятся Arduino Uno, макетная плата, клавиатура 4х4, дисплей WH1602 с интерфейсом I2C, блок питания 5 В и провода. Части клавиш назначают новые функции: сложение, вычитание, умножение, деление, «равно» и удаление последнего символа. В скетче используются библиотеки Keypad и LiquidCrystal_I2C, дисплей имеет адрес 0x27, ряды и столбцы клавиатуры подключены к тем же пинам 11–8 и 7–4. Нажатые клавиши попадают в буфер и на экран, а по нажатию «=» программа выделяет из буфера первое число, знак действия и второе число, после чего выводит результат.

← Все статьи