Kysymys:
Kuinka 16 painiketta voidaan liittää vain 8 johtimeen?
Basj
2017-03-07 20:05:05 UTC
view on stackexchange narkive permalink

Tässä on tuote.Ymmärrän ajatuksen: nämä 16 painiketta käyttävät 4x4-matriisia.4 riviä riville, 4 riviä sarakkeille ja meillä on 8 kaapelia.

enter image description here

Mutta:

  1. HMiten tämä voi toimia ilman multiplekseria?

  2. C Voiko tämä havaita tarkasti useiden painikkeiden painamisen? Vaikka painikkeet käyttävät samaa riviä tai samaa saraketta?Esimerkki: painikkeita asennossa (2,2) (2,3), (3,2) ja (3,3) painetaan samanaikaisesti.

  3. HMiten se toimii?

Tämä on yleistä tietoa, kuten löydät Google-haulla "näppäimistön multipleksointi" tai vastaava.Etkö kokeillut sitä ensin ennen tämän julkaisemista?
@TonyM Tietysti tein, monia hakuja, ja tilasin jopa muutaman multiplekseripiirin 74HC164, jotka saapuivat kotiin muutama päivä sitten.Aioin liittää kaiken tällä multiplekseri-sirulla, kun löysin tämän.Sitten mietin "miten tämä voi toimia ilman multiplekseriä"?
Vasemmalla olevan laitteen sisällä on oltava multipleksointikoodi
@MarceloEspinozaVargas Ok.Mitä sitten ajattelet kysymyksestä nro 2?
Se riippuu todellisesta multipleksointikoodista, jos se on yhtä yksinkertaista kuin lähettää + V jokaiselle riville ja käyttää kutakin saraketta syötteenä, se ei voi tehdä sitä, mutta jos se vaihtaa jokaisen rivin ja sarakkeen ympäri (kaikki 8nastat tulona ja ulostulona) ja voi pitää muistissa mitä painiketta painetaan, se voi havaita useita painikkeita samanaikaisesti
Tein tämän haun ja toinen tulos oli pdf, joka vastasi yksityiskohtaisesti Q1, Q3 ja osa Q2.Voit nähdä mielipiteeni, eikö vain - tämä on jo dokumentoitu ja parempi kuin selitämme sen täällä.Katso, saat yksityiskohtaiset vastaukset.
@TonyM Kiitos, että osoitit minulle tämän.Voitteko linkittää PDF: n salaisuuden sijasta;)?Ehkä etsin muilla avainsanoilla kuin näppäimistö jne., Enkä todennäköisesti löytänyt samaa.
Toki :-) www.emc.com.tw/eng/database/Sa2/Gp/An/Gf/AN-009.pdf
Olen pahoillani @TonyM, mutta se on luultavasti helppo lukea jollekulle, joka jo tietää, mutta minulle, kun näen kokoonpanijan ja `MOV A, @0X11; poista WDT käytöstä ', ei ole erityisen helppoa ymmärtää, kuinka näppäimistö, jossa on useita painikkeita-sama aika toimii ...
@Basj:, jolla on useita puristimia, ei ole ongelma.Skannat kaikki neljä riviä peräkkäin.Jos painike löytyy painettuna riviltä 1, merkit sen muistiin.Kun kyse on rivistä 3, löydät siellä painetun toisen painikkeen, myös sen.Loppujen lopuksi saat molemmat painikkeet.Niin kauan kuin pystyt skannaamaan huomattavasti nopeammin kuin ihmiset voivat painaa painikkeita, et menetä sitä.
http://www.cs.ucr.edu/~ehwang/courses/cs120b/04summer2/labs/lab9.html
https://deskthority.net/wiki/Rollover,_blocking_and_ghosting
Katso tämä animaatio: https://upload.wikimedia.org/wikipedia/commons/f/f2/FunctionalCircuitDiagramOfKeyboardNumPadScanningProcedure-small.gif (Huomaa: rivin ja sarakkeen vaihtaminen ei ole laitteistoa. Se on koodisi menossa "OK", aseta nyt pin1 korkeaksi, lue nyt pin5 ": n tila jne.)
@MarceloEspinozaVargas vasemmalla oleva laite on Raspberry Pi (malli 3).Nämä GPIO-nastat voidaan määrittää nopeasti ja helposti koodina.Näyttää siltä, että kaikki näppäimistön nastat on kytketty GPIO: iin (ei mitään GND: hen), mutta merkitty valokuva ei ole niin selvä
Tuotteen käyttöoppaassa opetetaan sen purkaminen: http://www.gotronic.fr/pj2-sbc-buttonmatrix-fr-1461.pdf
Neljä vastused:
Olin Lathrop
2017-03-07 20:22:02 UTC
view on stackexchange narkive permalink
Kuinka tämä voi toimia ilman multiplekseria?

Ei. Näppäimistökortilla näyttää olevan vain kytkimiä, ehkä joitain diodeja, joita emme näe. Vasen levy näyttää kuitenkin siltä, ​​että siinä on prosessori. Melkein varmasti multipleksointi tapahtuu laiteohjelmistossa.

Multipleksointialgoritmi toimii näin:

  1. Aja yksi rivi korkealle, muut matalalle.

  2. Ota passiiviset pudotusvalinnat käyttöön sarakeriveillä.

  3. Katso, mitkä sarakerivit ovat korkeita. Näiden sarakerivien ja yhden väitetyn rivilinjan leikkauspainikkeita painetaan. Muut rivin painikkeet vapautetaan.

  4. Toista takaisin vaiheeseen 1 ja vahvista seuraava rivi peräkkäin.

Yllä oleva prosessi toistetaan riittävän nopeasti, jotta kaikki painikkeet tarkistetaan ajan kuluessa, joka tuntuu silti välittömältä ihmisen tarkkailijalle. Ihmisen "hetkellisen" raja on tässä yhteydessä noin 50 ms. Jopa matalan luokan mikrokontrolleri voi skannata 4x4-näppäimistön paljon lyhyemmässä ajassa.

Voiko tämä havaita tarkasti useiden painikkeiden painamisen?

Luultavasti kyllä. Yksi tapa on laittaa diodi sarjaan jokaisen painikkeen kanssa. Ne voivat olla näyttämäsi taulun alaosassa. Diodien kanssa yllä kuvattu algoritmi toimii vain.

Toinen tapa on asettaa vastukset sarjaan linjojen kanssa ja mitata niiden analoginen jännite. Vaikka useilla painikkeilla lyhennettäisiin useita rivi / sarake viivoja yhteen, voit lopulta selvittää, mitä painikkeita painetaan. Tämä edellyttää A / D-tuloja mikrossa, ei vain digitaalisia tuloja, kuten diodeja käytettäessä.

Kiitos.Entä sitten useita puristimia samanaikaisesti?Huomaa: vasen lauta on RaspberryPi.
@Basj Jos aiot painaa vain 2 painiketta samanaikaisesti, olet kunnossa, vain silloin, kun painat vähintään kahta painiketta samassa sarakkeessa ja toista painiketta toisessa sarakkeessa, tarvitset diodit
@Hayman miksi se on niin?Voitteko antaa esimerkin?Miksi (1,2), (2,2) ja (3,3) painetaan samanaikaisesti ongelmana, kun diodia ei ole?Ehkä sinulla olisi pieni kaavio?Koska tämä kohta on todella ratkaiseva, ehkä se kannattaa omistettuun vastaukseen @Hayman?
+ 1-merkintä "vasemmalla levyllä näyttää siltä, että siinä on prosessori".Rakasti sitä.
Olen myös kuullut, että kolme ei toimi satunnaisesti tämän tyyppisen multipleksoinnin kanssa.Se rekisteröi neljännen näppäimen painettuna (haamupainike).Tälle algoritmille on nimi, enkä muista sen näyttävän ...
@Basj on selvää, jos pelaat sen kanssa.Aina kun painat painiketta, yhdistät rivin sarakkeeseen.Aina kun rivi ja sarake yhdistetään, risteyksessä oleva avain rekisteröidy painettuna.Mutta jos painetaan vähintään 3 näppäintä, rivi ja sarake voidaan yhdistää * epäsuorasti *.
@Basj Katso [tämä kuva] (https://i.stack.imgur.com/VCYa0.png).Punaiset viivat ilmaisevat logiikan korkean tason.Jos pidät 3 x: llä merkittyä painiketta painettuna, voit jäljittää ne ja nähdä polun, jolla signaali virtaa.Ensinnäkin rivi 1 valitaan ja asetetaan korkealle, jolloin painikkeesta 1,1 ensimmäinen sarake tulee korkeaksi.Painamalla painiketta 1,2 olemme nyt tehneet rivin 2 korkeaksi.Jos painamme mitä tahansa muuta painiketta rivillä 2, teemme toisen sarakkeen korkealle.Ongelma tässä on, että μC on tyhmä, se tietää asettaneensa rivin 1 korkealle ja näkevänsä korkean sarakkeessa 3, minkä vuoksi painike 1,3 on korkea
@Basj Ilman diodeja, jos yhdistät rivin 1 sarakkeeseen 1 ja rivin 1 sarakkeeseen 2, olet liittänyt sarakkeet 1 ja 2 yhteen.Kuinka voit nyt selvittää, painettiinko rivin 2 saraketta 1 eikä rivin 2 saraketta 2?Diodien avulla et ole yhdistänyt kahta saraketta yhteen, koska tällaisen polun olisi mentävä taaksepäin yhden diodin läpi.
Jopa sen käyttöoppaassa (pääset siihen tuotteen linkistä) annetaan koodi, jota käytetään sen demultipleksointiin: 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

Ilman diodeja ... saat fantomikulmioita.

Esimerkiksi esimerkissäsi (2,2) (2,3), (3,2) ja (3,3);valitsit ironisen esimerkin valitsemalla suorakulmion.Jos todella painat kaikkia neljää, se toimii.Mutta jos painat mitä tahansa suorakulmion kolmea kulmaa, myös neljäs kulma näyttää olevan painettuna, vaikka se ei olekaan.

Tämä näppäimistö on selvästi tarkoitettu näppäimistön tietojen syöttämiseen, jossa käyttäjän käytäntö on yksi näppäimen painallus kerrallaan.Huomaa, että esimerkiksi huoltoaseman luottokortin syöttönäppäimistössä ei ole "shift" -näppäimiä.

Jos kuitenkin teit S1: stä vaihtonäppäimen ja S3: sta alt-shift-näppäimen siten, että käyttäjät saattavat kohtuudella pitää molempia painettuna samalla, kun painat myös S13, niin myös S15 näyttää olevan painettuna.

Suurimmalla osalla tietojen syöttönäppäimistöjä ei ole tarkoitus painaa enempää kuin 2 näppäintä kerrallaan, joten siinä ei ole ongelmaa.Musiikkinäppäimistöt ovat toinen tarina, koska useita näppäimiä voidaan painaa kerrallaan.Suurimmalla osalla niistä on diodit tai erilliset johdot kullekin näppäimelle.Mutta löysin yhden musiikkinäppäimistön käytettyjen tavaroiden kaupasta (hinnoiteltu 9 euroa), jolla ei ollut sopivaa sovitusta useille painikkeille kerralla, ennustamattomilla ja ärsyttävillä tuloksilla!
Avainkytkimet voivat olla tyyppiä, johon on sisäänrakennettu diodi, tai niiden alle voi olla piilotettuja diodeja.
bobflux
2017-03-07 20:32:38 UTC
view on stackexchange narkive permalink

Näin voit tehdä sen ilman jatkuvaa skannausta:

  • Aseta kaikki ohjaimet korkealle
  • Ota passiiviset pudotukset käyttöön vastaanottolinjoilla
  • Aseta nastanvaihdon keskeytys havaitsemaan yksi viivoista, jotka menevät korkealle (tai muuttuvat tasolle)
  • Kun näin tapahtuu, ota käyttöön näppäimistön skannaus, sanokaa 10 ms välein
  • Skannaa normaalisti ja käsittele näppäinpainalluksia
  • Aikakatkaisun jälkeen ilman tapahtumia lopeta skannaus ja käynnistä se uudelleen ensimmäisessä luetelmakohdassa
Darrell Harriman
2017-03-08 12:20:24 UTC
view on stackexchange narkive permalink

Olen tehnyt tämän kokoonpanokielellä paljailla Atmel AVR -mikrokontrollereilla.
Yksinkertaisuuden vuoksi: Näppäimistörivit: käytä Arduino-nastoja 4,5,6 ja 7 (AVR-nastat PD4, PD5, PD6 ja PD7) Näppäimistön sarakkeet: käytä Arduino-nastoja 8, 9, 10 ja 11 (AVR-nastat PB0, PB1, PB2 ja PB3) Tee rivinastatulot vetojen ollessa käytössä. Tee sarakkeen nastat Lähtö ja lähtö nollat ​​niille. Ota nastanvaihdon keskeytykset käyttöön kaikissa rivi- ja saraketapissa. http://playground.arduino.cc/Main/PinChangeInterrupt Painamalla näppäimistön painiketta, rivinappi vedetään matalalle. Keskeytysrutiinin on luettava rivinastat ja löydettävä, mikä tappi on matala. Yläosan 4 bitin tulee olla kolme ja yksi nolla. Jos käytät uint8_t 8-bittistä muuttujaa, voit jakaa sen 16: lla tai (var >> 4) laittaaksesi 4 bittiä luvun alempiin bitteihin. Voit käyttää bittiä OR | toiminto 240: llä asettamaan ylemmät 4 bittiä 1 sekunniksi ja bittiä EI ~ operaatio kääntämään kaikki bitit, joten sinulla on vain yksi bitti, joka edustaa riviä, jossa painikkeen painallus oli päällä. Tallenna tämä numero nimellä 0, 1, 2 tai 3.
Vaihda tapin kokoonpano:
Tee sarake-nastatulot vetojen ollessa käytössä. Tee rivinastat Lähtö ja lähtö nollat ​​niille. Lue sarakkeen tapit ja etsi, mikä tappi on alhaalla. Tee samanlainen käsittely tällä arvolla, paitsi että sinun ei tarvitse siirtää numeroa oikealle. Var ^ 240: n ja ^ var: n jälkeen sinulla on yksi bitti edustamaan saraketta, jossa näppäinpainallus oli päällä. Muista poistaa keskeytykset käytöstä ennen porttien uudelleenmääritystä, koska se todennäköisesti laukaisee ei-toivotut keskeytykset. Saatat joutua tyhjentämään keskeytysliput, kun poistut keskeytysrutiinista, jotta vältetään päällekkäiset keskeytysten käsittelyt.



Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...