Як 16 кнопок можна з'єднати лише з 8 проводами?


9

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

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

Але:

  1. Як це може працювати без мультиплексора?

  2. Чи може це виявити точно натискання декількох кнопок? Навіть якщо кнопки використовують той самий рядок або той самий стовпець? Приклад: кнопки в положенні (2,2) (2,3), (3,2) та (3,3) одночасно натискаються.

  3. Як це працює?


7
Це загальновідомі відомості, які ви знайдете в пошуку Google для "мультиплексування клавіатури" або подібного. Ви цього не спробували спочатку, перш ніж опублікувати це?
TonyM

3
@TonyM Звичайно, я здійснив багато пошуків, і я навіть замовив кілька мультиплексорних мікросхем 74HC164, які приїхали додому кілька днів тому. Коли я знайшов це, я збирався передати все з цим мультиплексорним чіпом. Тоді мені було цікаво "як це може працювати без будь-якого мультиплексора"?
Бась

1
Пристрій зліва повинен мати код мультиплексування всередині нього
Marcelo Espinoza Vargas

3
@TonyM Дякую, що вказали мені на це. Чи можете ви зв’язати PDF, а не робити таємницю;)? Можливо, я шукав за іншими ключовими словами, крім клавіатури і т. Д., І, мабуть, не знайшов того самого.
Бась

1
@Basj: мати кілька натискань - це не проблема. Ви скануєте всі чотири рядки один за одним. Якщо в рядку 1 знайдена кнопка, ви її помічаєте. Коли йдеться про рядок 3, ви знаходите там ще одну кнопку, яку ви натискаєте. Зрештою, ви отримуєте обидві кнопки. Поки ви зможете сканувати значно швидше, ніж люди можуть натискати кнопки, ви цього не пропустите.
Габор

Відповіді:


24
Як це може працювати без мультиплексора?

Це не так. Здається, що на клавіатурі є просто комутатори, можливо, деякі діоди ми не бачимо. Однак на лівій дошці схоже, що на ній є процесор. Майже напевно, мультиплексування проводиться в прошивці.

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

  1. Проїжджайте один ряд високо, інші низько.

  2. Увімкнути пасивні витягування на рядках стовпців.

  3. Подивіться, які рядки стовпців високі. Натискаються кнопки на перетинах цих ліній стовпців з однією ствердженою лінією рядків. Інші кнопки в цьому рядку відпущені.

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

Вищеописаний процес повторюється досить швидко, щоб всі кнопки перевірялися протягом часу, який все ще відчуває себе миттєвим для людини-спостерігача. Межа людини "миттєвого" в цьому контексті становить близько 50 мс. Навіть мікроконтролер низького рівня може сканувати клавіатуру 4x4 за набагато менше часу, ніж це.

Чи може це виявити точно натискання декількох кнопок?

Напевно, так. Один із способів - поставити діод послідовно з кожною кнопкою. Вони можуть бути в нижній частині дошки, яку ви показуєте. З діодами алгоритм, описаний вище, просто працює.

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


1
Дякую. Що тоді робити кілька пресів одночасно? Примітка: ліва дошка - це RaspberryPi.
Бась

1
@Hayman чому це так? Чи можете ви навести приклад? Чому (1,2), (2,2) та (3,3) одночасно натискають на проблему, коли діода немає? Може, у вас є невеликі схеми? Оскільки ця точка дійсно вирішальна, можливо, варто доречно відповісти @Hayman?
Basj

8
+1 для "ліва дошка виглядає так, що на ній є процесор". Полюбив це.
Енрік Бланко

3
@Basj це очевидно, якщо ти граєш з ним. Щоразу, коли ви натискаєте кнопку, ви підключаєте рядок до стовпця. Щоразу, коли рядок і стовпець з'єднані, клавіша в перетині реєструється як натиснута. Але якщо натиснути принаймні 3 клавіші, рядок і стовпець можна з'єднати побічно .
варення

2
@Basj Поглянь на цю картинку . Червоні лінії вказують на логічно високий рівень. Якщо ви тримаєте 3 кнопки, позначені символом "x", ви можете відстежити їх і побачити шлях, по якому буде надходити сигнал. Перший рядок 1 вибирається і встановлюється високим, натисканням кнопки 1,1 це робить перший стовпчик високим. Натиснувши кнопку 1,2, ми зробили рядок 2 високим. Тепер, якщо ми натиснемо будь-яку іншу кнопку в другому ряду, зробимо ще один стовпчик високим. Проблема в тому, що μC є німим, він знає, що він встановлює рядок 1 високим, і він бачить високий на стовпці 3, тому вважає, що кнопка 1,3 висока
Doodle

