CANET - Display Multifunción para Visualizar Datos NMEA 0183 Mediante Dispositivos de Bajo Coste ...
CANET - Display Multifunción para Visualizar Datos NMEA 0183 Mediante Dispositivos de Bajo Coste ...
2016 – 2017
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
2
Agradecimientos
En primer lugar, agradecer a mi tutor José Vicente Soler Bayona por el apoyo
recibido para llevar a cabo este proyecto y por sus consejos que me han facilitado el
camino para realizarlo. Además como profesor me ha aportado los conocimientos
informáticos que me han servido directamente para el desarrollo de este trabajo y
esta memoria.
Por último agradecer a todas las personas que me han mostrado su apoyo y ánimos
para poder avanzar. Una mención especial a mi familia que sin ellos no habría sido
posible el llegar aquí. Y a mi pareja que ha sido un gran pilar que me ha ayudado a
visualizar el camino, bueno más que un pilar una viga maestra.
3
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
Resumen
El presente trabajo de fin de grado trata sobre el desarrollo de una aplicación de
escritorio para la visualización de datos NMEA 0183. La aplicación se llama nmea-
Display.
Palabras clave: Java , JavaFX , NMEA 0183, Raspberry pi , Scene Builder, MVC.
4
Abstract
The current final degree Project addresses about the development of a desktop
application to visualize NMEA 0183 data. The application its named nmea-Display.
The implementation has been focused on its operation with a low-cost device like a
Raspberry pi 3.
It has been used the Java programming language for the logic of the application and
the JavaFx technology for the user interface.
5
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
6
Tabla de contenidos
1. Introducción ......................................................................................................... 9
7
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
4. Diseño ................................................................................................................. 26
7. Conclusiones....................................................................................................... 53
8
1. Introducción
1.1 Motivación
1.2 Objetivos
9
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
2. Especificación de requisitos
2.1 Introducción
2.1.1 Propósito
10
2.2 Descripción general
El proyecto constará de una aplicación que se ejecutará en un dispositivo estilo
Raspberry pi la cual mediante un puerto USB recibirá la información a filtrar y
mostrar.
Usuario Principal
11
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
También podrá decidir según sus necesidades el número de pantallas que mostrará
la aplicación, así como qué tipo de información se asignará a cada una de ellas.
2.2.3 Restricciones
Se da por supuesto que se dispone de una pantalla táctil para poder interactuar con
la aplicación así como responder a la entrada por ratón.
12
2.3 Requisitos funcionales
13
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
14
2.3.3 Visualizar datos
Este requisito sería la misma tabla para cada uno de los datos a mostrar.
Debe de haber una fuente de alimentación continua para evitar el apagado del
aparato.
15
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
3. Análisis
3.1 Introducción
16
3.2 Diagrama de contexto.
Este diagrama representa una visión global del sistema y sus actores principales.
Como único actor tenemos al Usuario Principal que será el usuario que manejará la
aplicación.
17
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
3.3.1 Introducción
Con el diagrama de casos de uso se pretende mostrar las posibles interacciones del
actor con el sistema y el comportamiento del mismo. Posteriormente se procederá a
explicar cada uno de ellos con más detalle.
18
3.3.2 Diagrama de casos de uso
Se explica de manera general qué actor participa en el caso de uso, así como las
precondiciones para poder llevarse a cabo y el modo de realizarlo.
19
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
20
Tabla 10 caso de uso: Añadir pantalla
Caso de uso Añadir pantalla
21
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
22
Tabla 14 caso de uso: Mostrar información
Caso de uso Mostrar información
23
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
El diagrama de clases muestra una vista general de las clases que conforman el
proyecto y las relaciones que hay entre ellas mediante referencias e instancias de
objetos.
Se puede destacar que la clase central es la clase Controller que tiene una instancia
de cada una del resto de las clases que conforman la aplicación. Esto es debido a la
arquitectura elegida para el desarrollo de la aplicación.
24
Ilustración 3 - Diagrama de clases.
25
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
4. Diseño
26
Patrón de diseño Modelo Vista Controlador.
Modelo
Es la parte que se encarga de la gestión, manejo y preparación de los datos
que será de utilidad para el funcionamiento correcto y esperado de la
aplicación.
Vista
Es la parte de presentación de la aplicación también conocida como la interfaz
de usuario. Es la encargada de mostrar por la pantalla cada elemento de la
aplicación y permitir la interactuación del usuario. También es la encargada
de mostrar la información de salida de la aplicación.
Controlador
Es la parte encargada de gestionar los eventos generados por las acciones del
usuario y por el modelo. Sirve de enlace entre la vista y el modelo, haciendo
que una interacción en la vista por parte del usuario se transmita al modelo
para que pueda obtener, transformar o guardar los datos asociados a la acción
del usuario y también reflejar los cambios efectuados por el modelo en la
vista.
27
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
La aplicación consta de tres paquetes que recogen las diferentes clases que la forman.
28
Tabla 18 Estructura de la aplicación: Paquete Controller
Paquete controller (Controlador)
29
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
5. Desarrollo e implementación
5.1.1 Hardware
Por otra parte también se limita a las herramientas disponibles y asequibles por parte
del desarrollador.
30
5.1.1.1 Ordenador Portátil
5.1.1.2 Raspberry pi 3
31
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
5.1.2 Software
5.1.2.1 Raspbian.
5.1.2.2 Eclipse.
De todos los presentados, eclipse es el programa con el que más tiempo he trabajado,
por ello lo he elegido para el desarrollo de este proyecto.
Otras características que aporta que han ayudado a la elección de este IDE son la
capacidad de autocompletar código, el autoformato para mayor legibilidad y
estructuración, la navegación entre las llamadas a funciones, herencia y definición
de las mismas así como las sugerencias de tipos de objetos.
Por último resaltar la gran versatilidad que consigue este IDE con la posibilidad de
instalación de complementos que le permiten ganar funcionalidades específicas
tanto para el desarrollo como para la integración de Git y el control de versiones.
32
Ilustración 5 –Captura del Eclipse.
5.1.2.3 E(fx)clipse.
Programa que permite la creación de la interfaz gráfica de una manera muy intuitiva.
Evita la tediosa tarea de definir y configurar una interfaz de usuario mediante código.
Su funcionalidad consiste en arrastrar los elementos que se quieren colocar y después
editar sus atributos como sus medidas, color, identificador para luego acceder a dicho
elemento en el código. El archivo generado es un .fxml que también se puede editar
desde eclipse con código y utiliza el lenguaje xml.
33
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
Complemento de eclipse para la creación del diagrama de clases. Ha sido elegido por
su facilidad de uso, ya que se crea el diagrama, se arrastran las clases que se quiere
mostrar y se relacionan entre ellas automáticamente. Se puede editar qué elementos
se muestran (atributos, métodos, tipos de retorno etc). Por último, permite exportar
el diagrama en forma de imagen.
5.1.2.6 Git
También es útil para poder trabajar en el proyecto desde varios dispositivos y tener
todos los cambios sincronizados y evitar conflictos.
34
5.1.2.7 GitLab
Servicio web utilizado para el control de versiones. Permite alojar tus proyectos en la
nube y poder acceder a ellos desde cualquier parte con cualquier gestor de Git.
Con el programa Git for Windows se pueden realizar todas las funciones que
proporciona git desde una consola en Windows.
Este programa nos permite tener constancia de los cambios realizados en el código y
así controlar que los cambios sean correctos antes de subir el código al repositorio de
GitLab. Por otra parte, permite tener un historial de los cambios realizados por si hay
que revertir alguna modificación.
5.1.2.9 WinScp
35
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
5.1.2.10 Putty
Cliente que utiliza el protocolo ssh para comunicar dos equipos. Se caracteriza por su
sencillez para configurar y ser software libre. Posibilita el manejo por consola de la
Raspberry pi desde el ordenador portátil.
https://app.moqups.com/
36
5.2 Tecnologías de Implementación
5.2.1 Java
Al ser uno de los más utilizados en el mundo cuenta con gran cantidad de
complementos y librerías que facilitan el desarrollo de aplicaciones.
5.2.2 JavaFX
JavaFX es una tecnología de software que, al combinarse con Java en forma de API,
permite crear y desplegar aplicaciones.
37
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
5.2.3 Xml
5.2.4 Css
CSS, de las siglas en inglés Cascading Style Sheets traducido como “Hojas de Estilo
en Cascada”, es un lenguaje de diseño gráfico que describe estilos de los elementos
presentes en un documento estructurado, en este caso *.fxml.
Con CSS se puede definir para cada elemento con qué características será
representado. Por ejemplo color, tamaño, fuente del texto, separación entre
elementos etc.
Java Marine API es una API diseñada para el acceso a datos provenientes del
estándar NMEA 0183.
Mediante su uso es posible atender una entrada de tramas NMEA 0183 y extraer los
datos que contiene para su uso.
38
5.3 Visión general de implementación
Pantalla principal.
Mockup:
39
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
Scenebuilder:
Pantalla de inicio.
Mockup:
Scenebuilder:
40
Pantalla de configuración.
Pantalla que contiene los elementos para la configuración de las pantallas de muestra
de datos y más herramientas.
Mockup:
Scenebuilder:
41
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
Pantalla que contiene los datos a visualizar y los botones de navegación entre
pantallas. Se han implementado la de dos y cuatro datos.
Mockup:
42
Scenebuilder:
Nuestra aplicación tiene una clase central que se encarga de la lógica de la aplicación.
1. Inicialización de la aplicación
initScreen()
43
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
showSettings()
showDisplay()
showHome()
prevDisplay()
nextDisplay()
Para ello, se asegura que la posición en la lista de pantallas disponibles esté dentro
de los límites y, si no lo está, pone el índice al principio o al final de la lista.
4. La gestión de pantallas
add4DisplayDefault(String, int)
remvDisplay(int)
44
Con estos métodos se añade y se elimina una pantalla de datos a la lista.
En esta capa se obtienen los datos a mostrar y también se guardan las pantallas
configuradas.
45
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
5. Después se inicializan los elementos para la lectura del puerto. Línea 83-85
6. Se comprueba varias veces si los datos recibidos son tramas válidas
NMEA0183 con la función isValid(data) que proporciona la API nma marine
7. En caso de ser válida la trama se devuelve el puerto abierto en la línea 94. En
caso de no ser válido ninguno de los puertos se devuelve null línea 110.
2. Lectura de datos
46
De esta manera se inicializa un nuevo SentenceReader y se le pasa como parámetro
el flujo de datos que se recibe del puerto USB obtenido anteriormente.
Las tres primeras serían para gestionar los cambios en el estado de lectura. Se han
implementado simplemente indicando el estado por consola para el desarrollo.
void readingPaused();
void readingStarted();
void readingStopped();
A este método se le llama cada vez que el objeto SentenceReader recibe una trama.
La API se encarga de hacer la llamada después de comprobar que la trama recibida
es válida utilizando para ello un patrón que forman las siguientes expresiones
regulares.
"^[$|!]{1}[A-Z0-9]{3,10}[,][\\x20-\\x7F]*(\\r|\\n|\\r\\n|\\n\\r){0,1}$"
"^[$|!]{1}[A-Z0-9]{3,10}[,][\\x20-\\x7F]*[*][A-F0-9]{2}(\\r|\\n|\\r\\n|\\n\\r){0,1}$"
Con esta línea de código se evalúa la ID de la trama recibida y según de qué tipo sea
se procederá al manejo de los datos.
47
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
Por ejemplo:
En caso que la Id de la trama sea “MWD” se transforma la trama a una trama de tipo
MWDSentence que es la que gestiona las tramas MWD.
En caso que la trama lleve asociada más de un tipo de dato, se asociará cada uno de
ellos con la property apropiada como podemos ver en la imagen con la trama de tipo
“MWD” que asocia los datos de velocidad del viento y el de dirección del viento.
48
5.3.4 Capturas de pantalla de la aplicación
Pantalla de inicio
Configuración
49
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
50
6. Despliegue y pruebas
51
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
Por otra parte, se ha ido probando también en la Raspberry pi para ver que el
comportamiento fuera el mismo que en el portátil y estudiar los posibles problemas
específicos a la plataforma que puedan surgir.
52
7. Conclusiones
El trabajo final de grado ha sido una experiencia enriquecedora para mí, tanto como
en el aporte de nuevos conocimientos así como a nivel personal, teniendo un valor
importante para mi futuro.
53
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
8. Anexos
Java
54
Eclipse
Una vez instalado Java JDK se procede a instalar el IDE Eclipse también de su página
oficial.
Elegimos la versión normal para desarrolladores Java. Incluye las funcionalidades
básicas de Eclipse así como Git integrado que será de gran utilidad.
E(fx)clipse
Menú Help -> Install new Software -> seleccionamos --All avaliable Sites y buscamos
e(fx)clipse. Seleccionamos el elemento que aparece, le damos a next y seguimos las
instrucciones en pantalla.
55
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
Scene Builder
Compilarlo uno mismo para la máquina en que se vaya a utilizar o bien descargarte
una versión ya compilada e instalable que esté a disposición pública.
Una vez instalado se ha de configurar la ruta del ejecutable de Scene builder para que
pueda ser utilizada por el proyecto.
Para ello vamos al menú Window -> Preferences -> JavaFX e introducimos la ruta
del ejecutable en el campo SceneBuilder executable.
Con este último paso ya tenemos configurado nuestro entorno para la utilización de
JavaFX.
56
8.2 Configuración rapberry pi para JavaFX
Desde la versión JDK de Java para los dispositivos incrustados arm eliminó la
herramienta javaFx por lo que para poder utilizarla hay que instalarla manualmente.
Para ello nos basamos en una de las muchas guías que encontramos en internet.
http://gluonhq.com/products/mobile/javafxports/get/
http://docs.gluonhq.com/javafxports/#anchor-1
57
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
Orientación de la pantalla
display_rotate=2
58
8.4 Estructura base de una aplicación JavaFX
4 Elementos de control
59
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
Para la parte eléctrica sigue el estándar RS-422 que especifica las características de
los aparatos emisores.
Para la parte de datos utiliza ASCII para la comunicación de datos en serie y define
las tramas transmitidas por el emisor que pueden ser recibidas por varios receptores.
Se transmite a una tasa de 4800 baudios, cada trama tiene 8 bit, no tiene bit de
paridad para corrección de comunicación, tiene un bit de parada que especifica el
final de la trama no tiene protocolo de “handshaking” que coordina la comunicación
entre dos dispositivos.
Caracteres reservados:
60
Para los datos se utilizan todos los caracteres ASCII entre 0x20 (espacio) y 0x7e (~)
menos los reservados de la tabla anterior.
Todas las tramas contienen como máximo 82 caracteres con los delimitadores
incluidos
Sigue los campos de datos delimitados por comas, si un campo está vacío se dejan
dos comas seguidas.
Un ejemplo de trama:
En caso que el resultado del checksum calculado sea diferente al recibido, la trama
será inválida pero no hay un protocolo en el estándar para volver a recibirla, por lo
que esta se pierde.
61
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
9. Glosario de términos
API:
Siglas en inglés de “Aplication Programming interface” sus siglas en español son
“Interfaz de Programación de Aplicaciones”. Es un conjunto de métodos
accesibles de una biblioteca que son utilizados por otro software. Se interactúa
con esos métodos que procesan las peticiones y ofrecen una respuesta
Biblioteca:
Conjunto de implementación de funciones para su uso por otro software.
Checksum:
Complemento:
Programa adicional que modifica la funcionalidad de otro. Se integra con el
programa objetivo.
62
Interfaz (Clase interface):
Plantilla que contiene los métodos sin funcionalidad desarrollada cuya lógica
debe ser definida por las clases que la implementen.
Mockup:
Boceto rápido que se realiza para representar la interfaz y funcionalidad de un
programa.
Patrón de diseño:
Solución arquitectónica a problemas comunes en el desarrollo de software.
Son soluciones que han sido probadas y documentadas que se pueden aplicar
a problemas con características similares.
Ssh:
Sftp:
Siglas en inglés de SSH File Transfer Protocol. Protocolo de transferencia segura
de archivos en español. Permite el manejo de archivos remotos de manera segura.
Trama:
Webapp:
Aplicación alojada en la red que permite su manejo local como si estuviera
instalada de manera local. Se utiliza a través de un navegador.
63
Display multifunción para visualizar datos NMEA 0183 mediante dispositivos de
bajo coste Rasberry Pi / Arduino
Bibliografía.
[1] EBBERS, H. (julio 2014) Mastering JavaFX 8 Controls. McGraw-Hill
Education. ISBN 978007c1833783
[2] IEEE Std 830-1998, Recommended Practice for Software Requirements
Specifications [Última consulta: agosto de 2017]
[Fuente: http://www.cse.msu.edu/~chengb/RE-491/Papers/IEEE-SRS-
practice.pdf ]
[3] JavaFX doc[Consulta en línea][Última consulta: agosto 2017]
[Fuente: http://docs.oracle.com/javase/8/javafx/api/ ]
[4] JavaFX CSS Reference Guide [Consulta en línea] [Última consulta:
agosto de 2017]
[5] JavaFx [Consulta en línea] [Última consulta: junio de 2017]
[Fuente: https://stackoverflow.com/questions/38359076/how-can-i-get-
javafx-working-on-raspberry-pi-3/38363136#38363136 (Comentario de
José Pereda del 13 de Julio de 2016)]
[6] e(fx)clipse [consulta en línea] [Última consulta: 10 de junio de 2017]
[Fuente: https://www.eclipse.org/efxclipse/install.html#for-the-ambitious]
[7] css [Consulta en línea][Última consulta: agosto de 2017]
[Fuente: https://es.wikipedia.org/wiki/Hoja_de_estilos_en_cascada]
[8] xml] [Consulta en línea] [Última consulta: agosto de 2017]
[Fuente: https://es.wikipedia.org/wiki/Extensible_Markup_Language]
[9] nmea data[Consulta en línea] [Última consulta: agosto de 2017]
[Fuente: http://www.gpsinformation.org/dale/nmea.htm#nmea ]
[10] nmea [Consulta en línea] [Última consulta: agosto de 2017]
[Fuente: https://en.wikipedia.org/wiki/NMEA_0183 ]
[11] Java marine API doc [Consulta en línea] [Última consulta: agosto
de 2017]
[Fuente: https://ktuukkan.github.io/marine-api/0.10.0/javadoc/ ]
[12] Noobs guía [Consulta en línea] [Última consulta: junio de 2017]
[Fuente: https://raspberryparatorpes.net/instalacion/noobs-paso-a-paso-
instalar-el-sistema-operativo-en-la-raspberry-pi/ ]
64
Referencias.
objectAid
[Fuente: http://www.objectaid.com/home]
gitLab
[Fuente: https://about.gitlab.com/ ]
SceneBuilder
[Fuente: http://gluonhq.com/products/scene-builder/ ]
Winscp
[Fuente: https://winscp.net/eng/docs/lang:es]
Putty
[Fuente: http://www.putty.org/ ]
Moqups
[Fuente: https://app.moqups.com/ ]
Eclipse
[Fuente: https://www.eclipse.org/downloads/ ]
JDK
[Fuente: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-
downloads-2133151.html ]
Portátil
[Fuente: http://www.toshiba.es/discontinued-products/satellite-l850-1rz/ ]
[Fuente: https://git-scm.com/download/win]
moqups:
[Fuente: https://app.moqups.com/ ]
65