Diseño interfaz usuario

Como se mencionó en la sección anterior existen varias aplicaciones que se pueden utilizar para leer los valores del monitor serial. En realidad, dado que hemos programado la ESP-32 de la manera más eficiente posible, nos hemos quedado sin ninguna forma de interactuar con ella. Es por ello que tendremos que realizar toda la manipulación de las señales que envía por medio de otra aplicación que se ejecutará en una computadora personal.

Lectura de los valores del monitor serial

En los sistemas operativos más utilizados el día de hoy (Window, Mac, Linux y Android) es bastante fácil manipular los puertos seriales por medio del propio sistema operativo por lo que no tenemos que hacer una implementación de cero. Dicho esto, es muy latosa la implementación según el lenguaje de programación ya que a pesar de que es sencillo, habría que realizar la implementación distinta para cada sistema operativo de manera diferente. En este sentido es muy amable el uso de Java y la biblioteca que usa el IDE de Arduino para manipular el monitor serial: JSerialComm

Esta será la única biblioteca externa que usaremos para la implementación de nuestro osciloscopio.

La mejor solución que encontré para el diseño, puesto en pseudocódigo una vez más:

    //Creamos una lista o un arreglo grande en el cual guardaremos los voltajes
    lista<entero> lista_lecturas_adc
    lista<flotante> lista_voltajes

    inicialización(){
        //Abrimos el puerto serial y lo configuramos para poder
        //leer los valores que nos está mandando desde la ESP-32
        abrir_puerto_lectura()
        configurar_puerto(tasa_baudios, bytes_por_palabra)
        abrir_flujo_de_bytes()
    }

    ciclo(){
        //leemos los valores disponibles en el puerto serial
        //y los agregamos a nuestra lista de valores en el ADC
        lista_lecturas_adc.agrega(leer_bytes_puerto_serial())

        //Convertimos los valores del ADC (en los cuales habrá enteros entre 0->4095)
        //y los convertimos en valores de voltaje según el arreglo de resistores diseñamos
        //en la parte del diseño del circuito
        lista_voltajes = convertir_valores_ADC_en_Voltajes(lista_lecturas_adc)
        
        //Graficamos los valores de voltaje leídos en una interfaz gráfica (por ejemplo una ventana)
        graficar(lista_voltajes)

        //Vaciamos ambas listas de voltaje para repetir el ciclo con una lista vacía
        //Y así "olvidar" los valores previos y graficar únicamente los nuevos valores leídos
        vaciar(lista_lecturas_adc)
        vaciar(lista_voltajes)
    }

El pseudocódigo es muy elemental pero ese es el esquema general del proyecto que se siguió al momento de diseñar el programa final. Obviamente la implementación es sustancialmente más compleja que el pseudocódigo pero la realidad es que lo subsecuente fue un tema más de ingeniería de implementación que de diseño.

Diseño de la interfaz gráfica de usuario

Entre los diseños comerciales existen múltiples diseños de osciloscopio pero todos respetan una serie de lineamientos más o menos univerales. En los primeros osciloscopios analógicos ya se incluían:

  • Pantalla rectangular dividida en 10 ó 12 secciones en horizontal, en 8 ó 10 secciones en vertical.
  • Capacidad de modificar la escala en el eje X, en el eje Y.
  • La positibilidad de mover los valores graficados tanto en el eje X como Y.
  • Manejo de múltiples canales de lectura(generalmente dos)

En los osciloscopios digitales modernos existen una serie de ventajas adicionales que en los osciloscopios más clásicos no, esto es gracias al aprovechamiento de las capacidades de los procesadores más y más modernos con los que se diseñan.

  • Detección de frecuencia
  • Cálculo automático de voltaje de corriente directa
  • Caracterización del voltaje de corriente alterna
  • Centrado automático de los picos en señales con oscilación (i.e. centrado de una sinusoidal)
  • Dibujo de líneas de referencia

La funcionalidad "fundamental" es aquella que podríamos asociar con un osciloscopio analógico clásico. Las capacidades más complejas que se encuentran en los osciloscopios modernos fueron considerados ganancia adicional.

Ya con los lineamientos básicos establecidos comenzó el desarrollo de la aplicación usando la biblioteca de "swing" en Java, con la cual es muy fácil programar aplicaciones gráficas.

Después de múltiples diseños se determinó que quizá el mejor para una experiencia de usuario sencilla sería el siguiente:

Entrar en detalle con respecto al funcionamiento preciso de la graficación así como los detalles de manejo del puerto serial etc. estaría fuera de enfoque ya que, una vez más, estaríamos trabajando con temas muy específicos de código y no de diseño.

Se tratarán más adelante los detalles con respecto a todas estas minucias.

Usuario avanzado: Diseño código Java