Subir a Inicio

PaperTecladoAnalógico. Varios pulsadores con una sola entrada analógica

Descripción

Al realizar proyectos con microcontroladores, tarde o temprano nos encontraremos que nos faltan entradas para algunos pulsadores, una posibilidad es utilizar una entrada analógica, a la que conectaremos un divisor de tensión entre 5V y masa con múltiples resistencias. Si puenteamos las resistencias con pulsadores, el valor de tensión medido en la entrada analógica variará, obtenieńdose un valor concreto con cada pulsador. Mediante software asociaremos cada valor a un pulsador.



Como se aprecia en la figura, tenemos 11 resistencias iguales en serie colocadas entre 5v y masa, y de la mitad de las resistencia obtenemos una toma a la entrada analógica del micro.
Si no apretamos ninguna tecla, como hay el mismo número de resistencias a un lado y al otro obtendremos un valor de 2,5v. 
Si apretamos el pulsador P1 puenteamos la 5 primeras resistencias, llevando el punto de medición a Vcc (5v). 
Si accionamos el pulsador P10, puenteamos las 5 últimas, llevando el punto de medición a masa (0v).  
Y si accionamos cualquier otro pulsador obtendemos un valor intermedio.


La lista de valores asociados a cada pulsador es el siguiente:
(es una tabla OpenOffice que puedes descargar al final de esta página)



Esta tabla representa en columnas los valores de resistencias que se obtienen al activar cada pulsador.
Vamos a analizar el caso de activar el pulsador P3.
La resistencia entre el punto de medición y masa será Rout = 19,8 K
( R0 y R11 siempre están activas, para evitar que se produzca corto al pulsar simultáneamente P1 y P10)
La Resistencia total será Rtotal = 29,7 K
La intensidad que circula por las resistencias será V/Rtotal=5/29,7=0,17mA
Y la caida de tensión que se producirá en las últimas resistencias, es decir el valor que mediremos será Vout= I x Rout = 0,17 x 19,8 = 3,33 v
Pero como la entrada analógica del micro discrimina 1024 valores para 5v, este valor será de Vout(1024) = 3,33 * 1024 / 5 = 683
Este valor puede oscilar a causa del rizado de la fuente y de las tolerancias de las resistencias, así que creo que es mejor utilizar los valores intermedios, es decir podemos mediante el programa detectar que se ha pulsado el P3 si el valor leído está rntre 649 y 725.
Si utilizas Arduino, puedes comprobar que todo este rollo que te he soltado es correcto si cargas el ejemplo AnalogInSerial (ArduinoMenú/Files/Examples/AnalogInSerial) y observas los valores obtenidos cada vez que pulsas una tecla.

Como se aprecia en la tabla, el consumo máximo del teclado es de 0,22 mA y cuando no se pulsa ningúna tecla consume 0,13mA, valores perfectamente asumibles para una alimentación por baterías (si quieres puedes aumentar el valor de las resistencias para disminuir el consumo).


Realización

Como siempre utilizaremos el método Paper que consiste en ayudarnos en unas pegatinas para facilitarnos el proceso de montaje y soldadura.

Primero imprimiremos el documento PaperTecladoAnalógico.pdf (disponible en la parte inferior de esta página en el apartado de descargas):


Y después de comprobar con la regla situada a la izquierda de la página impresa que está a escala 1/1, recortamos la etiqueta:


Si quieres puedes protegerla pegando encima un poco de plástico autoadhesivo transparente. Añade algún tipo de pegamento y con ayuda de algo puntiagudo colócala encima de un trozo de stripboard de modo que encajen lo agujeros dibujados con  los de la stripboard.


Después con el punzón y sobre un soporte blando, perfora todos los agujeros de la etiqueta.



Comprueba al trasluz que no te has dejado ningún agujero:


Para hacer la placa más pequeña, he hecho algunas txapuzas:

He colocado en un mismo agujero varias resistencias, por lo que habrá que agrandar un poco los agujeros centrales:


También he cortado una de las patas de los pulsadores para que no produzcan cortocircuito (fíjate bien cual) ,




y la pata "coja" la soldamos con el interior de un trozo de cable unifilar:


 El resultado es el siguiente:


Se me olvidaba! en la parte inferior tienes que cortar las pistas:


para que quede algo parecido a esto:



Los tres cables de conexión los puedes soldar por la parte inferior.

Ha llegado el momento de comprobar que todo funciona. Si utilizas Arduino, puedes probarlo con el ejemplo AnalogInSerial o con los que tienes a tu disposición en el archivo de descarga.

