КЛАВИАТУРЫ - типы, схемы, блоки, принцип работы (Ликбез)

Ответить
Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

КЛАВИАТУРЫ - типы, схемы, блоки, принцип работы (Ликбез)

#1

Сообщение Dryundel » 27.08.2022{, 12:50}

Клавиатуры
0.jpg
.
Почти ни один проект не обходится без периферийных устройств ввода информации. На этом держатся основные принципы взаимодействия человека с электронным устройством. Одним из таких устройств является клавиатура. С помощью неё можно вводить данные - цифры, буквы, команды.

Разновидности клавиатур
Разновидностей клавиатур довольно много: механические(контактные), мембранные, опто-механические, сенсорные, проекционные, аналоговые, матричные и др. Способ трансформации физического воздействия в электрический импульс для данной темы не особо принципиален. Для разработчика гораздо важней второй этап - обработка полученных импульсов.

Клавиатура из набора кнопок.
Если взять некоторое количество кнопок, то для каждой из них необходим отдельный пин контроллера, плюс один общий. Как правило общий это GND или VCC. Когда кнопок довольно много, можно применить расширители портов, специальные микросхемы. Но есть и другой вариант сокращения количества необходимых пинов для клавиатуры.

Матричная клавиатура
Именно для сокращения количества контактов(проводов) придумана матричная клавиатура. В такой клавиатуре один контакт кнопки соединен в общую линию строки клавиатуры, а другой в общую линию столбца клавиатуры.
Принципиальная схема матричной клавиатуры 4*4Показать
10.jpg
Как видно из схемы, для 16 кнопок нам потребовалось 8 проводов вместо 17(16+GND).
Возникает резонный вопрос, как же подключать такую клавиатуру. Где 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 минуту :
Матричная клавиатура
Подключение, настройка, типичные ошибки.

Хотя сложностей в подключений нет, частенько вижу что это сделано не правильно.
Видео "Ключ к Ардуино" с правильным подключениемПоказать
Принято что строки считаются сверху вниз, а столбцы слева направо. Именно так сделаны широко распространенные, недорогие мембранные клавиатуры.
Мембранная матричная клавиатураПоказать
14.jpg
Вот проект с форума. Пример где перепутаны пины подключения. Человек тупо перевернул фишку.
Ввод с клавы.flp
(496.51 КБ) 45 скачиваний
.
При правильном подключении порядок выходов блока должен быть таким (Выделено красным).
Скрин проекта с ошибкойПоказать
15.jpg
Работать оно конечно будет, но проектировать крайне не удобно.

Рассмотрим проект поближе
Представлен вариант ввода числа с клавиатуры. То, что сделано крайне грамотно - это использован всего один блок Bounce после блока ИЛИ. При нажатии любой из кнопок генерируется короткий импульс, на основании которого переписывается результирующее значение, которое образуется путем сложения новой строковой переменной (String) c предыдущим результатом.
В данном случае использование конвертации в String а затем снова в числовой формат обосновано тем, что результат Float(с плавающей точкой). Если же результатом должно быть целочисленное значение, правильней будет обойтись без String, т.к. такая конвертация является довольно тяжелой операцией для процессора.
С вводом целочисленного значения проект упрощается и будет выглядеть так.
Ввод целочисленного значенияПоказать
16.jpg
Считывание нажатий и Обработка нажатий
Считывание и обработка нажатий - это две разных операции. Как видно из предыдущего примера, считыванием занимается блок матричной клавиатуры, а обработка выполняется простыми штатными средствами FLProg. Однако обработка не сводится только к простому вводу числа. Возможны и другие более сложные задачи. Для того, что бы не загромождать проект. Можно воспользоваться готовыми вариантами. На форуме можно найти Пользовательские Блоки обоих типов.
Пример:
блок "Ввод числа с клавиатуры"
Скрин блокаПоказать
Ввод числа с матричной клавиатуры.jpg
Ввод числа с матричной клавиатуры.jpg (46.15 КБ) 1561 просмотр
.
Кроме того есть и блоки работающие с матричной клавиатурой через микросхемы расширений по порту I2C, занимая при этом всего два пина, которые одновременно могут использоваться дисплеем и разными датчиками.
Поиск по тегам клавиатура клавиатуры и обязательно только в названиях тем.

В настоящее время готовится универсальный блок который сможет использовать более десяти вариантов микросхем расширений.
Ждать осталось не долго. :)
.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

КЛАВИАТУРЫ - типы, схемы, блоки, принцип работы (Ликбез)

#2

Сообщение Dryundel » 28.08.2022{, 16:40}

Многомерные матрицы (Теория).
Что такое матрица, наверное уже понятно. Китайская матричная клавиатура 4х4 типичный представитель дву-мерной(квадратной) матрицы.
Что она дает? Сокращение количества используемых пинов в соотношении количество строк = квадратный корень от количества кнопок. Это в случае если количество строк = количеству столбцов.
Можно пойти и дальше. Матрицу реально сделать трех-мерную(кубическую), четырех-мерную и т.д. В трех мерной матрице количество проводов на столбцы будет уже кубическим корнем из количества кнопок. Наглядно это будет выглядеть примерно так.
трех-мерная матрицаПоказать
18.jpg
Это теоретическое представление, потому как в реальности для этого у каждой дву-мерной клавиатуры должен быть ключ на разрешение работы. Для увеличения кнопок в три раза потребуется всего три дополнительных провода. Алгоритм будет следующий:
- Даем разрешение на работу конкретного экземпляра клавиатуры
- Даем импульс на строку
- Считываем столбцы
Сочетание (экземпляр - строка - столбец) даст возможность определить конкретную кнопку.

Многомерную матрицу показать наглядно довольно сложно, точней это невозможно сделать в трех-мерном мире.
Если же очень грубо и на практике, то выглядеть она будет примерно так:
Пример четырех-мерной матрицыПоказать
19.jpg
В данном случае потребуется по ключу на каждую группу клавиатур. Но это вполне оправдано, ведь увеличив количество клавиатур с 3 до 9 потребуется всего еще три дополнительных провода.
К алгоритму добавится разрешение на работу группы клавиатур в самом начале.
Примерно по такому принципу устроены большие клавиатуры типа компьютерной.

Трех-мерная клавиатура и FLProg (Реальность)
Как так? Это невозможно! Должен быть ключ! Скажете вы и отчасти будете правы. НО! Речь идет о псевдо трех-мерной матрице.
Что нам мешает соединить в клавиатурах только линии строк? Вот так.
Соединение в псевдо трех-мерную матрицуПоказать
21.jpg
.
Таким образом мы сэкономили целых 8 проводов на двух дополнительных клавиатурах.
Хорошо, соединили, а что дальше? Нужен специальный Пользовательский блок? Как обрабатывать нажатия?
В реальности все до банальности просто и с этим справится даже штатный блок матричной клавиатуры.
Соединив строковые провода, на самом деле мы получили матрицу размером 4х12 и это выглядит так
Псевдо трех-мерная матрица 4х16Показать
22.jpg
.
Дальше дело техники. У нас есть 4 строки и 16 столбцов. Главное не запутаться при проектировании. Но как говориться - не будет хватать пина и не так на пупе крутанешься. :) Так что на обычную NANO легко можно повесить 3 и даже 4 клавиатуры, без особых танцев с бубнами. Правда в последнем случае придется слегка подправить код для использования аналогового пина (A6-A7)

.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

КЛАВИАТУРЫ - типы, схемы, блоки, принцип работы (Ликбез)

#3

Сообщение Dryundel » 30.08.2022{, 00:27}

ВАЖНО!
Китайская клавиатура или "Попытка убить контроллер"
.
23.jpg
.
В глобальной сети можно найти массу подобных схем подключения дешевой матричной клавиатуры.
Скажу сразу - Лучше так не делать! Сейчас разберемся почему.

Выше я писал о недостатках штатного блока "Матричная клавиатура", в том числе:
Dryundel писал(а):
27.08.2022{, 17:11}
Отсутствие мультитач. Нет гарантированной возможности отследить хотя бы две одновременно нажатые кнопки.
Автор же заявляет:
24.jpg
Справка - Блок для работы с матричной клавиатурой
Вероятно кто то из нас лукавит. Проще всего взять и проверить.

Подключаем клавиатуру к пинам, вытаскиваем в проект блок и к примеру выводим в монитор порта 12(16) символов (по одному на каждый выход блока клавиатуры).
Тест клавиатуры.flp
(483.34 КБ) 35 скачиваний
Если нажаты одновременно две клавиши в одной строке, то все Ок.
Если же нажаты две клавиши в одном столбце то получаем глюк.
Значит Автор не прав? Стоп - не все так однозначно!

Алгоритм кода весьма прост (смотри схему матрицы в самом начале)
- Подали сигнал на строку 1
--- Прочитали столбец 1 (результат на выход блока)
--- Прочитали столбец 2 (результат на выход блока)
--- Прочитали столбец 3 (результат на выход блока)
- Сняли сигнал со строки 1
- Подали сигнал на строку 2
--- Прочитали столбец 1 (результат на выход блока)
--- Прочитали столбец 2 (результат на выход блока)
--- Прочитали столбец 3 (результат на выход блока)
- Сняли сигнал со строки 2
- Подали сигнал на строку 3
--- Прочитали столбец 1 (результат на выход блока)
--- Прочитали столбец 2 (результат на выход блока)
--- Прочитали столбец 3 (результат на выход блока)
- Сняли сигнал со строки 3

И так каждый цикл программы. Здесь вообще нечему глючить. Сигнал может быть одновременно только на одной строке. Столбцы считываем тоже по очереди. В коде проблем точно нет. Должно же вроде работать. Так в чем же изъян?

