Ik heb zitten puzzelen of er een methode bestaat waarmee ik een aantal on-off-on schakelaars (dus met middenstand, floating) in een matrix setup kan uitlezen. Al tekenend begon me snel te duizelen...
Ik heb een mcp23017 beschikbaar (met i2c) die ik wil gebruiken om de schakelaarstanden uit te lezen. Met twee pinnen per schakelaar komt ik er wel uit maar dan limiteer ik het aantal schakelaars tot 8 per mcp terwijl ik er graag een paar meer wil. De scan snelheid zal geen probleem zijn omdat die schakelaars toch niet meer dan een paar keer per dag omgezet zullen worden.
In een gewone 4x4 matrix keyboard zou ik 16 toetsen in moeten kunnen zetten met 8 data lijnen.
Elke wisselschakelaar met middenstand bevat telkens 2 schakelaars en zou ik met die 4x4 matrix op 8 wisselschakelaar moeten kunnen uitkomen.
Omdat elke schakelaars feitelijk uit twee schakelaars bestaan die een gezamenlijke middelste poot hebben kan ik de setup niet naar een 4x4 matrix vertalen.
(En dan komt ook nog de software voor het scannen van de matrix, vrees ik)
Ik heb al zitten kijken naar ladder weerstandsnetwerken maar daar krijg ik geen goed gevoel bij. Weet iemand hier een oplossing voor?
maartenbakker
Golden Member
www.elba-elektro.nl | "The mind is a funny thing. Sometimes it needs a good whack on the side of the head to jar things loose."
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
Met een 4x4 matrix kun je dus 4x4=16 contacten uitlezen.
Dus 4x2 schakelaars met middenstand, gewoon de common zijde aan de kolom drive knopen de andere 8 kanten met diodes in de matrix hangen. En 16 diodes nodig + 4 pullups.
Hier de helft van de matrix met schakelaars:
------------------+---------------------+--- row1 -[ R ]--- +Vcc
------------+-----|---------------+-----|--- row2 -[ R ]--- +Vcc
-------+----|-----|----------+----|-----|--- row3 -[ R ]--- +Vcc
-+-----|----|-----|----+-----|----|-----|--- row4 -[ R ]--- +Vcc
| | | | | | | |
_ _ _ _ _ _ _ _
V V V V V V V V (<-diodes)
- - - - - - - -
| | | | | | | |
( ) | ( ) ( ) | ( ) ( ) | ( ) ( ) | ( )
| | | |
| | | |
(.) (.) (.) (.)
|----------| |----------|
col1 col2
ik heb dat ooit met weerstanden gedaan.
elke schakelaar had een weerstand en met de spanning te meten, kon ik berekenen welke schakelaars aan stonden. had 5 schakelaars per poort zitten
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Of neem een i/o extender als de PCA9606/9506: heb je 40 i/o pins...
Dank je @henri62!
Aan het gebruik van diodes had ik niet gedacht.
Zo is het wel super simpel. En ik kan per 2 schakelaars de boel opzetten door er gewoon een kolom bij te zetten.
Ik denk dat je zelfs de standaard arduino matrix decodeerroutines kan gebruiken die gelijktijdig ingedrukte toetsen kan detecteren (Nullkraft/Keypad). Nog even uitpuzzelen hoe ik de detectie van de middenstand per schakelaar kan vastleggen.
Bedankt!
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Nog even uitpuzzelen hoe ik de detectie van de middenstand per schakelaar kan vastleggen.
Da's het simpelste: er is dan geen contact...
Je hoeft trouwens niks te scannen: de MCP heeft een IOC interrupt die je automatisch waarschuwt als er iets wijzigt...
(in rust alle 'col' pinnen laag laten dan)
fatbeard
Honourable Member
Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.
Dat gaat volgens mij niet werken: als er al een schakelaar op bijvoorbeeld row0 is gemaakt zal een tweede schakelaar op dezelfde row niet worden gezien...
Je zult derhalve de kolommen moeten scannen.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Op zaterdag 15 maart 2025 15:17:13 schreef fatbeard:
Dat gaat volgens mij niet werken: als er al een schakelaar op bijvoorbeeld row0 is gemaakt zal een tweede schakelaar op dezelfde row niet worden gezien...
Je zult derhalve de kolommen moeten scannen.
Dat gaat wel: de eerste schakelaar op row1 zit op col1, de tweede op row1 / col2.
(kolom of row scannen kan beide, alleen is kolom scannen meer werk in software)
fatbeard
Honourable Member
Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Op zaterdag 15 maart 2025 15:45:56 schreef fatbeard:
Dus toch scannen...
[...]
Ja, maar pas als er 'iets' ingedrukt is (interrupt)
Scannen of niet, het maakt mij niet veel uit. 1x per seconden een scan is voor mijn toepassing geen probleem. Ik hoef er geen lange telefoonnummers mee in te tikken 
Ik heb overigens de interrupt niet eens op mijn bus naar buiten gevoerd nu ik er aan denk.
Bedrading technisch is dit trouwens ook wel een mooie oplossing.
Telkens de schakelaars rechtstreeks met een diode op een van de vier buslijnen solderen. Is lekker makkelijk, scheelt een hoop draadjes strippen en ook geen risico de kluts kwijt raken in berg spaghetti.
Ook de software is vrij makkelijk. Niet eens een library nodig.
Nu nog even wachten tot de schakelaar binnenkomen.
Dank voor het meedenken.
OPTOdesign
R&D | Design | Light | Innovation | Education
Toch lijkt mij het volgende ook goed haalbaar:
Op vrijdag 14 maart 2025 23:11:05 schreef kirst:
Ik heb al zitten kijken naar ladder weerstandsnetwerken maar daar krijg ik geen goed gevoel bij. Weet iemand hier een oplossing voor?
Bij 'weerstandsnetwerken' of 'weerstandsladders' denk ik aan deze componenten (worden verkocht onder deze naam):
Deze is in jou geval inderdaad niet geschikt om meerdere schakelaars uit te lezen op een simpele manier.
Echter, als je voor iedere volgende weerstand de dubbele waarde neemt van de voorgaande (daar zit overigens een praktisch limiet aan) kan je alle denkbare combinaties van alle schakelaars uitlezen omdat iedere combinatie dan een eigen weerstand heeft. Vergeet de kant en klare componenten als bovenstaand dan en gebruik losse weerstanden.
Je sluit het aan als een spanningsdeler en leest de waarde in op een vrije ADC poort. Afhankelijk van het aantal schakelaars, het gewenste bereik en daarmee het aantal keer dat je de weerstandswaarde kúnt verdubbelen, heb je 1, 2 of een paar ADC poorten nodig om het aantal schakelaars (in rijen of kolommen) over te verdelen met een zelfde spanningsdeler.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Wat vanuit TS niet 100% duidelijk is, dat is of de schakelaars momentaanschakelaars zijn en slechts enkele seconden per dag actief zijn, of dat ze gerust in stand "1" gezet kunnen worden en dan een week in die stand kunnen blijven staan.
Ik dacht aan dat laatste en dan werkt Arco's interrupt truuk niet. Als je dan bijvoorbeeld de schakelaar tussen col1 en row1 activeert dan is, ook bij alle col draden laag row1 al continue geactiveerd (laag). Dus alle andere schakelaars op row1 krijg je geen seintje meer van.
Dan kan je "col1" niet laagmaken en nog wel van DIE schakelaars een seintje krijgen. Maar dan werken alle andere schakelaars op col1 niet meer....
Kortom je zult dan toch moeten scannen. Maar een scan iedere 200ms is prima te doen, Ook met een minimale CPU als een AVR/arduino.
Of als een seconde vertraging tot iets reageert niet uitmaakt kan je iedere seconde een scan doen.
OPTOdesign
R&D | Design | Light | Innovation | Education
Inderdaad. Ik dacht ook te lezen dat het welkom zou zijn als er wat pinnen bespaard konden worden en toch wat meer schakelaars. Vandaar toch nog even mijn toevoeging.
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
De serieweerstands truuk (is iets anders als de R-2R ladder) werkt alleen met drukknoppen waarbij er maximaal 1 tegelijk ingedrukt wordt.
Dit is vaak gebruikt in frontjes van autoradio's. Dan had je maar 1 pin (+GND) nodig om een stuk of 7-8 knopjes te lezen. Dat is wel zo ongeveer de max anders is het door toleranties in (standaard) weerstanden niet meer betrouwbaar.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Op zondag 16 maart 2025 20:52:41 schreef rew:
Ik dacht aan dat laatste en dan werkt Arco's interrupt truuk niet.
Als je dan bijvoorbeeld de schakelaar tussen col1 en row1 activeert dan is, ook bij alle col draden laag row1 al continue geactiveerd (laag).
Werkt wel altijd. Bij gedrukte toets wordt de betreffende row ook laag en genereert een interrupt. En dan uiteraard scannen welke toets het is.
Ik gebruik het heel vaak, dus geloof me dat het prima werkt.
Continu scannen kan ook zonder interrupt, maar da's een beetje onnodige bezigheidstherapie... 
(altijd proberen de boel zo simpel en overzichtelijk mogelijk te houden)
De analoge 'serieweerstandstruuk' werkt ook met meerdere toetsen tegelijk als je de weerstandswaarden juist kiest.
(ik vind het niks, een verkeerde 'besparing', i/o pinnen kosten tenslotte bijna niks meer tegenwoordig)
Ik heb in japanse receivers al vaak genoeg ellende moeten oplossen van een of meerdere vastzittende toetsen, er gebeuren dan de vreemdste dingen...
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
Op maandag 17 maart 2025 21:31:47 schreef Arco:
[...]
Werkt wel altijd. Bij gedrukte toets wordt de betreffende row ook laag en genereert een interrupt. En dan uiteraard scannen welke toets het is.
Ik gebruik het heel vaak, dus geloof me dat het prima werkt.
Dat is denk ik niet wat 'rew' bedoelt. Hier moeten schakelaars uitgelezen worden, als er een schakelaar al dicht is kun je op de col 'row' niks meer detecteren aan wijziging.
Ik heb in japanse receivers al vaak genoeg ellende moeten oplossen van een of meerdere vastzittende toetsen, er gebeuren dan de vreemdste dingen...
Je bevestigd zelf al dat het inderdaad niks is. Zelfde hier pas gehad met een Yamaha versterker. Op een gegeven moment waren alle schakelaars 1 "tandje" opgeschoven.
Ook als een knopje slecht contact maakt krijg je de verkeerde toetsaanslag binnen.
Op mijn telefoon idem, de volume + / - zijn ook zo gemaakt, een groot drama, volume omlaag wordt in een keer omhoog. Net wanneer je het niet wilt.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Dat is denk ik niet wat 'rew' bedoelt. Hier moeten schakelaars uitgelezen worden, als er een schakelaar al dicht is kun je op de col niks meer detecteren aan wijziging.
Op de col's valt ook niks te detecteren, dat zijn outputs. (de rows kun je gewoon stuk voor stuk uitlezen)
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
De arco-truuk werkt als er zelden of nooit meer dan 1 toets tegelijk actief is. Een normaal keyboard b.v. (met een paar uitzonderingen als shift en control).
De truuk is dat je alle col outputs op 0 zet, dan scan je ze "allemaal tegelijk". Zodra dan een row laag wordt en je een interrupt krijgt, kan je 1 voor 1 de col outputs laag maken om te kijken welke colum die schakelaar op zat. (*)
Als de col1-row1 schakelaar actief is en blijft, dan werkt het niet meer als je alle column registers tegelijk laag hodut en gaat wachten op een interrupt: Row1 is en blijft "actief" (laag): andere column-x row1 schakelaars krijg je geen interrupt meer van: Row1 is al laag.
Om wel alle row-1 andere-column schakelaars te kunnen inlezen kan je de col1 output hoog maken, en slechts "alle andere column" outputs laag. In dat geval werkt de interrupt voor "andere row1 schakelaars" weer wel, maar nu kan je de activering van andere column-1 schakelaars niet meer zien.
Is het zo dat je nooit meer dan 1 toets tegelijk hebt, dan ga je gewoon terug naar "alle columns 0" en wacht je tot een neiuwe interrupt: Toets/schakelaar is losgelaten/niet meer actief. Een volgende interrupt is dan een nieuwe toets.
Omdat ik dacht dat de TS schakelaars heeft die in drie standen zonder je vinger er op kunnen blijven staan, dacht ik dat het geval van meerdere schakelaars tegelijk actief niet "zeldzaam" zou zijn. Dan is het softwaretechnisch gewoon verstandiger om gewoon te blijven scannen.
Met twee van die 23x08 uitbreidings dingen kan je 64 schakelaars (of 32 dubbele) aan. Je moet dan 8 kolommen scannen. Je zet een interrupt op 1000 keer per seconde, vraagt iedere interrupt het row-register op, en zet een nieuwe column waarde. Dan scan je in 8ms alle keys, 125 scans per seconde. Doe je i2c op 400kHz, dan kan je 400 bits versturen/ontvangen. Moet genoeg zijn.
Ben je software I2C aan het doen, dan wordt de situatie een beetje tricky omdat je dan een significant deel van je tijd met de I2C bezig zal zijn. Maar met een hardware-i2c implementatie moet het gewoon prima gaan.
(*) Het kan nog iets efficienter: Zet de columns na de interrupt op input, pulldown, alle rows op output-1 en 1 read van het column register en je weet welke schakelaar er geactiveerd is.
OPTOdesign
R&D | Design | Light | Innovation | Education
Ik snap niet zo goed wat er mis is met de spanningsdeler-methode. Dat is een bewezen goede techniek. Denk aan resistive touchscreens 