Si ahora quieres ponerlo bonito, puedes realizar una carátula, como siempre recortamos y protegemos con plástico autoadhesivo la etiqueta frontal:



(en este caso pondremos también en la parte inferior, para intentar que con el uso no se estropee).



Después cortamos la carátula trasera que utilizaremos como plantilla para cortar el material que utilizaremos como marco.

 Transferimos las dimensiones del marco al cartón pluma:


Yo utilizo cartón pluma pero puedes utilizar cualquier material que tenga como mínimo el espesor de la placa.



Una vez cortado el cartón pluma, he colocado adhesivo de doble cara para fijar la pegatina delantera:



También coloco adhesivo en la parte trasera



Comprobamos que la placa entra en el alojamiento realizado en el cartón pluma:


Como en mi caso sobre bastante distancia entre la placa y el cartón pluma, lo relleno con papel doblado varias veces (hace el efecto de muelle).


Ahora colocamos la etiqueta trasera:



Y recortamos los exteriores  (había cortado el cartón-pluma con demasía).



Obteniendo el siguiente resultado:


Y por la parte trasera:


Funcionamiento

Para comprobar el teclado puedes realizar el montaje siguiente:

A continuación un ejemplo del programa de demostración del funcionamiento de los pulsadores para Arduino. 


/*
  Teclado analógico
 Lee el estado de un teclado compuesto por un divisor de tensión,
 cuyas resistencias son puenteadas a masa o a 5 voltios.
 El programa mostrará mediante pulsaciones de un led colocado entre el pin
 13 y masa, la tecla pulsada.

 El circuito:
 * Salida de "Teclado analógico" (cable azul) conectada a la entrada analógica 0
 * Cable rojo de "Teclado analógico" a 5v
 * Cable negro de "Teclado analógico" a masa. (GND)
 * the other side pin to +5V
 * Anodo del LED (pata larga) conectada a la salida digital 13
 * Cátodo del LED (pata corta) conectada a masa

 * Nota: como la mayoría de Aduinos ya incorporan un LED conectado
 al pin 13 en la placa, este led es opcional.


 Creado por Iñigo Zuluaga
 20-Jul-2010

 http://txapuzas.blogspot.com

 */

int TecladoPin = 0;    // Selecciona la entrada para el teclado
int ledPin = 13;       // Selecciona el pin del LED
int TecladoValor = 0;  // Variable para almacenar el valor analógico del teclado
int Pulsador=99;       // Variable que indica el pulsador accionado


void setup() {
  // declara ledPin como SALIDA:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // lee el valor analógico del teclado:
  TecladoValor = analogRead(TecladoPin);  
  if (TecladoValor>939) {
   Pulsador=4;
  }
 else if (TecladoValor>792) {
   Pulsador=3;
 }
 else if (TecladoValor>686) {
   Pulsador=2;
 }
 else if (TecladoValor>604) {
   Pulsador=1;
 }
 else if (TecladoValor>540) {
   Pulsador=10;
 }
 else if (TecladoValor>484) {
   Pulsador=99;
 }
 else if (TecladoValor>420) {
   Pulsador=5;
 }
  else if (TecladoValor>338) {
   Pulsador=6;
 }
 else if (TecladoValor>232) {
   Pulsador=7;
 }
 else if (TecladoValor>85) {
   Pulsador=8;
 }
 else if (TecladoValor>0) {
   Pulsador=9;
 }

 if (Pulsador != 99) {
   for (int cont=0; cont < Pulsador; cont++) {
   // Enciende el LED:
   digitalWrite(ledPin, HIGH);
   // Espera 200 milisegundos:
   delay(200);        
   // Apaga el LED:      
   digitalWrite(ledPin, LOW); 
   // Espera 200 milisegundos:
   delay(200);
   }
 }             
}



Y otro, pero esta vez encapsulado en una función para que sea más fácil su utilización.




  /*
  Ejemplo de utilización de una función de lectura del Teclado analógico
 Lee el estado de un teclado compuesto por un divisor de tensión,
 cuyas resistencias son puenteadas a masa o a 5 voltios.
 El programa mostrará mediante pulsaciones de un led colocado entre el pin
 13 y masa, la tecla pulsada.

 El circuito:
 * Salida de "Teclado analógico" (cable azul) conectada a la entrada analógica 0
 * Cable rojo de "Teclado analógico" a 5v
 * Cable negro de "Teclado analógico" a masa. (GND)
 * the other side pin to +5V
 * Anodo del LED (pata larga) conectada a la salida digital 13
 * Cátodo del LED (pata corta) conectada a masa

 * Nota: como la mayoría de Aduinos ya incorporan un LED conectado
 al pin 13 en la placa, este led es opcional.


 Creado por Iñigo Zuluaga
 20-Jul-2010

 http://txapuzas.blogspot.com

 */

