Come possono essere collegati 16 pulsanti con solo 8 fili?


9

Ecco il prodotto Capisco l'idea: questi 16 pulsanti usano una matrice 4x4. 4 linee per le file, 4 linee per le colonne e abbiamo 8 cavi.

inserisci qui la descrizione dell'immagine

Ma:

  1. Come può funzionare senza multiplexer?

  2. Questo può rilevare pressioni accurate di più pulsanti? Anche se i pulsanti utilizzano la stessa riga o la stessa colonna? Esempio: pulsanti in posizione (2,2) (2,3), (3,2) e (3,3) premuti contemporaneamente.

  3. Come funziona?


7
Questa è una conoscenza comune che troverai con una ricerca di Google per il "multiplexing della tastiera" o simili. Non l'hai provato prima, prima di pubblicarlo?
TonyM

3
@TonyM Ovviamente ho fatto molte ricerche e ho persino ordinato alcuni chip multiplexer 74HC164 che sono arrivati ​​a casa pochi giorni fa. Stavo per collegare tutto con questo chip multiplexer quando l'ho trovato. Quindi mi chiedevo "come può funzionare senza multiplexer"?
Basj

1
Il dispositivo a sinistra deve avere un codice di multiplexing al suo interno
Marcelo Espinoza Vargas

3
@TonyM Grazie per avermi indicato questo. Puoi collegare il PDF invece di creare un mistero;)? Forse ho cercato con parole chiave diverse da tastiera, ecc. E probabilmente non ho trovato lo stesso.
Basj

1
@Basj: avere più stampanti non è un problema. Scansionate tutte e quattro le righe una dopo l'altra. Se viene trovato un pulsante premuto nella riga 1, lo noti. Quando si tratta della linea 3, trovi un altro pulsante premuto lì, lo noti anche tu. Alla fine, ottieni entrambi i pulsanti. Finché sei in grado di scansionare in modo significativamente più veloce di quanto le persone possano premere i pulsanti, non ti perderai.
Gábor

Risposte:


24
Come può funzionare senza multiplexer?

Non La tastiera sembra avere solo interruttori, con forse alcuni diodi che non possiamo vedere. Tuttavia, la scheda di sinistra sembra avere un processore. Quasi certamente, il multiplexing viene eseguito nel firmware.

L'algoritmo multiplexing funziona in questo modo:

  1. Guida una fila in alto, le altre in basso.

  2. Abilita pulldown passivi sulle linee di colonna.

  3. Vedi quali linee di colonna sono alte. Vengono premuti i pulsanti alle intersezioni di quelle linee di colonna con una riga di riga asserita. Gli altri pulsanti su quella riga vengono rilasciati.

  4. Ripetere il passaggio 1, affermando la riga successiva in sequenza.

Il processo di cui sopra viene ripetuto abbastanza velocemente in modo che tutti i pulsanti vengano controllati entro un tempo che risulta ancora istantaneo per un osservatore umano. Il limite umano di "istantaneo" in questo contesto è di circa 50 ms. Anche un microcontrollore di fascia bassa può scansionare una tastiera 4x4 in un tempo molto inferiore.

Questo può rilevare pressioni accurate di più pulsanti?

Probabilmente sì. Un modo è mettere un diodo in serie con ciascun pulsante. Quelle potrebbero essere sul lato inferiore della tavola che mostri. Con i diodi, l'algoritmo sopra descritto funziona.

Un altro modo è quello di mettere i resistori in serie con le linee e misurare la loro tensione analogica. Anche con più pulsanti che mettono in cortocircuito più righe / colonne, puoi eventualmente capire quali pulsanti vengono premuti. Ciò richiede ingressi A / D nel micro, non solo ingressi digitali come quando vengono utilizzati i diodi.


1
Grazie. Che dire di più macchine da stampa contemporaneamente? Nota: la scheda di sinistra è un RaspberryPi.
Basj

1
@Hayman perché è così? Puoi fare un esempio? Perché (1,2), (2,2) e (3,3) sono premuti allo stesso tempo un problema quando non c'è diodo? Forse avresti un piccolo schema? Dato che questo punto è davvero cruciale, forse vale la pena per una risposta dedicata @Hayman?
Basj

8
+1 per "la scheda di sinistra sembra avere un processore". Mi è piaciuto molto.
Enric Blanco,

3
@Basj è ovvio se ci giochi. Ogni volta che premi un pulsante, stai collegando una riga a una colonna. Ogni volta che una riga e una colonna sono collegate, il tasto all'intersezione si registra come premuto. Ma se vengono premuti almeno 3 tasti, una riga e una colonna possono essere collegate indirettamente .
Hobbs

2
@Basj Dai un'occhiata a questa foto . Le linee rosse indicano un livello logico alto. Se tieni premuti i 3 pulsanti indicati con una 'x' puoi rintracciarli e vedere il percorso in cui fluirà il segnale. Innanzitutto viene selezionata la riga 1 ed è impostata su alta, premendo il pulsante 1,1 questo rende alta la prima colonna. Premendo il pulsante 1,2 abbiamo ora aumentato la riga 2. Ora se premiamo qualsiasi altro pulsante sulla riga 2, aumenteremo un'altra colonna. Il problema è che il μC è stupido, sa che imposta la riga 1 alta e vede un valore alto nella colonna 3, quindi pensa che il pulsante 1,3 sia alto
Doodle

9

Senza diodi ... otterrai rettangoli fantasma.

Ad esempio nel tuo esempio (2,2) (2,3), (3,2) e (3,3); hai scelto un esempio ironico scegliendo un rettangolo. Se si premono effettivamente tutti e quattro, funzionerà. Ma se si preme alcun tre angoli del rettangolo, sarà anche il quarto angolo appaiono essere premuto, anche se non lo è.

Quella tastiera è chiaramente intesa per l'inserimento dei dati della tastiera, in cui la convenzione dell'utente è una pressione di un tasto alla volta. Notate che non ci sono tasti "maiusc" sulla tastiera per l'immissione di una carta di credito, ad esempio.

Tuttavia, se si imposta S1 come tasto Maiusc e S3 un tasto Maiusc in modo tale che gli utenti possano ragionevolmente tenere entrambi premuti mentre si preme anche S13, anche S15 sembrerebbe essere premuto.


1
In effetti, la maggior parte delle tastiere per l'immissione dei dati non è progettata per avere più di 2 tasti alla volta, quindi non c'è problema. Le tastiere musicali sono un'altra storia, poiché molti tasti possono essere premuti contemporaneamente. La maggior parte di essi ha diodi o cablaggi indipendenti per ciascuna chiave. Ma ho trovato una tastiera musicale in un negozio di seconda mano (al prezzo di 9 euro) che non aveva alcun adattamento appropriato per più tasti premuti alla volta, con risultati imprevedibili e fastidiosi!
Level River St

Gli interruttori a chiave potrebbero essere di un tipo che ha un diodo incorporato o potrebbero esserci dei diodi nascosti sotto di essi.
rackandboneman

1

Ecco come farlo senza scansione continua:

  • Imposta tutti i driver su alto
  • Abilita pulldown passivi sulle linee di ricezione
  • Imposta l'interruzione cambio pin per rilevare una delle linee che vanno in alto (o cambiano di livello)
  • Quando ciò accade, abilitare la scansione della tastiera, ad esempio ogni 10 ms
  • Scansione normale ed elaborazione dei tasti premuti
  • Dopo un timeout senza eventi, interrompere la scansione e riavviare al primo punto elenco

0

L'ho fatto con Assembly Language su microcontrollori Atmel AVR nudi.
Per semplicità: righe della tastiera: utilizzare i pin Arduino 4,5,6 e 7 (pin AVR PD4, PD5, PD6 e PD7) Colonne tastiera: utilizzare i pin Arduino 8, 9, 10 e 11 (pin AVR PB0, PB1, PB2 e PB3 ) Effettua gli input dei pin Row con i pull-up abilitati. Esegui l'output dei pin della colonna e azzera loro l'output. Abilita interruzione cambio pin su tutti i pin di riga e colonna. http://playground.arduino.cc/Main/PinChangeInterrupt Premendo un pulsante sul tastierino si abbassa un perno di riga. La routine di interrupt deve leggere i pin della riga e trovare quale pin è basso. I 4 bit superiori dovrebbero essere tre e uno zero. Se usi una variabile uint8_t a 8 bit, puoi dividerla per 16 o (var >> 4) per inserire i 4 bit nei bit inferiori del numero. È possibile utilizzare un OR bit a bit | operazione con 240 per impostare i 4 bit superiori su 1s e un'operazione NOT ~ bit per invertire tutti i bit in modo da avere solo un bit impostato che rappresenta la riga in cui si trovava la pressione del pulsante. Memorizza questo numero come 0, 1, 2 o 3.
Cambia la configurazione dei pin:
Effettua gli input dei pin della colonna con i pull-up abilitati. Esegui l'output dei pin di riga e genera zero. Leggi i pin della colonna e trova quale pin è basso. Esegui una manipolazione simile con questo valore, tranne per il fatto che non è necessario spostare il numero verso destra. Dopo var ^ 240 e ^ var hai un solo bit per rappresentare la colonna su cui era premuto il tasto. Ricordarsi di disabilitare gli interrupt prima di riconfigurare le porte in quanto probabilmente causerà interruzioni indesiderate. Potrebbe essere necessario cancellare i flag di interruzione quando si esce dalla routine di interruzione per impedire la duplicazione della gestione degli interrupt.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.