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를 주문했습니다. 나는 이것을 발견했을 때이 멀티플렉서 칩으로 모든 것을 연결하려고했습니다. 그런 다음 "멀티플렉서없이 어떻게이 작업을 수행 할 수 있습니까?"
Basj

1
왼쪽의 장치에는 그 안에 다중화 코드가 있어야합니다
Marcelo Espinoza Vargas

3
@TonyM 이것을 지적 해 주셔서 감사합니다. 미스터리를 만드는 대신 PDF를 연결할 수 있습니까?) 아마도 키패드 이외의 다른 키워드로 검색했을 때 아마 같은 키워드를 찾지 못했습니다.
Basj

1
@Basj : 여러 번 누르는 것은 문제가되지 않습니다. 네 줄을 차례로 스캔합니다. 1 행에서 버튼을 누르면 발견됩니다. 3 번 줄에 관해서는 다른 버튼을 누른 것을 알 수 있습니다. 결국에는 두 버튼이 있습니다. 사람들이 버튼을 누르는 것보다 훨씬 빠르게 스캔 할 수 있다면 놓칠 수 없습니다.
Gábor

답변:


24
멀티플렉서없이 어떻게 작동합니까?

그렇지 않습니다. 키패드 보드에는 스위치가있는 것 같습니다. 아마도 우리가 볼 수없는 다이오드가 있습니다. 그러나 왼쪽 보드에는 프로세서가있는 것처럼 보입니다. 거의 확실하게 멀티플렉싱이 펌웨어에서 수행되고 있습니다.

멀티플렉싱 알고리즘은 다음과 같이 작동합니다.

  1. 한 줄은 높이, 다른 줄은 줄입니다.

  2. 열선에서 수동 풀다운을 활성화합니다.

  3. 어떤 열 줄이 높은지 확인하십시오. 하나의 단정 된 행 행과 해당 열 행의 교차 부분에있는 단추를 누릅니다. 해당 행의 다른 버튼이 해제됩니다.

  4. 다음 행을 순서대로 확인하면서 1 단계로 반복하십시오.

상기 과정은 충분히 반복되어 인간 관찰자에게 여전히 즉각적인 느낌을주는 시간 내에 모든 버튼이 점검된다. 이러한 맥락에서 "인스턴트"의 인간 한계는 약 50ms입니다. 저가형 마이크로 컨트롤러조차도 그보다 훨씬 적은 시간에 4x4 키패드를 스캔 할 수 있습니다.

여러 버튼을 정확하게 누르는 것을 감지 할 수 있습니까?

아마 그렇습니다. 한 가지 방법은 각 버튼과 다이오드를 직렬로 연결하는 것입니다. 그것들은 당신이 보여준 보드의 바닥에있을 수 있습니다. 다이오드를 사용하면 위에서 설명한 알고리즘이 작동합니다.

다른 방법은 저항을 선과 직렬로 연결하고 아날로그 전압을 측정하는 것입니다. 여러 행 / 열 줄을 함께 단락시키는 여러 단추가 있어도 어떤 단추를 눌렀는지 알아낼 수 있습니다. 이를 위해서는 다이오드 사용과 같은 디지털 입력뿐만 아니라 마이크로의 A / D 입력이 필요합니다.


1
감사. 동시에 여러 번의 프레스는 어떻습니까? 참고 : 왼쪽 보드는 RaspberryPi입니다.
Basj

1
@Hayman 왜 그렇습니까? 예를 들어 줄 수 있습니까? 다이오드가 없을 때 왜 (1,2), (2,2) 및 (3,3)이 동시에 문제가됩니까? 어쩌면 작은 회로도가 있습니까? 이 시점이 매우 중요하기 때문에 @Hayman 전용 답변에 대한 가치가 있습니까?
Basj

8
"왼쪽 보드에 프로세서가있는 것 같습니다"+1 그것을 좋아했습니다.
Enric Blanco

3
@Basj 당신이 그것을 가지고 노는 것이 분명합니다. 버튼을 누를 때마다 행을 열에 연결합니다. 행과 열이 연결될 때마다 교차점의 키가 눌린 것으로 등록됩니다. 그러나 3 개 이상의 키를 누르면 행과 열을 간접적 으로 연결할 수 있습니다 .
hobbs

2
@Basj 이 사진을보십시오 . 빨간색 선은 로직 하이 레벨을 나타냅니다. 'x'로 표시된 3 개의 버튼을 누르고 있으면 버튼을 추적하여 신호가 흐르는 경로를 볼 수 있습니다. 첫 번째 행 1이 선택되어 높이 1로 설정되면 버튼 1,1을 눌러 첫 번째 열을 높입니다. 버튼 1,2를 눌러 2 행을 높이 만들었습니다. 이제 2 행에서 다른 버튼을 누르면 다른 열이 높아집니다. 이것의 문제는 μC가 멍청하다는 것인데, 행 1을 높게 설정하고 열 3을 높게 설정한다는 것을 알고 있으므로 버튼 1,3이 높다고 생각합니다.
Doodle

9

다이오드가 없으면 팬텀 사각형이 나타납니다.

예를 들어 (2,2) (2,3), (3,2) 및 (3,3); 직사각형을 선택하여 아이러니 한 예를 선택했습니다. 당신이 경우 실제로 네를 누르면, 그것은 작동합니다. 그러나 사각형의 세 모퉁이를 누르면 네 번째 모퉁이도 눌려진 것처럼 보이지만 나타납니다 .

이 키패드는 사용자 데이터가 한 번에 한 번만 누르면 키보드 데이터 입력을위한 것입니다. 예를 들어, 주유소 신용 카드 입력 키패드에는 "shift"키가 없습니다.

그러나 S1을 Shift 키로, S3을 Alt-Shift 키로 설정하여 사용자가 S13을 누르는 동안 합리적으로 유지할 수 있으면 S15도 눌린 것으로 나타납니다.


1
실제로, 대부분의 데이터 입력 키보드는 한 번에 두 개 이상의 키를 누르도록 의도되지 않았으므로 아무런 문제가 없습니다. 한 번에 많은 키를 누를 수 있으므로 음악 키보드는 또 다른 이야기입니다. 대부분의 키에는 다이오드 또는 독립적 인 배선이 있습니다. 그러나 한 번에 여러 키를 눌렀을 때 적절한 조정이 이루어지지 않은 중고 가게 (9 유로 가격)에서 하나의 음악 키보드가 발견되어 예측할 수없고 성가신 결과가 발생했습니다!
Level River St

키 스위치는 내장 다이오드가있는 유형이거나 그 아래에 다이오드가 숨겨져있을 수 있습니다.
rackandboneman

1

연속 스캔없이 수행하는 방법은 다음과 같습니다.

  • 모든 드라이버를 높게 설정
  • 수신 라인에서 수동 풀다운 사용
  • 핀 변경 인터럽트를 설정하여 높은 라인 (또는 레벨 변경) 중 하나를 감지합니다.
  • 이 경우 10ms마다 키패드 스캔을 활성화하십시오.
  • 정상적으로 스캔하고 키 누름 처리
  • 이벤트가없는 시간 초과 후 스캔을 중지하고 첫 번째 글 머리 기호 지점에서 다시 시작하십시오.

0

Bare Atmel AVR 마이크로 컨트롤러에서 Assembly Language를 사용하여이 작업을 수행했습니다.
간단하게하기 위해 : 키패드 행 : Arduino 핀 4,5,6 및 7 사용 (AVR 핀 PD4, PD5, PD6 및 PD7) 키패드 열 : Arduino 핀 8, 9, 10 및 11 사용 (AVR 핀 PB0, PB1, PB2 및 PB3 ) 풀업이 활성화 된 상태에서 행 핀 입력을 만듭니다. 열 핀 출력 및 출력 0을 만듭니다. 모든 행 및 열 핀에서 핀 변경 인터럽트 사용. http://playground.arduino.cc/Main/PinChangeInterrupt 키패드의 버튼을 누르면 로우 핀이 낮아집니다. 인터럽트 루틴은 행 핀을 읽고 어느 핀이 낮은지를 찾아야합니다. 상위 4 비트는 3과 1이어야합니다. uint8_t 8 비트 변수를 사용하는 경우 변수를 16 또는 (var >> 4)로 나누어 4 비트를 숫자의 하위 비트에 넣을 수 있습니다. 비트 단위 OR | 240을 사용하여 상위 4 비트를 1로 설정하고 비트 NOT ~ 작업을 수행하여 모든 비트를 반전하므로 버튼 누름이 표시된 행을 나타내는 비트 세트가 하나만 있습니다. 이 번호를 0, 1, 2 또는 3으로 저장
하십시오. 핀 구성을 전환하십시오.
풀업이 활성화 된 상태에서 열 핀 입력을 만듭니다. 행 핀 출력 및 출력 0을 만듭니다. 열 핀을 읽고 어느 핀이 낮은 지 찾으십시오. 숫자를 오른쪽으로 이동할 필요가 없다는 점을 제외하고이 값을 사용하여 유사한 조작을 수행하십시오. var ^ 240 및 ^ var 후에는 키를 누른 열을 나타내는 단일 비트가 있습니다. 원하지 않는 인터럽트가 발생할 가능성이 있으므로 포트를 재구성하기 전에 인터럽트를 비활성화하십시오. 인터럽트 루틴을 떠날 때 중복 인터럽트 처리를 방지하기 위해 인터럽트 플래그를 지워야 할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.