in

Microcontroladores: Sumando pulsadores

Conectar pulsadores a un microcontrolador para lograr la concreción de resultados predeterminados es una tarea que en apariencia no debiera contener muchos misterios. Bastará con disponer de un pin del microcontrolador y asunto resuelto pero, ¿Qué sucede cuando la cantidad necesaria de pulsadores supera a los pines disponibles del microcontrolador? Descubre algunos secretos y saca el máximo provecho de los escasos recursos de hardware que a veces dispones en un diseño tratando de hacer magia con uno o dos pines disponibles para más de 5 o 6 pulsadores. Recuerda: las cosas no siempre son tan sencillas ni tan difíciles como desde afuera aparentan.

Cuando comenzamos a transitar el apasionante mundo de la programación de microcontroladores, solemos encontrarnos con una catarata de información con ejemplos que cubren la mayoría de las necesidades. Sin embargo, una de las cosas que a menudo suelen ocurrir dentro de esa mayoría es que los encargados de transmitir una enseñanza o un ejemplo práctico, suponen que hay cosas ya sabidas. Es decir, dan por sentado que hay conocimientos básicos que el lector (tú) ya posee y no se detienen a explicar muchos detalles que no siempre se conocen previamente. Un caso puntual es la conexión de pulsadores o botones que se conecten en los puertos de los microcontroladores y se utilicen para controlar distintos eventos. Muchos deben creer que uno nace sabiendo como se le pueden sumar infinitos pulsadores a un diseño y no es así.

Una de las interfaces de entrada a un microcontrolador, son los pulsadores.

Una pregunta que suele rondar la cabeza de mucha gente es acerca del modo en que los diseñadores de equipos electrónicos logran conectar (y hacer funcionar) a decenas de pulsadores a través de un único pin. Recolectando información de aquí y de allá mientras caminamos la web, logramos reunir algunos ejemplos que creemos te pueden ser de utilidad para disponer de los mejores recursos según la situación que te toque resolver. Dicho de otro modo: cuando tengas que utilizar botones, pulsadores, interruptores o algún switch conozcas las formas usuales de conectarlos al microcontrolador.

Sumando de a uno
El método más sencillo y elemental de sumar botones a un diseño es utilizando las entradas (I/O) libres de un microcontrolador y que hayan sido predefinidas al comienzo del listado del programa como entradas. La forma en que esto se realiza es a través de la instrucción TRIS sea cual fuere el lenguaje de programación que utilicemos. De esta forma y en cualquier momento del programa, podemos utilizar un pin del microcontrolador como entrada o como salida con sólo indicarle el trabajo a realizar con la instrucción TRIS. Por ejemplo, si colocamos la instrucción TRISB.5 = 1 estaremos indicando que el pin 0 del puerto B pasa a funcionar como entrada. Por el contrario, un cero a la derecha de la igualdad indicará un funcionamiento como salida del pin utilizado.

Ejemplos de conexiones de un pulsador en un PIC

En el dibujo superior vemos las dos posibilidades que tenemos de conectar un botón a una entrada (al azar) de un microcontrolador. La única diferencia importante que encontramos en los ejemplos mostrados es su implementación en el pin PORTA.4. Cabe destacar que este pin posee en su entrada un Schmitt Trigger que es utilizado habitualmente para contar impulsos externos utilizando las propiedades del Timer 0 (T0CKI = Timer 0 ClocK Input). Luego, sólo debemos interrogar, en el momento oportuno, por el estado del pin y ya tendremos funcionando nuestro botón en el PIC. El ejemplo en nuestro clásico Proton BASIC será de la siguiente forma:

Ejemplo del listado para utilizar un solo boton

Trabajando con un teclado matricial
Se conoce como teclado matricial al arreglo o disposición organizada de teclas para lograr un conjunto que utilice la menor cantidad posible de pines del microcontrolador, pudiendo sumar la mayor cantidad de teclas. Esta disposición es la habitual en los teclados de teléfonos y calculadoras. En la mayoría de los casos la organización de la conexión de los pulsadores se realiza mediante la estructura filas-columnas de la manera que vemos en el dibujo.

Matriz de 9 teclas

En el ejemplo se puede apreciar una configuración de 9 teclas que ocupa solo seis pines del microcontrolador y que se organizan en tres filas y tres columnas. Gracias a las características del puerto B, en esta disposición de teclas y utilizando un PIC como el 16F628A, no necesitamos resistores externos de polarización ya que el microcontrolador los posee integrados en el mismo dispositivo. Solo bastará con habilitarlos a través del bit 7 del registro OPTION_REG existente en todos los PIC de la línea 16F. Si deseas utilizar los resistores internos del puerto B para ésta u otras aplicaciones, recuerda siempre configurar correctamente el registro mencionado.

