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