Почти ни один проект не обходится без периферийных устройств ввода информации. На этом держатся основные принципы взаимодействия человека с электронным устройством. Одним из таких устройств является клавиатура. С помощью неё можно вводить данные - цифры, буквы, команды.
Разновидности клавиатур
Разновидностей клавиатур довольно много: механические(контактные), мембранные, опто-механические, сенсорные, проекционные, аналоговые, матричные и др. Способ трансформации физического воздействия в электрический импульс для данной темы не особо принципиален. Для разработчика гораздо важней второй этап - обработка полученных импульсов.
Клавиатура из набора кнопок.
Если взять некоторое количество кнопок, то для каждой из них необходим отдельный пин контроллера, плюс один общий. Как правило общий это GND или VCC. Когда кнопок довольно много, можно применить расширители портов, специальные микросхемы. Но есть и другой вариант сокращения количества необходимых пинов для клавиатуры.
Матричная клавиатура
Именно для сокращения количества контактов(проводов) придумана матричная клавиатура. В такой клавиатуре один контакт кнопки соединен в общую линию строки клавиатуры, а другой в общую линию столбца клавиатуры.
Принципиальная схема матричной клавиатуры 4*4Показать
Возникает резонный вопрос, как же подключать такую клавиатуру. Где GND, VCC? А их просто не требуется.
Принцип обработки сигналов с матричной клавиатуры
Для обработки нажатий (считывания) такой клавиатуры потребуется 4 выхода(для строк) и 4 входа(для столбцов).
Поочередно, очень быстро (в каждом цикле программы) подаем импульс на выходы (строки), а в момент подачи такого импульса на строку, считываем входы (столбцы). Сочетание того на какой выход мы подали импульс и на какой вход он пришел обратно, нам и даст информацию о том какая кнопка в данный момент нажата.
Работа с матричной клавиатурой в FLProg.
В FLProg есть штатный блок для матричной клавиатуры. https://flprog.ru/bez-rubriki/helppage/ ... ixKeyboard
В справке достаточно подробно описано как его настроить. Можно создать любое количество строк и столбцов, лишь бы хватило свободных пинов на контроллере.
Плюсы блока:
- Минималистичный код который занимает не много памяти. (пожалуй из плюсов это всё)
Минусы блока
- Отсутствие мультитач. Нет гарантированной возможности отследить хотя бы две одновременно нажатые кнопки.
- Отсутствует подавление дребезга контактов. Требуется добавить на каждый выход блока, блок Bounce. А это программно 16 таймеров и уже неплохая прибавка к весу программы.
- Можно использовать только пины контроллера. Микросхемы расширения не поддерживаются.
На что обратить внимание при подключении матричной клавиатуры
Матричной клавиатуре требуются входы с подтяжкой. Не все входы в контроллерах имеют внутреннюю(программную) подтяжку. При использовании блоков матричной клавиатуры нигде не упомянут этот момент и предполагается что назначенные на столбцы пины имеют встроенную подтяжку.
Пример:
У ESP32 есть ряд пинов которые могут работать только как входы, но они не имеют внутренней подтяжки. GPI 34, 35, 36, 39. При компиляции INPUT_PULLUP (программная подтяжка), никаких предупреждений не возникает и клавиатура начнет глючить.
Как выходы эти пины назначить нельзя. Поэтому можно только как входы (столбцы для блока). Обойти эту проблему легко. Надо всего лишь сделать внешнюю подтяжку этих входов, подключив их через резисторы 4,7-10 кОм к VCC.
Отправлено спустя 4 часа 21 минуту :
Матричная клавиатура
Подключение, настройка, типичные ошибки.
Хотя сложностей в подключений нет, частенько вижу что это сделано не правильно.
Видео "Ключ к Ардуино" с правильным подключениемПоказать
Мембранная матричная клавиатураПоказать
При правильном подключении порядок выходов блока должен быть таким (Выделено красным).
Скрин проекта с ошибкойПоказать
Рассмотрим проект поближе
Представлен вариант ввода числа с клавиатуры. То, что сделано крайне грамотно - это использован всего один блок Bounce после блока ИЛИ. При нажатии любой из кнопок генерируется короткий импульс, на основании которого переписывается результирующее значение, которое образуется путем сложения новой строковой переменной (String) c предыдущим результатом.
В данном случае использование конвертации в String а затем снова в числовой формат обосновано тем, что результат Float(с плавающей точкой). Если же результатом должно быть целочисленное значение, правильней будет обойтись без String, т.к. такая конвертация является довольно тяжелой операцией для процессора.
С вводом целочисленного значения проект упрощается и будет выглядеть так.
Ввод целочисленного значенияПоказать
Считывание и обработка нажатий - это две разных операции. Как видно из предыдущего примера, считыванием занимается блок матричной клавиатуры, а обработка выполняется простыми штатными средствами FLProg. Однако обработка не сводится только к простому вводу числа. Возможны и другие более сложные задачи. Для того, что бы не загромождать проект. Можно воспользоваться готовыми вариантами. На форуме можно найти Пользовательские Блоки обоих типов.
Пример:
блок "Ввод числа с клавиатуры"
Скрин блокаПоказать
Кроме того есть и блоки работающие с матричной клавиатурой через микросхемы расширений по порту I2C, занимая при этом всего два пина, которые одновременно могут использоваться дисплеем и разными датчиками.
Поиск по тегам клавиатура клавиатуры и обязательно только в названиях тем.
В настоящее время готовится универсальный блок который сможет использовать более десяти вариантов микросхем расширений.
Ждать осталось не долго.
.