Por supuesto que puedes agregar otra fila y otra columna hasta llegar a un modelo de 16 teclas o si prefieres también puedes quitar alguna columna o fila y utilizar 6 botones solamente. Menos de 6 teclas ya supone el uso de cuatro pines y eso equivaldría a un botón por pin, por lo que esta técnica se debe utilizar cuando necesitamos más de 6 pulsadores y hasta un máximo de 16 cuando solo tengamos posibilidad de utilizar un solo puerto para su operación. Si en cambio trabajamos con otro microcontrolador que posea 2 puertos libres, el arreglo de teclas puede alcanzar a 64 unidades (8 filas, 8 columnas).

La forma de estructurar el programa para hacer funcionar un teclado matricial es sencilla mientras se cuiden ciertos aspectos de orden funcional. Es decir, que la rutina que se encarga de leer el teclado posea una estructura correcta, ágil y optimizada para demorar el menor tiempo posible investigando si se ha pulsado una tecla o no y que además no cometa errores de confusión (que pulsemos un botón y el programa interprete que actuamos sobre otro).

Encabezado del programa que escanea un teclado matricial

La manera habitual de hacer funcionar un teclado es habilitando las columnas o filas como salidas y las no definidas de esta forma, como entradas. Por ejemplo, las columnas las configuraremos como entradas y las filas como salidas. Esto se realiza como dijimos anteriormente con la instrucción TRIS. De acuerdo al circuito propuesto nos quedará TRISB = %00000111 donde los tres bits menos significativos se colocan en uno para configurar esos pines como entradas y al resto como salidas. De esta forma comenzamos a habilitar en forma secuencial las filas de a una mientras se controla si algún botón se oprime “leyendo” cada una de las columnas. Realizando de forma rápida el barrido de las habilitaciones de las filas y la observación de los sucesos en las columnas, podremos determinar cuál tecla se pulsa en el momento en que el teclado se habilita para su funcionamiento.

En el listado de ejemplo podemos ver el encabezado del programa con las definiciones de las variables, los nombres que asignamos a cada pin del puerto según su función, y como dato destacado, el ajuste de los registros TRIS y OPTION_REG. Luego se inicia el programa que realizará el trabajo y las acciones que hayamos decidido para él y en el momento que sea necesario saldremos a leer el teclado con la subrutina PULSAR.

Rutina que se encarga de leer la matriz

Como vemos en el ejemplo, el barrido de activación se realiza en forma secuencial habilitando una fila tras la otra y atendiendo si se pulsa alguna tecla. En ese caso, el programa salta rápidamente al lazo principal llevando consigo la variable BOTON cargada con el número de la tecla pulsada.

Proton al rescate
Una de las instrucciones poderosas que posee este lenguaje de programación se llama INKEY y existe para evitarnos los tediosos y engorrosos listados que otros compiladores se empeñan en que utilicemos y que a veces solo logran hacernos confundir (y casi siempre lo logran) entre tantas filas y columnas al programar la rutina de un teclado matricial. Solo debemos indicarle al programa cuál será el puerto dedicado al teclado mediante la declaración: DECLARE KEYPAD_PORT PORTB. Luego, con sólo incluir la línea BOTON = INKEY, el programa realizará automáticamente la búsqueda de cualquier tecla pulsada devolviéndonos su valor con tan sólo utilizar una línea de comando.

La instrucción INKEY nos ahorra muchas líneas de programa

Como pueden ver, el programa completo se reduce a unas pocas líneas y esto cobra vital importancia para aumentar la sencillez del programa. En el HELP de Proton encontrarán datos adicionales para aumentar la capacidad operativa de esta instrucción tan importante. 

¿Y cuando 16 teclas son pocas?
Otra de las maneras de organizar un teclado cuando los recursos son escasos es aplicar el principio de funcionamiento que utilizan la mayoría de los fabricantes de equipos electrónicos de consumo masivo. Con el afán de administrar los recursos de hardware al límite, se utiliza una o varias entradas ADC del PIC y sobre ellas se “apilan” en serie una cascada de pulsadores en una cantidad a veces impensada.

Teclado clásico de un TV

En la imagen superior tenemos el ejemplo de un TV donde se utiliza un solo pin para leer 5 botones. Como podemos ver, la alimentación de 5Volts en el extremo inferior se conecta a la serie de resistencias R1901 – R1907 para llegar al pin 12 del microprocesador (KEY–IN) donde tenemos a R819 respecto a GND que nos completará una configuración de divisor resistivo variable según la tecla pulsada. La alimentación al ser común a cada tecla provocará la llegada de una tensión diferente ante la pulsación de una u otra tecla. El ADC se encargará de determinar el nivel de esta tensión y determinará en consecuencia cuál tecla fue pulsada.

Combinación de un teclado matricial y uno serie en un mismo equipo

En este diagrama vemos que en otros casos se utilizan la combinación de matrices con circuitos series como el anterior. Esto es común en los grandes equipos musicales y fue una técnica híbrida muy utilizada priorizando las funciones principales al teclado de matriz y las secundarias o de segundo orden y jerarquía al circuito serie. El motivo se asentaba en la confiabilidad de los botones “soft-touch” empleados en la fabricación de los equipos. Una calidad pobre de pulsadores en una configuración serie provocaba errores de interpretación al microprocesador que terminaba ejecutando una instrucción que no era la deseada por el usuario. Por ejemplo, si pulsabas PLAY para reproducir un CD se pasaba a la función RADIO o se cambiaba la configuración del ecualizador de audio.

