Está en la página 1de 6

Programa.

Diseo de un teclado usando un solo pin del ADC


Por David Infante Snchez
Fundador de www.comunidadatmel.com
dinfante29@hotmail.com

En los programas del curso del CD del programador se vieron varios teclados, uno de ellos
era usar un pin por cada tecla, pero si tenemos 16 teclas ocuparamos 16 pines;
posteriormente se analiz un teclado matricial y para 16 teclas ocuparamos una matriz de
4*4, necesitndose 4 pines de entrada y 4 pines de salida para hacer el barrido de las teclas.
Pero hay una forma ms econmica refirindonos al ahorro de pines y es haciendo que cada
tecla genere un voltaje distinto para diferenciarla de otra tecla. Inclusive es la forma en que
los electrodomsticos funcionan como los estreos de casa que tienen muchas teclas, hacen
que cada tecla genere un voltaje distinto.
Tericamente si tenemos un ADC de 8 bits podramos tener hasta 256 teclas, pero en la
prctica no es posible porque las resistencias tienen tolerancias y hay que separar cada tecla
en un voltaje para diferenciar entre cada tecla. Recuerdo que un alumno quera hacer un
teclado matricial que le expliqu, pero luego le expliqu tambin el teclado con el ADC el
cual le permiti ahorrar muchos pines, pero cuando lo expuso ante otros dijeron que por
qu no lo hizo pin a pin como debera hacerse un teclado y aunque l coment que as
funcionaban los teclados de los electrodomsticos (que funcionan y se venden por millones)
no aceptaron esta idea, que comento no es nueva, ni invencin ma es algo que ya haba
visto en algunas notas de aplicacin, pero la realidad de la no aceptacin de cuando expuso
esa aplicacin es porque las personas se van quedando obsoletas y cuando ven algo nuevo y
al no entenderlo se cierran, pero comento esta es la forma en que se manejan los teclado de
todos los electrodomsticos y es a travs de la generacin de voltajes, y es que esto permite
ahorrar pines en el chip ya que uno slo pin puede usarse para detectar muchas teclas.
Regresando al tema, veamos la red resistiva de la figura 1:
En el ejemplo las 4 resistencias son de 1Kohm, pero lo importante es que si las 4
resistencias son iguales el voltaje que habr en los extremos de la resistencia sern: 1.25,
2.5, 3.75 y 5 volts. Entonces si se presiona el B0 Vg=1.25V, si se presiona B1 Vg=2.5, B2
Vg=3.75 y B4=5 volts. Ese Vg es el que aplicamos al pin del ADC del microcontrolador,
pero si no se presiona ninguna tecla qu voltaje habra en Vg? Sera cero, pero resulta que
en el ADC el pin quedar flotado porque no est conectado a ningn potencial, as que el
ADC medir ruido, as que tenemos que modificar el circuito para fijar el ADC a un
potencial de cero cuando no se presione ninguna tecla, figura 2.


Figura 1. Voltajes generados con una red resistiva.
En la siguiente figura se aprecia que el Vadc=0 cuando no se presione ninguna tecla porque
est fijado a cero a travs de la resistencia de pull down.

Figura 2. Se pone una resistencia mucho ms grande que las resistencias del divisor para
disminuir el efecto de carga.
Vea el circuito equivalente de la figura 3 cuando se presiona B0

Figura 3. Queda en paralelo la resistencia inferior con la R de 100Kohms y es igual a
990.09 ohms
Cuando se presiona el B1 queda en paralelo las 2 resistencias inferiores con la resistencia
de 100 Kohm y su equivalente es de 1960 ohms, en lugar de 2 Kiloohms.

Vemos que al ser grande esa resistencia de 100Kohms su efecto sobre las resistencias del
divisor disminuye, si fuera muy pequea su efecto modificara las resistencias del divisor y
por lo tanto sus voltajes. As que despreciaremos el efecto de carga de esa resistencia y
consideraremos que los voltajes generados son 1.25, 2.5, 3.75 y 5 volts. Si se colocan ms
teclas y ms resistencias probablemente si requiera ver los voltajes que se generaran
considerando el efecto de la resistencia de pull down.
Cuando se presiona la tecla B1 se coloca en paralelo las dos resistencias de 1Kohm con la
de 100 Kohm, as que el voltaje en la segunda resistencia no es de 2.5 Volts sino de 2.47
Volts, vemos que el efecto en el voltaje no es muy grande, as que lo seguiremos
considerando de 2.5 volts.
Vamos a suponer que tiene una red de 100 teclas y 100 resistores de 1Kohm y se presiona
la ltima tecla, la resistencia equivalente sera 100Kohm en paralelo con 100 resistores de 1
Kohm=50 Kohms, en lugar de 100 kohms, as que cuando hay muchas teclas y resistores el
efecto de carga se va haciendo ms grande y deber calcular los voltajes generados cuando
se presione la tecla, pero en el caso de pocas teclas no influira el efecto de esa resistencia.
Ya sabemos dos cosas: una que mis dibujos tienden a un estilo de cubismo postmodernista
y que al presionarse la tecla de la tabla se genera el voltaje que muestra la misma, pero
suponga que usamos el ADC en 8 bits y el Vref=5volts as que el valor en cuentas es el que
se muestra:
Tecla presionada Voltaje generado Valor en cuentas
B0 1.25 64
B1 2.5 127
B2 3.75 191
B3 5 255

Para sabemos que las resistencias no son exactas as que colocamos un rango de holgura,
vea que entre tecla y tecla hay aproximadamente 64 cuentas de diferencia. Entonces
podemos hacer que el rango para detectar la tecla sean 32 cuentas hacia arriba y 32 hacia
abajo del valor calculado por si la resistencia real es ms grande o ms pequea por la
tolerancia.
Recalculamos la tabla anterior agregndole cuentas hacia arriba y hacia abajo quedndonos:
Tecla presionada Valor en cuentas Rango en cuentas
B0 64 32 a 96
B1 127 97 a 159
B2 191 160 a 223
B3 255 Mayor a 223

Con ese rango hacemos que si el voltaje est entre 32 y 96 sabemos que es la tecla B0 la
que se presion y hacemos inmune la tecla a la tolerancia del resistor o variaciones de
voltaje. En el programa haremos:
if (valor_adc >=32 & Valor_adc<97)
Tecla=0;

Y esa prueba la haremos para todos los rangos y ver a qu tecla corresponde la que se
presion segn el voltaje (cuentas) que gener la lectura del ADC.
Aunque este programa slo verifica 4 teclas, bien puede hacer un teclado ms grande. La
resistencia de pull down puede modificarla hasta unos 220 Kohms para disminuir ms el
efecto de carga.
Vea la configuracin de los perifricos en el codewizard.


Arme el siguiente circuito y aada lo que est en azul para que pruebe el programa.


En el divisor no podemos poner resistencias muy bajas porque aumentara el consumo de
energa al aumentar la corriente, y no las ponemos tampoco muy elevadas porque sera
grande el efecto de carga con la resistencia de pull down, al circuito slo agregue la
pantalla de LCD.
while (1)
{
lcd_gotoxy(4,0);
lcd_putsf("Tecla=");

valor=read_adc(0);
if ((valor>=32) && (valor<97))
tecla=0x31; //Tecla=1 en ASCII

if ((valor>=97) && (valor<160))
tecla=0x32; //Tecla=2 en ASCII

if ((valor>=160) && (valor<224))
tecla=0x33; //Tecla=3 en ASCII

if (valor>=224)
tecla=0x34; //Tecla=4 en ASCII

lcd_putchar(tecla);
// Place your code here

};

Si desea un teclado ms grande slo se ocupan ms resistores en el divisor de tensin y
recalcular la tabla para ver los voltajes que se generaran y el valor en cuentas de la
conversin.

Hay muchos teclados con el ADC y propuestas de redes resistivas, pero esta es la que se me
ocurri y me parece factible.

Cuando conecte el circuito el primer valor que desplegar ser basura porque la variable
tecla no est inicializada, puede inicializarla en el programa a un valor conocido.

Y para terminar falta el comentario final: No atiendo correos de dudas particulares, slo
atiendo correo de profesores.