Teclado 4x4 Resist

download Teclado 4x4 Resist

of 76

Transcript of Teclado 4x4 Resist

Objetivo: Leer un teclado matricial de 4 x 4 teclas mediante un nico pin del PIC o Arduino.

Conceptos involucrados: Suma de resistencias en serie, divisor de tensin y conversin Analgico-Digital del PIC oArduino.

Necesitamos: Un teclado matricial de 4 x 4 teclas, 9 resistencias.

Antecedentes: En el documento "Hardware Techniques for PICmicro Microcontrollers"AN234de Microchip se describe someramente lo que vamos a intenta realizar. De ah he sacado la idea y a continuacin os describir lo que he desarrollado a partir de ella.

Desarrollo: Como todos sabes, un teclado matricial 4 x 4 es un arreglo compuesto por 4 x 4 teclas con 4 + 4 lneas que conectan entre si las teclas, una lnea por cada fila de teclas ms una lnea por cada columna de teclas. Al ser pulsada una cualquiera de ellas une entre s una de las lneas, la de su columna, con otra de ellas, la de su fila. As al pulsar una tecla quedan unidas solo dos de las ocho que tiene.

Tradicionalmente se ha conectado un teclado de estos a un PIC o Arduino, usando 8 pines de ste, 4 para las filas y 4 para las columnas y se lean poniendo en alto las filas, o las columnas, y leyendo las columnas, o las filas, para detectar qu tecla se haba pulsado. Esta tcnica es muy fcil de implementar pero tiene el costo de usar muchos pines del PIC.

Lo que aqu vamos a desarrollar es la idea de poder hacer esto mismo pero haciendo uso de un solo pin del PIC o Arduino, pero que tenga la especial funcin de Conversor Analgico - Digital. Para ello tenemos que conseguir que al pulsar cada una de las teclas obtengamos un voltaje distinto en una nica lnea. Leyendo este voltaje con el Conversor AD del PIC podemos llegar a saber qu tecla es la que se ha pulsado.

Una imagen vale ms que mil palabras:

Como veis en ella cada crculo en la rejilla central del teclado del dibujo representa una de las teclas, que al pulsar une una de las resistencias de R1 a R4 conectadas a VDD con otra de R5 a R8 conectadas al PIC. As si pulsamos en la tecla situada en la esquina superior izquierda tendremos que VDD le llega al PIC tras atravesar R1+R5. Si por el contrario pulsamos la tecla inferior derecha la corriente nos llegar a travs de la unin entre R4+R8. Siempre que pulsemos una tecla cualquiera obtendremos un voltaje de cada entre la suma de dos resistencias Rcolumna+Rfila

Otro detalle a tener en cuenta es que si no pulsamos ninguna tecla nuestro pin del PIC estara conectado a nada, la lnea que une el pic con las resistencias R5 a R8 y tras ella el vaco. Esto podra, y sera con total seguridad, una verdadera antena que recogera todo lo que pasase cerca de all, dndonos todo tipo de lecturas falsas mientras no pulssemos ninguna tecla. Para evitar ese efecto colocamos R9 que mantendr el pin del conversor conectado a GND mientras nos pulsemos nada sobre el teclado.

Pero esta configuracin es lo que conocemos como unDivisor de Tensinen la que tenemos una resistencia conectada a VDD y otra a GND y nosotros tomamos el valor del voltaje en la unin que hay entre ellas.

Este divisor de tensin en el que tenemos un Vino voltaje de entrada y un Vouto voltaje de salida tras l, que es perfectamente calculable mediante la frmula que aparece a la derecha.Como vemos en esta configuracin lo que llamamos aqu Rtopes lo que en nuestro teclado hemos llamado Rcolumna+Rfilao sea la suma de las dos resistencias correspondientes al pulsar una tecla en l. Y Rbottomes nuestra R9 del teclado.

La gran falta del documento de Microchip es que no nos aporta ni valores de R1 a R9, ni comportamiento aproximado de cmo podramos elegir dichos valores. Pero con lo que hemos visto hasta aqu estamos en condiciones de poder calcular con bastante precisin el comportamiento de nuestro circuito, sabiendo que Rtop es Rc+Rf y que VDD es 5V podemos concluir que Vout = R9 / R9+Rc+Rf * 5V y as tendremos un valor de Vout para cada pareja de resistencias Rc+Rf.

Con esta informacin me he construido una tabla Excel en la que he puesto primero la tabla de resistencias de columnas y filas y las distintas sumas de cada una de ellas. Despus otra con los distintos voltajes que se generan en el divisor de tensin con cada una de las parejas anteriores. Y por ltimo otra tabla en la que hago corresponder cada uno de estos voltajes con el valor de la conversin AD del PIC con precisin de 10 bits (1024 -> 5V lo que Vout es a X)

Jugando con las combinaciones entre valores de unas y otras resistencias he llegado a obtener uno valores que veo correctos.

Los resultados:

Nota1

Como podemos ver tenemos abajo los valores que vamos a obtener en la conversin A/D para cada tecla pulsada. Son valores razonablemente separados unos de otros y que nos pueden permitir leer nuestro teclado con un nico pin del PIC o Arduino que es lo que queramos hacer.Tutorial de uso de un teclado matricial, en forma digitalhttps://www.youtube.com/watch?v=-Hhb-mamd10En la pgina de: http://playground.arduino.cc/Main/KeypadTutorial#.UzRWd6h5Ph4Teclado matricial de 16 teclas (O keypad)

Nueva adquisicin: teclado matricial de 16 caracteres, gestionado por 8 pines (4 filas x 4 columnas). Y esto para qu? Pues para muchas cosas, montar una alarma, manejar un sistema domtico (dcese de un sistema para manejar los aparatos domsticos de forma centralizada o incluso programada o a distancia), introducir valores de prueba a un circuito...

Bueno, y esto como se maneja? Pues en Arduino, la forma ms sencilla, es conectar cada patilla a un pin de entrada, usando un total de 8, y mediante la librera Keypad, y un sencillo cdigo, que el Arduino detecte qu tecla se ha pulsado. Como veremos a continuacin, la distribucin de las teclas se introduce en una matriz en el cdigo, los pines donde se han conectado las filas y columnas se introducen en un array (una variable de programacin que es algo as como un listado ordenado) y luego la librera Keypad se encarga de interpretar las pulsaciones.

#include

const byte FILAS=4; //cuatro filasconst byte COLS=4; //cuatro columnas//definimos el keymapchar keys[FILAS][COLS]={ {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'}};//conectar los pines FILA0,FILA1,FILA2,FILA3 a estos pins de arduino MEGAbyte rowPins[FILAS]={39,41,43,45};//conectar los pines COL0, COL1, COL2, COL3 a estos pins de arduinobyte colPins[COLS]={47,49,51,53};//crear el keypadKeypad keypad = Keypad(makeKeymap(keys),rowPins,colPins, FILAS, COLS);

void loop(){ keypad.getKey(); //funcin que este leyendo de la entrada analogica de la ldr y si salta estando activada, mete un delay de 30seg y suena}

Los pines usados se corresponden a un Arduino MEGA (mi ltima adquisicin), con 54 pines E/S digitales.

PROBLEMAS INICIALES:

Cuando conectas todas las patillas del keypad seguidas, te encuentras con el primer problema: cul es cul?En mi caso, la solucin ha sido aadir unSerial.print(Keypad);en el loop e ir pulsando cada tecla, de modo que iba viendo cual era cual y ponindolo en una tabla. Al final me di cuenta de que lo estaba conectando al revs, y solo tuve que cambiar el orden de los pines en los arrays COLS y FILAS.

Y si no tienes pines suficientes en el Arduino?Si no usas un MEGA, lo ms probable es que no tengas pines suficientes, y entonces te viene el problema de cmo ahorrar pines. Bien, pues puedes usar 1 slo pin analgico para leer todos los valores del keypad. Cmo? Pues tras husmear por la red, encontr varias pginas, la mayora en ingls, sobre cmo usar un divisor de tensin para indicar qu tecla se est pulsando.Esto se basa en colocar una determinada resistencia en cada patilla, de modo que la entrada analgica lea un valor de voltaje distinto en funcin de la tecla que hayamos pulsado.Ensta entrada, el autor, Ramrez (desde aqu muchas gracias) explica los fundamentos fsicos de ste efecto, y las frmulas en las cuales se basa.Luego, el pin de entrada se conecta a una entrada analgica, y mediante programacin, se averigua cual es la tecla que se ha pulsado:

stas son las resistencia que he usado yo (salen valores justos porque he usado las que he encontrado por casa, sin comprar ninguna ms)

R10 Ohm

R2330Ohm

R3380Ohm

R430Ohm

R580Ohm

R6100Ohm

R7330Ohm

R81000Ohm

R91000Ohm

Tenis ms informacin en la web dePonteduino, con los esquemas grficos que he seguido para el clculo de resistencias.

Para implementar sta solucin, he reescrito ste cdigo (de nuevo basado en el del grupoPonteduinode Pontevedra)char teclado;

void setup() {

Serial.begin(9600);}

void loop() { char codigo[4]; for (int i=0;i=936 && entradateclado=920 && entradateclado=761 && entradateclado=504 && entradateclado=719 && entradateclado=708 && entradateclado=609 && entradateclado=430 && entradateclado=691 && entradateclado=685 && entradateclado=590 && entradateclado=424 && entradateclado=916 && entradateclado=902 && entradateclado=750 && entradateclado=499 && entradateclado 834 ) teclado='7';//else if ( entradateclado > 769 )teclado='4';//else if ( entradateclado > 716 )teclado='1';else if ( entradateclado > 674 )teclado='A';//else if ( entradateclado > 632 )teclado='8';//else if ( entradateclado > 594 )teclado='5';else if ( entradateclado > 562 )teclado='2';//else if ( entradateclado > 529 )teclado='0';//else if ( entradateclado > 496 )teclado='9';//else if ( entradateclado > 472 )teclado='6';//else if ( entradateclado > 452 )teclado='3';else if ( entradateclado > 392 )teclado='B';else if ( entradateclado > 334 )teclado='F';//else if ( entradateclado > 323 )teclado='E';else if ( entradateclado > 313 )teclado='D';else if ( entradateclado > 305 )teclado='C';

if (ultecla != teclado){Serial.print("Tecla ");Serial.println(teclado);delay(500);ultecla=teclado;}}Este es uncdigobsicopero expresa la idea de lafuncinde estatcnica.La desventaja de utilizar un A/D radica en ladiscriminacinde teclas.tambinen la sensibilidad a variaciones de voltaje, y finalmente en laselecciny valor real de los valores de resistencias a tomar.Hasta laprxima...

Un ejemplo mas de teclado matricial.

Vamos a utilizar un elemento de entrada muy interesante, un teclado matricial de 4 x 3.Un teclado matricial cuenta con filas y columnas, cuando se presiona un botn, se activa la salida correspondiente a la fila y la columna en la que se encuentra dicho botn, leyendo estos datos podemos saber cual a sido el presionado.

Este funcionamiento es el mismo que en los mapas, o en el juego de hundir la flota, si tienes una coordenadas con la fila y la columna estas definiendo un punto nico.Conectaremos el matriz a Arduino de la siguiente forma: ProtoboardEsquemaLo que haremos ser leer las entradas digitales de Arduino para saber cuales estn a 1 y cuales a 0, en el momento en que tengamos dos 1 podremos averiguar que botn esta siendo pulsado.Para ello utilizaremos la librera keypad , que nos simplificar la lectura de las entradas. Pero para que funcione deberemos crear una matriz con la distribucin de las teclas (de ah el nombre de teclados matriciales, porque se pueden representar cmo una matriz.), a parte de esto, la librera tambin necesita saber el numero de filas (rows) y columnas (cols) de nuestro teclado y los pines a los que corresponde cada uno de ellos. Veamos todo ello en el cdigo, que nos permitir leer por serial lo botones que pulsamos.view plainprint?1. //aadimoslalibrerakeypad2. include/* Keypadtest.pde * * Demonstrate the simplest use of the keypad library. * * The first step is to connect your keypad to the * Arduino using the pin numbers listed below in * rowPins[] and colPins[]. If you want to use different * pins then you can change the numbers below to * match your setup. * */#include

const byte ROWS = 4; // Four rowsconst byte COLS = 3; // Three columns// Define the Keymapchar keys[ROWS][COLS] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'}, {'#','0','*'}};// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.byte rowPins[ROWS] = { 9, 8, 7, 6 };// Connect keypad COL0, COL1 and COL2 to these Arduino pins.byte colPins[COLS] = { 12, 11, 10 };

// Create the KeypadKeypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

#define ledpin 13

void setup(){ pinMode(ledpin,OUTPUT); digitalWrite(ledpin, HIGH); Serial.begin(9600);}

void loop(){ char key = kpd.getKey(); if(key) // Check for a valid key. { switch (key) { case '*': digitalWrite(ledpin, LOW); break; case '#': digitalWrite(ledpin, HIGH); break; default: Serial.println(key); } }}

Troubleshooting1. You can pretty much connect your keypad to any pins you would like. Be careful not to use the serial pins (0 and 1) if you are using them for communication. 2. If key presses seem to take a long time to show up then you are probably using long delay()'s in your code. The same thing can happen if you use too many small delay()s like delay(10). 3. Make sure you understand the pin mappings and have the keypad wired up to match. If you wired the pins incorrectly (and already soldered them in) then you may be able to fix it by redefining the pins and/or keymap to make your keypad work.

Para no hacer las cosas siempre habr obstculos e impedimentos fuera de nuestro alcance para hacerlo solo basta decidirloIng. Armando Mtz.R.