Si bien la técnica de teclas en serie con divisor resistivo trabajando sobre el ADC del microcontrolador nos brinda la posibilidad de colocar en nuestros diseños una enorme cantidad de teclas (imagina que una variable BYTE puede albergar hasta 256 valores distintos para una equivalente cantidad de botones), debemos estar muy atentos a la calidad de los pulsadores que utilizaremos ya que nuestro desarrollo puede fallar en el momento menos esperado. Además, como dice Murphy, no sólo fallará en el momento menos esperado sino que cuando lo haga, provocará el mayor daño imaginable. Por lo tanto, el consejo es utilizar pulsadores de excelente calidad cuando decidamos este tipo de desarrollo para evitar futuros dolores de cabeza.

Reportar

¿Qué te pareció?

Escrito por Mario

10 Comments

Leave a Reply
  1. Muy buen articulo pero cabe aclarar para aquellos que quieren empezar a programar microcontroladores que las instrucciones citadas por ejemplo :
    "La forma en que esto se realiza es a través de la instrucción TRIS sea cual fuere el lenguaje de programación que utilicemos…" es aplicable a la línea PIC de microchip.
    En otros micros (hasta donde yo conozco) se implementan de otras formas y son otras instrucciones.
    Vuelvo a repetir: Muy buenos tus articulos Mario

    • Hola Jorge!
      Fijate que en un lugar aclara que "Gracias a las características del puerto B, en esta disposición de teclas y utilizando un PIC como el 16F628A, no necesitamos resistores externos de polarización ya que el microcontrolador los posee integrados en el mismo dispositivo. Solo bastará con habilitarlos a través del bit 7 del registro OPTION_REG existente en todos los PIC de la línea 16F.", con lo que queda claro que se refiere a la línea PIC de microchip…. 😉

      Saludos!

      • Hola Ariel
        No lo tomes como crítica, si no todo lo contrario.
        Simplemente quiero ayudar dentro de mis posibilidades a quien lee una articulo como este por primera vez y no tiene ni idea de lo que es un PIC u otro microcontrolador.
        Como bien ha dicho Mario en varias oportunidades, a veces es un poco intimidante cuando se aborda un tema de estos por primera vez. Simplemente quise subrayar este tema para aquellos principiantes que tienen la intención de ingresar a este tema.
        Saludos Mario y Ariel.

  2. Buen dia Mario:

    Me gusto mucho con lo que empezaste este articulo, y es que muchas veces fallamos en cosas pequeñas pero que son importantes y esto de las entradas a los micros es bastante importante.
    El ejemplo del teclado matricial me gusto mucho y las instrucciones que reducen la adquisicion de los botones pulsado pues muchisimo mejor y el ultimo ejemplo de la entrada de multiples pulsadores por usa sola entrada esta genial aunque no nos das un programa especifico pero nosotros mismos los haremos, y pues creo que si queremos hacerlo lo deberiamos hacer con valores de resistencias distanciados para evitar confusiones y pensaria que con condensadores para evitar corrientes parasitas.
    Mario muchas gracias por este articulo, el del dip meter es un hit para los electronicos (como yo) y no te olvidaste esta semana tampoco de nosotros los adictos a los microcontroladores (como yo), un gran abrazo desde Colombia.

    Son los mejores NEOTEO

  3. Hola…yo tengo una dudisima desde hace un poco de tiempo…espero me la puedan contestar…un pulsador de 2 terminales…i es presionado pasa la corriente que ingresa por uno de sus pines al otro ya que son solo 2 pines….pero ocupan mucho los pulsadores de 4 terminales…a estos push… por que pin se ingresa la corriente? a que pin la envia si es pulsado? como funcionan los push de 4 terminales
    desde ya gracias

    • Lo más probable es que, aunque veas 4 pines, eléctricamente sólo sean 2, de modo que, por ejemplo, siempre tendrías 1 y 2 unidos y por otro lado el 3 y el 4, y al pulsarlo se cerrarían todos. La otra posibilidad es que sean cuantro pines y dos circuitos, por lo que al pulsarlo, por ejemplo, el pin 1 se cierra con el 2 y el 3 con el 4.
      Arturo.

  4. Yo apenas, me estoy recuperando de anterior je je ya que son muy extensos pero con mucha buena información así que hay que repasarlos con detenimiento.
    Seria interesante dar ejemplo para descargar, por dar una idea el código compilado y un ejemplo en isis-proteus para que los usuarios nuevos o que desconozca la electrónica, vea lo interesante que es. Claro es una idea ^_^
    Respecto a este articulo como siempre 10/10
    A estos días le di el link de limpieza ZEN a una amiga la cual le sirvió mucho así que otro agradecimiento =)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

La paradoja de Einstein-Podolsky-Rosen

DARPA y su robot saltarín