Página principal

DISEÑO DE UN TECLADO ANALÓGICO PARA APLICACIONES CON MICROCONTROLADOR

Ing. Alfredo Segura
México, 2011



DISEÑO DE UN TECLADO ANALÓGICO PARA APLICACIONES CON MICROCONTROLADOR

En algunos de nuestros diseños electrónicos con microcontroladores hemos de incluir un teclado para introducir datos o seleccionar opciones. Sin embargo pensar en un teclado matricial nos lleva a tener que elegir un microcontrolador (uC) con un mayor número de terminales para poder realizarlo. Son comunes los teclados matriciales de 4X4 (4 renglones por 4 columnas), para lo cual se requieren 8 pines de I/O en el uC.

Si el diseño requiere un teclado de las dimensiones adecuadas, podemos recurrir a un teclado analógico, el cual se puede lograr usando resistencias en serie y en cada unión de dos resistencias, se coloca el  botón que aterriza ese nodo. El arreglo se muestra en la siguiente figura:



Es conveniente utilizar una fuente de tensión muy estable, como por ejemplo el CI TL-431 o cualquier otro que se encuentre en el mercado. La razón de esto es porque el voltaje Vo a la salida del teclado analógico deberá ser siempre del mismo valor para una tecla específica y así para todas las teclas incorporadas al teclado.

La salida del teclado analógico deberá ser conectada a una entrada analógica en el uC debidamente programado para que haga la lectura o sondeo constante de dicha entrada. Es claro, según el diagrama anterior que, sin oprimir ninguna tecla, el voltaje Vo será el de la fuente estable y por lo tanto el programa en el uC, no hará acción alguna relacionada al teclado, sino que seguirá con sus actividades programadas.

Tan pronto se presiona una de las teclas, el uC recibirá por la entrada analógica la tensión correspondiente que resulta de la división entre Rv y la suma de R1 a Rn:


Vo = Vi(R1 + … + Rn) / [Rv + (R1 + … + Rn)]


Por supuesto que el diseñador podrá elegir libremente el nombre de cada tecla, de acuerdo con las actividades que el uC debe realizar al presionarse una de ellas. En el diagrama se han etiquetado como las típicas de un teclado con 16 posiciones, sin el punto(.):

0, #, D, C, 3, 2, 1, 4, 5, 6, B, A, 7, 8, 9


Así que el módulo ADC (Analog To Digital Converter) o Convertidor Analógico a Digital del microcontrolador podrá entregar un valor digital diferente por cada una de las teclas que se vayan presionando.

Para tener un span mas alto en los valores de cada tecla, Rv podrá elegirse del valor mas adecuado para que Vo sea el valor mas bajo apreciable cuando se presiona la tecla “0”.  Así, para cuando se presione la tecla “7”, la suma de todas las resistencias R1 + … + R15, involucradas en la ecuación de Vo, proporcionen el valor mas alto de tensión.

Hay que aclarar que este modelo de teclado analógico no se puede usar para oprimir varias teclas simultáneamente, porque al oprimir solamente una de ellas, se anulan las mas alejadas a la salida Vo. Sin embargo, se puede crear otro ramal de teclas, que serán exclusivas para usarse en forma simultánea con las primeras, para expandir las funciones. De todos modos, otro ramal de teclas en una misma PCB, no es muy difícil de obtener y el uC destinaría una entrada adicional analógica para recibir esta nueva señal.

A continuación se muestra un ejemplo de programa en Cpp para un microcontrolador PIC 12F675 que tiene únicamente 8 terminales:

/*
Programa con el 12f675 y un HT12E que sirve para leer un teclado analógico
usando una cadena de resistencias de 1k formando un divisor de tensión con otra
de 10K a Una fuente de voltaje regulado (Vi). Dependiendo de la tecla presionada
y del voltaje convertido se traduce en el numero BCD de la tecla que
corresponda.

Alfredo Segura enero de 2011, México.
*/

#include <12f675.h>
#define adc = 10
#fuses INTRC_IO, NOMCLR, NOWDT, PUT, NOBROWNOUT, NOCPD, NOPROTECT
#use delay(clock = 4000000)

#use fast_io(a)

#byte Port_A = 0x05

#bit ra0 = 0x05.0  // Entrada Analógica
#bit ra1 = 0x05.1  // D0
#bit ra2 = 0x05.2  // D1
#bit ra3 = 0x05.3
#bit ra4 = 0x05.4  // D2
#bit ra5 = 0x05.5  // D3

#rom 0x03FF = {0x3438 }  // solo poner si se usa el programador USP 3.0

int i = 0, cod1, cod2, dato, comd;

void enviar(comd) {    // comd viene como 0b000001, 0b0000111
  cod1 = comd << 1;    // Recorre una vez para acomodar D0 en D1 y D1 en D2
  cod2 = cod1 << 1;    // Recorre otra vez para acomodar D2 en D4 y D3 en D5
  cod1 = cod1 & 0x0F;  // Protege nibble bajo
  cod2 = cod2 & 0xF0;  // Protege nibble alto
  comd = cod1 | cod2;  // Reúne ambas partes
  Port_A = comd;       // saca dato por el puerto
  delay_us(200);       // lo exhibe un momento
}

void ini(void) {
  setup_adc(adc_clock_internal);
  setup_adc_ports(san0);
  setup_comparator(nc_nc_nc_nc);
  set_tris_A(0b00001001);
  Port_A = 0x00;
  i = 0;
}

void main(void) {
  ini();
  delay_ms(300);  // Retardo de 300 ms al encender el pic

  while (true) {
    dato = read_adc();
    delay_ms(100);

    if ((dato >= 111) && (dato <= 120)) {  // no hay dato
    }

    if ((dato >= 0) && (dato <= 5)) {  // tecla "1"
      comd = 0x01;                     // Tecla "1"
      enviar(comd);                    // envía dato
    }
    if ((dato >= 18) && (dato <= 30)) {  // tecla "2"
      comd = 0x02;                       // Tecla "2"
      enviar(comd);                      // envía dato
    }
    if ((dato >= 36) && (dato <= 49)) {  // tecla "3"
      comd = 0x03;                       // Tecla "3"
      enviar(comd);                      // envía dato
    }
    if ((dato >= 55) && (dato <= 65)) {  // tecla "4"
      comd = 0x04;                       // Tecla "4"
      enviar(comd);                      // envía dato
    }
    if ((dato >= 68) && (dato <= 78)) {  // tecla "5"
      comd = 0x05;                       // Tecla "5"
      enviar(comd);                      // envía dato
    }
    if ((dato >= 80) && (dato <= 89)) {  // tecla "6"
      comd = 0x06;                       // Tecla "6"
      enviar(comd);                      // envía dato
    }
    if ((dato >= 91) && (dato <= 99)) {  // tecla "7"
      comd = 0x07;                       // Tecla "7"
      enviar(comd);                      // envía dato
    }
    if ((dato >= 101) && (dato <= 108)) {  // tecla "8"
      comd = 0x08;                         // Tecla "8"
      enviar(comd);                        // envía dato
    }
  }
}


Se ha elegido un microcontrolador de 8 terminales, con la finalidad de dejar claro que un teclado analógico es muy recomendable para el ahorro de terminales, pudiendo ser destinadas el resto a otras entradas o salidas.

En la siguiente imagen se muestra la tarjeta PCB únicamente del teclado analógico, en el cual se insertarán y soldarán las resistencias de 1 K y los botones, colocando un conector de 3 pines como interface con la tarjeta donde se instale el microcontrolador PIC12F675:




Ing. Alfredo Segura
México, 2011