Informe Proyecto Programación Orientado a Objetos: Manejo de Microcontrolador a través de Java

Integrantes

Resumen

Este informe presenta el trabajo realizado para el proyecto Manejo de Microcontrolador a través de Java en el contexto del ramo de Programación Orientado a Objetos (ELO329) con el profesor Sr. Agustín González. Aquí se detallan los casos de uso, diagramas UML, bibliotecas y programas diseñados especialmente para la demostración de esta simple pero útil aplicación

Introducción

Desde hace un par de años quienes integran el grupo tienen la inquietud de poder controlar variables dentro un invernadero y poder interactur con él de forma remota. Para esto, en este trabajo se presenta una solución que pretende leer sensores de forma local y remota e interactuar con el sistema de la misma forma. Se presenta un servicio Java que interactúa con una placa Arduino a través de conexión serial. Por su parte el servicio en Java entrega las opciones de encender y apagar un servidor el cual entrega la lectura de datos remotamente y por otro lado se cuenta con un código en Arduino que obtiene valores de lectura desde los sensores y los envía por puerta serial a medida que estos van siendo requeridos.

El trabajo presenta un análisis resumido del problema donde se explican los elementos involucrados y tres casos de uso. Luego se incluye un diagrama UML de clases donde se explica la dependencia de clases y finalmente se adjunta una pequeña explicación del código utilizado, clases implementadas y pruebas realizadas

Creación de una aplicación Java que comunique serialmente con Arduino local y remotamente

Análisis: Definición y Contextualización del Problema

Para poder desarrollar este sistma es claro que son necesarias las siguientes entidades:

A su vez el proceso Java necesita de los mecanismos necesarios para poder comunicarse de forma simple pero a la vez efectiva con el microcontrolador y también necesita establecer comunicaciones remotas a través de conexiónes TCP utilizando Sockets. De esta forma Java necesita de las siguientes bibliotecas y clases:

Por lo tanto el problema se reduce a poder comunicar el proceso Java con un microcontrolador arduino de forma que éste último envíe las mediciones via puerto serial (o USB) y Java los interprete y despliegue de forma ordenada y clara. Además es necesario que el proceso Java permita la conexión vía sockets pero para esto es necesario utilizar hebras de forma que el proceso no se bloquee esperando una conexión o esperando a que el cliente cierre la conexión.

Un diagrama que logra contextualizar rápidamente lo que se busca obtener se muestra a continuación:

Para poder lleva a cabo pruebas, se realizan primero los casos de uso y luego se prueban exhaustivamente las secuencias de uso normal y alternativo. Por ejemplo se prueba que la temperatura se actualize correctamente o que los mensajes a través de los sockets sean enviado correctamente.

Análisis: Casos de Uso

Caso 1

Título: Leer Sensores

Propósito: Obtener los valores de los sensores y desplegarlos en la pantalla del PC.

Actores: Usuario y sensores.

Pre-Condiciones:

Eventos: «Click» en Botón en interfaz Java.

Post-Condiciones: Programa Java queda recibiendo datos desde componente censora y despliega valores a medida que se actualizan.

Tipo: Manual

Curso Normal de Eventos:

Entorno Sistema
1) El usuario presiona el botón que inicia la transmisión de datos desde Arduino. 2) El proceso Java despliega aviso mientras carga variables y datos.
3) Proceso Java muestra los valores mientras Arduino los va enviando.
4) Usuario presiona botón para dejar de desplegar información en pantalla. 5) Proceso Java envía información a Arduino y este deja de enviar datos.

Curso Alternativo de Eventos:

Entorno Sistema
1A) El usuario presiona el botón que detiene la transmisión de datos desde Arduino sin que se encuentre transmitiendo. 2A) El botón de encuentra desactivado hasta que la transmisión se encuentre activa

Caso 2

Título: Iniciar Servidor de Sockets

Propósito: Dejar abierta una puerta para compartir datos a través de conexiones remotas

Actores: Usuario

Pre-Condiciones:

Eventos: «Click» en Botón en interfaz Java.

Post-Condiciones: Programa Java queda leyendo sensores y a la vez queda escuchando alguna posible conexión remota por un puerto socket.

Tipo: Manual

Curso Normal de Eventos:

Entorno Sistema
1) El usuario presiona el botón que inicia el servidor de sockets. 2) El proceso Java despliega aviso instancia objeto servidor.
3) Proceso Java muestra los valores mientras Arduino los va enviando y a la vez inicia servidor y éste queda escuchando a través de un puerto socket.
4) Usuario remoto envía comando LEER 5) Proceso Java envía información cliente respecto a los sensores.
6) Usuario remoto envía comando END 7) Proceso Java cierra conexión con cliente remoto.

Curso Alternativo de Eventos:

Entorno Sistema
1A) El usuario presiona el botón que inicia la transmisión de datos sin que Arduino se encuentre operativo. 2A) El botón de encuentra desactivado hasta que Aruino se encuentre activo

Análisis: UML de Clases

A continuación se adjunta imágen de diagrama UML de clases para la clase principal:

A continuación se adjunta imágen de diagrama UML de clases para la clase encargada de crear el servidor de sockets el cual es instanciado por la clase anteriormente descrita:

Conclusiones

Se puede concluir que las expectativas respecto de lo que se esperaba cumplir, se lograron a parcialidad, ya que a pesar del diseño previo, no fue posible implementar todo lo que se pretendía. Primero, el funcionamiento del servidor de sockets no quedó funcionando como se esperaba y bloqueba la aplicación a la espera de una conexión. Por otro lado no fue posible implementar la lectura desde arduino y el despliegue de información en dos hebras distintas por un tema de tiempo, por lo que para poder actualizar la lectura desde el sensor, había que apagar y prender la conexión nuevamente.

Respecto a las mejoras, es posible ocupar otro microprocesador más versatil y que funcione con interrupciones, ya que Arduino está constantemente iterando sobre un loop infinito y para poder detener esto, se hace necesario ocupar delays y detenciones de flujo lo que no es recomendable bajo ninguna circunstancia. Además, es posible ocupar un servicio java que no ocupe interfaz gráfica para no requerir un pc con altas capacidades en un lugar como el que se pretende implementar este sistema.

Ligas

El código completo de nuestro proyecto se encuentra en el siguiente enlace:

codigo_proyecto_arduinojavasockets.zip

Referencias