Vraag:
Hoe kunnen 16 knoppen worden aangesloten met slechts 8 draden?
Basj
2017-03-07 20:05:05 UTC
view on stackexchange narkive permalink

Hier is het product.Ik begrijp het idee: deze 16 knoppen gebruiken een 4x4-matrix.4 regels voor rijen, 4 regels voor kolommen en we hebben 8 kabels.

enter image description here

Maar:

  1. Hoe kan dit werken zonder een multiplexer?

  2. C Kan dit het indrukken van meerdere knoppen nauwkeurig detecteren? Zelfs als knoppen dezelfde rij of dezelfde kolom gebruiken?Voorbeeld: knoppen op positie (2,2) (2,3), (3,2) en (3,3) tegelijkertijd ingedrukt.

  3. Hoe werkt het?

Dit is algemeen bekend, zoals u zult vinden bij een Google-zoekopdracht naar 'toetsenbordmultiplexing' of iets dergelijks.Heb je dat niet eerst geprobeerd voordat je dit plaatste?
@TonyM Natuurlijk heb ik veel zoekopdrachten gedaan en heb ik zelfs een paar multiplexer-chips 74HC164 besteld die een paar dagen geleden thuiskwamen.Ik stond op het punt alles te bedraden met deze multiplexer-chip toen ik dit vond.Toen vroeg ik me af "hoe kan dit werken zonder een multiplexer"?
Het apparaat aan de linkerkant moet een code van multiplexing bevatten
@MarceloEspinozaVargas Ok.Wat vind je dan van vraag 2?
Het hangt af van de feitelijke multiplexcode, als het zo simpel is als het verzenden van + V over elke rij en het gebruik van elke kolom als invoer, dan zal het het niet kunnen doen, maar als het rond elke rij en kolom schakelt (alle 8pinnen als invoer en uitvoer) en kan in het geheugen vasthouden welke knop wordt ingedrukt, het kan mogelijk meerdere knoppen detecteren die tegelijkertijd worden ingedrukt
Ik heb die zoekopdracht uitgevoerd en het tweede resultaat was een pdf met een gedetailleerd antwoord op je Q1, Q3 en een deel van Q2.U kunt mijn punt begrijpen, nietwaar - dit is al gedocumenteerd en beter dan dat we het hier zullen uitleggen.Neem een kijkje, u krijgt gedetailleerde antwoorden.
@TonyM Bedankt dat je me dit hebt gewezen.Kun je de pdf linken in plaats van een mysterie te maken;)?Misschien zocht ik met andere trefwoorden dan het toetsenbord, enz. En ik heb waarschijnlijk niet hetzelfde gevonden.
Zeker :-) www.emc.com.tw/eng/database/Sa2/Gp/An/Gf/AN-009.pdf
Het spijt me @TonyM, maar het is waarschijnlijk gemakkelijk te lezen voor iemand die het al weet, maar voor mij is het zien van assembler en `MOV A, @0X11; uitschakelen WDT` niet bijzonder eenvoudig om te begrijpen hoe een toetsenbord met meerdere drukken opdezelfde tijd werkt ...
@Basj: met meerdere persen is geen probleem.U scant alle vier de regels achter elkaar.Als een knop wordt ingedrukt in regel 1, noteert u deze.Als het op regel 3 aankomt, vind je daar een andere knop ingedrukt, die je ook opmerkt.Uiteindelijk krijg je beide knoppen.Zolang je aanzienlijk sneller kunt scannen dan mensen op knoppen kunnen drukken, mis je het niet.
http://www.cs.ucr.edu/~ehwang/courses/cs120b/04summer2/labs/lab9.html
https://deskthority.net/wiki/Rollover,_blocking_and_ghosting
Bekijk deze animatie: https://upload.wikimedia.org/wikipedia/commons/f/f2/FunctionalCircuitDiagramOfKeyboardNumPadScanningProcedure-small.gif (let op: het omschakelen in rij en kolom is geen hardware-iets. Je code gaat "OK, zet nu pin1 op hoog, lees nu wat de staat van pin5 is "enz.)
@MarceloEspinozaVargas het apparaat aan de linkerkant is een Raspberry Pi (model 3).Die GPIO-pinnen zijn snel en eenvoudig in code configureerbaar.Het lijkt erop dat alle pinnen van het toetsenbord zijn verbonden met GPIO's (niets met GND), maar de gemarkeerde foto is niet zo duidelijk
De handleiding van uw product leert hoe u het moet demultiplexen: http://www.gotronic.fr/pj2-sbc-buttonmatrix-fr-1461.pdf
Vier antwoorden:
Olin Lathrop
2017-03-07 20:22:02 UTC
view on stackexchange narkive permalink
Hoe kan dit werken zonder enige multiplexer?

