Menu
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 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.

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:

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.

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).

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.

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.

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.

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.

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.

Escrito por Mario

Leave a Reply