¿Paso 5: Qué teclas han sido presionadas?
Personas han enfrentado a este problema en el pasado, y una solución común es la matriz de análisis. La idea clave es que queremos saber los Estados claves (arriba/abajo) pero no tenemos que saber en el mismo instante. Mediante la exploración de las teclas en el tiempo (aunque muy rápidamente en términos humanos) podemos reducir la cantidad de hardware que necesitamos.
En nuestro caso nos arregló las claves (octavas) de 4 filas y 7 columnas (notas blancas). Analizar las columnas (notas) uno a la vez y ver que esas notas son activos dentro de las octavas. Después de hacer exploraciones de 7 (para cada nota) sabremos el estado de cada una de las 28 teclas. Especificamos la nota para escanear utilizando 3 salidas (8 posibilidades - sólo necesitamos 7 notas) y 4 entradas (4 octavas). Necesitamos 7 alambres para las notas y 4 cables para las octavas. Podemos resolver el problema utilizando 11 cables y 7 pernos del IO. Esta es una gran mejora.
Hay algunos detalles:
* Llave fantasma: Debido a la matriz de carácter de la tecla lo cableado es posible para prensas de múltiples teclas a interpretarse erróneamente como el prensado de una clave que no está siendo presionada. Mediante la adición de un diodo para cada interruptor de evitar que la corriente fluya al revés en la matriz y parar esto del suceso.
* Selección de columna/Nota: Sólo tenemos que seleccionar 1 Nota a la vez (de 7) y carecen de pernos del IO, por lo que la mejor manera de manejar esto es utilizar un decodificador 3:8. Se utilizó un 74LS138. Que tiene una salida baja activa, por lo que el circuito es quizás menos intuitivo que con un + 5V por salida.
* Circuitos entrado: Las entradas en el atmega328p pueden configurarse para tener Levante interno de resistencias. Está bien. Nos salva de tener a los mismos.
* Clave De rebote: Llaves mecánicas no cierre o abra limpiamente. Rebotan rápidamente entre los Estados abiertos y cerrados más de un relativamente largo período (miiliseconds). Solucionamos este problema al filtrar los eventos claves de software. Ponga simplemente no reconocemos una tecla arriba/abajo evento hasta que ese Estado ha persistido en el interruptor para una serie de exploraciones. Podemos afinar ese número hacia arriba o hacia abajo para facilitar la clave menos o más "susceptible".
Recursos:
Una discusión interesante de análisis clave y clave velocidad de detección en los teclados comerciales.
http://www.openmusiclabs.com/Learning/digital/INPUT-Matrix-Scanning/Keyboard/
Gran Firmware Piano. Matriz de teclado controlador.
https://github.com/Deadsy/bigpiano/BLOB/Master/src/Key.cpp
https://github.com/Deadsy/bigpiano/BLOB/Master/src/Key.h