Типичная ошибка новичков в схемотехнике
Выход контроллера это не выключатель а переключатель. На нем не может быть состояния "Ничего". Выход всегда притянут(подключен) либо к GND(-5V) либо к VCC(+5V).
25.jpg
25.jpg (4.3 КБ) 1386 просмотров
.
Пошаговый разбор работы клавиатуры
Рассмотрим пошагово что происходит во время выполнения программы.
Уточнение Сигнал на выходах инвертированный. Т.е. притягивание к GND это сигнал, в остальное время на выходе +5V (так по коду)
В принципе можно было бы сделать и наоборот, но у Автора так. На то есть некоторые основания.
Схема клавиатуры в работеПоказать
КЗ.jpg
Поэтапно
1 Ничего не нажато
2 Нажата кнопка
3 Пришел импульс на строку 1 (все норм отработало)
4 Нажаты две кнопки
5 Пришел импульс на строку 1 и ВОЗНИКАЕТ КЗ (короткое но КЗ)

Получается что это попытка убить контроллер. Но он не умирает т.к. сигнал кратковременный, несколько микросекунд.
Похоже что на некоторое время(очень короткое), все выходы контроллера ложатся в ноль. А когда приходит импульс на строку 3 то они еще не успевают восстановиться, там же микросекунды между строками. Вот здесь и была зарыта эта собака.

Самое типичное решение - диоды. Добавив их в схему, по одному на выход (строку) мы можем смело утверждать что гарантировано отслеживать нажатия до 2 кнопок одновременно. Мало того, если все одновременно нажимаемые кнопки в одной строке или в одном столбце, то отслеживаются все эти кнопки (3 или 4). На большее такая клавиатура без дополнительных ухищрений не способна.
В зависимости от алгоритма, выходы могут быть и на столбцах, тогда диоды устанавливаются туда.

Но не все так печально с недорогой клавиатурой. Да, без ухищрений мультитач не возможен, но существуют алгоритмы, которые обходят эти ограничения. Есть и блок который делает это. Скачать его можно здесь:
Матричная клавиатура PRO (Мультитач)

Мультитач матричная клавиатура
Есть и другой способ достигнуть отслеживания одновременно всех кнопок или необходимого количества (сочетания). Для этого потребуется поставить по диоду на каждую кнопку. Однако дешевая мембранная клавиатура для этого не подойдет. Придется сделать такую самому или приобрести готовую кнопочную. Существуют и наборы. Их возможно доработать.
Примеры матричных клавиатурПоказать
26.jpg
Схема матричной клавиатуры с диодамиПоказать
27.jpg
.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

КЛАВИАТУРЫ - типы, схемы, блоки, принцип работы (Ликбез)

#4

Сообщение Dryundel » 31.08.2022{, 16:10}

Дребезг контактов
Как и любая механическая кнопка, мембранная матричная клавиатура, а так же, хоть и в меньшей степени сенсорная, подвержены такому явлению как дребезг контактов или пограничное состояние переключения, в случае с сенсорной. С этой неприятностью необходимо бороться и фильтровать.
Делается это либо на физическом уровне схемотехники - RC-фильтры, триггеры Шмитта или же на программном. В FLProg для этого имеются штатные средства - блок Bounce или таймер с задержкой на включение. По сути это одно и то же, только во втором можно настроить время задержки. В блоке Bounce эта задержка выставлена жестко 40 мс. Потребуется по одному такому блоку на каждую кнопку клавиатуры. В некоторых случаях можно обойтись одним плюс многовходовой блок ИЛИ.
Примеры фильтрации дребезга контактовПоказать
1.jpg
.
Однако если использовать один блок плюс ИЛИ, возможно отфильтровать дребезг только если кнопки нажимаются по одной. при нажатии одновременно второй кнопки, такой вариант не сработает. При использовании по блоку на каждый вход, проект может оказаться визуально перегружен. Поэтому я сделал отдельный блок для такой фильтрации. Он так же показан на скрине.
Особенностью этого блока является то, что он следит одновременно за всеми кнопками и выдает изменение на выходы только когда дребезг прекратился на всех кнопках. Благодаря этому преимуществу, можно отфильтровать не только дребезг, но и отделить одновременное нажатие двух кнопок от нажатия их по отдельности. Пример этого есть в теме блока.
.
Продолжение следует.

Анонс:
- Будут рассмотрены сенсорные и компьютерные клавиатуры.
- Возможность подключения матричных клавиатур через микросхемы расширений по I2C.
- Новые и уже имеющиеся ПБ для работы с клавиатурами.
- Примеры обработки разных нажатий кнопок
- Мультитач для матричной клавиатуры
- Использование нескольких клавиатур для одного контроллера.

Ответить

Вернуться в «Обучающие примеры работы в FLProg»