int TecladoPin = 0;    // Selecciona la entrada para el teclado
int ledPin = 13;       // Selecciona el pin del LED
int TecladoValor = 0;  // Variable para almacenar el valor analógico del teclado
int Pulsador=99;       // Variable que indica el pulsador accionado


void setup() {
  // declara ledPin como SALIDA:
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // lee el valor analógico del teclado:
 Pulsador=LeerTeclado();          // Va a la función de lectura del teclado
 if (Pulsador != 99) {            // Si se ha pulsado una tecla ...
   for (int cont=0; cont < Pulsador; cont++) {
   // Enciende el LED:
   digitalWrite(ledPin, HIGH);
   // Espera 200 milisegundos:
   delay(200);        
   // Apaga el LED:      
   digitalWrite(ledPin, LOW); 
   // Espera 200 milisegundos:
   delay(200);
   }
 }             
}

int LeerTeclado(){
  /* Devuelve el valor de la tecla pulsada
  Entradas=0
  Salidas=Pulsador(1-10,99)
  Cuando no se acciona ninguna tecla devuelve 99.
  */
  int TecladoValor =0;
  int Pulsador=0;
  TecladoValor = analogRead(TecladoPin);  
  if (TecladoValor>938) {
   Pulsador=4;
  }
 else if (TecladoValor>792) {
   Pulsador=3;
 }
 else if (TecladoValor>685) {
   Pulsador=2;
 }
 else if (TecladoValor>614) {
   Pulsador=1;
 }
 else if (TecladoValor>521) {
   Pulsador=10;
 }
 else if (TecladoValor>500) {
   Pulsador=99;
 }
 else if (TecladoValor>418) {
   Pulsador=5;
 }
  else if (TecladoValor>337) {
   Pulsador=6;
 }
 else if (TecladoValor>230) {
   Pulsador=7;
 }
 else if (TecladoValor>84) {
   Pulsador=8;
 }
 else if (TecladoValor>0) {
   Pulsador=9;
 }
return Pulsador;
}



Y por fin el programa funcionando:





Información legal

1. Propiedad intelectual
Todos los derechos de propiedad intelectual del contenido de Txapuzas eléctronicas, están bajo una licencia Creative Commons Share-Alike, cuyo contenido podéis revisar en este enlace.
Por tanto queda permitido copiar, distribuir, comunicar públicamente la obra y hacer obras derivadas de la misma, siempre que se respeten los términos de la licencia arriba reseñada.
3. Actualizaciones y modificaciones de Txapuzas electrónicas
El autor se reserva el derecho a actualizar, modificar o eliminar la información contenida en Txapuzas eléctrónicas, y la configuración o presentación del mismo, en cualquier momento, sin previo aviso, y sin asumir responsabilidad alguna por ello.
4. Indicaciones sobre aspectos técnicos
El autor no asume ninguna responsabilidad que se pueda derivar de problemas técnicos o fallos en los equipos informáticos, que se produzcan a causa de los circuitos e ideas expuestos en el blog de txapuzas electrónicas, así como de los daños que pudieran ocasionar.
El autor se exime de toda responsabilidad ante posibles daños o perjuicios que pueda sufrir el usuario a consecuencia de errores, defectos u omisiones en la información facilitada.


Descargas

El esquema, descripción e imágenes están disponibles en el siguiente enlace:

Si tienes problemas con el enlace anterior, aquí puedes descargar todos los archivos de txapuzas

Notas
Para la realización de este proyecto se han utilizado los programas: Arduino, Inkscape, Openoffice, Gimp, Picasa, Fritzing
Si encuentras algún fallo, se te ocurre alguna mejora, o simplemente quieres hacer algún comentario, te lo agradeceré: Gracias :-)


