Как можно подключить 16 кнопок всего 8 проводами?

Вот продукт. Идея мне понятна: эти 16 кнопок используют матрицу 4х4. 4 линии для строк, 4 линии для столбцов, и у нас есть 8 кабелей.

введите описание изображения здесь

Но:

  1. Как это может работать без мультиплексора?

  2. Может ли это точно определять нажатия нескольких кнопок? Даже если кнопки используют одну и ту же строку или один и тот же столбец? Пример: кнопки в положении (2,2) (2,3), (3,2) и (3,3) нажаты одновременно.

  3. Как это работает?

Это общеизвестно, как вы обнаружите, выполнив поиск в Google по запросу «мультиплексирование клавиатуры» или тому подобное. Разве вы не пробовали это сначала, прежде чем опубликовать это?
@TonyM Конечно, много искал, и я даже заказал несколько микросхем мультиплексора 74HC164, которые прибыли домой несколько дней назад. Я собирался подключить все к этому чипу мультиплексора, когда нашел это. Тогда мне было интересно, «как это может работать без мультиплексора»?
Устройство слева должно иметь внутри код мультиплексирования
@MarceloEspinozaVargas Хорошо. Тогда что вы думаете о вопросе № 2?
Это зависит от фактического кода мультиплексирования, если это так же просто, как отправка +V по каждой строке и использование каждого столбца в качестве входных данных, то он не сможет этого сделать, но если он переключается между каждой строкой и столбцом (принимая все 8 контакты как вход и выход) и может хранить в памяти, какая кнопка нажата, он может обнаруживать несколько кнопок, нажатых одновременно
Я сделал этот поиск, и вторым результатом был PDF-файл с подробным ответом на ваш Q1, Q3 и часть Q2. Вы можете понять мою точку зрения, не так ли - это уже задокументировано и лучше, чем мы объясним это здесь. Посмотрите, получите подробные ответы.
@TonyM Спасибо, что указали мне на это. Можете ли вы связать PDF вместо того, чтобы делать тайну ;)? Возможно, я искал другие ключевые слова, кроме клавиатуры и т. д., и, вероятно, не нашел того же самого.
Конечно :-) www.emc.com.tw/eng/database/Sa2/Gp/An/Gf/AN-009.pdf
Извините, @TonyM, но это, вероятно, легко читать для тех, кто уже знает, но для меня, видя ассемблер MOV A,@0X11;disable WDT, не особенно просто понять, как работает клавиатура с несколькими нажатиями кнопок...
@Basj: несколько нажатий не проблема. Вы сканируете все четыре строки одну за другой. Если в строке 1 найдена нажатая кнопка, вы это отмечаете. Когда дело доходит до строки 3, вы обнаружите, что там нажата еще одна кнопка, вы тоже это замечаете. В итоге вы получите обе кнопки. Пока вы можете сканировать значительно быстрее, чем люди могут нажимать кнопки, вы ничего не пропустите.
Посмотрите эту анимацию: upload.wikimedia.org/wikipedia/commons/f/f2/… (примечание: переключение между строками и столбцами не является аппаратной вещью. Это ваш код говорит: «Хорошо, теперь установите контакт 1 на высокий уровень, теперь прочитайте, в каком состоянии контакт 5" и т. д.)
@MarceloEspinozaVargas устройство слева — это Raspberry Pi (модель 3). Эти контакты GPIO быстро и легко настраиваются в коде. Похоже, что все контакты клавиатуры подключены к GPIO (ничего к GND), но на размеченном фото не все так ясно.
Руководство по вашему продукту учит, как его демультиплексировать: gotronic.fr/pj2-sbc-buttonmatrix-fr-1461.pdf

Ответы (4)

Как это может работать без мультиплексора?

Это не так. На плате клавиатуры, кажется, есть только переключатели, возможно, с некоторыми диодами, которые мы не видим. Однако левая плата выглядит так, как будто на ней есть процессор. Почти наверняка в прошивке делается мультиплексирование.

Алгоритм мультиплексирования работает примерно так:

  1. Ведите один ряд высоко, остальные низко.

  2. Включите пассивные раскрывающиеся списки в строках столбцов.

  3. Посмотрите, какие строки столбца высокие. Кнопки на пересечении этих строк столбцов с одной утвержденной строкой нажимаются. Остальные кнопки в этом ряду отпущены.

  4. Повторите обратно к шагу один, последовательно закрепляя следующую строку.

Описанный выше процесс повторяется достаточно быстро, так что все кнопки проверяются за время, которое для человека-наблюдателя все еще кажется мгновенным. Человеческий предел «мгновенного» в этом контексте составляет около 50 мс. Даже самый дешевый микроконтроллер может просканировать клавиатуру 4x4 за гораздо меньшее время.

Может ли это точно определять нажатия нескольких кнопок?

Вероятно, да. Один из способов - поставить диод последовательно с каждой кнопкой. Они могут быть на нижней стороне доски, которую вы показываете. С диодами как раз работает описанный выше алгоритм.

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

Спасибо. А как насчет нескольких нажатий одновременно? Примечание: левая плата — RaspberryPi.
@Basj Если вы собираетесь одновременно нажимать только 2 кнопки, то все в порядке, только при нажатии 2 или более кнопок в одном столбце и еще одной кнопки в другом столбце вам понадобятся диоды.
@Хейман, почему так? Можете ли вы привести пример? Почему одновременное нажатие (1,2), (2,2) и (3,3) является проблемой при отсутствии диода? Может быть, у вас есть небольшая схема? Поскольку этот момент действительно важен, может быть, стоит дать специальный ответ @Hayman?
+1 за «левая плата выглядит так, как будто на ней есть процессор». Мне это понравилось.
Я также слышал, что три иногда не работают с этим типом мультиплексирования. Он регистрирует четвертую клавишу как нажатую (фантомное нажатие). У этого алгоритма есть название, и я не могу его вспомнить, чтобы посмотреть...
@Basj это очевидно, если вы играете с этим. Всякий раз, когда вы нажимаете кнопку, вы соединяете строку со столбцом. Всякий раз, когда строка и столбец соединены, клавиша на пересечении регистрируется как нажатая. Но если нажаты хотя бы 3 клавиши, строка и столбец могут быть связаны косвенно .
@Basj Взгляните на эту картинку . Красные линии указывают на высокий логический уровень. Если вы удерживаете 3 кнопки, обозначенные знаком «x», вы можете проследить их и увидеть путь, по которому будет проходить сигнал. Сначала выбирается строка 1 и устанавливается высокий уровень, нажатие кнопки 1,1 делает первый столбец высоким. Нажав кнопку 1,2, мы сделали второй ряд высоким. Теперь, если мы нажмем любую другую кнопку в строке 2, мы сделаем еще один столбец высоким. Проблема в том, что микроконтроллер тупой, он знает, что он установил высокий уровень в строке 1, и он видит высокий уровень в столбце 3, поэтому он думает, что кнопка 1,3 имеет высокий уровень.
@Basj Без диодов, если вы соедините строку 1 с столбцом 1 и строку 1 со столбцом 2, вы соедините столбцы 1 и 2 вместе. Теперь, как вы можете определить, была ли нажата строка 2, столбец 1, а не строка 2, столбец 2? С диодами вы не соединяете два столбца вместе, потому что такой путь должен был бы идти назад через один диод.
Даже в руководстве по нему (его можно найти по ссылке на продукт) приведен код, который используется для его демультиплексирования: gotronic.fr/pj2-sbc-buttonmatrix-fr-1461.pdf

Без диодов вы получите фантомные прямоугольники.

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

Эта клавиатура явно предназначена для ввода данных с клавиатуры, где пользовательское соглашение заключается в нажатии одной клавиши за раз. Например, вы замечаете, что на клавиатуре ввода кредитной карты на заправочной станции нет клавиш «Shift».

Однако, если вы сделаете S1 клавишей Shift, а S3 клавишей Alt-Shift, чтобы пользователи могли разумно удерживать обе клавиши, одновременно нажимая S13, тогда S15 также будет казаться нажатой.

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

Вот как это сделать без непрерывного сканирования:

  • Установите все драйверы на высокий уровень
  • Включить пассивные подтягивания на принимающих линиях
  • Установите прерывание смены контакта, чтобы обнаружить, что одна из линий становится высокой (или изменяется уровень)
  • Когда это произойдет, включите сканирование клавиатуры, скажем, каждые 10 мс.
  • Сканируйте в обычном режиме и обрабатывайте нажатия клавиш
  • После тайм-аута без событий остановить сканирование и перезапустить с первой точки маркера

Я сделал это с помощью языка ассемблера на голых микроконтроллерах Atmel AVR.
Для простоты: Ряды клавиатуры: используйте контакты Arduino 4, 5, 6 и 7 (контакты AVR PD4, PD5, PD6 и PD7) Столбцы клавиатуры: используйте контакты Arduino 8, 9, 10 и 11 (контакты AVR PB0, PB1, PB2 и PB3). ) Сделайте входы для выводов строки с включенными подтягиваниями. Сделайте выводы столбца выходными и выведите на них нули. Включите прерывания смены контакта на всех выводах строки и столбца. http://playground.arduino.cc/Main/PinChangeInterruptНажатие кнопки на клавиатуре приведет к низкому уровню вывода строки. Процедура прерывания должна прочитать выводы строки и определить, какой из выводов имеет низкий уровень. Старшие 4 бита должны состоять из трех единиц и одного нуля. Если вы используете 8-битную переменную uint8_t, вы можете разделить ее на 16 или (var >> 4), чтобы поместить 4 бита в младшие биты числа. Вы можете использовать побитовое ИЛИ | операция с 240, чтобы установить старшие 4 бита в 1 с, и побитовая операция NOT ~, чтобы инвертировать все биты, чтобы у вас был только один бит, представляющий строку, в которой было нажатие кнопки. Сохраните это число как 0, 1, 2 или 3.
Переключите конфигурацию контактов:
Сделайте входы штифтов столбца с включенными подтягиваниями. Make Row pins Output и выводите на них нули. Прочитайте контакты столбца и найдите, какой из них низкий. Проделайте аналогичные манипуляции с этим значением, за исключением того, что вам не нужно сдвигать число вправо. После var ^ 240 и ^var у вас есть один бит для представления столбца, в котором была нажата клавиша. Не забудьте отключить прерывания перед перенастройкой портов, так как это, скорее всего, вызовет нежелательные прерывания. Возможно, вам придется сбросить флаги прерывания при выходе из процедуры обработки прерывания, чтобы предотвратить повторную обработку прерывания.