Arctic es una aplicación de Android que analiza y evalua al esquiador gracias a un sensor colocado en el esquí.
Se puede descargar en el siguiente enlace:
https://play.google.com/store/apps/details?id=com.quique.u_tad.arctic
8. Capítulo 3. Introducción
8
3. Introducción
En este Trabajo de Fin de Grado se combina dos de las pasiones del autor. El esquí alpino
y la tecnología. Se entiende que con lo avanzado que está el mundo de la tecnología y
los avances que se pueden ver día a día en ese mundo, en el esquí alpino no se ha visto
ninguna mejora tecnológica aplicada en los últimos años.
Como antiguo corredor de esquí alpino y actual entrenador en un equipo de
competición así como estudiante del Grado en Ingeniería de Desarrollo de Contenidos
Digitales tengo la sensación de que el esquí alpino es un campo que no está explotado
tecnológicamente hablando y que puede ofrecer muchas ventajas para esquiadores
amateurs y para entrenadores y corredores. A unos por el simple hecho de poder medir
lo que hacen y compartirlo, que hoy en día está muy de moda, a otros por el poder
obtener con detalle unos datos no apreciables con la vista y así trabajar de una manera
más eficiente y óptima para la consecución de unos resultados deportivos exitosos.
Es por eso que se va a tratar de dar una solución a través de un producto mínimo viable
aplicando tecnologías de última generación. Para ello se han definido unos requisitos
pensados para que el proyecto sea abarcable. Con esto se pretende abrir el camino de
las tecnologías en el mundo del esquí alpino y en general en el de deportes menos
populares.
Para ello se explicará la actualidad de las tecnologías utilizadas del apartado 3 al 5 con
el fin de entender porque se han utilizado esas tecnologías y qué aportan al proyecto.
En los apartados 6 y 7 se explicará el problema que se ha planteado y que se abordará
en el apartado 9, dónde se explicará la solución que se ha dado y se podrá entender en
detalle el producto mínimo viable obtenido.
Por último, en el apartado 9, se describirán las pruebas realizadas que evaluarán si se
cumplen las expectativas del trabajo.
9. Capítulo 4. Apps y Desarrollo en Android
9
4. Apps y Desarrollo en Android
En los últimos años los dispositivos móviles han sufrido un gran avance, llegando a
convertirse en ordenadores y llegando a millones de usuarios.
De ahí nace Android, un sistema operativo y plataforma software basado en Linux para
dispositivos móviles (teléfonos, tablets, smartwatches, etc.). Pertenece a la compañía
de Google y es open-source (de código abierto) por lo que cualquiera puede crear sus
propias aplicaciones, widgets e incluso modificar el sistema operativo.
A día de hoy es el sistema operativo para dispositivos móviles de mayor éxito llegando
a estar en casi el 75% de dispositivos móviles del mercado. Apple, con iOS, es la segunda
que más éxito tiene con el 17%. [1]
Las aplicaciones Android se programan mediante el lenguaje de programación Java.
Google nos ofrece el SDK (Software Development Kit) de Android necesario para
desarrollar las aplicaciones y ejecutar el emulador y también nos ofrece el entorno de
desarrollo Android Studio basado en IntelliJ IDEA de JetBrains. También se pueden
utilizar otros IDEs como Eclipse haciendo uso de extensiones. [2]
A continuación se verá más a fondo algunos aspectos de Android que son necesarios
para tener una mejor visión del sistema operativo.
Figura 3: Android y las distintas aplicaciones de Google disponibles en Android [44]
12. Capítulo 4. Apps y Desarrollo en Android
12
4.2. Versiones
En cuanto a las versiones de Android, hasta mayo de 2015 han sacado 11 grandes
actualizaciones del sistema operativo.
En la Figura 6 se puede ver un cronograma temporal de las versiones de Android.
Como se observa en la Figura 7, la versión que más dispositivos abarca es Android 5.0
‘Lollipop’ casi igualada con Android 4.4 ‘KitKat’. La última versión, Android
Marshmallow, no tiene el éxito de las otras porque todavía no es soportada por todos
los dispositivos y depende de cada fabricante.
Cada fabricante tiene la posibilidad de modificar Android para dar su toque personal al
sistema operativo que tengan los dispositivos móviles de su marca y así diferenciarlo del
resto de las marcas. Lo hacen mediante capas de personalización que modifican Android
tanto a nivel visual para el usuario, como a nivel de software para el rendimiento del
dispositivo. Esta capa de personalización hay veces que, si no está desarrollada de una
manera óptima, da problemas de rendimiento y no son más útiles que la versión de
Android pura. Es por eso que la tendencia de estas capas de personalización es la de ser
más limpias y claras. [10]
Figura 6: Cronograma temporal de versiones de Android [15]
Figura 7: Número de dispositivos que ejecutan determinada versión de Android [25]
17. Capítulo 4. Apps y Desarrollo en Android
17
usuario y gracias a eso se tienen datos que a la larga pueden ser muy interesantes para
el seguimiento médico de los usuarios.
Dentro de esta categoría, las aplicaciones que nos ayudan a llevar un seguimiento de
ejercicios son muy numerosas. Muchas de ellas utilizan sensores del móvil o de un
dispositivo externo para medir los datos con mayor precisión que se comunican con el
dispositivo móvil a través de Bluetooth o Wifi. Esos datos que se recogen nos pueden
servir para mejorar la técnica en distintos deportes como running, futbol, tenis, golf,
béisbol, etc.
Por ejemplo, la marca Garmin ha creado un accesorio que se acopla al palo de golf y
hace mediciones de los golpes que se realizan. [23]
Cada vez son más los accesorios que se venden para una toma de datos precisa,
facilitando datos y mediciones que un dispositivo móvil no puede ofrecer. Por ejemplo,
los sensores de la marca Zepp que aportan datos muy útiles para los deportes de tenis,
golf, béisbol y softbol. [24]
También hay marcas de artículos deportivos que están integrando los sensores en los
artículos que venden. Por ejemplo, Babolat, marca de raquetas de tenis, ya tiene un
modelo de raqueta que se conecta con el móvil y te permite visualizar diferentes datos
[25].
Figura 10: Raqueta Babolat con sensores integrados [25]
18. Capítulo 5. Arduino
18
5. Arduino
La plataforma Arduino es uno de los productos más populares de electrónica de código
abierto (open-source). Desarrollado por Massimo Banzi y David Cuartielles en 2005,
Arduino es una plataforma de prototipos electrónica de código abierto basada en
hardware y software flexibles y fáciles de usar. [26]
5.1. Introducción
Para programar el microcontrolador de la placa se utiliza Arduino Programming
Language basado en Wiring y el IDE Arduino Development Environment basado en
Processing. Los proyectos de Arduino pueden ser autónomos o pueden estar
comunicándose con otro software ejecutándose independientemente. [26]
El software se puede descargar gratuitamente para Windows, Mac OS X y Linux y hay
diseños de referencia del hardware (archivos CAD) disponibles bajo licencia open-source
para adaptarlos a tus necesidades. [27]
Arduino está compuesto por una placa principal que contiene insertado el
microprocesador y por el resto de controladores y componentes electrónicos. [26]
Arduino tiene una gran variedad de placas con distintas características en sus
componentes principales y diferentes tamaños para poder adaptarse a distintos tipos
de proyectos. [26]
Figura 11: Placa Arduino [26]
19. Capítulo 5. Arduino
19
5.2. Sketch
Sketch es el nombre que Arduino le da a los programas que se pueden cargar y ejecutar
en sus placas. [26]
Se programan en un lenguaje de programación muy similar a C y tienen la siguiente
estructura: [28]
• Comentarios: Todo sketch suele empezar con una explicación de lo que hace y
para qué sirve el sketch. Como en la mayoría de lenguajes, pueden ocupar una
línea ( // ) o varias líneas ( /* */ ).
• Declaraciones: En esta parte se realizan las declaraciones de librerías y de las
variables que se utilizará a lo largo del programa por lo que suele estar después de
la explicación para que sea la primera parte en compilarse.
• Funciones: como todo programa se crean funciones para con el fin de utilizarlas
durante el programa y hacer un código limpio y ordenado. Hay que destacar dos
funciones principales que tienen que estar en todo sketch de Arduino que son
setup() y loop().
• setup(): es llamada una sola vez cuando el sketch empieza a ejecutarse y es donde
se realizan inicialización de librerías y variables. Es útil para asignar valores que no
van a cambiar durante la ejecución del programa. Un sketch puede ejecutarse
cuando se enciende o se resetea la placa de Arduino.
• loop(): como su nombre dice, se ejecuta una y otra vez hasta que se resetea la
placa o se apaga. Aquí es donde va todo toda la lógica del programa.
Por hacer una comparación con otros lenguajes, el setup() es un constructor o un init y
el loop() es el main del programa.
También se debe tener en cuenta la librería Serial que permite la comunicación entre la
placa Arduino y un ordenador u otros dispositivos. El IDE Arduino Development
Enviroment tiene la herramienta Serial Monitor que permite seleccionar el puerto por
el que se realizará la comunicación. Para la utilización del Serial hay que tener
conocimiento de las siguientes funciones: [29]
• Serial.begin(port): para inicializar el Serial y se debe indicar el puerto por el que se
realizarán las comunicaciones. Suele hacerse en el setup(). Para finalizarlo una vez
se termine el programa se utiliza la función Serial.end(). [30]
• Serial.write(): sirve para enviar datos a través del puerto establecido. Se puede
enviar bytes, strings o un array indicando su longitud. [31]
22. Capítulo 5. Arduino
22
5.4. IMUduino
El IMUduino (Figura 14) es un microcontrolador (ATMEGA32u4) de 16x42 milímetros y
aproximadamente 2,7 gramos que tiene un transmisor Nordic nRF8001 Bluetooth Low
Energy, un giroscopio y acelerómetro de 6 ejes (MPU6050), un compás digital de 3 ejes
(HMC5883) y un barómetro/altímetro (MS561101BA03-50) [36]. Es una copia del
Arduino Leonardo. Para su funcionamiento necesita estar conectado a una batería
externa y se puede conectar al ordenador vía microUSB. [36]
IMUduino utiliza un sistema de comunicaciones serie UART, acrónimo de Universal
Asynchronous Receiver-Transmitter. Es un chip integrado en la placa que se encarga de
recibir los datos de los sensores e formato paralelo y convertirlos a un formato serie
para enviarlos mediante Bluetooth. [37]
Después de esta descripción técnica, creo que es necesario explicarlo de una forma más
clara. Para eso hay que tener dos conceptos claros: IMU y Arduino. Este último está
explicado en el apartado anterior.
IMU son las siglas de Unidad de Medición Inercial (Inertial Measurement Unit) y es un
sistema cerrado que se usa para calcular la orientación, localización y movimiento. Están
formados por una combinación de acelerómetros y de giroscopios (sensores de
velocidad angular) para saber cómo se mueve y en qué posición está.
Una IMU detecta en cada instante la orientación y los cambios de dirección (i.e. ángulos
de roll, pitch y yaw) y además los integra para saber el cambio sobre la posición inicial.
Este sistema se opone al sistema GPS que utiliza satélites para calcular la posición.
Las IMUs, como todos los componentes de medida, tienen errores de medición. En este
caso, al ir calculando constantemente los cambios detectados en la posición el error se
Figura 14: Placa IMUduino [33]
24. Capítulo 6. Bluetooth
24
6. Bluetooth
Bluetooth® es una tecnología concebida como alternativa inalámbrica a las conexiones
por cable mediante el intercambio de datos por ondas de radio. [41] Fue creada en 1994
por la empresa Ericsson y más adelante se formó Bluetooth SIG (Special Interest Group)
cuando otras empresas como Intel, IBM, Nokia, etc. se sumaron al proyecto de Ericsson.
Su nombre está inspirado en un rey de Dinamarca Harald Blåtand, en inglés, Harold
Bluetooth. Según la historia, a finales del siglo X, el rey Harald ayudó en la conversión de
varias tribus vikingas a la religión cristiana y representa la unión [42]. De ahí viene el
nombre, ya que la tecnología Bluetooth fue creada como un estándar global de
comunicación inalámbrica que permite la conectividad (la unión) y colaboración entre
los productos y las industrias dispares. [43]
Figura 15: Logo de Bluetooth®
Bluetooth utiliza ondas de radio en vez de cables para realizar la conexión entre varios
dispositivos. Un producto Bluetooth (un móvil, un reloj, un ratón, etc.) contiene un
pequeño chip con un transmisor Bluetooth y un software que facilita su uso. Para que
haya comunicación entre dos dispositivos vía Bluetooth deben haberse emparejado
previamente. El rango de dispositivos de una conexión Bluetooth es de 2 a 8 dispositivos
y se denomina piconet a la red creada cuando se realiza una conexión de dispositivos
por medio de la tecnología Bluetooth. Cuando se crea una red piconet y se estabiliza,
automáticamente un dispositivo adquiere el rol de master y los demás dispositivos de la
red toman el rol de esclavos. Las redes piconet se estabilizan dinámicamente y
automáticamente según van entrando y saliendo dispositivos del radio de alcance. [43]
La tecnología Bluetooth permite conectar sin cables varios dispositivos. Hasta hace poco
lo normal era conectar el teléfono con el ordenador, con el coche, con unos cascos o con
otro teléfono. Pero cada vez más se está integrando Bluetooth con dispositivos como
televisiones, las luces de casa o una pelota de fútbol. El futuro del Bluetooth es
inimaginable.
En la actualidad, hay muchos tipos de Bluetooth (diferentes versiones) pero los dos tipos
de Bluetooth más comunes son Bluetooth BR/EDR (versión 2.1) y Bluetooth Low Energy
(BLE) o Bluetooth Smart (versión 4.0). Se habla de una nueva versión 5.0 que doblará la
velocidad y cuadriplicará el rango . La última versión de Bluetooth está diseñada para el
internet de las cosas (IoT [44]). La eficiencia energética de esta versión de Bluetooth lo
hace perfecto para dispositivos que se ejecutan durante largos periodos de tiempo con
pequeñas fuentes de energía como pilas de botón o fuentes de energías alternativas.
25. Capítulo 7. Planteamiento del problema
25
7. Planteamiento del problema
Viendo que los wearables son herramientas del futuro que nos facilitan el trabajo [45] y
sabiendo que una de las tendencias tecnológicas es el uso del Smartphone como
ordenador personal [46] se ha tratado de integrarlo y de aplicarlo a un dominio de
aplicación relevante: el deporte y, para ser más exactos, el mundo del esquí alpino. En
ese deporte últimamente se están introduciendo mejoras tecnológicas cómo cascos [47]
o gafas de esquiar inteligentes [48]. Estos dispositivos permiten la comunicación entre
varios dispositivos iguales y te dan algún dato respecto a la velocidad, la localización, la
altitud y el número de giros.
Figura 16: Vision con las gafas Oakley AIRWAVE [48]
Por otra parte existen aplicaciones móviles que miden datos algo más precisos. Hay
algunas genéricas que no se centran en el esquí como Runtastic [49] que dan datos cómo
velocidad máxima y media, elevación ganada, elevación perdida y la distancia total
recorrida.
En la Figura 17 se puede ver un ejemplo de los datos que muestra a los usuarios la
aplicación Runtastic después de grabar una bajada de esquí.
32. Capítulo 8. Solución Propuesta
32
Solucionado el problema de la batería, se ha trabajado en el sketch de Arduino que se
va a cargar en IMUduino. IMUduino ofrece una librería “FreeIMU.h” que da la opción de
leer los siguientes datos:
• Aceleración
• Rotación
• Ángulos de navegación (Yaw Pitch Roll)
• Temperatura
• Altitud respecto al nivel del mar
• Presión
Sería muy interesante poder leer todos esos datos pero la placa IMUduino tiene una
memoria de 28.672 bytes, lo que limita el tamaño del sketch y la cantidad de datos que
podemos leer.
Para este trabajo se ha decidido utilizar los datos de aceleración, rotación, ángulos de
navegación, temperatura y presión, ya que serán útiles para saber cómo se mueve el
usuario y así poder analizar su forma de esquiar y para otros datos adicionales. El sketch
que se ha creado para coger esos datos ocupa un 98% de la memoria disponible. Si
incluyésemos la altitud se ocuparía el 101% del tamaño por lo que no permite subirlo a
la placa del IMUduino. Tampoco es mucho problema porque viendo las librerías que
ofrece IMUduino, la función que devuelve la altitud utiliza la temperatura y la presión
además de otras constantes, así que para calcular la altitud respecto al nivel del mar se
utilizara el dispositivo que recibe los datos y los procesa.
Como se explicó en el apartado 5.2, en todo sketch de Arduino tiene que haber dos
métodos obligatoriamente que son setup y loop. Para el sketch que se ha desarrollado
para este trabajo en el setup se inicializan los componentes IMU y también se inicializa
el componente Bluetooth Low Energy. También se cambia el nombre del dispositivo BLE
para que cuando se haga el emparejamiento aparezca el nombre que se desee. El
nombre tiene una longitud máxima de siete caracteres así que se ha decidido utilizar el
nombre de ARCTIC, el mismo que el de la aplicación de Android.
En la otra función imprescindible, la función loop, haremos uso de funciones declaradas
en el sketch para realizar el envío de los datos por separado. Por lo tanto se han creado
tres funciones: writeAccel, writeGyro, writeYPR y writeTemPres. Cada una envía por BLE
los datos correspondientes mediante un buffer de bytes que es lo leen de los sensores
IMU. Esas funciones serán llamadas si el estado de del BLE es conectado. El BLE puede
tener tres estados diferentes:
33. Capítulo 8. Solución Propuesta
33
• ACI_EVT_DEVICE_STARTED: El dispositivo se ha encendido y es visible a otros
dispositivos.
• ACI_EVT_CONNECTED: Se ha establecido una conexión con otro dispositivo.
• ACI_EVT_DISCONNECTED: Se ha terminado la conexión con otros dispositivos.
También se llamará a la función “pollACI()” que hace que el envío de datos a través del
BLE se haga de una manera ordenada y constante por eso se llama siempre al principio
del loop.
El envío de datos se hace a través de un buffer de bytes así que el receptor recibirá arrays
de bytes que tendrá que decodificar. Para que el receptor sepa que dato recibe cada vez
y los guarde y procese correctamente se ha decidido utilizar un separador para cada
dato que se envía.
Para los datos de la aceleración, rotación y ángulos de navegación siempre se enviarán
triplas con los datos de los ejes X, Y y Z. A cada eje se le destinan 5 bytes y entre cada
uno de ellos se insertará un carácter especial, que los diferencie entre ellos, de tamaño
1 byte por lo que el total de bytes enviados es de 17.
En el caso de la función que envía la temperatura y la presión, envía una dupla con los
datos de temperatura y presión separados por un delimitador. En este caso el tamaño
del bytes enviados es de 11 bytes.
La elección de los delimitadores no ha sido fácil pues no todos los caracteres son
aceptados, por ejemplo, el carácter y el carácter # daba problemas. Al final se ha
decidido utilizar:
• “/” para la aceleración.
• “%” para la rotación.
• “@” para los ángulos de navegación.
• “_” para la temperatura y la presión.
Con el sketch de Arduino terminado y cargado sobre la placa de Arduino y el IMUduino
funcionando de un modo wireless (sin cables), se puede empezar a trabajar en el
dispositivo que recibirá los datos y los procesará para dar al usuario una información
útil.
34. Capítulo 8. Solución Propuesta
34
8.2. Desarrollo de la aplicación
Para el receptor y procesador de los datos, así como la visualización de los resultados se
ha decidido desarrollar una aplicación Android.
Se ha desarrollado con el IDE Android Studio que Google pone a disposición a los
desarrolladores de Android facilitando las cosas. Android Studio permite configurar el
entorno de ejecución, visualizar los archivos de un proyecto así como editarlos entre
muchas otras cosas. Es especialmente útil para la edición de los archivos .xml (pantallas
de la aplicación) ya que permite editarlo por código o a través de una interfaz gráfica y
sencilla sin tocar nada de código cómo se pude ver en la Figura 25.
Figura 25: Captura de pantalla del IDE Android Studio
8.2.1. Entorno y configuración
Google también pone a disposición de los usuarios unas herramientas de desarrollo
(SDK) y un conjunto de librerías. Para esta aplicación se ha decidido usar el SDK 24, y la
versión mínima de la API con la que funcionará nuestra aplicación es con la 21, que
corresponde a Android 5.0 (Lollipop). Esto hace que el número de dispositivos dónde se
puede instalar la aplicación sea de 3060. Esa cifra no representa el número máximo de
usuarios que puede tener la aplicación, representa el número de dispositivos que hay
en el mercado en dónde se podrá instalar la aplicación. Ese número nos lo proporciona
Google al subir el apk de nuestra aplicación a Google Play. También nos permite excluir
los dispositivos que queramos (p.e. si sabemos que en un determinado modelo de móvil
no funciona nuestra aplicación).
35. Capítulo 8. Solución Propuesta
35
Para el desarrollo de Android existen diferentes herramientas para la automatización de
tareas como compilación, testing, empaquetado, etc. y para la gestión de dependencias.
Se ha decidido utilizar Gradle por su facilidad de uso y su integración con Android Studio.
Consiste en varios archivos en los que se establecen algunos parámetros de
configuración del programa. La última versión es la 2.1.2 y es la que se ha utilizado.
En uno de los archivos de Gradle se indica la configuración por defecto, que incluye:
• applicationId "com.quique.u_tad.arctic"
• minSdkVersion 21
• targetSdkVersion 24
• versionCode 2
• versionName "1.0"
Cada vez que se sube un apk nuevo a Google Play hay que cambiar la versión del código
ya que sino no dejará actualizar la aplicación.
En ese mismo archivo se definen también las posibles distintas configuraciones de
compilación. Para este proyecto se han definido dos distintas configuraciones: release y
debug. En esta configuración se pueden definir variables que luego se pueden utilizar en
el código de la aplicación y puede ser útil para hacer unas cosas dependiendo de si estas
en debug o en reléase. También se definen las opciones de firmado de la aplicación que
exige Google Play para poder publicar una aplicación. La de debug se ha utilizado
mientras se ha estado desarrollando y testando la aplicación y la de reléase se ha
utilizado a la hora de subirla a Google Play.
Y por último, el archivo Gradle nos permite gestionar las librerías y dependencias que se
utilizará en el programa. Cabe destacar que las versiones de las librerías de Google
deben de coincidir con el número de versión del SDK que se está utilizando, así pues, si
se ha trabajado con el SDK 24, las librerías de Google son 24.X.X .
Los archivos de Gradle son los primeros que mirará Android Studio cuando se intente
ejecutar o compilar la aplicación para definir la configuración sobre la que se ejecutará
o compilará el código por lo que es importante tenerlo bien configurado desde el
principio y simplemente ir añadiendo dependencias y librerías según se vayan
requiriendo.
Una vez se tiene el entorno definido y configurado se procede al desarrollo de la
aplicación y para eso se han definido unos requisitos que debe de cumplir la aplicación.
36. Capítulo 8. Solución Propuesta
36
8.2.2. Requisitos de la aplicación
Se han definido una serie de requisitos mínimos que debe de cumplir la aplicación.
• Creación de una cuenta con nombre y email.
• Conexión vía Bluetooth al sensor IMUduino.
• Guardar el sensor para futuras conexiones.
• Registro de actividad y guardado de los datos en local.
• Opción de borrar actividad.
• Visualización de los datos y resultados.
• Edición y borrado de perfil.
• Contacto con el desarrollador de la aplicación para quejas y/o sugerencias.
• Compartir el enlace de descarga de la aplicación.
En un principio se definieron más requisitos pero convertía el proyecto en un proyecto
demasiado grande así que se decidió minimizar los requisitos para que el proyecto fuese
alcanzable.
Con esos requisitos de la aplicación se han creado unas historias de usuario que
ayudarán en la distribución de tareas a la hora de desarrollar la aplicación.
• Usuario inicia aplicación por primera vez.
• Usuario se da de alta en la aplicación.
• Usuario hace logout de la aplicación.
• Usuario tiene alguna duda o comentario.
• Usuario quiere grabar una actividad.
• Usuario quiere borrar una actividad.
• Usuario quiere cancelar una actividad.
• Usuario quiere guardar una actividad.
• Usuario quiere ver las actividades guardadas.
• Usuario quiere ver una actividad guardada.
37. Capítulo 8. Solución Propuesta
37
• Usuario quiere emparejar el sensor.
• Usuario quiere guardar sensor para no tener que emparejarlo cada vez que
quiere utilizarlo.
• Usuario quiere eliminar el sensor guardado.
• Usuario quiere recomendar la aplicación a alguien.
Después de analizar las historias de usuario y los requisitos se han definido los diferentes
componentes que formarán parte del sistema.
8.2.3. Diagrama de componentes
Para visualizar la estructura de alto nivel del sistema y el comportamiento de los
componentes se ha decidido realizar un diagrama de componentes que se puede ver en
la Figura 26.
Figura 26: Diagrama de componentes del sistema
Cómo se puede observar en el diagrama, se requiere de una base de datos para el
almacenamiento de los datos.
38. Capítulo 8. Solución Propuesta
38
8.2.4. Almacenamiento de datos
Para guardar los datos que se leen del sensor para su visualización y los datos del usuario
se utilizará la base de datos local del dispositivo en dónde este instalada la aplicación.
Android ofrece varios sistemas de almacenar información a las aplicaciones:
• SQLite es el sistema que utiliza Android para gestionar bases de datos. Es un
gestor de bases de datos relacional, de dominio público y muy ligero. La
información se guarda en un archivo dentro de la carpeta de la aplicación.
• Content Providers son unos componentes que ofrece Android para guardar
datos y ponerlos a disposición de otras aplicaciones del sistema.
• Shared Preferences son preferencias de la aplicación. Se guardan de la forma
clave-valor y se utiliza para guardar datos específicos.
Para esta aplicación se utilizará la base de datos SQLite para todos los datos del usuario
y para los datos recibidos por el sensor y las Shared Preferences para guardar la dirección
Bluetooth del sensor.
8.2.4.1. SQLite
Del usuario sólo se guardan el nombre, los apellidos y el correo electrónico. A pesar de
ser pocos datos y de sólo permitir un usuario, se ha optado por utilizar SQLite para los
datos de usuario para tener la opción de guardarlos en una base de datos remota en un
futuro.
Para los datos que se reciben del sensor tiene mucho más sentido guardarlos utilizando
SQLite porque son muchos datos y para su procesado se filtrarán y se ordenaran en
función de las necesidades. Cómo no sólo se guardan los datos recibidos del sensor, sino
que también se guarda cuando se ha empezado a leer datos, cuándo se ha parado, cómo
estaba la nieve, cómo se ha sentido el usuario, los giros que ha hecho y una puntuación
de la bajada del usuario, la estructura de la base de datos se complica un poco. En la
Figura 27 se puede observar el esquema de la base de datos utilizada para guardar las
actividades que registra el usuario y los datos que recibe del sensor.
Los datos son normalizados a 100 una vez son recibidos para poder hacer operaciones
con ellos. Para eso, después de insertarlos en la base de datos se ejecuta un update de
todas las tablas dividiéndolo por el máximo valor absoluto de cada fila. Con esta
normalización no sólo se facilita el hacer operaciones con ellos sino que mejora la
visualización de los datos en las gráficas.
40. Capítulo 8. Solución Propuesta
40
8.2.5. Arquitectura
A la hora de programar y de crear el software se ha intentado crear un software de
calidad y de conseguir un código que fuese robusto, mantenible, modulable y lo
suficientemente flexible para que estuviese abierto al cambio ya que los requisitos no
estaban cerrados y pensando también en un desarrollo futuro.
Para eso se tuvieron en cuenta lo principios de Clean Architecture [51]. No es una
arquitectura en sí, más bien son un conjunto de condiciones que hacen que la
arquitectura se considere “clean” y que hace que se consiga un software de mayor
calidad.
Además Clean Architecture respeta los principios S.O.L.I.D. que están orientados a la
programación orientada objetos e intentan que en lenguajes orientados a objetos se
pongan en práctica los conceptos de herencia, composición, abstracción,
encapsulamiento o polimorfismo y no se queden en simples definiciones.
Los principios S.O.L.I.D. se resumen en:
• Single Responsibility: cada objeto debe tener una única responsabilidad
• Open-Closed: abierto para la extensión, clausurado ante cambios.
• Liskov Substitution: las clases hijas deben poder ser tratadas como las clases
padre.
• Interface Segregation: es preferible muchas interfaces con pocos métodos a
pocas interfaces con muchos métodos.
• Dependency Inversion: los componentes deben depender de abstracciones, no
de implementaciones concretas.
Cómo se puede observar, S.O.L.I.D. corresponde a las iniciales de sus principios, de ahí
el nombre.
Volviendo a Clean Architecture, los principios que lo definen son:
• Independiente de Frameworks.
• Testeable.
• Independiente de la UI.
• Independiente de la BBDD.
• Independiente de cualquier agente externo.
46. Capítulo 8. Solución Propuesta
46
Figura 33: Captura de pantalla del formulario de alta de usuario de la aplicación ARCTIC de Android
8.2.7.2. Navigation Drawer
Todas las pantallas de la aplicación una vez el usuario esta logeado están compuestas
por una barra de herramientas (Toolbar) en la parte superior y el resto de pantalla se
dedica a un contenedor de contenido (content layout). Dependiendo de la pantalla
cambia el contenido del contenedor y el título y las herramientas disponibles en el
toolbar. Cómo recomienda Google con el Material Design, el toolbar debe estar en
diferente altura al contenedor ya que es un elemento más importante y se puede
observar que el toolbar crea una pequeña sombra sobre el contenedor.
En la aplicación hay tres pantallas principales desde las cuales se pueden realizar todas
las funciones que tiene la aplicación. Para poder navegar entre esas pantallas, se ha
utilizado un Navigation Drawer, o un menú lateral deslizante. Este tipo de menú es
accesible mediante un botón de menú en la barra de herramientas o mediante la acción
de desplazar el dedo desde la parte izquierda de la pantalla hacia el lado opuesto. Como
se puede ver en la Figura 34, en el Navigation Drawer muestra una breve información
del usuario en la parte superior, formada por el nombre y por el mail del usuario y se
puede acceder a la pantalla de Inicio, la pantalla de Perfil y la pantalla de Ajustes.
54. Capítulo 8. Solución Propuesta
54
Como se puede observar en la Figura 40, para la selección del estado de la nieve y del
feeling del usuario se ha utilizado una barra con botones de selección. Esto hace que
solo se pueda elegir una opción a la vez. En caso de seleccionar alguna, cambiará de
color indicando que está seleccionada.
Cuando se pulse al botón de validar, se redirigirá a la pantalla de inicio y ya aparecerá la
nueva actividad guardada.
8.2.7.7. Detalle de Actividad
Cuando se pulsa una actividad de la lista de actividades de la pantalla de inicio, se
mostrará una información detallada de la actividad en esta pantalla. Se mostrarán los
siguientes datos:
• Número de giros, que se calculan con los datos recogidos con el sensor.
• Duración de la bajada en el formato MIN:SEG.
• Feeling, que es el que indicó el usuario en el formulario de nueva actividad. En
caso de no haberlo completado, el estado será: Normal. Dependiendo del
estado, aparece un emoticono representado el estado.
• Estado de la nieve que también indicó en usuario en el formulario. En caso de no
haberlo completado, el estado de la nieve será: Blanda.
• Puntuación, que se calcula con un algoritmo aplicado a los datos tomados. Se
representa gráficamente con estrellas, de 1 a 5 pudiendo tomar valores medios
como 3,5 estrellas, en ese caso, se pintarán las tres primeras estrellas negras, la
cuarta mitad negra mitad vacía, y la quinta vacía entera.
• Unas gráficas que se dibujan con los datos tomados por el sensor. Aparecen tres
gráficas: Aceleración, Rotación y Yaw Pitch Roll o ángulos de navegación. Para un
usuario estándar no dice mucho, pero para alguien que sepa interpretar los datos
puede resultar muy útil. Para poder mostrar las tres gráficas con un tamaño
aceptable en la misma pantalla sin tener que hacer scroll vertical, se ha optado
por utilizar un sistema de pestañas en las que cada una contiene un gráfico. Se
puede cambiar de pestaña o haciendo swipe hacia los lados o pulsando en la
pestaña que se quiera visualizar. Los gráficos son interactivos, es decir, que se
pueden ampliar y mover para verlo más en detalle. Cuando se selecciona una
gráfica, los datos se dibujan de forma animada.
Se puede ver un ejemplo de pantalla en la Figura 41. En ese ejemplo, el usuario ha
realizado 4 giros, en 35 segundos, se ha sentido genial y la nieve estaba excesivamente
57. Capítulo 8. Solución Propuesta
57
otro apartado con sus ajustes, se haga con relativa facilidad. En estas dos categorías se
permite al usuario realizar las siguientes acciones:
• Olvidar dispositivo Bluetooth emparejado. En caso de haber realizado el
emparejamiento con el sensor, aparecerá la dirección Bluetooth del sensor y un
botón de eliminar. Al ser una acción importante, cuando se pulsa el botón de
borrar aparece una alerta informando de las consecuencias de la acción y
preguntando si desea olvidar el dispositivo Bluetooth. Se puede apreciar en la
Figura 43. Para mostrar esa alerta se ha utilizado un Alert Dialog. Están pensados
para confirmar e informar de acciones que conllevarán cambios en la aplicación.
• Cerrar sesión y borrar datos de la cuenta de usuario. Al ser también una decisión
importante se mostrará un Alert Dialog como se puede apreciar en la Figura 43.
Figura 43: Captura de pantalla del Alert Dialog para confirmar borrado de dispositivo Bluetooth y para confirmar el
logout de la aplicación ARCTIC de Android
8.2.7.10. Idioma
Se ha decidido desarrollar toda la aplicación tanto para inglés como para español. Para
eso se utiliza un archivo “strings.xml” para cada idioma. Ese archivos contendrá los
58. Capítulo 8. Solución Propuesta
58
strings que luego se utilizarán en el programa. Se encuentran en la carpeta values de los
recursos. Para cada idioma se crea una carpeta de values-CODIGO_IDIOMA que
contendrá su archivo strings. Es necesario que todos los archivos strings tengan las
mismas variables. Se usará un archivo u otro en función de la configuración de idioma
del móvil. En caso de no tener una carpeta dedicada a ese idioma, se utilizará el de la
carpeta values, que suele ser el de inglés.
8.2.7.11. Estructura UI
La estructura de la interfaz gráfica se divide en carpeta y cada carpeta contiene recursos
que se utilizarán para la interfaz gráfica. En la figura se pueden ver las diferentes
carpetas que forman parte de la estructura.
Las carpetas de drawable contienen los distintos iconos e
imágenes utilizados. Hay varias carpetas drawable en
función de la resolución de la pantalla en dónde se utilicen
los recursos.
La carpeta de anim contiene las animaciones utilizadas en
los iconos.
En la carpeta layout están todas las vistas utilizadas, ahí es
donde están todas las pantallas.
En la carpeta menú se definen los diferentes menús
utilizados, en este caso, el del naviagtion drawer.
Las carpetas mipmap contienen el icono de la aplicación
que se utilizará cuando se instale la aplicación en un
dispositivo.
Y por último la carpeta values que además de contener el archivo strings.xml, se pueden
definir otros archivos cómo colors.xml, dimens.xml, styles.xml, etc.. Se puede ver que
hay varias carpetas values en función del idioma del dispositivo para el archivo
strings.xml y otras en función de la versión del dispositivo o de la resolución de la
pantalla del dispositivo.
59. Capítulo 8. Solución Propuesta
59
8.2.8. Análisis de los datos
Con los datos tomados por el sensor del acelerómetro, giroscopio y los ángulos de
navegación, se ha decidido realizar dos cálculos para mostrar el número de giros hechos
en una bajada y una puntuación.
8.2.8.1.Número de giros
Para calcular el número de giros se han tenido en cuenta los datos del eje X del
acelerómetro. Esos datos nos indican que ha habido un movimiento del sensor en ese
mismo eje, siendo positivo hacia un lado y negativo para el lado contrario. Esto significa
que cada vez que la gráfica corte el eje X en 0 se estará realizando un cambio de
dirección, es decir, un giro. Para detectar ese corte del eje X con los datos tomado se ha
creado el siguiente algoritmo en Java:
El algoritmo detecta cuándo la gráfica empieza a tomar datos positivos y cuándo
empieza a tomar datos negativos. Cuando se den esas dos condiciones, se aumenta el
número de giros y se ponen los detectores a false. Después de muchas pruebas,
modificaciones y optimizaciones se ha llegado a un algoritmo bastante preciso.
int giros = 0;
boolean corte_subida = false;
boolean corte_bajada = false;
for(int i = 1; i < data_acc_x.size(); i++){
if(data_acc_x.get(i) > 0){
if(!corte_subida){
corte_subida = true;
}//if
}else if(!corte_bajada){
corte_bajada = true;
}//if-else
if(corte_subida && corte_bajada){
giros ++;
corte_subida = false;
corte_bajada = false;
}//if
}//for
60. Capítulo 8. Solución Propuesta
60
8.2.8.2.Puntuación
Desde el primer momento que se pensó en la aplicación, se tuvo la idea de incluir una
puntuación para que el usuario obtuviese algún dato sencillo y útil para interpretar el
resultado. Tras un análisis del esquí, aplicando conocimientos de profesionales y
contando con los datos del sensor, se llegó a un algoritmo basado en la pendiente de la
pista y la angulación del esquí.
Para la pendiente de la pista, se ha utilizado una función que calcula la pendiente media
de la pista. Para ello se ha calculado la media de los valores del eje Y del acelerómetro
que están normalizados a 1, por lo tanto los datos están en el intervalo [-1,1] y luego se
ha hecho la conversión a tanto por ciento. 1 = 100%, 0.5 = 50%.
Figura 44: Imagen aclarativa de la inclinación de la pista.
Se entiende angulación del esquí como el ángulo que forma respecto al eje horizontal.
La angulación del esquí es fundamental a la hora de realizar un buen giro. A mayor
angulación del esquí, menor será el radio de giro por lo tanto se hará un giro más
cerrado. Esto es debido a que cuanto mayor sea la angulación del esquí más presión se
ejerce sobre él y por lo tanto más se dobla y cuanto más doblado esté, el radio de giro
es menor. En la Figura 45 se puede ver claramente qué es la angulación del esquí.
Por otro lado, el contacto de la suela del esquí con la nieve influye en la velocidad del
esquiador pues cuanta mayor superficie de suela esté en contacto con la nieve mayor
será la velocidad que se gana. Los esquiadores profesionales aplican cera fluorada a la
suela para disminuir la fricción y ganar aceleración.
Para calcular la angulación media del esquí se han utilizado los valores que tomaba el
acelerómetro en el eje X normalizados a 1 y luego se ha expresado en tanto por ciento.
65. Capítulo 10. Resultados
65
10. Resultados
Para probar la calidad del trabajo realizado se han realizado dos tipos de pruebas:
• Pruebas de calidad. Estas pruebas se han pensado para medir la calidad del
código realizado y ver en qué puntos hay que mejorar para conseguir un código
de calidad en un futuro. Para estas pruebas se ha utilizado una herramienta
online de análisis del código llamada Kiuwan [55]. El análisis se ha realizado sobre
el código Java del proyecto y los resultados han sido bastante satisfactorios. En
la Figura 50 se puede ver un resumen del análisis realizado. Cómo se puede
observar, las áreas de seguridad, eficiencia, portabilidad y confiabilidad del
código superan el target establecido (90 sobre 100 por defecto). En cambio en la
mantenibilidad del código esta dos tercios por debajo de lo esperado.
Figura 50: Resumen del análisis de código realizado con la herramienta Kiuwan.
66. Capítulo 10. Resultados
66
• Pruebas funcionales. En este caso se ha trabajado en la funcionalidad de la
aplicación, es decir, se ha comprobado si la aplicación cumple con los requisitos
descritos en el apartado 8.2.2. y para ello se han diseñado una serie de pruebas:
1. Registro de usuario con datos no válidos y con datos válidos.
2. Edición de datos de usuario con datos no válidos y con datos válidos.
3. Logout de la aplicación.
4. Emparejamiento con un dispositivo BLE.
5. Acción de borrar el sensor y volver a emparejarlo.
6. Emparejar con un dispositivo no compatible y tratar de grabar actividad
7. Acción de recomendar aplicación.
8. Acción de enviar comentario al desarrollador.
9. Grabación, visualización de nueva actividad y borrado de una actividad.
10. Cancelación de una actividad.
11. Grabación y visualización de una actividad con una puntuación alta y otra
con puntuación baja
Con esa batería de pruebas se ha intentado abarcar todos los requisitos de la aplicación.
Esta batería de pruebas se ha ido diseñando según se iban implementando
funcionalidades con el fin de probarlas. Y nos han servido para corregir errores y mejorar
la aplicación.
Los resultados de las pruebas funcionales han sido los siguientes:
1. Registro de usuario con datos no válidos y con datos válidos: OK
En la pantalla del formulario de nuevo usuario se ha introducido para el campo
de nombre y de email valores incorrectos. En la Figura 51 se pueden ver las
diferentes capturas de pantalla que se han dado en la prueba. Se puede
observar que el texto “123” no es válido para el nombre y que la dirección de
correo “kike@gmail” tampoco es válida. Una vez corregidos esos campos, sí
que permite crear el usuario correctamente.
68. Capítulo 10. Resultados
68
2. Edición de datos de usuario con datos no válidos y con datos válidos: OK
En este caso de prueba se ha intentado editar el perfil con unos datos no
válidos. Se ha utilizado el texto “Acedo2” para el campo de apellido y el texto
de “kike. acedo@gmail.com”. Una vez corregido el número del apellido y el
espacio del email, el usuario se ha guardado correctamente.
Figura 52: Resultados del caso de prueba 2
3. Logout de la aplicación: OK
Está situación es muy importante ya que es una acción que puede tener
grandes consecuencias por lo que se esperaban dos cosas. La primera es que
aparezca un alert dialog que pregunte por la confirmación de la acción y en caso
de confirmar, y el otro es que se borren todos los datos.
En este caso, sólo se puede demostrar si aparece el alert dialog con la pregunta
de confirmación. Respecto al borrado de datos, se puede confirmar mediante
el Log de la aplicación que se observa en la Figura 53.
Figura 53: Log del caso de prueba 3