Dat hoeft niet. Het toetsenbord lijkt alleen schakelaars te hebben, met misschien enkele diodes die we niet kunnen zien. Het linkerbord ziet er echter uit alsof er een processor op zit. Vrijwel zeker wordt multiplexing gedaan in firmware.

Het multiplex-algoritme werkt ongeveer als volgt:

  1. Rij een rij hoog, de andere laag.

  2. Schakel passieve pulldowns in op de kolomregels.

  3. Kijk welke kolomregels hoog zijn. De knoppen op de snijpunten van die kolomregels met de ene beweerde rijlijn worden ingedrukt. De andere knoppen op die rij worden losgelaten.

  4. Herhaal terug naar stap één en bevestig de volgende rij op volgorde.

Het bovenstaande proces wordt snel genoeg herhaald, zodat alle knoppen worden gecontroleerd binnen een tijd die voor een menselijke waarnemer nog steeds onmiddellijk aanvoelt. De menselijke limiet van "onmiddellijk" in deze context is ongeveer 50 ms. Zelfs een low-end microcontroller kan een 4x4-toetsenbord in veel minder tijd scannen.

Kan dit nauwkeurig het indrukken van meerdere knoppen detecteren?

Waarschijnlijk wel. Een manier is om met elke knop een diode in serie te zetten. Die kunnen aan de onderkant van het bord staan ​​dat je laat zien. Met de diodes werkt het hierboven beschreven algoritme gewoon.

Een andere manier is door weerstanden in serie te zetten met lijnen en hun analoge spanning te meten. Zelfs met meerdere knoppen die meerdere rij- / kolomregels aan elkaar kortsluiten, kun je er uiteindelijk achter komen welke knoppen worden ingedrukt. Dit vereist A / D-ingangen in de micro, niet alleen digitale ingangen zoals wanneer diodes worden gebruikt.

