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

9

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

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

Но:

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

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

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

Basj
источник
7
Это общеизвестно, как вы найдете в поиске Google для «мультиплексирования клавиатуры» или тому подобное. Разве вы не пробовали это прежде, чем опубликовать это?
TonyM
3
@TonyM Конечно, я провел много поисков и даже заказал несколько чипов мультиплексора 74HC164, которые пришли домой несколько дней назад. Я собирался соединить все с этим чипом мультиплексора, когда нашел это. Тогда мне было интересно, "как это может работать без мультиплексора"?
Basj
1
Устройство слева должно иметь код мультиплексирования внутри
Марсело Эспиноза Варгас
3
@TonyM Спасибо, что указали мне это. Можете ли вы связать PDF вместо того, чтобы сделать загадку;)? Может быть, я искал с другими ключевыми словами, чем клавиатура и т. Д., И я, вероятно, не нашел то же самое.
Basj
1
@Basj: наличие нескольких нажатий не является проблемой. Вы сканируете все четыре строки одну за другой. Если кнопка найдена нажатой в строке 1, вы отмечаете это. Когда дело доходит до строки 3, вы обнаруживаете, что там нажата другая кнопка, вы тоже это заметили. В итоге вы получаете обе кнопки. Пока вы можете сканировать значительно быстрее, чем люди могут нажимать кнопки, вы не пропустите это.
Габор

Ответы:

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

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

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

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

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

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

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

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

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

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

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

Олин Латроп
источник
1
Спасибо. А как насчет нескольких нажатий одновременно? Примечание: левая доска - RaspberryPi.
Basj
1
@ Хейман, почему это так? Можете привести пример? Почему одновременно нажимаются клавиши (1,2), (2,2) и (3,3), когда диод отсутствует? Может быть, у вас есть небольшая схема? Поскольку этот вопрос действительно важен, может быть, стоит посвятить ответ @Hayman?
Basj
8
+1 за "левая плата выглядит так, как будто на ней есть процессор". Любил это.
Энрик Бланко
3
@Basj очевидно, если ты будешь играть с этим. Всякий раз, когда вы нажимаете кнопку, вы подключаете строку к столбцу. Когда строка и столбец соединены, клавиша на пересечении регистрируется как нажатая. Но если по крайней мере 3 клавиши нажаты, строка и столбец могут быть связаны косвенно .
Хоббс
2
@Basj Посмотри на эту картинку . Красные линии указывают на высокий логический уровень. Если вы удерживаете 3 кнопки, обозначенные «х», вы можете проследить их и увидеть путь, по которому будет проходить сигнал. Сначала выбирается строка 1 и устанавливается высокий уровень, при нажатии кнопки 1,1 это делает первый столбец высоким. Нажав кнопку 1,2, мы сделали высоту второго ряда. Теперь, если мы нажмем любую другую кнопку в строке 2, мы сделаем еще один столбец высоко. Проблема в том, что микроконтроллер тупой, он знает, что установил высокий уровень в строке 1, и видит высокий уровень в столбце 3, поэтому он считает, что кнопка 1,3 является высокой
Doodle
9

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

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

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

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

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

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

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

Я сделал это с помощью языка ассемблера на голых микроконтроллерах 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 с, и побитовая операция НЕ ~, чтобы инвертировать все биты, чтобы у вас был установлен только один бит, представляющий строку, в которой было нажатие кнопки. Сохраните это число как 0, 1, 2 или 3.
Переключите конфигурацию контактов:
Сделайте входы столбцов с включенными подтягиваниями. Сделайте вывод рядных выводов и выведите на них нули. Прочитайте контакты столбца и найдите, какой из них низкий. Выполните аналогичные манипуляции с этим значением, за исключением того, что вам не нужно сдвигать число вправо. После var ^ 240 и ^ var у вас есть один бит для представления столбца, на котором была нажата клавиша. Не забудьте отключить прерывания перед перенастройкой портов, так как это, вероятно, вызовет нежелательные прерывания. Возможно, вам придется очистить флаги прерывания при выходе из процедуры прерывания, чтобы предотвратить дублирование обработки прерываний.

Даррелл Харриман
источник