Comment connecter 16 boutons avec seulement 8 fils?

9

Voici le produit. Je comprends l'idée: ces 16 boutons utilisent une matrice 4x4. 4 lignes pour les lignes, 4 lignes pour les colonnes, et nous avons 8 câbles.

entrez la description de l'image ici

Mais:

  1. Comment cela peut-il fonctionner sans multiplexeur?

  2. Cela peut-il détecter avec précision les pressions sur plusieurs boutons? Même si les boutons utilisent la même ligne ou la même colonne? Exemple: boutons en position (2,2) (2,3), (3,2) et (3,3) enfoncés en même temps.

  3. Comment ça marche?

Basj
la source
7
C'est une connaissance courante, comme vous le trouverez avec une recherche Google pour le «multiplexage du clavier» ou similaire. Vous n'avez pas essayé ça avant de poster ça?
TonyM
3
@TonyM Bien sûr, j'ai fait de nombreuses recherches et j'ai même commandé quelques puces de multiplexeur 74HC164 qui sont arrivées à la maison il y a quelques jours. J'étais sur le point de tout câbler avec cette puce multiplexeur quand j'ai trouvé cela. Alors je me demandais "comment cela peut-il fonctionner sans multiplexeur"?
Basj
1
L'appareil de gauche doit avoir un code de multiplexage à l'intérieur
Marcelo Espinoza Vargas
3
@TonyM Merci de me l'avoir signalé. Pouvez-vous lier le PDF au lieu de faire un mystère;)? Peut-être que j'ai cherché avec d'autres mots clés que le clavier, etc. et je n'ai probablement pas trouvé le même.
Basj
1
@Basj: avoir plusieurs presses n'est pas un problème. Vous scannez les quatre lignes l'une après l'autre. Si un bouton est trouvé enfoncé à la ligne 1, vous le notez. En ce qui concerne la ligne 3, vous trouvez un autre bouton enfoncé, vous le notez aussi. En fin de compte, vous obtenez les deux boutons. Tant que vous êtes en mesure de numériser beaucoup plus rapidement que les gens ne peuvent appuyer sur les boutons, vous ne le manquerez pas.
Gábor

Réponses:

24
Comment cela peut-il fonctionner sans multiplexeur?

Ce n'est pas le cas. La carte du clavier semble avoir seulement des commutateurs, avec peut-être quelques diodes que nous ne pouvons pas voir. Cependant, la carte de gauche semble avoir un processeur. Le multiplexage se fait presque certainement dans le micrologiciel.

L'algorithme de multiplexage fonctionne comme ceci:

  1. Conduisez une rangée de haut, les autres bas.

  2. Activez les déroulements passifs sur les lignes de colonne.

  3. Voir quelles lignes de colonne sont hautes. Les boutons situés aux intersections de ces lignes de colonne avec la ligne de ligne affirmée sont enfoncés. Les autres boutons de cette ligne sont libérés.

  4. Répétez à l'étape 1, en affirmant la ligne suivante dans l'ordre.

Le processus ci-dessus est répété assez rapidement pour que tous les boutons soient vérifiés dans un délai qui semble toujours instantané pour un observateur humain. La limite humaine de «instantané» dans ce contexte est d'environ 50 ms. Même un microcontrôleur bas de gamme peut scanner un clavier 4x4 en beaucoup moins de temps que cela.

Cela peut-il détecter avec précision les pressions sur plusieurs boutons?

Probablement oui. Une façon consiste à mettre une diode en série avec chaque bouton. Celles-ci pourraient être sur le côté inférieur du tableau que vous montrez. Avec les diodes, l'algorithme décrit ci-dessus fonctionne juste.

Une autre façon consiste à mettre les résistances en série avec les lignes et à mesurer leur tension analogique. Même lorsque plusieurs boutons raccourcissent plusieurs lignes / colonnes, vous pouvez éventuellement déterminer les boutons sur lesquels vous appuyez. Cela nécessite des entrées A / N dans le micro, pas seulement des entrées numériques comme lorsque des diodes sont utilisées.

Olin Lathrop
la source
1
Merci. Qu'en est-il des presses multiples en même temps? Remarque: le panneau de gauche est un RaspberryPi.
Basj
1
@Hayman pourquoi en est-il ainsi? Pouvez-vous donner un exemple? Pourquoi (1,2), (2,2) et (3,3) sont-ils pressés en même temps un problème quand il n'y a pas de diode? Peut-être auriez-vous un petit schéma? Comme ce point est vraiment crucial, cela vaut peut-être la peine pour une réponse dédiée @Hayman?
Basj
8
+1 pour "la carte de gauche semble avoir un processeur". J'ai adoré ça.
Enric Blanco
3
@Basj c'est évident si vous jouez avec. Chaque fois que vous appuyez sur un bouton, vous connectez une ligne à une colonne. Chaque fois qu'une ligne et une colonne sont connectées, la touche à l'intersection s'enregistre comme pressée. Mais si au moins 3 touches sont enfoncées, une ligne et une colonne peuvent être connectées indirectement .
Hobbs
2
@Basj Jetez un oeil à cette image . Les lignes rouges indiquent un niveau logique élevé. Si vous maintenez les 3 boutons indiqués par un «x», vous pouvez les tracer et voir le chemin dans lequel le signal circulera. Tout d'abord, la ligne 1 est sélectionnée et placée en haut, en appuyant sur le bouton 1,1, cela fait que la première colonne est haute. En appuyant sur le bouton 1,2, nous avons maintenant fait la ligne 2 haute. Maintenant, si nous appuyons sur un autre bouton de la ligne 2, nous ferons une autre colonne haute. Le problème est que le μC est stupide, il sait qu'il place la ligne 1 haut et il voit un haut sur la colonne 3, donc il pense que le bouton 1,3 est haut
Doodle
9

