Los indicadores de nivel analógicos vienen sufriendo desde hace un tiempo el desplazamiento lógico de la escena que le ha impuesto el avance tecnológico. La necesidad de interpretar en una escala graduada la posición de un indicador requería de un tiempo y un trabajo que fue reemplazado por vistosos indicadores digitales que presentan la numeración exacta del valor que estamos intentando mesurar. Sin embargo, existen aplicaciones que no te exigen saber un valor exacto sino tener una información estimada de un “cuánto”. Ejemplos claros de esto que mencionamos son los vumetros de audio, los indicadores de nivel de señal de recepción y toda aquella indicación que suponga una medición dinámica de cualquier magnitud.
Si tienes delante de tus ojos un vaso con la mitad de su capacidad completada y, por otro lado, un display que indica el número “50%”, ¿cuál de las indicaciones provocará en tu cerebro una verdadera impresión de la cantidad y real magnitud?
Conviene dejar sentado desde el principio la fácil confusión existente entre ESTÍMULO y PERCEPCIÓN. El estímulo pertenece al mundo exterior y produce un primer efecto o sensación en la cadena del conocimiento; es de orden cualitativo, como el frío, el calor, lo duro, lo blando, lo rojo, lo blanco. Es toda energía física, mecánica, térmica, química o electromagnética que excita o activa a un receptor sensorial. En cambio, la percepción pertenece al mundo individual interior, al proceso psicológico de la interpretación y al conocimiento de las cosas y los hechos.
Identificar la realidad por las impresiones que se producen en nuestros sentidos es una de las más firmes evidencias de la misteriosa perfección de la mente humana. La psicología es la encargada de explicar la diferencia que existe entre las sensaciones recibidas y la realidad del mundo físico que nos rodea, aunque están implicadas otras muchas ciencias, como la geometría, la física o la biología. Porque “50%” para algunos significa que el vaso está medio lleno y para otros que el vaso está medio vacío. Por lo tanto, esas dos neuronas de más que deben ponerse en acción para decodificar lo que vemos (estímulo) y luego codificarlo en una sensación (percepción) no funcionan a la misma velocidad y de igual modo en todos los seres humanos.
Por todo esto, cuando debas realizar un trabajo que requiera la utilización de un LCD alfanumérico, instalar un indicador analógico dentro de la aplicación digital puede ser la determinante del éxito de una aplicación de medición dinámica. ¿Qué te llega más: el movimiento analógico de una barra al cuantificar sonido o dos dígitos que varíen entre 00 y 99 indicando lo mismo? Mediante un programa mucho más sencillo de lo que crees podrás adaptar e incrustar indicadores “analógicos” dentro de un LCD alfanumérico.
El circuito.
La aplicación es muy sencilla de construir: se realiza con cualquier microcontrolador que posea una entrada analógica para poder realizar las mediciones de la magnitud que quieras representar. Lo siempre distinto será la etapa previa a la entrada del microcontrolador, aunque el objetivo final es transformar el dato a mostrar en una variable que posea una excursión entre 0 y 5 Volts. Como siempre, te recomendamos utilizar en la entrada un diodo zener de 5,1 Volts o 5,6 Volts para proteger el microcontrolador.
Si lo que deseas es utilizar el desarrollo como un simple indicador de tensión, te bastará con realizar un divisor resistivo de entrada para adaptar los niveles a los que soporta el microcontrolador seleccionado. Si la magnitud a evaluar es otra (temperatura, corriente, señal de RF, etc.), deberás intercalar un circuito capaz de transformar esa energía en una tensión variable entre 0 y 5 Volts. Debido a que el abanico de posibilidades es demasiado amplio como para abarcar todas las aplicaciones posibles, tú deberás optar por la interfaz de entrada más conveniente de acuerdo a la necesidad de tu construcción. Luego, se requiere de una conexión sencilla de cuatro bits a un display alfanumérico, que puede ser de la cantidad de caracteres que desees, y, por supuesto, una fuente de alimentación acorde al circuito que quieras desarrollar. Nada más. Todo muy sencillo y elemental. He aquí el video que demuestra el funcionamiento:
Un circuito elemental y muy demostrativo es el que hemos armado con un potenciómetro lineal conectado a una de las entradas analógicas del microcontrolador (como es nuestra costumbre, un PIC) que nos permitirá visualizar y optimizar nuestro código de acuerdo al buen gusto que requiera el diseño, junto a las necesidades que la aplicación nos exija. Es decir, en lugar de visualizar simples barras o segmentos, podemos utilizar asteriscos, letras u otra simbología simpática y agradable. El resultado final esperado será siempre el mismo: lograr la percepción a través del sentido visual para facilitar la lectura sin necesidad de activar mecanismos cerebrales “extras”.
El código empleado en el PIC
La mecánica empleada en el armado de la rutina que utilizaremos seguirá los pasos habituales que empleamos en Basic, tal como hemos hecho en cada ejemplo presentado en NeoTeo. De todas formas, un programa bien comentado o explicado en la misma secuencia en que se desarrolla puede servirte para armar tu rutina sea cual fuere el lenguaje de programación que decidas emplear.
En este caso, definimos el PIC a utilizar y su respectivo cristal; luego la conexión del LCD, los parámetros de funcionamiento del conversor analógico–digital y las variables que utilizaremos dentro del programa. Hasta aquí todo muy clásico. Las instrucciones “diferentes” que podemos ver en el listado comienzan con las directivas PRINT $FE y PRINT $0. Cuando a una instrucción PRINT no se la continúa con un indicador de posición, ésta se transforma en una orden directa al LCD. En el caso particular de PRINT $FE, se hace referencia a cualquier actividad que intentemos desarrollar con un cursor titilante (de visión intermitente) sobre la pantalla.
Por ejemplo, PRINT $FE, 1 equivaldrá a la instrucción CLS (limpiar la pantalla); PRINT $FE, $0E significará que un cursor intermitente (emulando un guión bajo) aparecerá debajo de cada carácter del display. Como éstos, todos los comandos especiales PRINT $FE aparecen bien explicados en la ayuda de los compiladores (en este caso, Proton Lite). Por otra parte, PRINT $0 indica que escribiremos directamente sobre la CGRAM del display, mientras que la terminación $0 al final de la instrucción cumple la función de terminación de la cadena de datos enviados (NULL). Dentro de estas instrucciones, REP c/n nos indica que enviaremos hacia el display al caracter c durante n veces.
Dentro del lazo de medición, lo que haremos es tomar el valor presente en la entrada analógica seleccionada, que tendrá una excursión entre 0 y 5 Volts y adoptará un valor numérico dentro del PIC comprendido entre 0 y 1023. Para entregar a través del LCD la conversión correcta, deberíamos utilizar el siguiente cálculo matemático:
DATO = (DATO * 500)/1024
Al efectuar la multiplicación por 500, estaríamos saliéndonos de la capacidad de una variable WORD, por lo que utilizaremos la operación matemática que nos ofrece Proton “*/” (Multiply Middle Operator) para mantenernos siempre dentro del límite del tamaño de la variable. Entonces, el resultado de la expresión nos queda de la siguiente forma:
DATO = (DATO */ 500) >> 2
De esta manera, se abrevia en una sola instrucción el trabajo con fracciones y nos permite utilizar números enteros en los cálculos sin necesidad de apelar a una variable FLOAT que nos ocuparía un espacio valioso en cantidad de BYTEs utilizados y que, en ocasiones, no podemos darnos el lujo de desperdiciar.
Luego, dentro de la variable MUESTRA, colocamos la cantidad de segmentos que ocupará nuestro LCD. Para el caso de 16 caracteres, serán 48. Por lo tanto, la cantidad de caracteres COMPLETOS (que tengan los tres segmentos) surgirá del resultado de la muestra obtenida dividido 3, mientras que los resultados para ocupar la variable PARCIAL quedarán relegados a aquellos que no obtengan un cociente con resto igual a cero. Esto es lo que se conoce en Basic como operación “MODULUS //”. Aquí entrarán los caracteres que poseen dos y un solo segmento. Por último, completamos el display con espacios vacíos que serían los que quepan en la variable PAD. Al armar la impresión de la línea, colocamos repetidos los caracteres completos (REP $03COMPLETOS); luego viene el PARCIAL, que siempre será uno solo (sea de un segmento o de dos); y por último viene la repetición de PAD (espacios vacíos) hasta terminar el renglón.
Esta sería una de las tantas formas posibles de construir una barra indicadora de nivel en Basic (Proton). Podemos armar así un vumetro de audio, un indicador de nivel de agua, un instrumento para medir intensidad de señales de radio, un voltímetro y todo lo que requiera de un instrumento dinámico de medición donde las sensaciones prevalezcan por sobre la fría información numérica. Otro ejemplo: un indicador de nivel de audio sencillo y elemental como éste:
Como siempre decimos, tú puedes hacerlo mejor, tú puedes mejorar la estética de los mensajes, tú puedes repetir la rutina en el programa y hacerlo estéreo, tú puedes cambiar las barras verticales por otra clase de caracteres, tú puedes mostrar texto en caso que el audio baje a silencio indicando tu nombre o alguna indicación útil y funcional al instrumento. Es decir, tú puedes hacerlo y para nosotros es un orgullo que lo logres y nos lo muestres.