15 comentarios:

  1. Hola, quisiera hacerles una pregunta, soy principiante en la aplicación de electrónica y uso de Arduino: ¿se podrían conectar varios teclados en el resto de las entradas analógicas?, ¿habría que hacer un arreglo especial?

    ResponderEliminar
  2. Hola Bringas,
    Si. Claro que puedes conectar varios teclados.
    Cada uno a una entrada analógica; sólo tendrás que modificar el programa para que vaya leyendo el valor de cada entrada analógica.
    Saludos

    ResponderEliminar
  3. hola, quisiera preguntar, las resistencias deben de ser de 3.3k o pueden ser de otro valor?? hay algun valor maximo o minimo de resistencias que se pueda usar, contemplando el voltaje del arduino, corriente etc?? por que usaron 3.3k??
    Muchas gracias de ante mano, es muy interesante todo el trabajo que realizan :D

    ResponderEliminar
  4. Hola anónimo
    Las resistencias pueden ser de otro valor: 1K, 2K, 4K... No hay ningún problema en utilizar otro valor. Simplemente comprueba con la tabla de cálculo que la intensidad consumida por las resistencias no sea muy elevada, ya que no tiene mucho sentido estar gastando batería o calentar el micro si no es necesario.
    El micro (Arduino), puede suministrar hasta 40mA por patilla. Con un valor de 3,3K estamos consumiendo 0,13mA cuando no se pulsa ninguna tecla y en función de la tecla pulsada hasta 0,22mA, luego tienes todavía mucho margen.
    (valores convenientes de consumo podrían ser de 0,10mA a 3mA)

    Saludos

    ResponderEliminar
  5. Tengo una duda, en el caso de querer medir 20 pulsadores en vez de 10 con una sola entrada... tendría que usar 21 resistencias, pero da igual el valor? digo con 3,3k funcionaria?

    ResponderEliminar
    Respuestas
    1. Hola Manoloide
      Teóricamente sí, pero debes tener en cuenta de que la diferencia de tensión de un pulsador a otro solo será de 0,5v, por lo que la alimentación del micro deberá estar bien filtrada, y la tensión analógica también. (Si usas un Arduino comercial no deberías tener problemas, ya que traen de serie este filtrado).
      La resistencia puede ser de 3,3K. Lo que haría yo si quieres poner tantos pulsadores es utilizar resistencias de precisión 1% para que no haya muchas desviación.

      SL2

      Eliminar
    2. Disculpa si oprimo varios pulsadores a la vez que sucederá? esque estoy haciendo un piano y quiero que sea de 36 teclas claro usare las otras entradas analógicas del 16f88 y el programa se puede usar en MicroCodeSTudio sino cuales serian los comando que se usarían? solo un ejemplo y ya de ahí me baso en los demas

      Eliminar
  6. Muchas gracias! Por responder y tan pronto, esta muy bueno el blog. Y gracias por el consejo :)

    ResponderEliminar
  7. este metodo no crea confuciones al activar varios pulsadores a la vez?

    ResponderEliminar
  8. amigo me urge si podrias ayudarme a realizar un temporizador con relevador,
    con el shield LCD KEYPAD SHIELD PARA ARDUINO UNO claro, yo haria una donacion por tu trabajo porfa www.erosin12@hotmail.com

    ResponderEliminar
  9. Enhorabuena por la página, ya muchas veces he usado esta sección y estoy acopiando material para hacer la CNC, pero ahora mismo tengo un problema. Uso esta configuración con un DIP switch en un sistema con varias placas gemelas para automáticamente seleccionar el IP pero mi conversor Analogico-Digital no funciona porque tiene una dispersión de valores muy grande. En mi placa tengo el pin 20 conectado a 5V y el 21 (Aref) al aire, me puede ayudar? Es un dipswitch de 8 contactos y debería tener resolución más que sobrada para lo que quiero.

    ResponderEliminar
  10. hola amigo muy bueno tu proyecto, quisiera saber si seria muy dificil hacer que al apretar uno de los botones se quede en ese estado (prendido) hasta que se vuela a presionar y ahi se apague, se que se deben usar or=tras variables para el antes y despues, pero hasta ahi llego, soy nuevo y aun estoy estudiando. saludos

    ResponderEliminar
  11. buenas tarde, quisiera saber si este teclado se podría usar con attiny85. gracias

    ResponderEliminar
  12. Hola muy buen bloc, solo un apregunta, como puedo otorgar a cada uno de los pulsadores, un valor de un teclado convenciona de 103 teclas? ejem si pulso P1 que me escribiera la "C"
    Muchas gracias de antemano

    ResponderEliminar
  13. Buenas
    La intensidad que pasa por la serie de resistencias es de 0,00016835 mA, la fórmula es en ohmios no en kilo ohmios

    ResponderEliminar