Bedankt.Hoe zit het dan met meerdere persen tegelijk?Let op: het linker bord is een Raspberry Pi.
@Basj Als je maar 2 knoppen tegelijk gaat indrukken, gaat het goed, het is alleen als je 2 of meer knoppen in dezelfde kolom indrukt en een andere knop in een andere kolom waar je diodes nodig hebt
@Hayman waarom is het zo?Kunt u een voorbeeld geven?Waarom is (1,2), (2,2) en (3,3) tegelijkertijd een probleem als er geen diode is?Misschien heb je een klein schema?Aangezien dit punt echt cruciaal is, is het misschien de moeite waard voor een speciaal antwoord @Hayman?
+1 voor "het linkerbord ziet eruit alsof er een processor op zit".Ik vond dat geweldig.
Ik heb ook gehoord dat drie niet af en toe werken met dit soort multiplexen.Het registreert een vierde toets als ingedrukt (een spookpers).Er is een naam voor dit algoritme, en ik kan het me niet herinneren dat het eruitzag ...
@Basj het is duidelijk of je ermee speelt.Elke keer dat u op een knop drukt, verbindt u een rij met een kolom.Telkens wanneer een rij en een kolom zijn verbonden, wordt de toets op het kruispunt geregistreerd als ingedrukt.Maar als er minstens 3 toetsen worden ingedrukt, kunnen een rij en een kolom * indirect * worden verbonden.
@Basj Bekijk [deze foto] (https://i.stack.imgur.com/VCYa0.png).De rode lijnen geven een logisch hoog niveau aan.Als je de 3 knoppen ingedrukt houdt die zijn aangegeven met een 'x', kun je ze traceren en het pad zien waarin het signaal zal stromen.Eerst wordt rij 1 geselecteerd en hoog gezet, door op knop 1,1 te drukken wordt de eerste kolom hoog.Door op knop 1,2 te drukken hebben we nu rij 2 hoog gemaakt.Als we nu op een andere knop in rij 2 drukken, zullen we een andere kolom hoog maken.Het probleem hiermee is dat de μC dom is, hij weet dat hij rij 1 hoog heeft ingesteld en hij ziet een hoogte in kolom 3, daarom denkt hij dat knop 1,3 hoog is
@Basj Zonder diodes, als je rij 1 met kolom 1 en rij 1 met kolom 2 verbindt, heb je de kolommen 1 en 2 met elkaar verbonden.Nu, hoe kunt u zien of rij 2 kolom 1 is ingedrukt en niet rij 2 kolom 2?Bij diodes heb je de twee kolommen niet met elkaar verbonden omdat zo'n pad achterwaarts door één diode zou moeten gaan.
Zelfs de handleiding ervan (men kan het bereiken via de link van het product) geeft de code die wordt gebruikt om het te demultiplexen: http://www.gotronic.fr/pj2-sbc-buttonmatrix-fr-1461.pdf
Harper - Reinstate Monica
2017-03-08 00:48:10 UTC
view on stackexchange narkive permalink

Zonder diodes ... krijg je fantoomrechthoeken.

Bijvoorbeeld in uw voorbeeld (2,2) (2,3), (3,2) en (3,3);je koos een ironisch voorbeeld door een rechthoek te kiezen.Als u werkelijk alle vier indrukt, zal het werken.Maar als u op een van de drie hoeken van de rechthoek drukt, wordt de vierde hoek ook weergegeven om ingedrukt te worden, ook al is dat niet zo.

Dat toetsenbord is duidelijk bedoeld voor het invoeren van toetsenbordgegevens, waarbij de gebruikersconventie één toetsaanslag per keer is.U merkt bijvoorbeeld dat er geen "shift" -toetsen zijn op het toetsenbord van een tankstation voor creditcardinvoer.

Als je echter van S1 een shift-toets en S3 een alt-shift-toets hebt gemaakt, zodat gebruikers beide redelijkerwijs kunnen vasthouden terwijl ze ook op S13 drukken, dan lijkt het alsof S15 ook is ingedrukt.

De meeste toetsenborden voor gegevensinvoer zijn inderdaad niet bedoeld om meer dan 2 toetsen tegelijk ingedrukt te houden, dus er is geen probleem.Muzikale toetsenborden zijn een ander verhaal, aangezien er veel toetsen tegelijk kunnen worden ingedrukt.De meeste hebben diodes of onafhankelijke bedrading naar elke toets.Maar ik vond wel een muzikaal toetsenbord in een tweedehandswinkel (geprijsd op 9 euro) die geen geschikte aanpassing had voor meerdere toetsen tegelijk, met onvoorspelbare en vervelende resultaten!
De sleutelschakelaars kunnen van een type zijn met een ingebouwde diode, of er kunnen diodes onder verborgen zijn.
bobflux
2017-03-07 20:32:38 UTC
view on stackexchange narkive permalink

U kunt dit als volgt doen zonder continue scan:

  • Zet alle stuurprogramma's op hoog
  • Schakel passieve pulldowns in op ontvangende lijnen
  • Stel de pincode-onderbreking in om te detecteren dat een van de lijnen hoog gaat (of van niveau verandert)
  • Als dit gebeurt, schakel dan toetsenbordscan in, zeg elke 10 ms
  • Normaal scannen en toetsaanslagen verwerken
  • Na een time-out zonder gebeurtenissen, stopt u met scannen en start u opnieuw bij het eerste opsommingsteken
Darrell Harriman
2017-03-08 12:20:24 UTC
view on stackexchange narkive permalink

Ik heb dit gedaan met Assembly Language op kale Atmel AVR-microcontrollers.
Voor de eenvoud: Toetsenbordrijen: gebruik Arduino-pinnen 4,5,6 en 7 (AVR-pinnen PD4, PD5, PD6 en PD7) Toetsenblokkolommen: gebruik Arduino-pinnen 8, 9, 10 en 11 (AVR-pinnen PB0, PB1, PB2 en PB3) Maak invoer van rijpennen met ingeschakelde pull-ups. Maak kolompinnen Uitvoer en uitvoer nullen naar hen. Schakel Pin Change Interrupts in op alle rij- en kolompinnen. http://playground.arduino.cc/Main/PinChangeInterrupt Door op een knop op het toetsenbord te drukken, wordt een rijpen naar beneden getrokken. De interruptroutine moet de rij-pinnen lezen en bepalen welke pin laag is. De bovenste 4 bits moeten drie enen zijn en één nul. Als je een uint8_t 8 bit variabele gebruikt, kun je deze delen door 16 of (var >> 4) om de 4 bits in de onderste bits van het getal te plaatsen. U kunt een bitsgewijze OR | gebruiken bewerking met 240 om de bovenste 4 bits in te stellen op 1s en een bitsgewijze NOT ~ -bewerking om alle bits om te keren, zodat u slechts één bit hebt die de rij vertegenwoordigt waarop de knop was ingedrukt. Sla dit nummer op als 0, 1, 2 of 3.
Verander de pinconfiguratie:
Maak invoer van kolompinnen met ingeschakelde pull-ups. Maak rijpennen Uitvoer en uitvoer nullen naar hen. Lees de kolompennen en zoek welke pen laag is. Voer een vergelijkbare bewerking uit met deze waarde, behalve dat u het nummer niet naar rechts hoeft te verschuiven. Na de var ^ 240 en ^ var heb je een enkele bit om de kolom weer te geven waarop de toets was ingedrukt. Vergeet niet om interrupts uit te schakelen voordat u poorten opnieuw configureert, omdat dit waarschijnlijk ongewenste interrupts zal veroorzaken. Mogelijk moet u de interruptvlaggen wissen wanneer u de interruptroutine verlaat om dubbele afhandeling van interrupts te voorkomen.



Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...