Что такое матричная клавиатура
Шаг первый: принцип работы матрицы клавиатуры
На этой клавиатуре 64 клавиши. Если бы мы подключили каждую из этих кнопок напрямую к плате разработки, нам потребовалось бы 64 контакта ввода-вывода. Это много выводов и больше, чем доступно на большинстве плат. Чтобы уменьшить количество разъемов до разумного числа, можно использовать матрицу клавиатуры, для которой требуется только количество выводов, равное квадратному корню (с округлением в большую сторону) из числа клавиш.
Матрица клавиатуры настроена таким образом, что каждый клавишный переключатель в строке подключен, и каждый клавишный переключатель в столбце подключен. Когда мы хотим увидеть, какие клавиши нажаты, мы «активируем» первую строку, а затем проверяем каждый столбец. Если активен конкретный столбец, мы знаем, что была нажата клавиша в этом столбце и строке 1. Затем мы деактивируем строку 1 и активируем строку 2, затем снова проверяем все столбцы. После того, как все строки были активированы, мы просто начинаем снова с первого ряда.
Поскольку устройство работает с микроконтроллером, «активировать» означает установить для этой строки значение LOW или HIGH. В этом случае мы устанавливаем для строки значение LOW, потому что используем встроенные подтягивающие резисторы микроконтроллера на входных контактах столбцов. Без подтягивающего резистора вывод будет реагировать непредсказуемо, и будут регистрироваться ложные нажатия кнопок.
Для всех строк также обычно установлено значение HIGH, что предотвращает соединение выводов столбца с выводами строки независимо от того была, нажата кнопка или нет.
Диоды в схеме предназначены для предотвращения непреднамеренного нажатия клавиш при удерживании определенных комбинаций кнопок. Диоды пропускают ток только в одном направлении, что предотвращает сдвоенное нажатие. Если бы не использовались диоды, то нажатие определенных клавиш могло бы вызвать срабатывание другой не нажатой клавиши, поскольку ток проводился бы через соседние переключатели.
Можно использовать регистр сдвига и для входных контактов, но здесь нужен другой тип регистра. Такой детали у мастера не было в наличии. К тому же использование сдвигового регистра для ввода также усложняет чтение столбцов и может вызвать проблемы с дребезгом клавиш.
schematic.pdf
Шаг второй: дизайн печатной платы
Теперь, когда есть понимание работы клавиатуры, мастер разрабатывает печатную плату в KiCAD. Он просто поместил символ кнопки и символ диода, затем скопировал и вставил их, пока не получил сетку из 64 ключей. Затем я добавил два символа разъемов 1x8: один для строк и один для столбцов. Одна сторона кнопок была соединена в столбцы, а другая сторона кнопок была соединена в ряды.
Обращаем особое внимание на номера контактов. У KiCAD есть проблема, когда номера выводов условного обозначения диода не совпадают с номерами выводов посадочного места. Это приводит к тому, что диоды находятся в обратном порядке, что является серьезной проблемой, учитывая их полярность. Чтобы решить эту проблему мастеру пришлось создать специальную посадочную площадку для диода с зеркальными местами контактов.
Создав схему и назначив символы, мастер перешел к разводке печатной платы. Контур платы был создан в Autodesk Fusion 360, экспортирован как DXF, а затем импортирован в KiCAD на слое Edge Cuts. Большая часть работы после этого заключалась в простом расположении кнопок так, чтобы их расположение было похоже на обычную клавиатуру.
Шаг третий: сборка
После изготовления плат мастер приступает к монтажу. Нужно просто припаять все компоненты на место. Все компоненты со сквозным отверстием, и пайка несложная. Особое внимание нужно обратить на ориентацию диодов. Отметка на диодах должна совпадать с отметкой на печатной плате.
Шаг четвертый: подключение клавиатуры к Arduino
Подключение выглядит сложно, но на самом деле все довольно просто.
Восемь перемычек идут от контакта столбца прямо к следующим контактам Arduino:
Column 1 > A0
Column 2 > A1
Column 3 > A2
Column 4 > A3
Column 5 > A4
Column 6 > A5
Column 7 > 5
Column 8 > 6
Затем устанавливаем сдвиговый регистр 74HC595 на макетную плату. Точка указывает на контакт 1. Регистр сдвига имеет два контакта, подключенных к 5 В, и два контакта, подключенных к земле.
Для подключения сдвигового регистра к Arduino нужно всего три провода:
Shift (Clock) 11 > 4
Shift (Latch) 12 > 3
Shift (Data) 14 > 2
По какой-то глупой причине выходные контакты сдвигового регистра расположены нелогично. Обратите особое внимание на схему распиновки сдвигового регистра при подключении их к выводам.
Row 1 > Shift (Q0) 15
Row 2 > Shift (Q1) 1
Row 3 > Shift (Q2) 2
Row 4 > Shift (Q3) 3
Row 5 > Shift (Q4) 4
Row 6 > Shift (Q5) 5
Shift 7 > Shift (Q6) 6
Shift 8 > Shift (Q7) 7
К контактам Arduino 0 и 1 ничего не подключается. Эти контакты используются для последовательного порта и вызывают конфликты.
Шаг пятый: прошивка
В статье приводится два кода. Первый старый, второй доработанный с учетом недостатков. Вводная часть работает для обоих кодов.
Все в коде имеет подробные комментарии. В основном, контакты настраиваются как входы и выходы. Основной цикл просто содержит функцию таймера. Каждые 5 мс он вызывает функцию сканирования клавиатуры. Эта функция вызывает отдельную функцию для установки регистра сдвига перед проверкой каждого столбца. Нажатые клавиши выводят свое значение в Serial.
Если вы хотите изменить то, что печатается при нажатии клавиши, просто измените Serial.print ("_"); в операторе if, соответствующем условию. Например, вы можете установить, что будет печататься, когда вы удерживаете FN и нажимаете N. То же самое верно для любой другой клавиши с каждым модификатором.
Многие ключи вообще ничего не делают в этом коде, потому что он просто печатает в Serial. Это означает, что клавиша Backspace не действует, потому что вы не можете удалить из последовательного монитора - эти данные уже получены. Однако вы можете изменить это если хотите.
Эта клавиатура предназначена для создания прототипов более сложных проектов. Вот почему легко изменить ее функциональность. Если, например, вы хотите распечатать набранный текст на OLED-экране, вы можете просто заменить каждый Serial.print ( на display.print ( или все, что требуется для вашего конкретного дисплея). Инструмент Replace All в Arduino IDE отлично подходит для замены всех этих значений одним быстрым шагом.
Новый код полностью переписан и работает лучше, чем исходный код. В основном это было сделано для решения проблемы с алгоритмом, который не позволял вводить символы при каждом нажатии клавиши. Исходный код проверял, чтобы конкретная клавиша была нажата не последней . Это вызывало проблему, если удерживались 2 или более клавиши, что приводило к вводу чего-то вроде "fgfgfgfgfgfgfgfgfgfg". Это также не позволяло вводить одну и ту же клавишу снова и снова очень быстро, например, когда вы набираете две буквы m в слове "bummer.".
Новый код решает обе эти проблемы. Вместо того, чтобы отслеживать последнюю нажатую клавишу, устройство проверяет состояние всей клавиатуры и сравнивает его со всем состоянием клавиатуры в последнем цикле. Это означает, что цикл может выполняться намного быстрее, и можно очень быстро вводить один и тот же ключ снова и снова. Производительность значительно улучшена. Все символы также находятся в массивах вверху, поэтому можно легко их найти и изменить. Для каждого модификатора есть независимые массивы. Код также намного короче.
Единственным недостатком этого нового кода является то, что он использует больше динамической памяти, хотя и использует значительно меньше места для программы. На Arduino Uno теперь используется: 3532 байта (10%) пространства для хранения программ и 605 байтов (29%) динамической памяти.
В очередном уроке, я поведаю читателю о том, как пишутся статьи на данном сайте, чтобы можно было не только скопировать готовый код, но и проследить за ходом мыслей. Поэтому урок будет в другом формате.
Теперь следующий шаг, изучение схемы. Во время изучения схемы микроконтроллер представляем черным ящиком, который может либо дрыгать ножками, либо читать информацию с ножек. Смотрим на особенности схемы, на одну ножку приходится 4 кнопки по горизонтали (строки), аналогично 4 кнопки приходится на одну ножку по вертикали (столбцы). Кнопки в пределах одной строки/столбца объединены общим проводом. Получается матрица 4х4.
Теперь нужно понять принцип работы более детально. Ножки, подключенные к общему проводу строк, настраиваются как вход, те что подключены к столбцам настроены как выход. Когда активен только первый столбец, то мы однозначно знаем, что нажаты могут быть только кнопки с 1 по 4. Далее, переключаемся на второй столбец, сканируем кнопки с 5 по 8 и т.д. Остается лишь читать состояния входов. Диоды нужны, чтобы защитить входы микроконтроллера, если нажато несколько кнопок одновременно. Этой информации должно быть достаточно для того, чтобы написать собственную прошивку. Написать свою прошивку это интересно и главное, ты знаешь как она работает. Поэтому я стараюсь все прошивки писать с нуля. Перейдем к программной части.
Можно использовать Таймер1, но он имеет множество полезных функций и может пригодиться для других вещей, поэтому задействуем таймер2. С какой периодичностью производить опрос? С такой, чтобы не пропустить самые быстрые нажатия. Для надежности, решил взять 20 раз в секунду, т.е. прерывание должно происходить раз в 50мс. Таймер2 не очень годится для длинных отсчетов, потому что максимальное число, которое можно записать в регистр сравнения 0xFF = 255. При минимальной частоте таймера 7813Гц, один тик будет длиться 1/7813=0,000128сек, т.е. максимальный промежуток между прерываниями 0,000128*255=32,6мс. В данном случае не принципиально 50 или 32, поэтому этот результат меня устроил.
За одно прерывание нужно опросить 4 столбца, для этого сделаем цикл for, переменная i хранит номер опрашиваемого столбца.
int i=0; // Timer 2 output compare interrupt service routine interrupt [TIM2_COMP] void timer2_comp_isr(void) < for(i=0; i<4; i++) < >>
Прерывание работает, цикл крутится, нужно добавить переключения столбцов. Для этого, проще всего, создать массив, в котором будут заранее сконфигурированы состояния PORTD, эти состояния будут по очереди записываться в порт.
int i=0; char portState[4]= ; // Timer 2 output compare interrupt service routine interrupt [TIM2_COMP] void timer2_comp_isr(void) < for(i=0; i<4; i++) < PORTD=portState[i]; >>
Неплохо еще вывести на экран какой нибудь символ. Для этого можно создать двухмерный массив, выбор символа, будет зависеть от номера столбца и строки. Символы до 9 соответствуют номерам кнопок, на остальные задействованы буквы. Символ выводится в момент сканирования строки, что очень удобно, так как мы знаем номер столбца и строки.
Примерно в такой последовательности я рассуждал, когда писал данную прошивку. Дальше должна следовать еще отладка на железе. Но в пределах данной статьи ограничусь симулятором.
Все что я хотел сказать данной статьей, что собирать из маленьких готовых кирпичиков гораздо проще, чем пытаться сразу написать все целиком. Разбейте большую задачу на множество маленьких задач и постепенно их решайте. Главное, разобраться с принципом работы устройства и заставить прошивку работать, оптимизировать ее можно после. Прошивка и схема доступны тут.
Update: Зачем нужны диоды? Допустим некий момент времени, когда опрашиваем первый столбец, соответственно на остальных столбцах логическая единица. Если диодов нет и нажать кнопку 1 и 5, то будет короткое замыкание.
47 комментариев: Урок 20. Опрос матричной клавиатуры.
void main(void)
PORTB=0x00;
DDRB=0xFF;
конечно не одно и тоже 🙂
У меня вопрос?.Порты установленные D установленые в логическую 1?
При одновременном нажатии на несколько клавиш ни одна из них не должна сработать. как это можно реализовать?
Привет. Вы не знаете, как записать в переменную, с помощью этой клавиатуры, например 7 значное число ? Если например во второй старший разряд я хочу записать ноль, допустим 7065783, это нужно записать в переменную, каким образом это сделать ? Интереснен момент с нулями в разрядах
В этой статье расскажу как работает матричная мембранная клавиатуру и приведу простой пример подключения клавиатуры к Arduino с отображением нажатий клавиш на последовательном мониторе.
Технические параметры:
► Разъём: PLS-8;
► Тип шлейфа: плоский, гибкий, 8 pin;
► Длина шлейфа: 75 мм;
► Размер: 77×69×2 мм;
► Масса: 7 г.
Обзор матричной мембранной клавиатуры
Принцип работы матричная клавиатура
В матричной мембранной клавиатуре 4 x 4 (4 столбца и 4 строки) содержится 16 кнопок, под каждой кнопкой находится мембранная переключатель. Все эти кнопки соединены с друг другом, образуя матрицу 4 × 4, это позволило уменьшит количество используемых выводов для подключения к микроконтроллеры (Arduino) с 17 контактов до 8 контактов.
Принцип работы очень простой, при нажатие кнопки замыкается контакт между столбцом и строкой, между ними начинает течь ток. Например, при нажатии клавиши «4» происходит короткое замыкание столбца 1 и строки 2. Схема клавиатуры 4 x 4 показана на рисунке ниже.
Подключение матричной мембранной клавиатура к Arduino
Необходимые детали:
► Arduino UNO R3 x 1 шт.
► Матричная мембранная клавиатура 4х4, 16 кнопок x 1 шт.
► Провод DuPont, 2,54 мм, 20 см, F-F x 1 шт.
► Кабель USB 2.0 A-B x 1 шт.
Подключение:
Теперь приступим к сборке схемы, подключим контакта 1 клавиатуры к цифровому контакту 9 на Arduino. Далее необходимо подключить все остальные контакты 2 с 8 и так далее.
Установка библиотек:
В данном примере используем одну библиотеку «Keypad.h» скачать ее можно с «Менеджер библиотек» или в конце статьи.
В строке поиска вводим «Keypad» находим библиотеку «Keypad by Mark Stanley» и устанавливаем ее.
Программа:
Пример простой, копируем или скачиваем и загружаем в Arduno.
Большая часть текста содержит объяснение программного кода, его можно скачать здесь либо посмотреть видео под статьей.
Сделать такую клавиатуру можно и самому. Для этого понадобится печатная плата, 12 или 16 обычных кнопок и соединительные провода. Я же буду использовать готовую.
Матричная клавиатура для Arduino
Для чего нужна матричная клавиатура?
Схема подключения матричной клавиатуры к Arduino
Подключать ее к плате следует 8 выводами, каждый из них считывает значения с определенных строк и столбцов. Подключать их следует к выводам на панели Digital. Я подключу, например, к выводам от 2 до 9 включительно. Нулевой и первый трогать не желательно, поскольку они предназначены для UART интерфейса (например, для подключения блютуз-модуля). Рациональнее оставить их свободными.
Схема подключения матричной клавиатуры к Arduino
После того, как вы установили в библиотеку, можно зайти в Ардуино IDE (программа с сайта Arduino) и посмотреть примеры скетчей.
Возьмем самый простой скетч для ознакомления. Он позволяет считывать значение с клавиатуры при нажатии определенной клавиши и выводить их в порт. В данном случае это монитор порта на компьютере.
Если это сделать неправильно, то, например, при нажатии цифры 4, в порт выйдет цифра 6 или любой другой символ. Это можно определить опытным путем и расположить символы, как они расположены на клавиатуре.
Далее нужно указать к каким выводам на плате подключаем управление строками и столбцами.
В функции void setup указываем скорость последовательного соединения с монитором порта 9600 бод. Функция нужна только для подачи питания на модули. В функции Void Loop прописываем условие. Переменная Char используется для хранения только одного символа, например, 1, А или 5, что подходит к ситуации. Если нажатие зафиксировано, то происходит вывод символа в монитор порта с помощью функции Serial Print. В скобках нужно указывать, какую переменную выводим в порт. Если все сделано верно, в мониторе порта получим символ, на который нажимали. Не забудьте в мониторе порта внизу справа указать скорость передачи данных такую же, как в скетче.
Схема с дисплеем и матричной клавиатурой
Давайте выведем данные на дисплей.
Схема подключения сопряженного с модулем I2C дисплея к Arduino
Как видим, нажимая на любой символ, видим его отображение на дисплее.
Подключение дисплея и матричной клавиатуры к Arduino
Можно заметить, если вводить символы дальше, то каждый предыдущий будет стираться, а на его месте появляться новый. Поэтому, если вы хотите вводить символы подряд, то просто удалите строчку, где указано положение курсора.
Чтобы стереть строчку, вспомним калькулятор. Когда нужно было удалить значение, мы нажимали на кнопку сброса. Нажмем на такую кнопку в плате и можем заново набирать символы.
Подключение клавиатуры к Arduino и управляющее действие
Попробуем при нажатии определенной клавиши включать или выключать светодиод. Добавляем его в схему.
Я буду использовать макетную плату и резистор (желательно использовать от 150 до 220 Ом). Двумя перемычками замкну схему, подключив их к пинам питания и земли на плате Ардуино.
Светодиод в примере подключен к пину 8 на плате Ардуино.
Давайте разберем скетч.
Возьмем первый скетч урока и просто его дополним. В начале с помощью полезной функции Define присвоим название подключенному к пину 8 светодиоду ledpin. В функции Void setup указываем сигнал со светодиода как выход.
Подключение клавиатуры к Arduino и управление светодиодом
Смотрите также:
Посты по урокам:
- Первый урок: Светодиод.
- Второй урок: Кнопка.
- Третий урок: Потенциометр.
- Четвертый урок: Сервопривод.
- Пятый урок: Трехцветный светодиод.
- Шестой урок: Пьезоэлемент.
- Седьмой урок: Фоторезистор.
- Восьмой урок: Датчик движения (PIR) на Arduino. Автоматическая отправка E-mail.
- Девятый урок: Подключение датчика температуры и влажности DHT.
Все посты сайта «Занимательная робототехника» по тегу Arduino.
Читайте также: