Interruptores y Botones de Presion - Teclados
Interruptores y Botones de Presion - Teclados
Interruptores y Botones de Presion - Teclados
Los interruptores y los botones de presin son los dispositivos simples para proporcionar la forma ms simple de detectar la aparicin de voltaje en un pin de entrada del microcontrolador. No obstante, no es tan simple como parece... Es por un rebote de contacto. El rebote de contacto es un problema comn en los interruptores mecnicos.
Al tocarse los contactos, se produce un rebote por su inercia y elasticidad. Por consiguiente, la corriente elctrica es rpidamente pulsada en lugar de tener una clara transicin de cero a la corriente mxima. Por lo general, esto ocurre debido a las vibraciones, los desniveles suaves y la suciedad entre los contactos. Este efecto no se percibe normalmente al utilizar estos componentes en la vida cotidiana porque el rebote ocurre demasiado rpido para afectar a la mayora de los dispositivos elctricos. Sin embargo, pueden surgir problemas en algunos circuitos lgicos que responden lo suficientemente rpido de manera que malinterpreten los pulsos producidos al tocarse los contactos como un flujo de datos. De todos modos, el proceso entero no dura mucho (unos pocos micro - o milisegundos), pero dura lo suficiente para que lo detecte el microcontrolador. Al utilizar slo un botn de presin como una fuente de seal de contador, en casi 100% de los casos ocurren los errores. El problema se puede resolver con facilidad al conectar un simple circuito RC para suprimir rpidos cambios de voltaje. Como el perodo del rebote no est definido, los valores de los componentes no estn precisamente determinados. En la mayora de los casos es recomendable utilizar los valores que se muestran en la siguiente figura.
Si se necesita una estabilidad completa, entonces hay que tomar medidas radicales. La salida del circuito, mostrado en la siguiente figura (biestable RS, tambin llamado flip flop RS), cambiar de estado lgico despus de detectar el primer pulso producido por un rebote de contacto. Esta solucin es ms cara (interruptor SPDT), pero el problema es resuelto. Ing. Armando Alberto Cajahuaringa Camaco Pgina 1
Aparte de estas soluciones de hardware, hay tambin una simple solucin de software. Mientras el programa prueba el estado de circuito lgico de un pin de entrada, si detecta un cambio, hay que probarlo una vez ms despus de un cierto tiempo de retardo. Si el programa confirma el cambio, esto significa que un interruptor/botn de presin ha cambiado de posicin. Las ventajas de esta solucin son obvias: es gratuita, se borran los efectos del rebote de contacto y se puede aplicar a los contactos de una calidad ms baja tambin.
Lectura de teclas
Para hacer la lectura de una tecla es necesario crear un circuito que lleva a cabo la lectura de una seal elctrica para el valor de cero y el otro para el valor uno. Los niveles de voltaje asociados dependen fuertemente de los circuitos involucrados. Los niveles ms comunes son compatibles con TTL, donde el cero lgico est representado por 0 V (cero voltios) y el uno lgico est representado por 5 V (cinco voltios). Una forma de lograr esta operacin es utilizar un pulsador conectado a VCC y una resistencia pull-down o un pulsador conectado a tierra (GND) y una resistencia pull-up. En la figura 4.6 vemos que la tensin de salida es igual a VCC cuando el pulsador est OFF ya que no hay corriente que fluye en el circuito por lo que la cada de voltaje a travs de R1 es cero. Cundo se pulsa el pulsador, una corriente fluye de VCC a tierra a travs de R1. Como no existe ninguna otra resistencia en el circuito toda la tensin del circuito est por encima de R1 y la tensin de salida pasa a convertirse en cero. A pesar de la aparentemente simple operacin, este tipo de circuiFigura 4-6. Circuito to presenta un problema oscilacin de la seal cuando se pulsa el de lectura del interruptor botn. Esta oscilacin se conoce como rebote (Figura 4.7).
Pgina 2
Estas oscilaciones indebidas pueden generar activaciones accidentales, causando un mal funcionamiento del programa. Para evitar esto, podemos utilizar tcnicas de eliminacin de rebote, por hardware o por software. Una opcin de antirrebote se puede ver en la Figura 4.8. En este circuito, el condensador acta como un amortiguador de seal. Un circuito con una resistencia y un condensador generan un retardo de tiempo para la seal. Este es el tiempo requerido para cargar el condensador. As, los cambios rpidos en la seal, debido a la Figura 4.8 Circuito antirrebote oscilacin mecnica del pulsador, son filtrados y no ocurre el problema de la conmutacin indebida como puede verse en la Figura 4.9.
Figura 4.9 Uso de un filtro RC para usarlo como antirrebote de una seal. http://www.labbookpages.co.uk/electronics/debounce.html A. Greensted (modicado) Tenga en cuenta que el nivel de la seal filtrada no llega a cero en ningn momento debido a que la constante de tiempo del filtro RC es mayor que el perodo de supresin de rebotes. Antirrebote por software El antirrebote por software se utiliza generalmente en situaciones en las que se desea aumentar la robustez de una entrada que ya tiene una supresin de rebotes por hardware o reducir el costo de la placa utilizando slo una solucin por software. La gran desventaja de este tipo de sistema es la de introducir un retardo en la deteccin de informacin. Para realizar un anti rebote software se necesita dar un cierto tiempo a la tecla presionada para estabilizar su valor. La Figura 4.7 muestra, en esta ocasin, que para una tecla dada es aproximadamente 150 ms, para un ciclo de reloj del sistema en cuestin (PIC18F4550 con el cristal es 0.56 us. Antes de utilizar el valor que estamos leyendo en la puerta en cuestin debe esperar 300 ciclos de reloj despus de cualquier cambio para asegurarse de que la seal se ha estabilizado, es decir, se ha pasado la fase de rebotar.
Pgina 3
Una de las complicaciones que se presenta a la hora de crear una rutina anti-rebotes para pulsador, al trabajar con microcontroladores, es evitar los impulsos mltiples, los (valga la redundan-
cia) rebotes que insertan dos, tres, diez impulsos en lugar de uno slo, como sera nuestro deseo. Las soluciones que los programadores aplican son incontables. Hay decenas de ejemplos por toda la web de estas rutinas y como es lgico; cada uno de nosotros utiliza la que entiende como la mejor de acuerdo al lenguaje de programacin que estamos utilizando.
Mucha gente coloca un retardo de tiempo, luego de la accin de pulsar el botn y calculan un tiempo medio de activacin para una accin normal. Por supuesto, el resultado es que no existen dos personas que pulsen un botn de igual modo. A unos no les actuar la accin y a otros (que se pasarn en tiempo) les avanzar, por ejemplo un men, en varias secciones. De manera irremediable, cuando a un equipo lo manipulan muchas personas, es imperioso incorporar un sistema que no falle y nos garantice que el sistema acte sin errores, ante todo tipo de usuarios. Hay una rutina (que es mi preferida) que utilizo en BASIC y que es la siguiente:
La rutina del lazo infinito para asegurar el momento en que el botn deja de ser pulsado
Utilizando un pin I/O cualquiera, en este caso el pin 7 del Puerto B, aprovecho a darle tres funciones al pin. Lo utilizo para trabajar con el programador mediante el modo ICSP, para activar un LCD alfanumrico (D7) y, como lo mencionamos, para un pulsador. Esta accin vale tanto para el pin RB7 como para el RB6. Claro est, de este modo puedes utilizar cualquier pin I/O del microcontrolador que est configurado como salida (LED, Dispaly, Rel, etc.). La rutina es sencilla y se corresponde con el siguiente circuito:
Pgina 4
Lo primero que hacemos es crear un punto en la estructura del programa donde SW1 tenga la posibilidad de ser pulsado y de generar un estado lgico bajo que acte del modo en que deseamos. Podemos hacer un barrido, o una lectura secuencial de mltiples pulsadores, conectados a diferentes pines I/O del microcontrolador en esa parte del software, nosotros te mostramos una. Con la instruccin TRISB.7 = 1 transformamos el pin en entrada y luego observamos su estado lgico. Si es activo, es decir, si est presionado, nos mantenemos dentro del lazo infinito hasta que cambie de estado. En nuestro caso, que retorne a un 1 lgico mientras est configurado como entrada. Cuando ello ocurre, el programa sale del lazo infinito y retorna (RETURN) al punto donde fue ejecutada la rutina de observacin de nivel lgico del pulsador. Por supuesto, la explicacin vale para conmutar el pin a un estado alto o bajo. Nosotros empleamos la tcnica de hacerlo a GND, pero sin problemas se puede hacer a Vcc, invirtiendo las resistencias. Esto es: 47K a GND y 4K7 a Vcc intercalando all el pulsador. La situacin de activo se presenta entonces como un 1 lgico en la entrada. Debemos tener muy presente de asegurarnos la configuracin TRIS del pin para no cometer errores y lograr que todo funcione de manera adecuada, sin errores. Por ltimo, tambin puedes lograr el mismo resultado utilizando la siguiente combinacin:
La solucin es la misma, se realiza en un solo rengln y no utiliza la "endemoniada" instruccin GOTO, que muchos no admiten, y que se adeca ms a una rutina para utilizar en lenguaje C. Tambin se puede adaptar una rutina con REPEAT-UNTIL para este mismo propsito y muchos otros mtodos que seguramente t habrs ensayado con xito. Qu mtodo utilizas para realizar un sistema Anti-Rebote de un pulsador mediante la programacin? Te manejas con un Timer que controlar el estado del pulsador en forma repetitiva? Hay tantas preguntas como opciones de trabajo cuando hablamos de pulsadores. Deseas compartir tus rutinas con nosotros y los lectores?
Pgina 5
Martin Muszio dijo... Mario, muy bueno el artculo, la verdad es que nunca vi nada en basic, pase de assembler a C directo, pero entiendo el punto. Tambin es bueno mencionar, que ciertos puertos de ciertos microcontroladores poseen pull-up internos, que se puede activar y de esta forma ahorrar espacio en el PCB y algunas resistencias. Mi implementacin en hardware: agrego una resistencia de 100 ohmios en serie entre gnd el pulsador... Software: en general pregunto el estado, si es vlido espero 20 ms y si vuelve a ser vlido actu en cuestin....
Pgina 6
Teclado Matricial
Como se ve en esta foto todo el circuito est armado en la parte de atrs. Para armar el teclado sugiero: 1) Imprimir en papel comn, los textos del teclado. 2) Pegar la impresin. 3) Cubrir la impresin con cinta celulsica transparente autoadhesiva (Celofn o similar), pinchando con alfiler los agujeros para pulsadores. 4) Soldar los pulsadores completar el armado. Para grabar uso el WinPic. En el archivo ZIP encontrarn una simulacin del teclado en Proteus, que les facilitar muchsimo la experimentacin. El Firmware est con todos los archivos fuente y el HEX. Es lo ms bsico posible, para comprender bien el funcionamiento, y que puedan experimentar a su gusto. y
Programa en Visual Basic 6.0. Es muy simple. Primero se conecta al Puerto Serie COM1 y luego de arrancarlo, un loop va leyendo continuamente el dato que llega del PIC y lo muestra en pantalla. Este la enva cada 100 o 200 milisegundos. El dato recibido es el cdigo tecleado. En mi caso, alimento el circuito desde el programador. Firmware Est hecho en C, compilado con CCS. Todas las lneas estn comentadas.
Pgina 7
///////////////////////////////////////////////////////////////////////// //// PIC 16F628A para Teclado Matricial conexin Serie //// //// www.arossini.com.ar //// //// Este Firmware se compila con CCS PCM. //// //// Cambia PIC en #include, configuracin y clock para tu //// //// PIC, si hace falta. //// //// La configuracin normal es: todo NO salvo MCLR que conviene SI,//// //// y el reloj, que tendrs que leer la hoja de datos del PIC. //// //// Este cdigo lo grabo en el PIC con Programador Alf de //// //// www.arossini.com.ar //// ///////////////////////////////////////////////////////////////////////// #include <16F628.h> // Uso este porque no existe el 16F628A #include <stdlib.h> // Para los int y long #include <stdio.h> // Para los float #FUSES NOWDT // No para el Watch Dog Timer #FUSES INTRC_IO // Reloj interno RC Osc, no CLKOUT #FUSES NOPUT // No para el Power Up Timer #FUSES NOPROTECT // No para proteccin de lectura del cdigo #FUSES NOBROWNOUT // No para el brownout reset #FUSES MCLR // MCLR habilitado para Reset por botn #FUSES NOLVP // No para programado por bajo voltaje. El Pin se usa como I/O #FUSES NOCPD // No para protecin de lectura de EEprom #use delay(clock=4000000) // Se informa la frecuencia del reloj #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1) // B2 es Transmite #use fast_io(A) // Para trabajar con la memoria #use fast_io(B) // Para trabajar con la memoria // = Nmeros registro (Memoria) que le corresponden #bit Linea1 = 0x006.0 // Lnea superior Dgitos 1,2,3,A #bit Linea2 = 0x006.3 // Segunda lnea #bit Linea3 = 0x006.4 // Tercer lnea #bit Linea4 = 0x006.5 // Cuarta lnea #bit Columna1 = 0x005.0 // Columna de la izquierda, Dgitos 1, 4, 7 y * #bit Columna2 = 0x005.1 // Columna segunda #bit Columna3 = 0x005.2 // Columna tercera #bit Columna4 = 0x005.3 // Columna cuarta #bit Transmite = 0x006.2 // Transmite datos a la PC //////////////////////////////////////////////////////////////////////////////// char Entrada[6]; // Cadena de nmero a transmitir int t ; // Contador de dgitos int d ; // Contador de dgitos //int *Puntero ; // Es transitorio, para ver donde est el primer // dgito de Entrada en la memoria RAM del PIC. Se usa con Proteus //////////////////////////////////////////////////////////////////////////////// void main() { //////////// 76543210 set_tris_a(0b00001111); // 1 entrada 0 salida set_tris_b(0b00000000); // 1 entrada 0 salida Linea1=0;Linea2=0;Linea3=0;Linea4=0; // Valores iniciales t = 0; // Valores iniciales //Puntero = &Entrada[0]; // Transitorio. Puntero es el puntero con el valor de la memoria RAM //write_eeprom(10,Puntero); //Transitorio. Escribe en la Memoria EEPROM el valor de la direccin RAM de Entrada. while(true) { // Lectura de los 16 pulsadores pulsados, por lnea //////////////////////////// Linea1 = 1; // Prende la lnea if (Columna1 == 1){Entrada[t]= 0x31;puts(Entrada);t=t+1;} // 1 No funciona con ASCII o decimal if (Columna2 == 1){Entrada[t]= 0x32;puts(Entrada);t=t+1;} // 2 No funciona con ASCII o decimal if (Columna3 == 1){Entrada[t]= 0x33;puts(Entrada);t=t+1;} // 3 No funciona con ASCII o decimal if (Columna4 == 1){Entrada[t]= 0x41;puts(Entrada);t=t+1;} // A No funciona con ASCII o decimal Linea1 = 0; // Apaga la lnea Linea2 = 1; // Prende la lnea if (Columna1 == 1){Entrada[t]= 0x34;puts(Entrada);t=t+1;} // 4 No funciona con ASCII o decimal if (Columna2 == 1){Entrada[t]= 0x35;puts(Entrada);t=t+1;} // 5 No funciona con ASCII o decimal Ing. Armando Alberto Cajahuaringa Camaco Pgina 8
if (Columna3 if (Columna4 Linea2 = 0; Linea3 = 1; if (Columna1 if (Columna2 if (Columna3 if (Columna4 Linea3 = 0; Linea4 = 1; if (Columna1
== 1){Entrada[t]= 0x36;puts(Entrada);t=t+1;} // 6 No funciona con ASCII o decimal == 1){Entrada[t]= 0x42;puts(Entrada);t=t+1;} // B No funciona con ASCII o decimal // Apaga la lnea // Prende la lnea == 1){Entrada[t]= 0x37;puts(Entrada);t=t+1;} // 7 No funciona con ASCII o decimal == 1){Entrada[t]= 0x38;puts(Entrada);t=t+1;} // 8 No funciona con ASCII o decimal == 1){Entrada[t]= 0x39;puts(Entrada);t=t+1;} // 9 No funciona con ASCII o decimal == 1){Entrada[t]= 0x43;puts(Entrada);t=t+1;} // C No funciona con ASCII o decimal // Apaga la lnea // Prende la lnea == 1){Entrada[t]= 0x2A;puts(Entrada);t=t+1;} // * No funciona con ASCII o decimal.
if (Columna2 == 1){Entrada[t]= 0x30;puts(Entrada);t=t+1;} // 0 No funciona con ASCII o decimal if (Columna3 == 1){Entrada[t]= 0x23;puts(Entrada);t=t+1;} // # No funciona con ASCII o decimal if (Columna4 == 1){puts(Entrada);for(d=0;d<6;d++){Entrada[d]=0x00;t = 0;}} //
Sera D, pero se usa como ACEPTAR
// Pone el contador a cero cuando se entraron 5 dgitos. // Apaga la lnea // retardo en ms // Fin del WHILE // Fin del MAIN
Pgina 9