Descripción general
(Un diagrama de bloques aproximado está vinculado a continuación).
Volví a cablear mi órgano con electrónica digital. Tengo un microcontrolador (Teensy LC) que se usa para escanear las teclas (presionadas o no). Se comunica con una máquina GNU / Linux host a través de USB, que maneja los estados de claves y decide si ha ocurrido una "pulsación de tecla" o "liberación de tecla", y ocurre un procesamiento adicional.
El microcontrolador solo tiene 23 pines de E / S digitales, pero el órgano tiene unos 200 interruptores (teclas y paradas) para monitorear. Utilizo multiplexores analógicos 16: 1 para escanear a través de las teclas. Cada multiplexor tiene su lado "1" en uno de los pines de E / S del microcontrolador, y cada uno de los pines en el lado "16" de los multiplexores está conectado a una tecla de órgano (interruptor). Hay una configuración de cátodo común de modo que si se presiona una tecla, la entrada que va al multiplexor es "alta" (3.3 v en este caso), y si no se presiona una tecla, la entrada es flotante. Sin embargo, no debería haber ninguna flotación, porque configuré mi microcontrolador para bajar sus entradas.
Los canales de los multiplexores se seleccionan digitalmente. Como hay 16 canales, tengo 4 bits de selección de canales. Todos los canales de los multiplexores se seleccionan en tándem. Es decir, los cuatro bits de selección de canal se envían desde el microcontrolador a todos los multiplexores al mismo tiempo. De esta manera, mi algoritmo de escaneo es básicamente:
uint8_t buf[RAWHID_TX_SIZE]; /*This gets initialized to 0*/
uint8_t pins[16] = {4,5,6,7,8,9,10,11,12,14,15,16,17,18,19,20};
for (uint8_t channel{0}; channel < 16; ++channel)
{
//Pins 0-3 are output to multiplexers for channel selection.
digitalWrite(0, channel & 1);
digitalWrite(1, channel & (1<<1));
digitalWrite(2, channel & (1<<2));
digitalWrite(3, channel & (1<<3));
for (uint8_t pin{0}; pin < 16; ++pin)
{
auto val = digitalRead(pins[pin]);
if (val == HIGH)
buf[current_byte] |= 1 << current_bit;
//increments current_bit and rolls current_byte if necessary.
increment_bit();
}
}
El problema
Cuando presiono una tecla y la mantengo presionada, otras teclas aparecen de forma aleatoria.
Una hipótesis para este comportamiento es que esto se debe a la inductancia: los cables de las llaves se envolvieron en su paquete original (1950) y se enrutan desde las llaves hasta mi sistema electrónico: tal vez una carrera de 5 pies. Pensé que la corriente que atravesaba un cable estaba induciendo una corriente débil en los cables cercanos. Algunos argumentos pragmáticos para esta hipótesis:
- Agregar una resistencia al cátodo común ayuda a aliviar los síntomas. De hecho, el problema mejoró en la medida en que el órgano se podía tocar. Si se agrega demasiada resistencia, las teclas deseadas no se mantendrían encendidas cuando se las presiona, y si hay poca resistencia, las teclas no deseadas sonarán de manera intermitente.
- El registro del pedal fue peor, y tiene la mayor cantidad de cables agrupados.
- El problema es peor cuando se presionan varias teclas. esto presumiblemente induce más corriente no deseada a claves no deseadas.
Argumentos en contra de esta hipótesis:
- la corriente a las claves deseadas debe ser mínima ya que la impedancia de entrada en los pines de ENTRADA del microcontrolador es excelente.
- Volví a cablear nuevamente el órgano sacando todos los cables de sus paquetes, y el problema persiste. Ahora, los cables no se enrutan completamente hacia un lado antes de regresar al centro donde se encuentra la electrónica; Vienen directamente a la electrónica. Esto proporciona alambres más cortos, y no un paquete cercano. para los pedales, ahora estoy usando cables de cinta en lugar del paquete original.
No tengo otras hipótesis.
Algunas cosas que he probado
- Como se indicó anteriormente, he vuelto a cablear el instrumento para eliminar todos los paquetes de cables, y el problema sigue siendo bastante grave. Puede ser un poco mejor que cuando había paquetes.
- También como se indicó anteriormente, he agregado varios niveles de resistencia al cátodo común. Ayuda, pero no estoy satisfecho con esa solución porque hace que se reduzca la corriente deseada. Esto hace que las notas deseadas a veces se detengan y comiencen a sonar, lo cual es inaceptable.
- He agregado esperas en mi circuito del microcontrolador. Pensé que tal vez las resistencias internas y el cátodo común no tenían tiempo suficiente para establecerse después de elegir un canal de multiplexor diferente. Agregar varios milisegundos (incluso varios cientos de milisegundos) de tiempo de "liquidación" no ayudó al problema.
Mi diagrama de bloques: