Como 16 botões podem ser conectados com apenas 8 fios?

9

Aqui está o produto. Entendo a ideia: esses 16 botões usam uma matriz 4x4. 4 linhas para linhas, 4 linhas para colunas e temos 8 cabos.

insira a descrição da imagem aqui

Mas:

  1. Como isso pode funcionar sem nenhum multiplexador?

  2. Isso pode detectar com precisão o pressionamento de vários botões? Mesmo que os botões usem a mesma linha ou a mesma coluna? Exemplo: botões na posição (2,2) (2,3), (3,2) e (3,3) pressionados ao mesmo tempo.

  3. Como funciona?

Basj
fonte
7
Esse é um conhecimento comum, como você encontrará em uma pesquisa no Google por "multiplexação do teclado" ou algo semelhante. Você não tentou isso primeiro, antes de postar isso?
7777 TonyM
3
@TonyM É claro que fiz muitas pesquisas e até pedi alguns chips multiplexadores 74HC164 que chegaram em casa há alguns dias. Eu estava prestes a conectar tudo com esse chip multiplexador quando o encontrei. Então eu queria saber "como isso pode funcionar sem qualquer multiplexador"?
Basj
11
O dispositivo do lado esquerdo deve ter um código de multiplexação dentro dele
Marcelo Espinoza Vargas
3
@ TonyM Obrigado por me indicar isso. Você pode vincular o PDF em vez de criar um mistério;)? Talvez eu tenha pesquisado com outras palavras-chave que não o teclado etc. e provavelmente não encontrei o mesmo.
Basj
11
@ Basj: ter várias prensas não é um problema. Você digitaliza todas as quatro linhas uma após a outra. Se um botão for encontrado pressionado na linha 1, observe-o. Quando se trata da linha 3, você encontra outro botão pressionado lá e também nota. No final, você recebe os dois botões. Contanto que você consiga digitalizar significativamente mais rápido do que as pessoas podem pressionar os botões, você não perderá.
Gábor

Respostas:

24
Como isso pode funcionar sem nenhum multiplexador?

Não faz. O teclado parece ter apenas interruptores, talvez com alguns diodos que não podemos ver. No entanto, a placa esquerda parece ter um processador. Quase certamente, a multiplexação está sendo feita no firmware.

O algoritmo de multiplexação funciona mais ou menos assim:

  1. Dirija uma linha alta, as outras baixas.

  2. Ative pulldowns passivos nas linhas da coluna.

  3. Veja quais linhas da coluna estão altas. Os botões nas interseções dessas linhas de coluna com a linha de linha declarada são pressionados. Os outros botões nessa linha são liberados.

  4. Repita novamente para a etapa um, afirmando a próxima linha em sequência.

O processo acima é repetido com rapidez suficiente para que todos os botões sejam verificados dentro de um tempo que ainda pareça instantâneo para um observador humano. O limite humano de "instantâneo" neste contexto é de cerca de 50 ms. Mesmo um microcontrolador de gama baixa pode digitalizar um teclado 4x4 em muito menos tempo que isso.

Isso pode detectar com precisão o pressionamento de vários botões?

Provavelmente sim. Uma maneira é colocar um diodo em série com cada botão. Essas podem estar na parte inferior do quadro que você mostra. Com os diodos, o algoritmo descrito acima simplesmente funciona.

Outra maneira é colocar resistores em série com linhas e medir sua tensão analógica. Mesmo com vários botões encurtando várias linhas de linha / coluna, você pode descobrir quais botões foram pressionados. Isso requer entradas A / D no micro, não apenas entradas digitais como quando os diodos são usados.

Olin Lathrop
fonte
11
Obrigado. E quanto a várias impressoras ao mesmo tempo? Nota: o painel esquerdo é um RaspberryPi.
Basj
11
@ Hayman, por que é assim? Você pode dar um exemplo? Por que (1,2), (2,2) e (3,3) pressionam ao mesmo tempo um problema quando não há diodo? Talvez você tenha um pequeno esquema? Como esse ponto é realmente crucial, talvez valha a pena uma resposta dedicada @Hayman?
Basj
8
+1 para "a placa esquerda parece ter um processador". Adorei isso.
21817 Enric Blanco
3
@ Basj é óbvio se você jogar com ele. Sempre que você pressiona um botão, você está conectando uma linha a uma coluna. Sempre que uma linha e uma coluna são conectadas, a tecla no cruzamento é registrada conforme pressionado. Mas se pelo menos três teclas forem pressionadas, uma linha e uma coluna poderão ser conectadas indiretamente .
hobbs
2
@Basj Dê uma olhada nesta foto . As linhas vermelhas indicam um nível lógico alto. Se você pressionar os 3 botões indicados com um 'x', poderá rastreá-los e ver o caminho no qual o sinal fluirá. Em primeiro lugar, a linha 1 é selecionada e definida como alta, pressionando o botão 1,1 para aumentar a primeira coluna. Ao pressionar o botão 1,2, chegamos à linha 2 alta. Agora, se pressionarmos qualquer outro botão na linha 2, criaremos outra coluna alta. O problema com isto é o uC é burro, ele sabe que conjunto de linhas 1 alto e ele vê uma alta na coluna 3, portanto, pensa botão 1,3 é alto
Doodle
9

Sem diodos ... você obterá retângulos fantasmas.

Por exemplo, no seu exemplo (2,2) (2,3), (3,2) e (3,3); você escolheu um exemplo irônico escolhendo um retângulo. Se você realmente pressionar todos os quatro, funcionará. Mas se você pressionar três cantos do retângulo, o quarto canto também parecerá ser pressionado, mesmo que não seja.

Esse teclado destina-se claramente à entrada de dados do teclado, onde a convenção do usuário é um pressionamento de tecla por vez. Você percebe que não há teclas "shift" no teclado de entrada de um cartão de crédito de posto de gasolina, por exemplo.

No entanto, se você transformou S1 em uma tecla Shift e S3 em uma tecla Alt-Shift, de modo que os usuários possam razoavelmente segurar as duas teclas enquanto pressiona S13, então S15 também parece ser pressionado.

Harper - Restabelecer Monica
fonte
11
De fato, a maioria dos teclados de entrada de dados não se destina a pressionar mais de duas teclas por vez, portanto não há problema. Os teclados musicais são outra história, pois muitas teclas podem ser pressionadas ao mesmo tempo. A maioria deles possui diodos ou fiação independente para cada tecla. Mas encontrei um teclado musical em uma loja de segunda mão (ao preço de 9 euros) que não tinha nenhuma adaptação apropriada para várias teclas pressionadas ao mesmo tempo, com resultados imprevisíveis e irritantes!
Level River St
Os interruptores de chave podem ser de um tipo que possui um diodo interno ou pode haver diodos ocultos embaixo deles.
rackandboneman
1

Veja como fazer isso sem varredura contínua:

  • Defina todos os drivers como altos
  • Ativar pulldowns passivos nas linhas de recebimento
  • Defina interrupção de troca de pinos para detectar uma das linhas que está alta (ou que muda de nível)
  • Quando isso acontecer, ative a verificação do teclado, digamos a cada 10 ms
  • Digitalize normalmente e processe as teclas pressionadas
  • Após um tempo limite sem eventos, pare a varredura e reinicie no primeiro marcador
peufeu
fonte
0

Fiz isso com a linguagem Assembly em microcontroladores nus Atmel AVR.
Para simplificar: Linhas do teclado: use os pinos do Arduino 4,5,6 e 7 (pinos do AVR PD4, PD5, PD6 e PD7) Colunas do teclado: use os pinos do Arduino 8, 9, 10 e 11 (pinos do AVR PB0, PB1, PB2 e PB3 ) Faça entradas de pinos de linha com pull-ups ativados. Faça os pinos da coluna zerarem e a saída zerar para eles. Ativar interrupção de alteração de pinos em todos os pinos de linha e coluna. http://playground.arduino.cc/Main/PinChangeInterrupt Pressionar um botão no teclado puxará um pino de linha para baixo. A rotina de interrupção precisa ler os pinos da linha e descobrir qual está baixo. Os 4 bits superiores devem ser três e um zero. Se você usar uma variável uint8_t de 8 bits, poderá dividi-la por 16 ou (var >> 4) para colocar os 4 bits nos bits inferiores do número. Você pode usar um OR bit a bit operação com 240 para definir os 4 bits superiores em 1s e uma operação NOT ~ bit a bit para inverter todos os bits, para que você tenha apenas um bit definido representando a linha em que o botão estava pressionado. Armazene esse número como 0, 1, 2 ou 3.
Alterne a configuração dos pinos:
Torne as entradas dos pinos da coluna com os pull-ups ativados. Tornar os pinos da linha zerados na saída e na saída. Leia os pinos da coluna e encontre qual é o pino baixo. Faça uma manipulação semelhante com esse valor, exceto que você não precisa mudar o número para a direita. Após as var ^ 240 e ^ var, você tem um único bit para representar a coluna em que a tecla foi pressionada. Lembre-se de desativar as interrupções antes de reconfigurar as portas, pois provavelmente disparará interrupções indesejadas. Pode ser necessário limpar os sinalizadores de interrupção ao sair da rotina de interrupção para evitar o tratamento duplicado da interrupção.

Darrell Harriman
fonte