9

Без діодів ... ви отримаєте фантомні прямокутники.

Наприклад, у вашому прикладі (2,2) (2,3), (3,2) та (3,3); Ви вибрали іронічний приклад, вибравши прямокутник. Якщо ви насправді натиснете всі чотири, це спрацює. Але якщо натиснути будь-які три кути прямокутника, четвертий кут також здасться натисненим, навіть якщо це не так.

Ця клавіатура явно призначена для введення даних на клавіатурі, де користувальницький режим - це одне натискання клавіш за раз. Ви помічаєте, що на клавіатурі входу кредитної картки на АЗС немає клавіш "shift".

Однак якщо ви зробили S1 клавішею зсуву, а S3 клавішею Alt Shift, щоб користувачі могли розумно утримувати обидва, одночасно натискаючи S13, тоді S15 також видається натиснутим.


1
Дійсно, більшість клавіатур для введення даних не мають одночасно натискати більше 2 клавіш, тому немає проблем. Музичні клавіатури - це ще одна історія, оскільки одночасно можна натискати багато клавіш. Більшість з них мають діоди або незалежне підключення до кожної клавіші. Але я знайшов одну музичну клавіатуру в магазині секонд-хенду (ціною в 9 євро), яка не мала відповідної адаптації для декількох клавіш, натиснутих одночасно, з непередбачуваними і дратівливими результатами!
Річка рівня Св.

Перемикачі клавіш можуть мати тип, який має вбудований діод, або під ними може бути прихований діод.
rackandboneman

1

Ось як це зробити без постійного сканування:

  • Встановіть усі драйвери на високий
  • Увімкнути пасивні витягування на приймальних лініях
  • Встановити переривання зміни штифта для виявлення однієї з ліній, що йдуть високо (або змінюються на рівні)
  • Коли це станеться, увімкніть сканування клавіатури, скажімо кожні 10 мс
  • Нормально сканувати та обробляти натискання клавіш
  • Після таймауту без подій припиніть сканування та перезапустіть спочатку кулю

0

Я зробив це з мовою збірки на голих мікроконтролерах Atmel AVR.
Для простоти: рядки клавіатури: використовуйте шпильки Arduino 4,5,6 і 7 (шпильки AVR PD4, PD5, PD6 і PD7) Стовпці клавіатури: використовуйте шпильки Arduino 8, 9, 10 і 11 (шпильки AVR PB0, PB1, PB2 і PB3 ) Зробіть введення рядкових штифтів із увімкненими підтягувачами. Зробіть штифти стовпців Вихідні та вихідні нулі до них. Увімкнути переривання змін PIN-коду на всіх штирях рядків та стовпців. http://playground.arduino.cc/Main/PinChangeInterrupt Натискання кнопки на клавіатурі знизить штифт рядка низько. У рутині переривання потрібно прочитати штифти рядків і знайти, який штифт низький. Верхні 4 біти повинні бути три і один нуль. Якщо ви використовуєте 8-бітну змінну uint8_t, ви можете розділити її на 16 або (var >> 4), щоб помістити 4 біти в нижні біти числа. Ви можете використовувати побіт АБО | Операція з 240 для встановлення верхніх 4 біт на 1s, а побіт НЕ ~ операція з інвертування всіх бітів, щоб у вас був лише один набір бітів, що представляє рядок, на який натискали кнопку. Зберігайте це число як 0, 1, 2 або 3.
Переключіть конфігурацію штифтів:
Зробіть вводи стовпців стовпців із увімкненими підтягувачами. Складіть рядкові штифти Вихідні та вихідні нулі до них. Прочитайте шпильки стовпців і знайдіть, який штифт низький. Виконайте подібні маніпуляції з цим значенням, за винятком того, що вам не доведеться зміщувати число вправо. Після var ^ 240 та ^ var у вас є один біт для відображення стовпця, на якому було натиснуто клавішу. Не забудьте відключити переривання перед перенастроюванням портів, оскільки це, ймовірно, призведе до небажаних переривань. Можливо, вам доведеться очистити прапори переривань, поки виходите з програми переривання, щоб запобігти повторенню обробки переривань.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.