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.
Mas:
Como isso pode funcionar sem nenhum multiplexador?
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.
Como funciona?
Respostas:
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:
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.
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.
fonte
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.
fonte
Veja como fazer isso sem varredura contínua:
fonte
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.
fonte