Teclado simple para Arduino

Fecha: 26 junio, 2018 Autor: JADM en: Arduino

En el mercado existe una gran variedad de teclados que pueden adaptarse casi a cualquier proyecto. Desde los más utilizados, como los teclados de membrana similares a un teclado telefónico hasta las matrices de pulsadores múltiples o los shields que integran el teclado a un LCD, muy útiles para manejar un menú, por ejemplo.

Resultado de imagen para teclados arduino

Pero que pasa cuando no disponemos de la cantidad de pines libres que requieren estos teclados? Y cuando no queremos o no podemos implementar un shield a nuestro proyecto?

Teclado resistivo para un sólo pin

Los pines analógicos de Arduino permiten leer tensiones de 0 a 5v devolviendo al programa un valor proporcional a la lectura, entre 0 y 1023.

Por otro lado, con un par de resistencias en serie se puede crear un divisor de tensión: un circuito que divide la tensión de entrada en el circuito en otras dos diferentes y más pequeñas de salida.

Algo así:

Se trata de una entrada de voltaje Vin y una salida a través de la resistencia R2. La resistencia R1 se usa para dividir la tensión hacia la salida Vout.

Podés saber que valor tendrá Vout con la siguiente fórmula:

Vout=(R1 / (R1 + R2)) x Vin

… pero para nuestra finalidad la verdad es que mucho no va a importar. Lo que sí tiene que importarte es que si el valor de la resistencia R1 cambia, tambien lo hará el valor de Vout. Entonces, si conectamos Vout a un pin analógico de Arduino (por ejemplo, A0), cuando cambie el valor de R1, va a cambiar el valor devuelto por analogRead(A0).

Además, R1 puede ser remplazada por varias resistencias conectadas en serie, cuyos valores se suman. Y si entre estas resistencias en serie colocamos interruptores, podemos cambiar el valor de R1 al abrir o cerrar esos interruptores. Como sigue:

Si seguís más o menos este circuito, notarás que según que pulsador se active, se sumará una diferente cantidad de resistencias (las que en nuestro ejemplo inicial llamamos R1) y por ende el valor leído en A0 será diferente.

Entonces podés conectar a tu proyecto un completo teclado para, por ejemplo manejar un menú con arriba-abajo, derecha-izquierda y OK, usando apenas 5 pulsadores y 6 resistencias. Si además tenés en cuenta que sólo vas a consumir 1 único pin analógico de tu Arduino, las ventajas ya son obvias.

Claro que es un circuito económico y sencillo y por eso, sabiendo que la magia no existe, tambien será bastante impreciso. La misma pulsación difícilmente entregue el mismo exacto valor a A0… más bien este valor va a estar dentro de un rango, pero no es demasiado difícil lidiar con eso:

 

int pinKb = A0;
 
void setup() {
 
   Serial.begin(9600);
 
   Serial.print("PULSADA:");
 
}
 
void loop() {
  // LECTURA DE TECLADO Y MENU *************************
  int pulsada = analogRead(pinKb);
 
  if (pulsada > 100) {
 
    Serial.println(pulsada);
 
  }

Habiendo armado el circuito del esquema anterior, cargás este último sketch en tu Arduino y, desde el monitor serial, vas a obtener el valor leído para cada tecla pulsada. Entonces vas a hacer repetidas pruebas con cada pulsador, tomando nota en cada caso del valor obtenido. Como resultado, vas a tener una tabla como esta:

Pulsador 1 – Valor mínimo: 100, Valor máximo 190

Pulsador 2 – Valor mínimo 210, Valor máximo 260

Pulsador 3 – Valor mínimo 310, Valor máximo 385

Pulsador 4 – Valor mínimo 410, Valor máximo 475

Pulsador 5 – Valor mínimo 516, Valor máximo 685

Con esta tabla, no te va a ser difícil implementar en tu proyecto funciones similares a la siguiente:

 

int tecla=analogRead(pinKb);
   if ((tecla>99) && (tecla<191)) { // se presionó la tecla 1 // y acá va el código en consecuencia... } if ((tecla>209) && (tecla<261)) {
    // se presionó la tecla 2
    // y acá va el código en consecuencia...
   }

A tener en cuenta:

Los valores que obtengas en tus experimentos seguramente van a ser bien diferentes de los de mi ejemplo. Van a depender principalmente del valor de las resistencias que hayas utilizado. En este ejercicio usé resistencias de 2k2, pero podes usar el valor que mejor te convenga. Tené en cuenta que cuanto mayor sea el valor de las resistencias, más amplitud habrá entre los valores obtenidos para cada tecla y esto es deseable. Pero si exagerás con las resistencias, la tensión que llegue al pin A0 puede ser demasiado pequeña para ser leída…

Este circuito, por su pobre diseño, ya es bastante impreciso en sí mismo, aunque cumple con creces con lo que se le pide. No le confiaría el control de un centro de disparo de misiles nucleares, pero para un menú de opciones de un control de luces LCD será más que suficiente. Igualmente, no está demás recomendarte que uses resistencias de tolerancias bajas… 1% no estaría mal. El valor de las resistencias varía de acuerdo a muchos factores… el circuito, el cableado, la temperatura, etc… y cuanto mayor sea la tolerancia de la resistencia, más van a variar los valores finales y por ende variarán tambien los valores obtenidos en la lectura del pin A0. Por ejemplo, para un circuito con resistencias de tolerancia 5% que armé durante el verano, con temperaturas por sobre los 30 grados, ahora que cambió el clima y tenemos unos 8 grados en el ambiente las pulsaciones en el teclado resultan erráticas: no siempre son leídas y muchas veces se confunde la tecla pulsada con otra. O bien tendría que hacer versiones diferentes del programa para cada temporada (????) o, lo correcto, usar resistencias de buena calidad con tolerancias bajas y ajustar los valores del rango correspondiente a cada tecla.

Si tu circuito usa lecturas de varios pines analógicos, especialmente si están próximos, tenés que considerar hacer una pausa entre las lecturas, para darle tiempo al microcontrolador de Arduino a limpiar los canales y obtener datos fehacientes. Un delay(100) debería ser suficiente en la mayoría de los casos.

El ruido eléctrico propio de tu circuito o interferencias externas pueden afectar estas lecturas. Incluir la instrucción inputMode(A0, INPUT_PULLUP) antes de comenzar a leer puede solucionar parte del problema (esto activa la resistencia pullup interna conectada al pin analógico de Arduino) pero si lo vas a hacer de este modo tendrás que volver a tomar los valores para tu tabla de referencia, porque el pullup activado va a modificar los valores obtenidos.

Si hay relés conectados al circuito para la activación de cargas importantes (calefactores, motores, etc…) el “chispazo” de activación de los relés pueden provocar el ruido suficiente como para que e dispare una falsa lectura de tecla pulsada. En algún momento publicaré algo sobre filtros antichispa, pero mientras tanto podes googlear el tema.