Stap 5: Welke toetsen zijn ingedrukt?
Mensen hebben in het verleden met dit probleem geconfronteerd, en een gemeenschappelijke oplossing is matrix scannen. De belangrijkste inzicht is dat we willen weten van de belangrijke staten (omhoog/omlaag), maar we hoeven niet te weten hen op het zelfde moment. Door het scannen van de toetsen na verloop van tijd (zij het in zeer snel in menselijke termen) kunnen we de hoeveelheid hardware moeten verminderen.
In ons geval we geregeld de sleutels in 4 rijen (octaven) en 7 kolommen (witte belangrijke notities). Wij scannen de kolommen (notities) één tegelijk en zien welke van die nota's zijn actief binnen de octaven. Na het doen van 7 scans (voor elke noot) zullen we weten de staat voor elk van de 28 sleutels. We geven de notitie te scannen met behulp van 3 uitgangen (8 mogelijkheden - we hoeven alleen maar 7 notities) en 4 ingangen (4 octaven). We moeten 7 draden voor de nota's en 4 draden voor de octaven. Wij kunnen het oplossen van het probleem met behulp van 7 IO pinnen en 11 draden. Dit is een grote verbetering.
Er zijn een paar details:
* Sleutel Ghosting: Vanwege de matrix aard van de bedrading van het sleutel kan voor meerdere sleutels persen worden geïnterpreteerd ten onrechte als het indrukken van een toets die is niet wordt ingedrukt. Door toevoeging van een diode aan elke switch we voorkomen dat huidige uit stroomt achteruit in de matrix en dit voorkomen.
* Kolom/Opmerking selectie: We moeten alleen 1 opmerking (uit 7) tegelijk selecteren en we zijn korte op IO pennen, dus de beste manier om dit te gaan is het gebruik van een 3:8-decoder. We gebruikten een 74LS138. Dat heeft een actieve laag vermogen, dus de circuits misschien minder is intuïtief dan hebbend een + 5V output gedreven.
* Input circuits: De ingangen van de atmega328p kunnen worden geconfigureerd om interne pull up weerstanden. Dat is goed. Het bespaart ons hebben ze ons draad.
* Key-Bouncing: Mechanische toetsen niet sluiten of open netjes. Ze stuiteren snel tussen open en gesloten staten over een relatief lange periode (miiliseconds). Wij dit probleem opgelost door het filteren van de belangrijkste gebeurtenissen in software. Zet gewoon een sleutel omhoog/omlaag gebeurtenis tot die staat heeft behouden op de switch voor een aantal scans niet herkend. We kunt afstemmen dat aantal omhoog of omlaag om maken de toets minder of meer "gevoelig".
Bronnen:
Een interessante discussie over belangrijke scannen en belangrijke snelheid sensing op commerciële toetsenborden.
http://www.openmusiclabs.com/learning/Digital/Input-matrix-Scanning/Keyboard/
Grote Piano Firmware. Toetsenbord matrix Driver.
https://github.com/deadsy/bigpiano/BLOB/Master/src/Key.cpp
https://github.com/deadsy/bigpiano/BLOB/Master/src/Key.h