A szimulátorunk műszerfalán számos kapcsoló helyezkedik el. Egy arduino micrót asználunk arra, hogy ezek állapotát ellenőrizzük és továbbítsuk a szimulátort futtató számítógépre. Az arduinóval egy joystickot emulálunk, amivel 32 nyomógomb állapotot tudunk küldeni. Ez a része nem gond. A probléma az, hogy ennyi digitális vagy analóg lába nincs ennek a kicsi arduino boardnak, így valamit ki kellett találni, hogyan lehetne ezt mégis kezelni. A megoldás egy kapcsoló mátrix építése.
Ez igazából egy példa, a mátrix mérete voltaképp tetszőlegesen növelhető. Nézzük, hogy működik ez a 4x4-es mátrix.
4 lábat kimenetként használunk, 4 lábat pedig bemenetként. A kimeneti lábak lesznek a sorok, a bemeneti lábak pedig az oszlopok. Ez annyit tesz, hogy az egy sorban levő kapcsolók egyik vége ugyanarra a kimeneti lábra lesznek kötve, az egy oszlopban levő kapcsolók másik lába pedig ugyanarra a bemenetre.
Például az első sor így néz ki:
Az arduino 2-es lába a kimenet, ide egy diódán keresztül rákötjük a kapcsolókat. A kapcsolók másik lábait pedig rendre a bemeneti lábakra kötjük, Ezt ismételjük soronként.
Ha egy oszlopot nézünk, azt látjuk, hogy minden sor külön kimeneti lábról egy diódán keresztül csatlakozik a kapcsolóhoz, a kapcsolók másik lába pedig ugyanarra a bemenetre megy.
A működési elv:
Alaphelyzetben a bemeneti lábakra bekapcsoljuk a PULL_UP regisztert (ha nincs földelve, stabil HIGH érték legyen), a kimeneti lábakat pedig HIGH értékre állítjuk (+5V -ot kapcsolunk rá, azaz nem földeljük!).
A kapcsolók állapotát soronként ellenőrizzük. Először földeljük az első kimeneti sort (LOW értékre állítjuk az első kimeneti lábat). Végig ellenőrizzük a bemeneti lábakat. Ahol az érték LOW, ott a kapcsolónk be van kapcsolva. Értelemszerűen ahol HIGH, ott a kapcsoló ki van kapcsolva. Ahogy megvizsgáltuk a bemeneteket, a kimeneti lábat HIGH értékre visszaállítjuk, így alaphelyzetbe kerül megint a mátrixunk és jöhet a következő sor. Itt ugyanezt kell tenni. A sorhoz tartozó kimeneti lábat LOW-ra, majd az oszlopokhoz tartozó bemeneti lábakat beolvassuk. A beolvasások végén mindig tegyük vissza a sorhoz tartozó kimenetet HIGH-ra!
Miért kell a dióda?
A sorokat úgy ellenőrizzük, hogy rendre leföldeljük őket. Mivel oszloponként a kapcsolók lábai is össze vannak kötve, ezért ha egy oszlopban bekapcsolunk egy kapcsolót, akkor ott az összes kapcsoló lábán megjelenik a föld. Itt gyönyörű áramkörök alakulhatnak ki, ráadásul mivel mindig csak egy kimenet van földelve, a többi pedig +5V-ra rakva, jó eséllyel akár a boardunkat is elfüstölhetjük egy remek kis rövidzárral (bár lehet van erre benne valami védelem, én inkább nem próbálom ki).
A dióda katódját a kimeneti lábra kötjük, az anódját pedig a kapcsolóra. Ezzel biztosítjuk, hogy csak az adott sor kimeneti lábáról érkező föld tud megjelenni a bemeneten (egy másik soron keresztül nem fog záródni a kör a dióda miatt), illetve két kimenet sosem kerülhet összezárásra (kivéve, ha mindkettő föld, de azzal meg nincs gond).
Mekkora mátrixot lehet így kezelni?
Elméletileg csak az arduino I/O lábainak száma korlátoz minket. Íme egy teljesen felesleges táblázat, mert nem igényel bonyolult számítást, de kiváló térkitöltő ebben a posztban. Feltétlenül jelezd, ha te is így gondolod.
Mátrix | I/O láb | Kapcsoló |
3x3 | 6 | 9 |
3x4 | 7 | 12 |
4x4 | 8 | 16 |
4x5 | 9 | 20 |
5x5 | 10 | 25 |
Tinkercad-en összeraktam egy áramkört erre (a képek onnan kerültek kivágásra), megmutatom az arduino code-ot és hogyan fut a szimuláció: