Interruptores y Botones de Presion_Teclados

Embed Size (px)

Citation preview

  • 7/27/2019 Interruptores y Botones de Presion_Teclados

    1/9

    Ing. Armando Alberto Cajahuaringa Camaco Pgina 1

    INTERRUPTORES Y BOTONES DE PRESINLos 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 microcontrola-dor. No obstante, no es tan simple como parece... Es por un rebote de contacto. El rebote decontacto 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 lacorriente mxima. Por lo general, esto ocurre debido a las vibraciones, los desniveles suaves yla suciedad entre los contactos. Este efecto no se percibe normalmente al utilizar estos com-ponentes en la vida cotidiana porque el rebote ocurre demasiado rpido para afectar a la ma-

    yora de los dispositivos elctricos. Sin embargo, pueden surgir problemas en algunos circuitoslgicos que responden lo suficientemente rpido de manera que malinterpreten los pulsos pro-ducidos al tocarse los contactos como un flujo de datos. De todos modos, el proceso entero nodura mucho (unos pocos micro - o milisegundos), pero dura lo suficiente para que lo detecte elmicrocontrolador. 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 suprimirrpidos cambios de voltaje. Como el perodo del rebote no est definido, los valores de loscomponentes no estn precisamente determinados. En la mayora de los casos es recomenda-ble utilizar los valores que se muestran en la siguiente figura.

    Si se necesita una estabilidad completa, entonces hay que tomar medidas radicales. La sali-

    da 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 decontacto. Esta solucin es ms cara (interruptor SPDT), pero el problema es resuelto.

  • 7/27/2019 Interruptores y Botones de Presion_Teclados

    2/9

    Ing. Armando Alberto Cajahuaringa Camaco Pgina 2

    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 uncambio, hay que probarlo una vez ms despus de un cierto tiempo de retardo. Si el programaconfirma el cambio, esto significa que un interruptor/botn de presin ha cambiado de posi-cin. Las ventajas de esta solucin son obvias: es gratuita, se borran los efectos del rebote decontacto 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 lecturade una seal elctrica para el valor de cero y el otro para el valor uno. Los niveles de voltajeasociados dependen fuertemente de los circuitos involucrados. Los niveles ms comunes soncompatibles con TTL, donde el cero lgico est representado por 0 V (cero voltios) y el unolgico est representado por 5 V (cinco voltios).

    Una forma de lograr esta operacin es utilizar un pulsador conec-tado a VCC y una resistencia pull-down o un pulsador conectado atierra (GND) y una resistencia pull-up.

    En la figura 4.6 vemos que la tensin de salida es igual a VCCcuando el pulsador est OFF ya que no hay corriente que fluye en elcircuito por lo que la cada de voltaje a travs de R1 es cero. Cundose pulsa el pulsador, una corriente fluye de VCC a tierra a travs deR1. Como no existe ninguna otra resistencia en el circuito toda latensin del circuito est por encima de R1 y la tensin de salida pasaa convertirse en cero.

    A pesar de la aparentemente simple operacin, este tipo de circui-to presenta un problema oscilacin de la seal cuando se pulsa elbotn. Esta oscilacin se conoce como rebote (Figura 4.7).

    Figura 4.7: La seal de oscilacin al cambiar de estado un pulsador. http://www.labbookpages.co.uk/electronics/debounce.html - Dr. Andrew Greensted

    Figura 4-6. Circuitode lectura del inte-rruptor

    http://www.labbookpages.co.uk/electronics/debounce.htmlhttp://www.labbookpages.co.uk/electronics/debounce.htmlhttp://www.labbookpages.co.uk/electronics/debounce.html
  • 7/27/2019 Interruptores y Botones de Presion_Teclados

    3/9

    Ing. Armando Alberto Cajahuaringa Camaco Pgina 3

    Estas oscilaciones indebidas pueden generar activa-ciones accidentales, causando un mal funcionamiento delprograma. Para evitar esto, podemos utilizar tcnicas deeliminacin de rebote, por hardware o por software. Unaopcin de antirrebote se puede ver en la Figura 4.8.

    En este circuito, el condensador acta como un amor-

    tiguador de seal. Un circuito con una resistencia y uncondensador generan un retardo de tiempo para la se-al. Este es el tiempo requerido para cargar el conden-sador. As, los cambios rpidos en la seal, debido a laoscilacin mecnica del pulsador, son filtrados y no ocu-rre 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 (modi cado)

    Tenga en cuenta que el nivel de la seal filtrada no llega a cero en ningn momento debidoa que la constante de tiempo del filtro RC es mayor que el perodo de supresin de rebotes.

    Antirrebote por softwareEl antirrebote por software se utiliza generalmente en situaciones en las que se desea au-

    mentar la robustez de una entrada que ya tiene una supresin de rebotes por hardware o re-ducir el costo de la placa utilizando slo una solucin por software. La gran desventaja de estetipo 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 presionadapara estabilizar su valor. La Figura 4.7 muestra, en esta ocasin, que para una tecla dada esaproximadamente 150 ms, para un ciclo de reloj del sistema en cuestin (PIC18F4550 con elcristal es 0.56 us. Antes de utilizar el valor que estamos leyendo en la puerta en cuestin debeesperar 300 ciclos de reloj despus de cualquier cambio para asegurarse de que la seal se haestabilizado, es decir, se ha pasado la fase de rebotar.

    Figura 4.8 Circuito antirrebote

    http://www.labbookpages.co.uk/electronics/debounce.htmlhttp://www.labbookpages.co.uk/electronics/debounce.htmlhttp://www.labbookpages.co.uk/electronics/debounce.html
  • 7/27/2019 Interruptores y Botones de Presion_Teclados

    4/9

    Ing. Armando Alberto Cajahuaringa Camaco Pgina 4

    Rutina Anti-Rebote para Pulsadohttp://www.marioguillote.blogspot.com/2013/07/rutina-anti-rebote-para-pulsador.html

    Sbado, 6 de julio de 2013Una de las complicaciones que se presenta a la hora de crear una rutina anti-rebotes pa-

    ra 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 ru tinas y como es lgico; cada uno de nosotros utiliza la que entiende como la mejor de acuerdo al

    lenguaje de programacin que estamos utilizando.

    Un simple ejemplo de un sistema que necesita un mtodo "Anti-Rebotes"

    Mucha gente coloca un retardo de tiempo, luego de la accin de pulsar el botn y calculanun tiempo medio de activacin para una accin normal. Por supuesto, el resultado es queno existen dos personas que pulsen un botn de igual modo. A unos no les actuar la accin ya 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 imperiosoincorporar un sistema que no falle y nos garantice que el sistema acte sin errores, ante todotipo de usuarios. Hay una rutina (que es mi preferida) que utilizo en BASIC y que es la siguien-te:

    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 tresfunciones al pin. Lo utilizo para trabajar con el programador mediante el modo ICSP , paraactivar un LCD alfanumrico (D7) y, como lo mencionamos, para un pulsador. Esta accin valetanto para el pin RB7 como para el RB6. Claro est, de este modo puedes utilizar cualquier pinI/O del microcontrolador que est configurado como salida (LED, Dispaly, Rel, etc.). La rutinaes sencilla y se corresponde con el siguiente circuito:

    http://www.marioguillote.blogspot.com/2013/07/rutina-anti-rebote-para-pulsador.htmlhttp://www.marioguillote.blogspot.com/2013/07/rutina-anti-rebote-para-pulsador.htmlhttp://4.bp.blogspot.com/-HNVsTF_elRY/Udi7sl77-fI/AAAAAAAAC84/KzDxMokqtQk/s1600/Rutina_BASIC.jpghttp://2.bp.blogspot.com/-_9MLnGFP-VI/Udi7J6np0XI/AAAAAAAAC8w/K6nchqDg4hQ/s1600/Pulsadores_Menu.jpghttp://4.bp.blogspot.com/-HNVsTF_elRY/Udi7sl77-fI/AAAAAAAAC84/KzDxMokqtQk/s1600/Rutina_BASIC.jpghttp://2.bp.blogspot.com/-_9MLnGFP-VI/Udi7J6np0XI/AAAAAAAAC8w/K6nchqDg4hQ/s1600/Pulsadores_Menu.jpghttp://www.marioguillote.blogspot.com/2013/07/rutina-anti-rebote-para-pulsador.html
  • 7/27/2019 Interruptores y Botones de Presion_Teclados

    5/9

    Ing. Armando Alberto Cajahuaringa Camaco Pgina 5

    Circuito clsico, multifuncin, con entradas y salidas simultneas.

    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 quedeseamos. Podemos hacer un barrido, o una lectura sec uencial de mltiples pulsadores, co-nectados a diferentes pines I/O del microcontrolador en esa parte del software, nosotros temostramos una. Con la instruccin TRISB.7 = 1 transformamos el pin en entrada y luego ob-servamos su estado lgico. Si es activo , es decir, si est presionado, nos mantenemos dentrodel lazo infinito hasta que cambie de estado. En nuestro caso, que retorne a un 1 lgicomientras est configurado como entrada. Cuando ello ocurre, el programa sale del lazo infinitoy 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, invirtiendolas 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 presentede asegurarnos la configuracin TRIS del pin para no cometer errores y lograr que todo fun-cione de manera adecuada, sin errores. Por ltimo, tambin puedes lograr el mismo resultadoutilizando la siguiente combinacin:

    Si el GOTO no es de tu agrado, aqu tienes el mismo ejemplo con WHILE-WEND

    La solucin es la misma, se realiza en un solo rengln y no utiliza la "endemoniada" instruc-cin GOTO, que muchos no admiten, y que se adeca ms a una rutina para utilizaren lenguaje C . Tambin se puede adaptar una rutina con REPEAT-UNTIL para este mismopropsito y muchos otros mtodos que seguramente t habrs ensayado con xito. Qu m-todo utilizas para realizar un sistema Anti-Rebote de un pulsador mediante la program a-cin? Te manejas con un Timer que controlar el estado del pulsador en forma repetitiva? Haytantas preguntas como opciones de trabajo cuando hablamos de pulsadores. Deseas compar-tir tus rutinas con nosotros y los lectores?

    http://4.bp.blogspot.com/-7toKBLDhwKY/Udi8h7Jt1_I/AAAAAAAAC9M/FscmA7AWYK4/s1600/Anti_Rebote_sin_GOTO.jpghttp://2.bp.blogspot.com/-0LybPMdv-98/Udi8GHPrdOI/AAAAAAAAC9A/2d7tbvhGeXU/s1600/Anti_Rebote.jpghttp://4.bp.blogspot.com/-7toKBLDhwKY/Udi8h7Jt1_I/AAAAAAAAC9M/FscmA7AWYK4/s1600/Anti_Rebote_sin_GOTO.jpghttp://2.bp.blogspot.com/-0LybPMdv-98/Udi8GHPrdOI/AAAAAAAAC9A/2d7tbvhGeXU/s1600/Anti_Rebote.jpg
  • 7/27/2019 Interruptores y Botones de Presion_Teclados

    6/9

  • 7/27/2019 Interruptores y Botones de Presion_Teclados

    7/9

    Ing. Armando Alberto Cajahuaringa Camaco Pgina 7

    Teclado Matricial

    Como se ve en esta foto todo elcircuito est armado en la partede atrs. Para armar el tecladosugiero:

    1) Imprimir en papel comn,los textos del teclado.

    2) Pegar la impresin.

    3) Cubrir la impresin con cintacelulsica transparente auto-adhesiva (Celofn o similar),pinchando con alfiler los aguje-ros para pulsadores.

    4) Soldar los pulsadores ycompletar el armado.

    Para grabar uso el WinPic.

    En el archivo ZIP encontra-rn una simulacin del tecladoen Proteus, que les facilitarmuchsimo la experimentacin.

    El Firmware est con todoslos archivos fuente y el HEX. Es

    lo ms bsico posible, paracomprender bien el funciona-miento, y que puedan experi-mentar a su gusto.

    Programa en Visual Basic 6.0.Es muy simple. Primero

    se conecta al Puerto SerieCOM1 y luego de arrancarlo,un loop va leyendo conti-nuamente el dato que llegadel PIC y lo muestra en pan-talla. Este la enva cada 100 o 200 milisegundos. El dato recibido es el cdigo tecleado. En micaso, alimento el circuito desde el programador.

    FirmwareEst hecho en C, compilado con CCS. Todas las lneas estn comentadas.

  • 7/27/2019 Interruptores y Botones de Presion_Teclados

    8/9

    Ing. Armando Alberto Cajahuaringa Camaco Pgina 8

    ///////////////////////////////////////////////////////////////////////////// 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 // Uso este porque no existe el 16F628A #include // Para los int y long#include // 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(){//////////// 76543210set_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

  • 7/27/2019 Interruptores y Botones de Presion_Teclados

    9/9

    Ing. Armando Alberto Cajahuaringa Camaco Pgina 9

    if (Columna3 == 1){Entrada[t]= 0x36;puts(Entrada);t=t+1;} // 6 No funciona con ASCII o decimal if (Columna4 == 1){Entrada[t]= 0x42;puts(Entrada);t=t+1;} // B No funciona con ASCII o decimal Linea2 = 0; // Apaga la lnea Linea3 = 1; // Prende la lneaif (Columna1 == 1){Entrada[t]= 0x37;puts(Entrada);t=t+1;} // 7 No funciona con ASCII o decimal if (Columna2 == 1){Entrada[t]= 0x38;puts(Entrada);t=t+1;} // 8 No funciona con ASCII o decimal if (Columna3 == 1){Entrada[t]= 0x39;puts(Entrada);t=t+1;} // 9 No funciona con ASCII o decimal if (Columna4 == 1){Entrada[t]= 0x43;puts(Entrada);t=t+1;} // C No funciona con ASCII o decimal Linea3 = 0; // Apaga la lnea Linea4 = 1; // Prende la lnea if (Columna1 == 1){Entrada[t]= 0x2A;puts(Entrada);t=t+1;} // * No funciona con ASCII o decimal.Podra ser punto decimalif (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= 5){t = 0;} // Pone el contador a cero cuando se entraron 5 dgitos.Linea4 = 0; // Apaga la lnea delay_ms(300 ); // retardo en ms } // Fin del WHILE } // Fin del MAIN