Sans diodes ... vous obtiendrez des rectangles fantômes.

Par exemple dans votre exemple (2,2) (2,3), (3,2) et (3,3); vous avez choisi un exemple ironique en choisissant un rectangle. Si vous réellement appuyez sur les quatre, cela fonctionnera. Mais si vous appuyez sur les trois coins du rectangle, le quatrième coin semble également être pressé, même si ce n'est pas le cas.

Ce clavier est clairement destiné à la saisie de données au clavier, où la convention utilisateur est une touche à la fois. Vous remarquez qu'il n'y a pas de touches «shift» sur un clavier de saisie de carte de crédit de station-service, par exemple.

Cependant, si vous avez fait de S1 une touche Maj, et S3 une touche Alt-Maj de sorte que les utilisateurs puissent raisonnablement maintenir les deux tout en appuyant également sur S13, alors S15 semble également être enfoncé.

Harper - Rétablir Monica
la source
1
En effet, la plupart des claviers de saisie de données ne sont pas destinés à avoir plus de 2 touches enfoncées à la fois, il n'y a donc pas de problème. Les claviers musicaux sont une autre histoire, car de nombreuses touches peuvent être enfoncées à la fois. La plupart d'entre eux ont des diodes ou un câblage indépendant pour chaque touche. Mais j'ai trouvé un clavier musical dans une boutique d'occasion (au prix de 9 euros) qui n'avait pas d'adaptation appropriée pour plusieurs touches enfoncées à la fois, avec des résultats imprévisibles et ennuyeux!
Level River St
Les interrupteurs à clé pourraient être d'un type qui a une diode intégrée, ou il pourrait y avoir des diodes cachées en dessous.
rackandboneman
1

Voici comment procéder sans scan continu:

  • Réglez tous les pilotes sur élevé
  • Activer les déroulements passifs sur les lignes de réception
  • Réglez l'interruption de changement de broche pour détecter l'une des lignes qui monte (ou change de niveau)
  • Dans ce cas, activez le balayage du clavier, disons toutes les 10 ms
  • Numérisez normalement et appuyez sur les touches
  • Après un délai sans événements, arrêtez l'analyse et redémarrez au premier point
peufeu
la source
0

Je l'ai fait avec Assembly Language sur des microcontrôleurs Atmel AVR nus.
Pour plus de simplicité: Rangées de clavier: utilisez les broches Arduino 4, 5, 6 et 7 (broches AVR PD4, PD5, PD6 et PD7) Colonnes du clavier: utilisez les broches Arduino 8, 9, 10 et 11 (broches AVR PB0, PB1, PB2 et PB3 ) Effectuez des entrées de broches de ligne avec des tractions activées. Créez des broches de colonne et émettez-leur des zéros. Activez les interruptions de changement de broche sur toutes les broches de ligne et de colonne. http://playground.arduino.cc/Main/PinChangeInterrupt Appuyez sur un bouton du clavier pour tirer une broche de rangée vers le bas. La routine d'interruption doit lire les broches de la ligne et trouver la broche la plus basse. Les 4 bits supérieurs doivent être trois uns et un zéro. Si vous utilisez une variable uint8_t 8 bits, vous pouvez la diviser par 16 ou (var >> 4) pour mettre les 4 bits dans les bits inférieurs du nombre. Vous pouvez utiliser un OR au niveau du bit | opération avec 240 pour régler les 4 bits supérieurs à 1 et une opération NOT ~ au niveau du bit pour inverser tous les bits afin que vous n'ayez qu'un seul jeu de bits représentant la ligne sur laquelle la touche a été activée. Enregistrez ce nombre sous la forme 0, 1, 2 ou 3.
Changez la configuration des broches:
Faire des entrées de broches de colonne avec pull-ups activés. Créez des épingles de ligne et émettez-leur des zéros. Lisez les broches de la colonne et trouvez quelle broche est basse. Faites une manipulation similaire avec cette valeur, sauf que vous n'avez pas à déplacer le nombre vers la droite. Après les var ^ 240 et ^ var, vous avez un seul bit pour représenter la colonne sur laquelle la touche était enfoncée. N'oubliez pas de désactiver les interruptions avant de reconfigurer les ports car cela déclenchera probablement des interruptions indésirables. Vous devrez peut-être effacer les indicateurs d'interruption lorsque vous quittez la routine d'interruption pour éviter la gestion des doublons d'interruption.

Darrell Harriman
la source