scieee AI-readable full text Open interactive document viewer

Desarrollo de una aplicación móvil para la monitorización de personas con movilidad reducida

González Ibarra, Javier

Abstract

En este Trabajo Fin de Máster se han desarrollado dos aplicaciones que permitirán monitorizar y analizar las señales capturadas de la sedestación del paciente, así como del movimiento de la silla de ruedas, para dar asistencia y soporte al personal sanitario. La primera de las aplicaciones, es una aplicación para teléfonos móviles que ha sido desarrollada en Android Studio. Esta primera aplicación se encarga de la adquisición de los datos que son enviados por la silla de ruedas a través de bluetooth. La segunda aplicación, es una aplicación para el PC y se ha llevado a cabo a través de Matlab, el propósito de esta aplicación es que los clínicos puedan analizar los datos obtenidos por la aplicación móvil cuando consideren necesario. Por último, tras desarrollar ambas aplicaciones se han validado a través de diferentes ensayos experimentales.

Full text

Curso: 2022-2023 Director/Directora: Cabanes Axpe, Itziar Estudiante: Gonzalez Ibarra, Javier DESARROLLO DE UNA APLICACIÓN MÓVIL PARA LA MONITORIZACIÓN DE PERSONAS CON MOVILIDAD REDUCIDA MÁSTER UNIVERSITARIO EN INGENIERÍA DE CONTROL, AUTOMATIZACIÓN Y ROBÓTICA TRABAJO FIN DE MASTER Fecha: Bilbao, 20, 09, 2023 2 RESUMEN En este Trabajo Fin de Máster se han desarrollado dos aplicaciones que permitirán monitorizar y analizar las señales capturadas de la sedestación del paciente, así como del movimiento de la silla de ruedas, para dar asistencia y soporte al personal sanitario. La primera de las aplicaciones, es una aplicación para teléfonos móviles que ha sido desarrollada en Android Studio. Esta primera aplicación se encarga de la adquisición de los datos que son enviados por la silla de ruedas a través de bluetooth. La segunda aplicación, es una aplicación para el PC y se ha llevado a cabo a través de Matlab, el propósito de esta aplicación es que los clínicos puedan analizar los datos obtenidos por la aplicación móvil cuando consideren necesario. Por último, tras desarrollar ambas aplicaciones se han validado a través de diferentes ensayos experimentales. Palabras clave: Aplicación, Sillas de Ruedas, Android Studio, Matlab, Bluetooth 3 LABURPENA Master Amaierako Lan honetan bi aplikazio garatu dira, pazientearen sedestaziotik eta gurpilaulkiaren mugimendutik hartutako seinaleak monitorizatu eta aztertu ahal izateko, osasun-langileei laguntza eta euskarria emateko. Lehenengo aplikazioa, telefono mugikorretarako aplikazio bat da eta Android Studio-n garatu da. Lehenengo aplikazio hau gurpil-aulkiak bluetooth-en bidez bidaltzen dituen datuak eskuratzeaz arduratzen da. Bigarren aplikazioa Matlab-en bidez gauzatu den PC-rako aplikazio bat da. Aplikazio honen helburua klinikoek beharrezkotzat jotzen dutenean aplikazio mugikorretatik lortutako datuak aztertu ahal izatea da. Azkenik, bi aplikazioak garatu ondoren, hainbat saiakuntza esperimentalen bidez balioztatu dira. Hitz-gakoak: Aplikazioa, Gurpil-Aulkia, Android Studio, Matlab, Bluetooth 4 ABSTRACT In this Master's Final Project, two applications have been developed to monitor and analyze the signals captured from the patient's sitting position, as well as the movement of the wheelchair, to provide assistance and support to health personnel. The first application is an application for cell phones that has been developed in Android Studio. This first application is responsible for the acquisition of data that si sent by the wheelchair via Bluetooth. The second application, is an application for the PC and has been carried out through Matlab. The purpose of this application is that clinicians can analyze the data obtained by the mobile application when they consider necessary. Finally, after developing both applications, they have been validated through different experimental trials. Keywords: Application, Wheelchair, Android Studio, Matlab, Bluetooth 5 ÍNDICE 1. INTRODUCCIÓN ................................................................................................................................. 12 2. CONTEXTO ......................................................................................................................................... 14 3. OBJETIVOS Y ALCANCE DEL TRABAJO ................................................................................................ 16 4. BENEFICIOS QUE APORTA EL TRABAJO ............................................................................................. 17 4.1. Beneficios científicos-técnicos.............................................................................................................. 17 4.2 Beneficios económicos .......................................................................................................................... 17 4.3 Beneficios sociales ................................................................................................................................. 17 5. ESTADO DEL ARTE .............................................................................................................................. 19 5.1. Monitorización de sillas de ruedas ....................................................................................................... 19 5.2. Aplicaciones para la salud .................................................................................................................... 21 5.3. Arquitectura Android ............................................................................................................................ 22 5.3.1. Kernel de Linux ............................................................................................................................... 23 5.3.2. Capa de abstracción de hardware (HAL) ....................................................................................... 23 5.3.3. Tiempo de ejecución de Android (ART) .......................................................................................... 23 5.3.4. Bibliotecas C/C++ nativas .............................................................................................................. 23 5.3.5 Marco de trabajo de la API de Java ................................................................................................ 23 5.3.6. Apps del sistema ............................................................................................................................ 24 5.4. Conclusión ............................................................................................................................................ 24 6. ANÁLISIS DE ALTERNATIVAS .............................................................................................................. 26 6.1. Hardware adquisición de datos ............................................................................................................ 26 6.2. Software adquisición de datos ............................................................................................................. 27 6.3. Base de datos ........................................................................................................................................ 28 7. DESCRIPCIÓN DE LA SOLUCIÓN PROPUESTA ..................................................................................... 29 7.1. Visión general ....................................................................................................................................... 29 7.2. Diseño de la electrónica del sistema .................................................................................................... 31 7.3. Desarrollo del código para la adquisición de datos .............................................................................. 33 7.4. Aplicación de Monitorización en dispositivo móvil .............................................................................. 37 7.4.1. Monitorización ............................................................................................................................... 37 7.4.2. Análisis ........................................................................................................................................... 42 7.5. Aplicación de la herramienta de Análisis para clínicos ......................................................................... 44 7.5.1. Monitorización & Simulación ......................................................................................................... 44 7.5.2. Análisis ........................................................................................................................................... 52 6 7.6. Validación: ensayos y análisis de los resultados ................................................................................... 55 7.6.1. Definición de los ensayos ............................................................................................................... 55 7.6.1.1 Rampas .................................................................................................................................... 56 7.6.1.2 Libre ......................................................................................................................................... 57 7.6.1.3 Giros ......................................................................................................................................... 58 7.6.1.4 Suelo liso .................................................................................................................................. 58 7.6.1.5 Pavimentos .............................................................................................................................. 59 7.6.2. Resultados ..................................................................................................................................... 61 7.6.2.1 Rampas .................................................................................................................................... 61 7.6.2.2 Libre ......................................................................................................................................... 67 7.6.2.3 Giros ......................................................................................................................................... 71 7.6.2.4 Suelo liso .................................................................................................................................. 73 7.6.2.5 Pavimentos .............................................................................................................................. 75 8. METODOLOGÍA .................................................................................................................................. 79 8.1. DESCRIPCIÓN DE TAREAS ..................................................................................................................... 79 8.2 DIAGRAMA DE GANTT ........................................................................................................................... 82 9. ASPECTOS ECONÓMICOS ................................................................................................................... 84 9.1. Recursos humanos ................................................................................................................................ 84 9.2. Amortización de recursos ..................................................................................................................... 84 9.3. Recursos materiales.............................................................................................................................. 85 9.4. Coste total del proyecto ....................................................................................................................... 85 10. CONCLUSIONES................................................................................................................................ 87 11. BIBLIOGRAFÍA .................................................................................................................................. 88 ANEXO I: MANUAL DE USUARIO ........................................................................................................... 90 I. INSTALACIÓN DEL SOFTWARE .................................................................................................................. 91 II. IMPLEMENTACIÓN DEL SOFTWARE ........................................................................................................ 91 III. UTILIZACIÓN DE LA APLICACIÓN DE MONITORIZACIÓN EN DISPOSITIVO MÓVIL.................................. 95 A. Monitorización .................................................................................................................................... 95 B. Análisis ................................................................................................................................................. 98 IV. UTILIZACIÓN DE LA APLICACIÓN DE LA HERRAMIENTA DE ANÁLISIS PARA LOS CLÍNICOS.................. 100 A. Monitorización .................................................................................................................................. 100 B. Simulación ......................................................................................................................................... 105 C. Análisis ............................................................................................................................................... 107 7 ANEXO II: CÓDIGO ARDUINO ............................................................................................................... 110 I. Código del Arduino maestro ................................................................................................................... 111 II. Código del primer esclavo Arduino ....................................................................................................... 113 III. Código del segundo esclavo Arduino.................................................................................................... 115 ANEXO III: CÓDIGO MATLAB ............................................................................................................... 117 ANEXO IV: CÓDIGO ANDROID STUDIO ................................................................................................ 210 I. SeleccionarAccion.java ........................................................................................................................... 211 II. MainActivity.java ................................................................................................................................... 212 III. Monitorizacion.java .............................................................................................................................. 214 IV. Analisis.java .......................................................................................................................................... 230 V. BBDD_Helper.java ................................................................................................................................. 241 VI. Estructura_BBDD.java .......................................................................................................................... 241 VII. ListAdapter.java ................................................................................................................................... 243 VIII. Modelo.java ........................................................................................................................................ 244 IX. AndroidManifest.xml ............................................................................................................................ 245 8 ÍNDICE DE FIGURAS Figura 1. La pirámide de población de España: pasado, presente y futuro .................................................... 14 Figura 2. Dos ruedas de medición basadas en células de carga: (A) SmartWheel y (B) Optipush .................. 19 Figura 3. Dispositivo Activ8 basado en acelerómetros triaxiales .................................................................... 20 Figura 4. Dispositivo TexiCare basado en sensores piezoresistivos ................................................................ 20 Figura 5. App que informa sobre el uso de la silla de ruedas .......................................................................... 21 Figura 6. Cuota de mercado de sistemas operativos móviles a nivel mundial................................................ 22 Figura 7. Componentes principales de Android .............................................................................................. 22 Figura 8. Esquema general del sistema ........................................................................................................... 29 Figura 9. Visión general de la solución hardware del sistema ........................................................................ 30 Figura 10. Esquema del desarrollo de la “Aplicación de Monitorización en dispositivo móvil” ..................... 30 Figura 11. Esquema del desarrollo de la “Aplicación de la herramienta de Análisis para los clínicos” .......... 31 Figura 12. Diagrama de las conexiones del sistema ........................................................................................ 32 Figura 13. Circuito electrónico correspondiente a la comunicación I2C ......................................................... 33 Figura 14. Diagrama de las tareas que cumple cada programa ...................................................................... 34 Figura 15. Diagrama de flujo correspondiente a las tareas del maestro ........................................................ 35 Figura 16. Diagrama de flujo correspondiente a las tareas del primer esclavo .............................................. 36 Figura 17. Diagrama de flujo correspondiente a las tareas del segundo esclavo ........................................... 36 Figura 18. Esquema de las funcionalidades de la Aplicación de Monitorización en dispositivo móvil ........... 37 Figura 19. Pantalla de inicio ............................................................................................................................. 38 Figura 20. Pantalla de bluetooth ..…………………………………………………………………………………………………………….. 37 Figura 21. Pantalla activar bluetooth .............................................................................................................. 39 Figura 22. Pantalla de monitorización ..…………………………………………………………………………………………………….. 39 Figura 23. Pantalla guardar datos .................................................................................................................... 41 Figura 24. Diagrama de flujo de la pantalla de monitorización ....................................................................... 42 Figura 25. Pantalla de análisis …………………………………………………………………………………………………………………… 41 Figura 26. Pantalla de opciones ensayos ......................................................................................................... 43 Figura 27. Esquema de las funcionalidades de la aplicación “Wheelchair” diseñada ..................................... 44 Figura 28. Pantalla inicial de la pestaña Monitorización & Simulación ........................................................... 45 Figura 29. Pantalla principal de la monitorización para la postura en sedestación ........................................ 48 Figura 30. Pantalla principal de la monitorización para el uso dinámico (en movimiento) de la silla ........... 49 Figura 31. Diagrama de flujo de la monitorización ......................................................................................... 50 Figura 32. Pantalla principal de la simulación para la postura en sedestación ............................................... 51 Figura 33. Pantalla inicial de la pestaña análisis .............................................................................................. 52 Figura 34. Pantalla principal del análisis con la tabla ...................................................................................... 54 Figura 35. Pantalla principal de la simulación para la postura en sedestación ............................................... 55 Figura 36. Rampa edificio B (Subida) ………………………………………………………………………………………………………… 55 Figura 37. Rampa edificio B (Bajada) ............................................................................................................... 56 Figura 38. Rampa San Mamés ......................................................................................................................... 56 Figura 39. Rampa pasillo F ............................................................................................................................... 57 Figura 40. Rampa edificio 1 ............................................................................................................................. 57 Figura 41. Línea libre columnas ………………………………………………………………………………………………………………… 57 Figura 42. Línea libre columnas (Recorrido) .................................................................................................... 58 9 Figura 43. Pasillo interior ................................................................................................................................. 58 Figura 44. Pavimento podotactil rojo .............................................................................................................. 59 Figura 45. Pavimento a franjas ........................................................................................................................ 59 Figura 46. Vías de tranvía ................................................................................................................................ 60 Figura 47. Sujeto1 RBb V2 ............................................................................................................................... 62 Figura 48. Sujeto2 RBb V1 ............................................................................................................................... 63 Figura 49. Sujeto2 RBs V1 ................................................................................................................................ 63 Figura 50. Sujeto1 RSb V1 ................................................................................................................................ 64 Figura 51. Sujeto1 RSs V1 ................................................................................................................................ 65 Figura 52. Sujeto1 RFs V2 ................................................................................................................................ 66 Figura 53. Sujeto1 RFb V2 ................................................................................................................................ 67 Figura 54. Sujeto1 R1 V5 .................................................................................................................................. 68 Figura 55. Sujeto1 R1 V2 .................................................................................................................................. 69 Figura 56. Sujeto2 R1 V1 .................................................................................................................................. 70 Figura 57. Sujeto2 R1 V5 .................................................................................................................................. 70 Figura 58. Sujeto1 LL V1 .................................................................................................................................. 71 Figura 59. Sujeto1 G90 V2 ............................................................................................................................... 72 Figura 60. Sujeto1 G180 V1 ............................................................................................................................. 72 Figura 61. Sujeto1 LC V2 .................................................................................................................................. 73 Figura 62. Sujeto1 LC V5 .................................................................................................................................. 74 Figura 63. Sujeto1 LD V3 .................................................................................................................................. 75 Figura 64. Sujeto1 PPR V4 ............................................................................................................................... 76 Figura 65. Sujeto2 PF V4 .................................................................................................................................. 77 Figura 66. Sujeto1 VT V1.................................................................................................................................. 78 Figura 67. Diagrama de Gantt.......................................................................................................................... 83 Figura 68. Porcentaje de gastos por partida ................................................................................................... 86 Figura 69. Seleccionar la placa y el puerto COM ............................................................................................. 92 Figura 70. Cargar el sketch en la placa de Arduino ......................................................................................... 92 Figura 71. Instalar la aplicación en el teléfono móvil ...................................................................................... 93 Figura 72. Activar el Permiso de Dispositivos cercanos .................................................................................. 93 Figura 73. Seleccionar la app “Wheelchair” .................................................................................................... 94 Figura 74. Instalación de la app “Wheelchair” ................................................................................................ 94 Figura 75. App “Wheelchair” instalada en MATLAB ........................................................................................ 95 Figura 76. Pantalla de inicio de la aplicación móvil (monitorizar) ................................................................... 95 Figura 77. Pantalla del bluetooth de la aplicación móvil (bluetooth desactivado) ......................................... 96 Figura 78. Pantalla del bluetooth de la aplicación móvil (seleccionar dispositivo) ......................................... 96 Figura 79. Pantalla de la monitorización de la aplicación móvil (empezar) .................................................... 97 Figura 80. Pantalla de la monitorización de la aplicación móvil (parar) ......................................................... 97 Figura 81. Pantalla de la monitorización de la aplicación móvil (guardar)...................................................... 98 Figura 82. Pantalla de inicio de la aplicación móvil (analizar) ......................................................................... 98 Figura 83. Pantalla de inicio de la aplicación móvil (ensayos) ......................................................................... 99 Figura 84. Pantalla de análisis de la aplicación móvil (opciones) .................................................................... 99 Figura 85. Pantalla de análisis de la aplicación móvil (borrar base de datos) ............................................... 100 Figura 86. Pantalla inicial de la pestaña de Monitorización & Simulación (monitorizar e idioma) ............... 101 16 3. OBJETIVOS Y ALCANCE DEL TRABAJO El objetivo principal de este TFM es el desarrollo de aplicaciones de monitorización de la postura en sedestación para personas con movilidad reducida que utilizan silla de ruedas para su desplazamiento. Estas herramientas, tanto en versión ordenador como en versión app móvil, permitirán ayudar al terapeuta de forma cuantitativa con el diagnóstico funcional del paciente. Este objetivo principal se divide en los siguientes objetivos específicos: 1. Revisión de los antecedentes bibliográficos existentes alrededor de la monitorización de personas con movilidad reducida. Para ello, se utilizará las bases de datos como Web Of Science o Scopus, a las cuales está inscrita la UPV/EHU, junto con otra documentación relacionada. 2. Diseño e implementación del circuito electrónico que se encargue de la adquisición de los datos. Este sistema será el resultado de la unión de dos dispositivos de monitorización previamente realizados (i-Kuxin o cojín sensorizado para captar la postura; y el dispositivo de la medición dinámica de la silla de ruedas, el cual capta el movimiento en 3D de la misma). 3. Desarrollar una aplicación para el teléfono móvil, en el entorno de Android Studio, que permita la captura de datos a través del móvil. Esta aplicación será de gran comodidad en los ensayos que requieran de desplazamientos, ya que solo se necesitará un teléfono móvil para su uso. 4. Desarrollar una segunda aplicación, en este caso, en el entorno de Matlab, principalmente dirigida a los fisioterapeutas. De tal forma que se pueda realizar el procesamiento automático de los datos, visualizar los históricos seleccionados, asistencia en el diagnostico funcional, etc. Esta aplicación se realizará da tal forma que resulte intuitiva y de fácil uso y también permitirá la adquisición de datos. 5. Validar el sistema de monitorización con ambas aplicaciones. Tras realizar el sistema de monitorización y desarrollar ambas aplicaciones, se llevarán a cabo una serie de ensayos para verificar el funcionamiento correcto del sistema y de las aplicaciones. El alcance de este proyecto es de labor investigadora, ya que se quiere dotar al Grupo de Sensorización Virtual para Bioingeniería (VISENS) con el software de un sistema de monitorización de una silla de ruedas, así como del hardware. De tal forma que se pueda ofrecer un sistema de monitorización completo para personas que requieren de una silla de ruedas para desplazarse, así como para futuras investigaciones, pudiendo realizar estudios clínicos con asociaciones como FEKOOR (Federación Coordinadora de Personas con Discapacidad Física y/u Orgánica de Bizkaia, coordinado a más de 8.700 pacientes) [3]. 17 4. BENEFICIOS QUE APORTA EL TRABAJO En este apartado se describen los beneficios que aporta este proyecto. Para lo cual, se ha optado por dividirlos en los siguientes aspectos: beneficios científicos-técnicos, beneficios económicos y beneficios sociales. 4.1. Beneficios científicos-técnicos Como se ha mencionado anteriormente, este TFM forma parte de un proyecto de investigación dentro del Grupo de Sensorización Virtual para Bioingeniería. Por lo que el objetivo principal es desarrollar un sistema de monitorización completo, el cual aúne los dispositivos para monitorizar la postura en sedestación y para el uso de la silla de ruedas. Por lo tanto, el beneficio técnico principal de este proyecto es generar dos aplicaciones que se puedan utilizar como herramienta para visualizar, almacenar y analizar los datos, junto con el sistema completo para la adquisición de los datos, facilitando al terapeuta ayuda para la valoración funcional del estado de los pacientes y la terapia de rehabilitación personalizada a realizar. La segunda aplicación, la aplicación desarrollada para el teléfono móvil, es un prototipo inicial por lo que es un buen punto de partida para poder realizar futuras mejoras. Asimismo, todos los conocimientos adquiridos gracias a este trabajo serán de gran utilidad para desarrollar avances en el proyecto. 4.2 Beneficios económicos La gran mayoría de los dispositivos de monitorización del mercado son independientes y además su valor es más elevado, de modo que con este sistema de monitorización se proporcionará mayor cantidad de información y además su coste será mucho más reducido. En cuanto al hardware, este será de menor precio que los existentes y además se proporciona dos soluciones softwares de gran interés médico. Por lo que estas aplicaciones se podrán utilizar en cualquier dispositivo, teléfono móvil. 4.3 Beneficios sociales En cuanto a los beneficios sociales, este sistema de monitorización está completamente dirigido a satisfacer una necesidad social, ya que permite la rehabilitación y terapia de personas con movilidad reducida. Además, los pacientes estarán monitorizados continuamente, por lo que el personal 18 sanitario podrá detectar alteraciones fuera del ambiente clínico. Con todo esto se conseguirá, en la medida de lo posible, mejorar la calidad de vida de las personas con movilidad reducida. 19 5. ESTADO DEL ARTE En este apartado se presentan los resultados de la búsqueda bibliografía en torno a los sistemas de monitorización existentes para las sillas de ruedas. Con ese fin, se han analizado los antecedentes bibliográficos para la monitorización de diferentes aspectos en usuarios de sillas de ruedas (postura, desplazamiento, actividad física…), junto con las interfaces gráficas diseñadas para estos sistemas. Posteriormente, se analizan los trabajos relativos a arquitecturas Android para sistemas de monitorización y análisis, finalizando con las conclusiones más relevantes de estos sistemas. 5.1. Monitorización de sillas de ruedas A día de hoy, son varios los sistemas existentes capaces de monitorizar ciertos aspectos en usuarios de sillas de ruedas. En cuanto a pacientes con lesiones de médula espinal, que utilizan sillas de ruedas manuales, se han desarrollado sistemas de monitorización a través de ruedas de medición comerciales [4]. En la figura 2 se pueden apreciar estas ruedas que se basan en células de carga multiejes, las cuales miden las fuerzas que ejerce el usuario en la propulsión de la silla, con el objetivo de mejorar su rehabilitación. Figura 2. Dos ruedas de medición basadas en células de carga: (A) SmartWheel y (B) Optipush [4] También se han desarrollado diferentes sistemas de monitorización para cuantificar la actividad física de los usuarios. Se encuentran los que emplean wereables situados en los usuarios para medir este parámetro [5], del mismo modo existen sistemas que utilizan dispositivos comerciales [6] o incluso sistemas que emplean los acelerómetros del teléfono móvil para obtener esa información [7]. Todos estos sistemas tienen como fin evitar lesiones u otras enfermedades secundarias y en la figura 3 se puede observar uno de ellos, el cual se basa en dos dispositivos comerciales Activ8, uno se coloca en la rueda y otro en la muñeca del usuario, de tal forma que se pueda medir la actividad física. 20 Figura 3. Dispositivo Activ8 basado en acelerómetros triaxiales [6] Del mismo modo que con las sillas de ruedas manuales, han aparecido investigaciones para monitorizar personas que utilizan sillas de ruedas eléctricas. Dentro de estos estudios se pueden encontrar sistemas para medir la movilidad de los pacientes o para evaluar los niveles de actividad, en ambos casos la adquisición de datos también se ha realizado mediante los acelerómetros de los teléfonos móviles de los usuarios [8, 9]. Asimismo, se han creado dispositivos que tienen como objetivo principal prevenir las úlceras por presión [10]. En este caso, la información se obtiene mediante sensores piezoresistivos. En la figura 4 se puede ver los datos recopilados por este dispositivo llamado TexiCare, que refleja las presiones aplicadas en la superficie textil. Figura 4. Dispositivo TexiCare basado en sensores piezoresistivos [10] Al mismo tiempo que los sistemas de monitorización han surgido sillas de ruedas inteligentes [1], sillas de ruedas eléctricas que ya incorporan los ordenadores, sensores y la tecnología de asistencia [11], atendiendo mejor a las personas con todo tipo de discapacidades y satisfaciendo un mayor número de necesidades. 21 5.2. Aplicaciones para la salud Con los avances de la tecnología móvil y su actual disponibilidad por parte de la mayoría de la población, ha surgido la posibilidad de que estos dispositivos ofrezcan nuevos servicios. En el presente, esto se ha podido ver reflejado en las plataformas de distribución digital como Google Play Store o Apple App Store, donde la cantidad de aplicaciones médicas o relacionadas con la salud se ha visto incrementada. El acrecentamiento de estas aplicaciones móviles para la gestión de la salud, ha modificado la forma en la que los ciudadanos o los usuarios de teléfonos móviles puedan acceder a la información médica, convirtiéndolos en una nueva herramienta para poder brindar servicios relacionados con la salud. Al igual que para el resto de la población, también han surgido aplicaciones móviles sanitarias dirigidas a personas que se desplazan en silla de ruedas, junto con estudios que demuestran el potencial y los beneficios de emplearlas con estas personas. Entre estos encontramos aplicaciones que realizan el mapeo de presión, proporcionando a los usuarios una vista de mapa en vivo y recordatorios para realizar cambios de peso [12]. Del mismo modo han aparecido investigaciones que utilizan aplicaciones que miden el estilo de vida y los cambios en la salud, para después entregar esta información a los usuarios [13]. También han aparecido aplicaciones informativas, las cuales los usuarios pueden emplear a modo de guía, ya que proporcionan información sobre el uso correcto de las sillas de ruedas [14]. En la Figura 3 se muestran unas pantallas de una de estas aplicaciones la cual entrega información como: las ventajas y desventajas de un respaldo rígido, que ocurre cuando el eje de la rueda esta por detrás del hombro, videos con entrenadores virtuales, … Todas estas aplicaciones mencionadas se han desarrollado tanto para el sistema operativo Android como para iOS. Figura 5. App que informa sobre el uso de la silla de ruedas [14] 22 5.3. Arquitectura Android En el último año alrededor del 71% de los teléfonos móviles vendidos disponían de Android como su sistema operativo, por detrás están iOS con una cuota del mercado del 28,41% y Samsung que cuenta con el 0,38% (Figura 6). Figura 6. Cuota de mercado de sistemas operativos móviles a nivel mundial [15] Android es una plataforma de código abierto basado en Linux creada para una variedad amplia de dispositivos. En el siguiente diagrama (Figura 7), se muestran los componentes principales de la plataforma Android y en los siguientes puntos se describe uno a uno cada componente. Figura 7. Componentes principales de Android [16] 23 5.3.1. Kernel de Linux La base de la plataforma Android es el kernel de Linux, el cual permite que Android aproveche funciones de seguridad claves y, al mismo tiempo, permite a los fabricantes de dispositivos desarrollar controladores de hardware para un kernel conocido. 5.3.2. Capa de abstracción de hardware (HAL) La capa de abstracción hardware brinda interfaces estándares que exponen las capacidades de hardware del dispositivo al marco de trabajo de la API de Java de nivel más alto. La HAL consiste en varios módulos de biblioteca y cada uno de estos implementa una interfaz para un tipo específico de componente de hardware, como el módulo de la cámara o de Bluetooth. Cuando el marco de trabajo de una API realiza una llamada para acceder a hardware del dispositivo, el sistema Android carga el módulo de biblioteca para el componente de hardware en cuestión. 5.3.3. Tiempo de ejecución de Android (ART) Para los dispositivos con Android 5.0 o versiones posteriores, cada app ejecuta sus propios procesos con sus propias instancias del tiempo de ejecución de Android (ART). El ART está escrito para ejecutar varias máquinas virtuales en dispositivos de memoria baja ejecutando archivos DEX, un formato de código de bytes diseñado especialmente para Android y optimizado para ocupar un espacio de memoria mínimo. Crea cadenas de herramientas, como Jack, y compila fuentes de Java en código de bytes DEX que se pueden ejecutar en la plataforma Android. 5.3.4. Bibliotecas C/C++ nativas Muchos componentes y servicios centrales del sistema Android, como el ART y la HAL, se basan en código nativo que requiere bibliotecas nativas escritas en C y C++. La plataforma Android proporciona API del marco de trabajo de Java para exponer la funcionalidad de algunas de estas bibliotecas nativas a las apps. 5.3.5 Marco de trabajo de la API de Java Todo el conjunto de funciones del SO Android está disponible mediante API escritas en el lenguaje Java. Estas API son los cimientos que necesitas para crear apps de Android simplificando la reutilización de componentes del sistema y servicios centrales y modulares, como los siguientes: 24 ▪ Un sistema de vista enriquecido y extensible que puedes usar para compilar la IU de una app; se incluyen listas, cuadrículas, cuadros de texto, botones e incluso un navegador web integrable. ▪ Un administrador de recursos que te brinda acceso a recursos sin código, como strings localizadas, gráficos y archivos de diseño. ▪ Un administrador de notificaciones que permite que todas las apps muestren alertas personalizadas en la barra de estado. ▪ Un administrador de actividad que administra el ciclo de vida de las apps y proporciona una pila de retroceso de navegación común. ▪ Proveedores de contenido que permiten que las apps accedan a datos desde otras apps, como la app de Contactos, o compartan sus propios datos. Los desarrolladores tienen acceso total a las mismas API del marco de trabajo que usan las apps del sistema Android. 5.3.6. Apps del sistema En Android se incluye un conjunto de apps centrales para correo electrónico, mensajería SMS, calendarios, navegación en Internet y contactos, entre otros elementos. Las apps incluidas en la plataforma no tienen un estado especial entre las apps que el usuario elije instalar; por ello, una app externa se puede convertir en el navegador web, el sistema de mensajería SMS o, incluso, el teclado predeterminado del usuario (existen algunas excepciones, como la app de Ajustes del sistema). Las apps del sistema funcionan como apps para los usuarios y brindan capacidades claves a las cuales los desarrolladores pueden acceder desde sus propias apps. Por ejemplo, si en tu app se intenta entregar un mensaje SMS, no es necesario que compiles esa funcionalidad tú mismo; como alternativa, puedes invocar la app de SMS que ya está instalada para entregar un mensaje al receptor que especifiques. 5.4. Conclusión Para dispositivos de monitorización que tienen como objetivo cuantificar la actividad física existen soluciones como las que emplean dispositivos comerciales o wereables situados en los usuarios. Sin embargo, estos sistemas de monitorización son intrusivos de la actividad física para personas con baja movilidad, que usan sillas de ruedas para desplazarse. También existen soluciones como las que utilizan los acelerómetros del teléfono móvil y a pesar de no ser una solución invasiva, no se 25 consigue que las estimaciones sean tan precisas como con los sensores externos. Asimismo, se han desarrollado sistemas de monitorización para medir la presión ejercida por el usuario en la silla, esto es, la postura, pero todavía siguen siendo independientes de los que miden otros aspectos como la actividad física. 32 Para realizar la unión de ambos dispositivos se propone una conexión de la siguiente forma: ▪ Mantener el Arduino Uno como maestro. ▪ Mantener el Arduino Nano, que recoge la información de los encoders, como esclavo. ▪ Añadir el Arduino Mega, que recoge la información de los 16 FSRs, como segundo esclavo. ▪ Mandar toda la información vía bluetooth (HC-06) a través del maestro. En la Figura 12 se muestra un esquema de la arquitectura resultante. Figura 12. Diagrama de las conexiones del sistema Para definir completamente la estructura, falta por mencionar el protocolo de comunicación, que al igual que con el dispositivo para monitorizar el uso de la silla de ruedas, ha sido el I2C. Este protocolo necesita dos cables para la comunicación, SDA y SCL, y permite la conexión de hasta 127 esclavos con esas dos líneas, entre otras ventajas. Para completar el bus solo hay que añadir dos resistencias pull-up de entre 2.2K y 10K. El circuito electrónico resultante se puede apreciar en la Figura 13, donde aparecen los tres Arduinos y el módulo bluetooth (no se han representado los sensores previamente mencionados). 33 Figura 13. Circuito electrónico correspondiente a la comunicación I2C 7.3. Desarrollo del código para la adquisición de datos Tras diseñar e implementar la parte física que se encarga de la adquisición de los datos, se continua con el software para adquirir esos datos. En esta sección se va a describir los distintos aspectos que se desarrollarán a partir de este punto mediante programación. El primer paso para la monitorización consiste en programar el sistema que se encargará de adquirir los datos directamente de los sensores. Arduino será el encargado de desempeñar esta primera labor, para después mediante la aplicación diseñada a través de Android Studio, recoger esos datos y mostrarlos en su interfaz gráfica. También se podrán adquirir los datos a través de la aplicación desarrollada con Matlab, aunque este no sea su objetivo principal. Por lo tanto, esta solución software requiere de tres programas y sus tareas se explican de forma resumida en el siguiente diagrama (Figura 14). 34 Figura 14. Diagrama de las tareas que cumple cada programa Como se puede observar el primer elemento implicado es Arduino, de modo que se creará un código para realizar estas tareas, concretamente tres códigos, uno para el maestro y dos para los esclavos. El código del maestro se ha programado de tal forma que cada 90 ms lea los datos del XSens, obtenga los datos del encoder, a través del primer esclavo, y los datos de los FSRs, mediante el segundo esclavo. Para ello, el código del primer esclavo detecta los flancos negativos, esto es, los dientes de metal en el disco del encoder y los va contando. El segundo esclavo en cambio toma medidas de los FSRs, también cada 90 ms. Una vez que el maestro dispone de esos datos, lee la temperatura y la humedad, actualiza el tiempo y finalmente manda los treinta datos por bluetooth. Tabla 4. Resumen de los 30 datos enviados por el maestro vía bluetooth Sensor Dato Arduino Uno 1. Tiempo DHT22 2. Temperatura, 3. Humedad Encoders 4. Contador1, 5. Contador2 XSens 6. AcelX, 7. AcelY, 8. AcelZ, 9. Roll, 10. Pitch, 11. Yaw, 12. VelAngX, 13. VelAngY, 14. VelAngZ FSRs 15. A1, 16. A2, 17. A3, 18. A4, 19. A5, 20. A6, 21. A6, 22. A8, 23. R9, 24. R10, 25. R11, 26. R12, 27. R13, 28. R14, 29. R15 y 30. R16 35 En la figura 15 se muestra un organigrama o esquema del algoritmo desarrollado con objeto de describir el flujo correspondiente a las tareas del maestro. En el documento Anexo II se detalla el código completo. Figura 15. Diagrama de flujo correspondiente a las tareas del maestro 36 Figura 16. Diagrama de flujo correspondiente a las tareas del primer esclavo Figura 17. Diagrama de flujo correspondiente a las tareas del segundo esclavo 37 7.4. Aplicación de Monitorización en dispositivo móvil La primera aplicación se empleará para la adquisición de datos, por lo que su diseño se basa en una fácil conectividad al dispositivo emisor de los datos, junto con una sencilla forma de almacenar esos datos. Esta app reúne los aspectos mencionados en el diseño software, como la monitorización y el análisis de los datos, y en la figura 18 se presentan las funcionalidades de esta interfaz gráfica diseñada con Android Studio. Asimismo, el Anexo I incorpora el manual de usuario de esta aplicación. Figura 18. Esquema de las funcionalidades de la Aplicación de Monitorización en dispositivo móvil Tras este apartado se describen las funcionalidades del esquema anterior; primero, la rama izquierda, donde se presenta la monitorización, con el algoritmo para la visualización de los datos y las funciones vinculadas a la aplicación. Luego, se explica la rama derecha, que cuenta con la función de análisis, con el propósito analizar la información adquirida. 7.4.1. Monitorización Una vez dentro de la aplicación, antes de la pantalla de monitorización, aparece una pantalla inicial. Esta pantalla permite que el usuario pueda decidir la acción que desea realizar: monitorizar o analizar. En la Tabla 5 se pueden apreciar las funcionalidades de esta pantalla. 38 Tabla 5. Funcionalidades de la pantalla de inicio Nombre Apariencia Funcionalidad Botón “Monitorizar” Entrar en la pantalla de la monitorización Botón “Analizar” Entrar en la pantalla de la análisis En la figura 19 se muestra la pantalla de inicio con las funcionalidades previas descritas. Figura 19. Pantalla de inicio Si se decide pulsar el botón de monitorizar, aparecerá una pantalla intermedia antes de llegar a la pantalla de monitorización. Esta pantalla intermedia indica el estado del bluetooth, permite cambiarlo a encendido y además muestra la lista de dispositivos a los que se puede conectar para recibir los datos. En la siguiente tabla (Tabla 6) aparecen sus funcionalidades. 39 Tabla 6. Funcionalidades de la pantalla de bluetooth Nombre Apariencia Funcionalidad Texto “Estado bluetooth” Indica el esta del bluetooth del móvil Lista “Dispositivos vinculados” Muestra los dispositivos vinculados al móvil Mensaje “Activar bluetooth” Permite activar el bluetooth del móvil En las figuras 20 y 21 se muestra el aspecto de la pantalla de bluetooth. Figura 20. Pantalla de bluetooth Figura 21. Pantalla activar bluetooth 40 Tras seleccionar el dispositivo vinculado al que se quiera conectar, el teléfono móvil se conectará automáticamente y se adentrará en la pantalla de monitorización. Esta pantalla dispone de todas las herramientas para mostrar los datos recibidos y poder almacenarlos. Tabla 7. Funcionalidades de la pantalla de bluetooth Nombre Apariencia Funcionalidad Displays “ IMU” Muestra los valores de las vibraciones, orientación y velocidad angular Displays “Respaldo” Muestra valores de los FSRs del respaldo Displays “Asiento” Muestra valores de los FSRs del asiento Displays “Ambientales” Muestra los valores de la temperatura y humedad Displays “Distancia” Muestra los valores de las distancias recorridas en ambas ruedas Botón “Empezar” Comienza a almacenar los datos que parecen en los displays Botón “Parar” Deja de almacenar los datos Mensaje “Guardar” Permite guardar los datos almacenados con el nombre que se desee Deslizadera “Visibilidad displays” Oculta el valor de todos los displays 41 En la Figuras 22 y 23 aparece la pantalla de la monitorización, junto con las funcionalidades anteriores. Figura 22. Pantalla de monitorización Figura 23. Pantalla guardar datos Una vez dentro de la pantalla de monitorización se comienza con la visualización de los datos en tiempo real a través de la ejecución de un algoritmo (Figura 24): 1. Se conecta al dispositivo seleccionado vía bluetooth. 2. Se mantiene en modo escucha para determinar el ingreso de datos. 3. Recoge los 30 datos enviados que se han obtenido previamente. 4. Calcula el tiempo transcurrido y adecua los datos recibidos. 5. Muestra esos datos mediante displays. 6. Se insertan los datos en unos arrays que irán incrementando su tamaño. 7. Repite el proceso con los datos hasta que se decida detener la monitorización u ocurra algún error en la conexión. 8. Guarda todos los datos almacenados en cada iteración en la base de datos. 48 Botón “Ver gráfica” Muestra la gráfica seleccionada Botón “No ver gráfica” Oculta la gráfica seleccionada Botón “ Ver últimos 30 segundos” Muestra los últimos 30 segundos de la gráfica seleccionada Botón “ Ver todo el tiempo” Muestra todo el tiempo transcurrido en la gráfica seleccionada Botón “Salir” Vuelve a la pantalla inicial Las Figuras 29 y 30 muestran las pantallas principales para la monitorización. Figura 29. Pantalla principal de la monitorización para la postura en sedestación 49 Figura 30. Pantalla principal de la monitorización para el uso dinámico (en movimiento) de la silla Una vez que se decide comenzar con la visualización de los datos en tiempo real, la aplicación ejecutará un algoritmo (Figura 31) para lograr esta tarea: 1. Se conecta al puerto serie del PC. 2. Recoge los datos que está mandado el Arduino UNO vía bluetooth. 3. Adecua los datos recibidos al formato o unidad necesario. 4. Muestra esos datos mediante la interfaz gráfica. 5. Guarda los datos con la ayuda de un array que irá incrementando su tamaño. 6. Repite el proceso con los datos hasta que se decida detener la monitorización u ocurra algún error en la conexión. 7. Guarda todos los datos almacenados en cada iteración en un archivo “.mat”. 50 Figura 31. Diagrama de flujo de la monitorización La segunda aplicación desarrollada responde a la demanda de visualizar los datos almacenados (de un día concreto, una semana, o lo que se quiera). A esta aplicación o módulo se ha denominado Simulación (se podría llamar también VISUALIZACIÓN DE HISTÓRICOS). Esto es, una monitorización con datos, pero que aporta cierta flexibilidad a los especialistas a la hora de supervisar los ensayos. En la tabla 11 se muestran las funcionalidades que se implementan en esta aplicación. 51 Tabla 11. Funcionalidades de la pantalla principal de la simulación Nombre Apariencia Funcionalidad Botón “Abrir” Selecciona el archivo “.mat” a visualizar Caja de dirección Indica el directorio desde donde se leen los datos Botones “Play”, “Pause” y “Stop” Inician/reanudan, pausan o detienen la simulación Display “Duración” Muestra la duración total de la simulación Deslizadera “Porcentaje reproducido” Muestra el porcentaje transcurrido de la simulación En la figura 32 se puede observar la pantalla de la simulación con las funcionalidades que se han modificado. Figura 32. Pantalla principal de la simulación para la postura en sedestación 52 7.5.2. Análisis Al igual que con la monitorización y la simulación se dispone de una pantalla inicial para el análisis, en la que se puede seleccionar el idioma deseado y la acción a realizar. En este caso, solo se dispone de una opción: analizar. Figura 33. Pantalla inicial de la pestaña análisis Al entrar en la pantalla de análisis aparecerán las herramientas necesarias para estudiar esos datos detenidamente (obtenidos previamente en la monitorización). En la Tabla 12 se visualiza la apariencia, funcionalidad y el nombre generado para la pantalla principal de la análisis. Tabla 12. Funcionalidades de la pantalla principal del análisis Nombre Apariencia Funcionalidad Botón “Cargar” Selecciona el archivo “.mat” a analizar Caja de dirección Indica el directorito desde donde se leen los datos 53 Botón “Hoja de cálculo .xlsx” Genera una hoja de cálculo .xlsx con la información de la tabla Botón “Tabla” Muestra la tabla de variables Botón “Gráfica” Muestra la gráfica de sensores Tabla “Variables” Agrupa los datos adquiridos en la etapa de monitorización Gráfica “Sensores” Muestra las variables seleccionadas en el panel Panel “Variables” Permite la visualización de las variables seleccionadas en la gráfica Botón “Reinicio” Resetea la gráfica y el panel Botón “Ayuda” Muestra una imagen de la localización de los FSRs Botón “Salir” Vuelve a la pantalla inicial 54 En la Figura 34 se muestra el aspecto final de la pestaña principal del análisis con la tabla de las variables. Figura 34. Pantalla principal del análisis con la tabla Si se decide cargar en la aplicación un archivo “.mat” almacenado previamente, se mostrarán directamente los treinta datos en la tabla que aparece en la figura anterior. Además, se ha añadido la opción que permite generar una hoja de cálculo “.xlsx” a partir de los datos que aparecen en la tabla. Por otro lado, si se selecciona la gráfica se podrán visualizar todas las variables a lo largo de todo el periodo de ensayo (Figura 33). Para seleccionar estas variables se utilizan unas “Check boxes”. También se ha incorporado una ayuda para la localización de los sensores FSRs y una opción de reinicio que borra todas las variables graficadas. 55 Figura 35. Pantalla principal de la simulación para la postura en sedestación 7.6. Validación: ensayos y análisis de los resultados En este apartado se resumen los ensayos realizados para validar ambas aplicaciones con la silla de ruedas sensorizada. La finalidad es obtener un conjunto de señales de cada una de las pruebas realizadas y de cada usuario en particular, con el objetivo de identificar qué características son más importantes en cada prueba para cada usuario. Primero, se definen los ensayos que se han realizado para después, mostrar los resultados obtenidos junto con unas conclusiones. 7.6.1. Definición de los ensayos Para realizar la validación de ambas aplicaciones se han realizado diferentes ensayos, cada uno con sus respectivas repeticiones, con dos sujetos (Sujeto1 y Sujeto2) diferentes y con un total de quince tipos pruebas: 56 7.6.1.1 Rampas En este tipo de superficie se han hecho pruebas en 3 rampas de 2°, 4° y 7° a velocidad 1 (3 km/h) y a velocidad 2 (5 km/h). SUBIDA/BAJADA RAMPA EDIFICIO B (RBs/RBb) Esta primera rampa es de 2°, consta de 3 tramos de cuesta con dos islas para cambiar el sentido de la rampa y en la siguientes figuras (Figura 36 y 37) se puede ver el escenario de la prueba: Figura 36. Rampa edificio B (Subida) Figura 37. Rampa edificio B (Bajada) SUBIDA/BAJADA RAMPA SAN MAMÉS (RSs/RSb) La segunda rampa (Figura 38) es de 4° y está al lado del campo de San Mames, consta de cuatro tramos de cuesta con tres zonas planas entre medio. Figura 38. Rampa San Mamés 57 SUBIDA RAMPA PASILLO F (RFs/RFb) La última rampa es de 7° y está dentro del edificio F (Figura 39), es un tramo muy corto que dura apenas cinco segundos. Figura 39. Rampa pasillo F 7.6.1.2 Libre En la pruebas denominadas como libre se han hecho dos recorridos diferentes; uno en exteriores con la subida de una rampa de 2°, giro y bajada, a 5 velocidades y otro en interiores alrededor de columnas a velocidad 1 (3 km/h), 2 (5 km/h) y 3 (7 km/h). RECORRIDO RAMPA EDIFICIO 1 (R1) El primer recorrido se ha realizado a cinco velocidades y en la siguiente figura (Figura 40) se puede observar el lugar empleado: Figura 40. Rampa edificio 1 64 SUBIDA/BAJADA RAMPA SAN MAMÉS (RSs/RSb) En esta segunda rampa, en comparación con la anterior, si observamos el Pitch (Figura 50) vemos que los tres tramos de la rampa son más notables, esto se debe a la inclinación de la rampa actual la cual es mayor. Ahora bien, en esta rampa los sensores del respaldo y del asiento no son tan relevantes como en el caso anterior, aunque si que se puede apreciar en algunos puntos de las señales los cambios de los tramos. Figura 50. Sujeto1 RSb V1 Una vez analizada la bajada de la rampa de San Mames, se decide anlizar la subida (Figura 51). Al igual que con la rampa anterior la inclinación del pitch varía, pero, en este caso, los sensores del respaldo y el asiento son todavia más estables que en comparación con la bajada y no se aprecían apenas las variaciones de los tramos. 65 Figura 51. Sujeto1 RSs V1 SUBIDA RAMPA PASILLO F (RFs/RFb) Como última rampa, se emplea la rampa del pasillo F, en la cual se obtienen diferentes resultados entre las mediciones de subida y de bajada. En cuanto a la subida (Figura 52), todos los sensores del respaldo (R9, R10, …, R16) muestran un aumento de fuerza en el respaldo al subir esta breve rampa y una disminución de la fuerza, en torno al segundo 9, al llegar al final de la rampa. 66 Figura 52. Sujeto1 RFs V2 En cuanto a la bajada (Figura 53), la cual comienza pasado el segundo seis, al contrario que en la subida, se ve que se libera peso en algunos de los sensores del respaldo, sobre todo en el sensor R13. En el asiento, el sensor A2 es el más representativo. Sin embargo, los resultados obtenidos en la bajada son menos representativos que en la subida y los resultados obtenidos en el asiento se diferencian peor que los del respaldo. 67 Figura 53. Sujeto1 RFb V2 En definitiva, las rampas son fáciles de identificar observando la variación en la orientación del Pitch, que es entregado por la IMU colocada en la silla de ruedas. A simple vista, parece que los sensores del respaldo pueden ser más significativos que los del asiento, en especial el sensor R13. Aun así, hay inclinaciones más bruscas que otras que pueden modificar la postura del usuario y los resultados. Por lo tanto, para obtener unos resultados más fiables deberían procesarse estos datos y analizarse de tal forma que se obtengan indicadores que no se hayan podido detectar. 7.6.2.2 Libre RECORRIDO RAMPA EDIFICIO 1 (R1) En este primer recorrido, se ha realizado pruebas a cinco velocidades y se ha optado por analizar dos aspectos: la distinción de las acciones durante el recorrido (cuesta-giro-cuesta) y la comparación de las mediciones a velocidades diferentes. 68 En la Figura 54 se puede observar el resultado de este recorrido a velocidad 5. En él se puede observar claramente el giro hacia la derecha de 180° en torno al segundo 20, fijándonos en el ángulo Yaw que entrega la IMU. Además, a diferencia de las pruebas anteriores, al darse este giro se ve como hay una modificación de presiones más notable en un sensor del asiento (A2). Figura 54. Sujeto1 R1 V5 En la figura 55 se entregan los resultados obtenidos para este mismo recorrido, pero, en este caso, a velocidad 2. En esta figura se puede ver también el momento en el que ocurre el giro observando el Yaw, en torno al segundo 30. Al igual que con más velocidad, en el sensor A2 del asiento tambien se aprecia el cambio de la distribucion de peso. 69 Figura 55. Sujeto1 R1 V2 Para comparar las mediciones a velocidades diferentes, se han comparado los resultados obtenidos con el mismo sujeto a velocidad 1 y a 5. Comparando ambas figuras se puede apreciar un aumento claro de las vibraciones (aceleraciones), de ±1 m/s2 a velocidad 1 (Figura 56) a ±3 m/s2 a velocidad 5 (Figura 57). Asimismo, este aumento de la amplitud de las vibraciones se ve claramente reflejado en las mediciones recogidas por los sensores del respaldo y de los del asiento. Lo que concluye que la velocidad es un factor determinante en el estudio de las vibraciones sufridas por el usuario de la silla de ruedas. 70 Figura 56. Sujeto2 R1 V1 Figura 57. Sujeto2 R1 V5 71 LÍNEA LIBRE COLUMNAS (LL) En este segundo recorrido, el cual se ha hecho a tres velocidades diferentes, es difícil interpretar los giros y como afectan estos al usuario (Figura 58). Sin embargo, apenas se aprecian diferencias entre ambos sujetos. Figura 58. Sujeto1 LL V1 7.6.2.3 Giros Asimismo, se han realizado varios ensayos con giros, en la figura 59, se observa un giro 90° hacia la derecha y en la figura 60, un giro de 180° hacia la izquierda, el sentido del giro se puede distinguir gracias al ángulo Yaw. Sin embargo, no se observan grandes cambios en la posición de ninguno de los usuarios con ninguno de los giros. 72 Figura 59. Sujeto1 G90 V2 Figura 60. Sujeto1 G180 V1 73 7.6.2.4 Suelo liso LINEA CONTINUA (LC) En el primer ensayo de los denominados como suelo liso ha consistido en realizar una línea recta con la silla de ruedas. En este tipo de ensayo se han llevado a cabo pruebas con las cinco diferentes velocidades que dispone la silla. En la Figura 61 se puede observar la línea continua realizada a velocidad 2, donde las vibraciones (aceleraciones) son menores de ±0,5 m/s2. Sin embargo, a velocidad 5 (Figura 62) las vibraciones aumentan hasta los ±2 m/s2. En los sensores del respaldo y el asiento también se puede apreciar como el incremento de velocidad aumenta la amplitud de las vibraciones, aunque no de forma tan clara. Por lo tanto, como se ha mencionado anteriormente, el aumento de la velocidad produce un aumento de las vibraciones, produciendo un efecto negativo sobre el paciente. Figura 61. Sujeto1 LC V2 80 ▪ Descripción: para poder desarrollar el sistema de monitorización es necesario familiarizarse con el entorno, por lo que la formación se convierte en una tarea imprescindible. El primer paso será conocer los sensores que componen los dispositivos previos diseñados. Para la interfaz gráfica se usará Matlab App Designer, empezando por comprender las interfaces previas realizadas. Finalmente, hay que adquirir también conocimientos acerca de Android Studio, de tal forma que se pueda desarrollar la aplicación móvil. ▪ Hitos: desarrollo de programas iniciales para satisfacer ciertas funcionalidades del sistema de monitorización. ▪ Medios humanos: Ingeniero Junior y Responsable del Proyecto. ▪ Tarea 4. Diseño del circuito electrónico (semanas 9 y 10)  Descripción: el desarrollo del sistema de monitorización comienza por el diseño del circuito electrónico el cual estaba formada en función de las características de cada sensor y ahora se basará en la comunicación de los dos dispositivos de monitorización.  Hitos: implementación y validación del circuito electrónico propuesto.  Medios humanos: Ingeniero Junior y Responsable del Proyecto. ▪ Tarea 5. Programación de la comunicación o conexión de los diferentes dispositivos (semanas 11 y 12)  Descripción: en esta tarea se desarrollará el código que se encarga de adquirir los datos que provienen de los sensores. Para llevar a cabo esta tarea se empleará el entorno de desarrollo Arduino IDE.  Hitos: validación del código desarrollado.  Medios humanos: Ingeniero Junior y Responsable del Proyecto. ▪ Tarea 6. Diseño de la interfaz de monitorización para PC vía Matlab App Designer (semanas 13 a 16)  Tarea 6.1. Algoritmo de adquisición de datos en Matlab (semana 13)  Tarea 6.2. Monitorización de variables (semanas 14 y 15)  Tarea 6.3. Análisis de datos (semana 16) 81 ▪ Descripción: el objetivo final es proporcionar una interfaz gráfica intuitiva y de fácil uso para los profesionales sanitarios. Para esta labor se utilizará Matlab App Designer, de modo que se obtenga un algoritmo que permita la adquisición de datos, además de la monitorización y el análisis de estos. ▪ Hitos: entrega de la interfaz de monitorización para PC ▪ Medios humanos: Ingeniero Junior y Responsable del Proyecto. ▪ Tarea 7. Diseño de la interfaz de monitorización para App móvil vía Android Studio (semanas 18 a 21 )  Tarea 7.1. Algoritmo de adquisición de datos en Android Studio (semana 18 y 19)  Tarea 7.2. Monitorización de variables (semana 20)  Tarea 7.3. Análisis de datos (semana 21) ▪ Descripción: al igual que con la tarea anterior se proporcionará una interfaz gráfica para los profesionales sanitarios, pero en este caso para ensayos en movimiento, lo que supone una adquisición de los datos mediante un teléfono móvil. Para realizar esta aplicación se empleará Android Studio y se centrará sobre todo en la adquisición y almacenaje de los datos. ▪ Hitos: entrega del análisis de alternativas y de la interfaz de monitorización para App móvil. ▪ Medios humanos: Ingeniero Junior y Responsable del Proyecto. ▪ Tarea 8. Montaje del sistema al completo y validación (semana 22 y 23)  Descripción: esta tarea se basa en el montaje del hardware en la silla de ruedas acompañado del software elaborado. Mediante pruebas sencillas se valida el funcionamiento correcto de ambas partes del sistema de monitorización.  Hitos: validación del sistema de monitorización y su documentación.  Medios humanos: Ingeniero Junior y Responsable del Proyecto. ▪ Tarea 9. Ensayos y análisis de los resultados (semanas 24 a 26)  Tarea 9.1. Diseño de los ensayos a realizar (semana 24)  Tarea 9.2. Realización de los ensayos y obtención de los resultados (semanas 25 y 26) 82 ▪ Descripción: esta tarea abarca todo lo relacionado con los ensayos finales, por lo que en un primer lugar se diseñaron los ensayos a realizar, de tal forma que se simulen situaciones relevantes. Tras esto, se llevaron a cabo unos ensayos mediante varios sujetos, analizando los resultados obtenidos. ▪ Hitos: entrega de la documentación con los resultados obtenidos. ▪ Medios humanos: Ingeniero Junior y Responsable del Proyecto. ▪ Tarea 10. Análisis económico y de viabilidad (semana 27)  Descripción: análisis de la viabilidad y rentabilidad del sistema de monitorización desarrollado mediante la consideración de los aspecto económicos del proyecto.  Hitos: entrega del presupuesto.  Medios humanos: Ingeniero Junior y Responsable del Proyecto. ▪ Tarea 11. Documentación de la memoria (semanas 4 a 6 y 21 a 31)  Descripción: en esta tarea se ha documentado todo lo relacionado con el TFM, la cual se ha llevado a cabo a lo largo del proyecto.  Hitos: entrega de la memoria final.  Medios humanos: Ingeniero Junior y Responsable del Proyecto. 8.2 DIAGRAMA DE GANTT En este apartado se muestra la planificación temporal de las tares previamente mencionadas mediante el Diagrama de Gantt (Figura 67). El desarrollo del proyecto ha tomado la duración de 31 semanas, desde el inicio con la búsqueda bibliográfica hasta el final con la redacción del documento y pasando por las demás tareas. 83 Figura 67. Diagrama de Gantt 84 9. ASPECTOS ECONÓMICOS En este apartado se realiza un análisis sobre los aspectos económicos del presente TFM. Para ello se ha optado por dividir los gastos por partidas de tal forma que se pueda valorar el peso de cada una en el gasto global del proyecto. Por lo tanto, se ha dividido en los recursos humanos, la amortización de inventariable y los material fungible que han sido necesarios para desarrollar este proyecto. 9.1. Recursos humanos En la siguiente tabla se puede observar el análisis económico de esta partida, en la cual la tasa horaria se ha decidido en función de la responsabilidad de cada persona. Tabla 14. Recursos humanos Concepto Horas empleadas Coste unitario Coste Ingeniero Junior 300 30 €/h 9000 € Director del proyecto 30 60 €/h 1800 € Total 10800 € 9.2. Amortización de recursos En esta partida se calcula el coste de las herramientas utilizadas, el uso de estas herramientas no será exclusivo para este proyecto. En él se encuentran las licencias de los diferentes softwares, el ordenador personal, el teléfono móvil, la silla de ruedas, las placas de Arduino, el XSens y el soldador. También cabe destacar que los entornos de desarrollo de Arduino y Android, Arduino IDE y Android Studio, son gratuitos. Tabla 15. Amortización de recursos Concepto Precio inicial Vida útil Utilización Amortización Ordenador personal 900 € 8 años 8 meses 75 € Word 149 € 1 año 8 meses 99,33 € MATLAB 860 € 1 año 6 meses 430 € Silla de ruedas 3.391,21 € 6 años 2 meses 94,20 € Xiaomi 11 Lite 263 € 6 años 3 meses 10,96 € 85 XSens MTi-7 DK 477,35 € 4 años 5 meses 49,72 € Arduino UNO 29,28 € 3 años 5 meses 4,06 € Arduino Nano 21,60 € 3 años 5 meses 3 € Arceli Mega Pro 26,99 € 3 años 5 meses 3,75 € Soldador 30 € 3 años 10 horas 0,01 € Total 770,03 € 9.3. Recursos materiales En esta última partida se calcula el coste asociado a los materiales necesarias para realizar el sistema de monitorización al completo, donde se encuentran los diferentes elementos electrónicos, como los sensores FSR, las resistencias…, la batería portátil, así como los elementos mecánicos del encoder. Tabla 16. Recursos materiales Concepto Unidades Precio/unidad Coste Sensores FSR 20 5,596 € 111,92 € Modulo BT 1 9,99 € 9,99 € Resistencias 16 0,06 € 0,95 € Metros de cable 4 2,32 € 9,28 € Protoboard 3 3 € 9 € Batería portátil 1 40 € 40 € Discos metálicos 2 48 € 96 € Separador de corriente 2 3,99 € 3,99 € Total 281,13 € 9.4. Coste total del proyecto Por último, se calcula el descargo al completo de los gastos derivados del proyecto, teniendo en cuenta las partidas anteriores. Además, se calcula el coste total mayorado al 10 % de modo que se disponga de una reserva para posibles imprevistos. Con lo que el coste total del proyecto se cierra en 12931,73 € y en la siguiente table se puede observar el desglose del mismo. 86 Tabla 17. Coste total del proyecto Concepto Coste Recursos humanos 10800 € Amortización de recursos 770,03 € Recursos materiales 281,13 € Total 11851,16 € Total (mayorado al 10 %) 13036,28 € Una vez calculado el coste total del proyecto se decide realizar un desglose de este coste, pero en esta ocasión representado el peso relativo de cada partida. Esto se puede apreciar en la siguiente gráfica (figura 68), donde se puede destacar que el peso más alto es el de los recursos humanos con un 83 %, del mismo modo que la amortización de los recursos supone un 6 % y los recursos materiales un 1% del coste total. Figura 68. Porcentaje de gastos por partida 87 10. CONCLUSIONES En este Trabajo de Fin de Máster se ha llevado a cabo un sistema de monitorización, junto con dos interfaces gráficas, con el objetivo a cumplir de satisfacer una necesidad social, ya que debía permitir mejorar la rehabilitación y terapia de personas con movilidad reducida que emplean una silla de ruedas para desplazarse. Una vez desarrollado el sistema de monitorización al completo, así como ambas aplicaciones, se ha validado mediante una serie de ensayos. Estos ensayos experimentales, que se han llevado a cabo con dos sujetos diferentes, han consistido en: ir recto a diferentes velocidades en línea continua y discontinua, subir y bajar rampas de 2°, 4° y 7°, realizar varios recorridos libres, ir sobre diferentes pavimentos… Gracias a estos ensayos se ha demostrado el correcto funcionamiento del sistema de monitorización al completo, así como el de las aplicaciones, comparando los datos obtenidos entre ambas aplicaciones o comparándolos con los datos obtenidos en ensayos previos realizados con otras aplicaciones ya validadas. Es importante destacar que ambas aplicaciones permiten a los sanitarios una monitorización cuantitativa y objetiva del comportamiento de estos pacientes; qué les ocurre al realizar actividades de la vida diaria, si existen riesgos de caídas, posturas no deseadas, producciones de escaras o úlceras... En este sentido, a futuro y con las señales que facilitan estos sistemas de captura y las aplicaciones desarrolladas, permitirán generar sistemas inteligentes que detecten cambios de comportamiento en el patrón de sedestación de manera individualizada, informando a los sanitarios de dicho cambios. Por lo tanto, haciendo un balance se puede decir que se ha cumplido con el objetivo principal del trabajo, esto es, mejorar la calidad de vida en la medida de lo posible de las personas con movilidad reducida. 88 11. BIBLIOGRAFÍA [1] H. Rahman, J. Ghommam, R. Fareh, J. Cui, L. Cui, Z. Huang, X. Li, and F. Han, “Iot wheelchair control system based on multimode sensing and human-machine interaction,” Micromachines, 2022. [2] “INE, Instituto Nacional de Estadística. Censos de Población y Proyecciones de Población”. [3] “FEKOOR” [En línea]. Disponible: https://fekoor.com/ [Último acceso: 2023]. [4] S. D. Groot, R. J. Vegter, C. Vuijk, F. V. Dijk, C. Plaggenmarsch, M. Sloots, J. Stolwijk-Sw¨uste, F. Woldring, M. Tepper, and L. H. V. D. Woude, “Wheel-i: Development of a wheelchair propulsion laboratory for rehabilitation,” Journal of Rehabilitation Medicine, vol. 46, pp. 493–503, 2014. [5] R. Gravina, C. Ma, P. Pace, G. Aloi, W. Russo, W. Li, and G. Fortino, “Cloud-based activity-aaservice cyber–physical framework for human activity monitoring in mobility,” Future Generation Computer Systems, vol. 75, pp. 158–171, 10 2017. [6] M. T. Leving, H. L. Horemans, R. J. Vegter, S. D. Groot, J. B. Bussmann, and L. H. van der Woude, “Validity of consumer-grade activity monitor to identify manual Wheelchair propulsion in standardized activities of daily living,” PLOS ONE, vol. 13, 4 2018. [7] A. Marco-Ahull´o, L. Montesinos-Magraner, L. M. Gonzalez, R. Llorens, X. SeguraNavarro, and X. Garc´ıa-Mass´o, “Validation of using smartphone built-in accelerometers to estimate the active energy expenditures of full-time manual wheelchair users with spinal cord injury,” Sensors, vol. 21, pp. 1–9, 2 2021. [8] J. Fu, S. Zhang, H. Wang, Y. D. Zhao, and G. Qian, “A novel mobile device-based approach to quantitative mobility measurements for power wheelchair users,” Sensors, vol. 21, 12 2021. [9] J. Fu, M. Jones, T. Liu, W. Hao, Y. Yan, G. Qian, and Y.-K. Jan, “A novel mobilecloud system for capturing and analyzing wheelchair maneuvering data: A pilot study,” Disability and Rehabilitation: Assistive Technology, vol. 28, pp. 105–114, 2016. [10] O. Chenu, N. Vuillerme, M. Bucki, B. Diot, F. Cannard, and Y. Payan, “Texicare: An innovative embedded device for pressure ulcer prevention. preliminary results with a paraplegic volunteer,” Journal of Tissue Viability, vol. 22, pp. 83–90, 8 2013. [11] J. Leaman and H. M. La, “A comprehensive review of smart wheelchairs: Past, present and future,” IEEE Transactions on Human-Machine Systems, 4 2017. [12] B. M. Goodwin, C. M. Olney, J. E. Ferguson, A. H. Hansen, B. Eddy, G. Goldish, M. M. Morrow, and T. L. Vos-Draper, “Visualization of user interactions with a pressure mapping mobile 89 application for wheelchair users at risk for pressure injuries,” Disability and Rehabilitation: Assistive Technology, vol. 34, pp. 444–453, 2022. [13] D. Hoevenaars, J. F. Holla, S. de Groot, P. J. Weijs, W. Kraaij, and T. W. Janssen, “Lifestyle and health changes in wheelchair users with a chronic disability after 12 weeks of using the wheels mhealth application,” Disability and Rehabilitation: Assistive Technology, 2022. [14] H. Y. T. Liu, R. M. Chia, I. M. A. Setiawan, T. M. Crytzer, and D. Ding, “Development of “my wheelchair guide” app: a qualitative study,” Disability and Rehabilitation: Assistive Technology, vol. 14, pp. 839–848, 11 2019. [15] “StatCounter - Global Stats” [En línea]. Disponible: https://gs.statcounter.com/os-marketshare/mobile/worldwide [Último acceso: 2023]. [16] “Android Developers” [En línea]. Disponible: https://developer.android.com/guide/platform?hl=es-419. [Último acceso: 2023]. [17] “Xiaomi 11 Lite 5G NE” [En línea]. Disponible: https://www.mi.com/es/product/xiaomi-11-lite5g-ne/. [Último acceso: 2023]. [18] “Introducción a Android Studio” [En línea]. Disponible: https://developer.android.com/studio/intro?hl=es-419. [Último acceso: 2023]. [19] “SQLite” [En línea]. Disponible: https://www.sqlite.org/index.html. [Último acceso: 2023]. [20] “Firebase Realtime Database” [En línea]. Disponible: https://firebase.google.com/docs/database?hl=es-419. [Último acceso: 2023]. 96 2. Tras esto, si el estado del bluetooth del teléfono móvil es desactivado, habrá que activarlo. Figura 77. Pantalla del bluetooth de la aplicación móvil (bluetooth desactivado) 3. Una vez activado el bluetooth o bien ya estaba activado, se debe seleccionar el dispositivo bluetooth vinculado al teléfono móvil al que se desee conectar. Figura 78. Pantalla del bluetooth de la aplicación móvil (seleccionar dispositivo) 97 4. Tras llevar a cabo los previos pasos comenzarán a mostrarse los datos recibidos por el sistema de monitorización. Si se desea comenzar a guardar esos datos solo hay que seleccionar la acción de empezar. También se pueden ocultar los datos mediante la deslizadera. Figura 79. Pantalla de la monitorización de la aplicación móvil (empezar) 5. Una vez terminado el ensayo, habrá que seleccionar el botón de parar. Figura 80. Pantalla de la monitorización de la aplicación móvil (parar) 98 6. Por último, introducir el nombre con el que se quiera guardar el archivo y seleccionar la opción de guardar. Figura 81. Pantalla de la monitorización de la aplicación móvil (guardar) B. Análisis 1. Del mismo que con la monitorización, para entrar en la pantalla del análisis solo hay que seleccionar: Analizar. Figura 82. Pantalla de inicio de la aplicación móvil (analizar) 99 2. Dentro de esta pantalla de análisis aparecerán todos los ensayos almacenados. Figura 83. Pantalla de inicio de la aplicación móvil (ensayos) 3. Al seleccionar uno de los ensayos serán posibles tres opciones: generar un TXT con los datos almacenados en formato Matlab, borrar el ensayo o cambiar el nombre al ensayo. El TXT generado se podrá almacenar en el teléfono móvil o en el Drive. Figura 84. Pantalla de análisis de la aplicación móvil (opciones) 100 4. Por último, existe la opción de borrar toda la base de datos. Figura 85. Pantalla de análisis de la aplicación móvil (borrar base de datos) IV. UTILIZACIÓN DE LA APLICACIÓN DE LA HERRAMIENTA DE ANÁLISIS PARA LOS CLÍNICOS La aplicación “Wheelchair” para el PC cuenta con diferentes modos de funcionamiento: Monitorización & Simulación y Análisis. En los siguientes apartados van a ser descritas estas funcionalidades que contiene la aplicación. A. Monitorización 1. Primero, ejecutar la aplicación “Wheelchair” en MATLAB y seleccionar la acción de monitorizar. Si se quiere se puede variar el idioma de la aplicación entre español, que viene por defecto, euskera o inglés. 101 Figura 86. Pantalla inicial de la pestaña de Monitorización & Simulación (monitorizar e idioma) 2. Una vez en el pantalla de la monitorización, el primer paso es rellenar el número del sujeto y de la repetición. Figura 87. Pantalla principal de la pestaña de monitorización (sujeto y repetición) 102 3. A continuación, hay que seleccionar la carpeta donde quiere que se guarden los datos una vez finalizada la monitorización. Figura 88. Pantalla principal de la pestaña de monitorización (guardar en) 4. Después, escoger el puerto COM desde donde se leerán los datos. Figura 89. Pantalla principal de la pestaña de monitorización (puerto COM) 103 5. Tras realizar los pasos previos se puede comenzar la monitorización en tiempo real. También aparecerá un switch para variar los valores de los FSRs entre amplitudes y porcentajes. Figura 90. Pantalla principal de la pestaña de monitorización (visualizar y switch) 6. Si se quiere visualizar el otro dispositivo solo hay que pulsar el botón i-Chair. Además, mediante los dos botones que aparecen al lado de cada gráfica, se puede dejar de ver esa gráfica, para acelerar la aplicación, y variar entre ver el tiempo total de la monitorización o los últimos treinta segundos. Figura 91. Pantalla principal de la pestaña de monitorización (i-Chair y opciones de las gráficas) 104 7. Cuando se considere oportuno se puede detener la monitorización. Figura 92. Pantalla principal de la pestaña de monitorización (detener) 8. Por último, preguntará si deseas guardar los datos obtenidos. Figura 93. Pantalla principal de la pestaña de monitorización con (guardar) 105 B. Simulación 1. Al igual que con la monitorización, para entrar en la simulación solo hay que seleccionar: simular. Figura 94. Pantalla inicial de la pestaña de Monitorización & Simulación (simular) 2. Para iniciar la simulación lo primero que hay que hacer es abrir el algún archivo “.mat” almacenado. Al realizar este paso aparecerá también el tiempo total de la simulación. Figura 95. Pantalla principal de la pestaña de la simulación (abrir y duración) 112 Wire.begin(); BTSerial.begin(9600); // CAMBIAR POR BT dht.begin(); xsens.begin(); timer.start(); Wire.beginTransmission(ESCLAVO_ADDR_1); // Comenzar a comunicarse con el esclavo 0x17 Wire.write(1); // Transmite al esclavo un 1 para que se inicialice Wire.endTransmission(); // Termina comunicación y libera los pines Wire.beginTransmission(ESCLAVO_ADDR_2); // Comenzar a comunicarse con el esclavo 0x17 Wire.write(2); // Transmite al esclavo un 2 para que se inicialice Wire.endTransmission(); // Termina comunicación y libera los pines t0 = millis(); // Da el tiempo en milisegundos desde que se encendió la tarjeta Arduino } void loop() { timer.update(); if (bescribir == true) EscribirBT(); } void EnvioEncoder(){ Wire.requestFrom(ESCLAVO_ADDR_1,4); // Solicitar 4 (2 word) bytes al esclavo cont1 = cont1 + Wire.read(); cont2 = cont2 + Wire.read(); } void EnvioFSR(){ Wire.requestFrom(ESCLAVO_ADDR_2, 32); // Solicitar 32 bytes (16 int) al esclavo for (int i=0 ; i<=15; ++i) wireReadData(fsr[i]); } void LecturaXSens(){ //Read mesurements (Reads all data given by the AHRS) xsens.updateMeasures(); 113 for(int i=0 ; i<3; ++i) datos_xsens[i] = xsens.getAccel()[i]; for(int i=0 ; i<3; ++i) datos_xsens[i+3] = xsens.getEulerd()[i]; for(int i=0 ; i<3; ++i) datos_xsens[i+6] = xsens.getRot()[i]; } void EscribirBT(){ BTSerial.print(millis()-t0); BTSerial.print(", "); BTserial.print(dht.readHumidity(),2); BTSerial.print(", "); BTserial.print(dht.readTemperature(),2); BTSerial.print(", "); BTSerial.print(cont1); BTSerial.print(", "); BTSerial.print(cont2); BTSerial.print(", "); for(int i=0 ; i<9; ++i){ BTSerial.print(datos_xsens[i],6); BTSerial.print(", "); } for(int i=0 ; i<=15; ++i){ BTSerial.print(fsr[i]); BTSerial.print(", "); } BTSerial.print("\n"); delay(150); bescribir = false; } II. Código del primer esclavo Arduino //Esclavo 1 - Encoders - Arduino NANO #include <Wire.h> #define PIN_SInductivo1 2 // Se declara el pin digital asociado con el sensor inductivo 1 #define PIN_SInductivo2 3 // Se declara el pin digital asociado con el sensor inductivo 2 // Declaración de las funciones ISR void Deteccion_SInductivo1(); // Actualización de los tiempos en los que se da la detección de metal del sensor inductivo 1 void Deteccion_SInductivo2(); // Actualización de los tiempos en los que se da la detección de metal del sensor inductivo 2 114 // La direccion del esclavo 1 #define ESCLAVO_ADDR 1 // Declaración e inicialización de variables volatile word cont1 = 0, cont2 = 0; // Índices y contadores void setup() { Wire.begin(ESCLAVO_ADDR); // Este Esclavo es el número 1 Wire.onRequest(envioDatos); // Cuando el Maestro le hace una petición, realiza el enviodatos Wire.onReceive(inicio); // Cuando el Maestro le envia un dato, realiza el inicio //Definición de las interrupciones de hardware de los sensores inductivos attachInterrupt(digitalPinToInterrupt(PIN_SInductivo1),Deteccion_SInductivo1,F ALLING); attachInterrupt(digitalPinToInterrupt(PIN_SInductivo2),Deteccion_SInductivo2,F ALLING); Serial.begin(9600); } void loop() { } void inicio(){ if(Wire.read()==1) // Cuando recive un 1 por parte del Maestro, inicializa los contadores { cont1 = 0; cont2 = 0; } } void envioDatos(){ Wire.write(cont1); Wire.write(cont2); cont1 = 0; cont2 = 0; } void Deteccion_SInductivo1(){ // Flanco negativo del sensor (detección de metal) ++cont1; 115 } void Deteccion_SInductivo2(){ // Flanco negativo del sensor (detección de metal) ++cont2; } III. Código del segundo esclavo Arduino //Esclavo 2 - FSRs - Arduino Mega #include <Ticker.h> #include <SoftwareSerial.h> #include <Wire.h> #include <WireData.h> // Permite enviar int, float... por I2C SoftwareSerial BTserial(0, 1); //RX | TX // Declaración de variables. float fsrReading; // Lectura analogica del divisor FSR resistor int sensores[16]; // La direccion del esclavo 2 #define ESCLAVO_ADDR 2 ////////// Periodic callback/Interruption ////////// void LeerDatos() { for (int i=0; i<=15; i++) { fsrReading = analogRead(i); // Lee voltage de la puerta analogica sensores[i] = map(fsrReading, 0, 1023, 0, 5000); } } // Declaración de interrupción Ticker timer(LeerDatos,90,0,MILLIS); void envioDatos() { for (int i=0; i<=15; i++) wireWriteData(sensores[i]); } void setup() { 116 timer.start(); Wire.begin(ESCLAVO_ADDR); Wire.onRequest(envioDatos); Wire.onReceive(inicio); } void loop() { timer.update(); } void inicio(){ if(Wire.read()==2) // Cuando recive un 2 por parte del Maestro, inicializa los sensores { for (int i=0; i<=15; i++) sensores[i] = 0; } } 117 ANEXO III: CÓDIGO MATLAB 118 classdef Wheelchair < matlab.apps.AppBase % Properties that correspond to app components properties (Access = public) UIFigure matlab.ui.Figure WheelchairLabel matlab.ui.control.Label TabGroup matlab.ui.container.TabGroup MonitorizacinSimulacinTab matlab.ui.container.Tab EnglishButton matlab.ui.control.StateButton EuskeraButton matlab.ui.control.StateButton EspaolButton matlab.ui.control.StateButton IdiomaButton matlab.ui.control.StateButton Image_silla matlab.ui.control.Image Panel_ichair matlab.ui.container.Panel Ver_Tiempo_Total_Button_3 matlab.ui.control.Button Ver_Tiempo_Total_Button_2 matlab.ui.control.Button Ver_Tiempo_Total_Button matlab.ui.control.Button parentesis_Label_3 matlab.ui.control.Label parentesis_Label_2 matlab.ui.control.Label parentesis_Label matlab.ui.control.Label YawLabel matlab.ui.control.Label PitchLabel matlab.ui.control.Label RollLabel matlab.ui.control.Label ZLabel_2 matlab.ui.control.Label YLabel_2 matlab.ui.control.Label XLabel_2 matlab.ui.control.Label ZLabel matlab.ui.control.Label YLabel matlab.ui.control.Label XLabel matlab.ui.control.Label VelocidadangularLabel matlab.ui.control.Label OrientacinLabel matlab.ui.control.Label VibracionesLabel matlab.ui.control.Label Ver_Vel_Ang_Button matlab.ui.control.Button Ver_Orientacion_Button matlab.ui.control.Button Ver_Vibraciones_Button matlab.ui.control.Button R2 matlab.ui.control.EditField R1 matlab.ui.control.EditField Humedad matlab.ui.control.EditField Temperatura matlab.ui.control.EditField Contador matlab.ui.control.EditField Image3_2 matlab.ui.control.Image TiempotranscurridoLabel matlab.ui.control.Label R2Label matlab.ui.control.Label R1Label matlab.ui.control.Label mLabel_2 matlab.ui.control.Label mLabel matlab.ui.control.Label Image4 matlab.ui.control.Image Encoder matlab.ui.control.Label Image3 matlab.ui.control.Image HumedadLabel matlab.ui.control.Label TemperaturaLabel matlab.ui.control.Label Label matlab.ui.control.Label Image2 matlab.ui.control.Image CLabel matlab.ui.control.Label 119 UIAxes_Vel_Angular matlab.ui.control.UIAxes UIAxes_Orientacion matlab.ui.control.UIAxes UIAxes_Vibraciones matlab.ui.control.UIAxes MonitorizacionPanel matlab.ui.container.Panel Image_Seleccionar matlab.ui.control.StateButton Image7 matlab.ui.control.Image Image6 matlab.ui.control.Image Image5 matlab.ui.control.Image GuardarenLabel matlab.ui.control.Label xButton_Monitorizacion matlab.ui.control.Button PuertoCOMDropDown matlab.ui.control.DropDown PuertoCOMLabel matlab.ui.control.Label RepeticionEditField matlab.ui.control.EditField RepeticinLabel matlab.ui.control.Label SujetoLabel matlab.ui.control.Label SujetoEditField matlab.ui.control.EditField ArchivoEditField matlab.ui.control.EditField DetenerButton matlab.ui.control.Button VisualizarButton matlab.ui.control.Button SimulacionPanel matlab.ui.container.Panel Image_open matlab.ui.control.StateButton Image_stop matlab.ui.control.Image Image_pause matlab.ui.control.Image Image_play matlab.ui.control.Image Image8 matlab.ui.control.Image AbrirLabel matlab.ui.control.Label ArchivoEditField_2 matlab.ui.control.EditField xButton_Simulacion matlab.ui.control.Button DuracionLabel matlab.ui.control.Label Slider matlab.ui.control.Slider SliderLabel matlab.ui.control.Label DuracionEditField matlab.ui.control.EditField SimularButton matlab.ui.control.Button MonitorizarButton matlab.ui.control.Button Image_logo_visens matlab.ui.control.Image DispositivoPanel matlab.ui.container.Panel iKuxinButton matlab.ui.control.Button iChairButton matlab.ui.control.Button Panel_ikuxin matlab.ui.container.Panel Switch matlab.ui.control.Switch LabelR9 matlab.ui.control.Label LabelR10 matlab.ui.control.Label LabelR11 matlab.ui.control.Label LabelR12 matlab.ui.control.Label LabelR13 matlab.ui.control.Label LabelR14 matlab.ui.control.Label LabelR15 matlab.ui.control.Label LabelA1 matlab.ui.control.Label LabelA6 matlab.ui.control.Label LabelA5 matlab.ui.control.Label LabelA4 matlab.ui.control.Label LabelA2 matlab.ui.control.Label LabelA7 matlab.ui.control.Label LabelA3 matlab.ui.control.Label LabelA8 matlab.ui.control.Label 120 LabelR16 matlab.ui.control.Label Respaldo matlab.ui.control.UIAxes Asiento matlab.ui.control.UIAxes AnlisisTab matlab.ui.container.Tab EnglishButton_2 matlab.ui.control.StateButton EuskeraButton_2 matlab.ui.control.StateButton EspaolButton_2 matlab.ui.control.StateButton IdiomaButton_2 matlab.ui.control.StateButton Image_silla_2 matlab.ui.control.Image UITable matlab.ui.control.Table Panel_grafica matlab.ui.container.Panel Image_asiento_respaldo matlab.ui.control.Image Image_ayuda matlab.ui.control.Image Panel matlab.ui.container.Panel Image_reiniciar matlab.ui.control.Image VelAngXCheckBox matlab.ui.control.CheckBox YawCheckBox matlab.ui.control.CheckBox PitchCheckBox matlab.ui.control.CheckBox RollCheckBox matlab.ui.control.CheckBox AcelYCheckBox matlab.ui.control.CheckBox iChairCheckBox matlab.ui.control.CheckBox HumedadCheckBox matlab.ui.control.CheckBox Distancia2CheckBox matlab.ui.control.CheckBox Distancia1CheckBox matlab.ui.control.CheckBox AcelXCheckBox matlab.ui.control.CheckBox TemperaturaCheckBox matlab.ui.control.CheckBox AcelZCheckBox matlab.ui.control.CheckBox VelAngYCheckBox matlab.ui.control.CheckBox VelAngZCheckBox matlab.ui.control.CheckBox R16CheckBox matlab.ui.control.CheckBox R15CheckBox matlab.ui.control.CheckBox A8CheckBox matlab.ui.control.CheckBox RespaldoCheckBox matlab.ui.control.CheckBox R12CheckBox matlab.ui.control.CheckBox R11CheckBox matlab.ui.control.CheckBox R10CheckBox matlab.ui.control.CheckBox R9CheckBox matlab.ui.control.CheckBox A6CheckBox matlab.ui.control.CheckBox AsientoCheckBox matlab.ui.control.CheckBox A2CheckBox matlab.ui.control.CheckBox A4CheckBox matlab.ui.control.CheckBox A3CheckBox matlab.ui.control.CheckBox A5CheckBox matlab.ui.control.CheckBox A1CheckBox matlab.ui.control.CheckBox A7CheckBox matlab.ui.control.CheckBox R13CheckBox matlab.ui.control.CheckBox R14CheckBox matlab.ui.control.CheckBox Sensores matlab.ui.control.UIAxes Elemento_Panel matlab.ui.container.Panel GrficaButton matlab.ui.control.Button TablaButton matlab.ui.control.Button Image_logo_visens_2 matlab.ui.control.Image AnalisisPanel matlab.ui.container.Panel Image_cargar matlab.ui.control.StateButton ExportarLabel matlab.ui.control.Label 121 CargarLabel matlab.ui.control.Label HojadeclculoxlsxButton matlab.ui.control.Button archivo_analisis matlab.ui.control.EditField xButton_Analisis matlab.ui.control.Button AnalizarButton matlab.ui.control.Button end properties (Access = public) filename; % Archivo de monitorizacion filename2; % Archivo de analisis AyudaApp; % Objeto dialog box Ayuda Datos; % Matriz con los datos de lectura tiempo; %arduinoObj; Datos_Sensores_Fuerza = zeros(1,16); Datos_Sensores_Tension = zeros(1,16); Datos_Sensores = zeros(1,14); data_num; data_num1; data_num2; data_str; Prueba = 1; x = 0; sujeto = 0; repeticion = 0; t; t4; y1; y2; y3; y4; y5; y6; y7; y8; y9; Nombre_variable; Num_simu; F1; F2; F3; F4; F5; F6; F7; F8; %Sensores Asiento F9; F10; F11; F12; F13; F14; F15; F16; %Sensores Respaldo F17; F18; F19; F20; % Tiempo F21; F22; F23; F24; F25; F26; F27; F28; F29; F30; F31; F32; F33; % Sensores silla a1; a2; a3; a4; a5; a6; a7; a8; a9; a10; a11; a12; a13; a14; a15; a16; a17; a18; a19; a20; a21; a22; a23; a24; a25; a26; a27; a28; a29; a30; v = 0; id = 0; id2 = 0; espanol = 1; euskera = 0; english = 0; arduinoObj; t0; t0_h; t0_m; t0_s; t0_ms; t1; t1_h; t1_m; t1_s; t1_ms; primert = 0; ver_vibraciones = 1; ver_orientacion = 1; ver_vel_ang = 1; t_total = 0; t_total_3 = 0; t_total_2 = 0; guardar_datos; 128 app.t1_s = str2double(app.t1(7:8)) - app.t0_s; app.t1_ms = str2double(app.t1(10:12)) - app.t0_ms; t_num = hours(app.t1_h) + minutes(app.t1_m) + seconds(app.t1_s) + milliseconds(app.t1_ms); %Guardar datos app.data_num2(1) = []; app.Datos_Sensores = [app.Datos_Sensores; app.t1_h app.t1_m app.t1_s app.t1_ms app.data_num2]; %Visualizar datos t_num.Format = "hh:mm:ss.SS"; app.Contador.Value = string(t_num); t_num.Format = "hh:mm:ss"; if app.espanol == 1 app.DetenerButton.Text = [string(t_num);"Detener"]; elseif app.euskera == 1 app.DetenerButton.Text = [string(t_num);"Gelditu"]; elseif app.english == 1 app.DetenerButton.Text = [string(t_num);"Stop"]; end app.Humedad.Value = string(app.data_num2(1)); app.Temperatura.Value = string(app.data_num2(2)); app.R1.Value = string(app.data_num2(3)); app.R2.Value = string(app.data_num2(4)); %Graficas de vibraciones, orientaciones y velocidades angulares if primera == 0 app.t = t_num; app.y1 = app.data_num2(5); app.y2 = app.data_num2(6); app.y3 = app.data_num2(7); app.y4 = app.data_num2(8); app.y5 = app.data_num2(9); app.y6 = app.data_num2(10); app.y7 = app.data_num2(11); app.y8 = app.data_num2(12); app.y9 = app.data_num2(13); primera = 1; else app.t = [app.t t_num]; app.y1 = [app.y1 app.data_num2(5)]; app.y2 = [app.y2 app.data_num2(6)]; app.y3 = [app.y3 app.data_num2(7)]; app.y4 = [app.y4 app.data_num2(8)]; app.y5 = [app.y5 app.data_num2(9)]; app.y6 = [app.y6 app.data_num2(10)]; app.y7 = [app.y7 app.data_num2(11)]; app.y8 = [app.y8 app.data_num2(12)]; app.y9 = [app.y9 app.data_num2(13)]; end if app.ver_vibraciones == 1 129 if length(app.y1) > 150 && app.t_total == 0 plot(app.UIAxes_Vibraciones, app.t(end-150:end), app.y1(end-150:end), "blue", ... app.t(end-150:end), app.y2(end-150:end), "green", app.t(end-150:end), ... app.y3(end-150:end), "yellow"); else plot(app.UIAxes_Vibraciones, app.t, app.y1, "blue", ... app.t, app.y2, "green", app.t, ... app.y3, "yellow"); end app.XLabel.Visible = 'on'; app.YLabel.Visible = 'on'; app.ZLabel.Visible = 'on'; app.parentesis_Label.Visible = 'on'; end if app.ver_orientacion == 1 if length(app.y4) > 150 && app.t_total_2 == 0 plot(app.UIAxes_Orientacion, app.t(end-150:end), app.y4(end-150:end), "blue", ... app.t(end-150:end), app.y5(end-150:end), "green", app.t(end-150:end), ... app.y6(end-150:end), "yellow"); else plot(app.UIAxes_Orientacion, app.t, app.y4, "blue", ... app.t, app.y5, "green", app.t, ... app.y6, "yellow"); end app.RollLabel.Visible = 'on'; app.PitchLabel.Visible = 'on'; app.YawLabel.Visible = 'on'; app.parentesis_Label_2.Visible = 'on'; end if app.ver_vel_ang == 1 if length(app.y7) > 150 && app.t_total_3 == 0 plot(app.UIAxes_Vel_Angular, app.t(end-150:end), app.y7(end-150:end), "blue", ... app.t(end-150:end), app.y8(end-150:end), "green", app.t(end-150:end), ... app.y9(end-150:end), "yellow"); else plot(app.UIAxes_Vel_Angular, app.t, app.y7, "blue", ... app.t, app.y8, "green", app.t, ... app.y9, "yellow"); end app.XLabel_2.Visible = 'on'; app.YLabel_2.Visible = 'on'; app.ZLabel_2.Visible = 'on'; app.parentesis_Label_3.Visible = 'on'; end end end end delete(app.arduinoObj); end % Button pushed function: HojadeclculoxlsxButton function HojadeclculoxlsxButtonPushed(app, event) 130 %Selecciona carpeta donde quiere guardar excel if isequal(app.Nombre_variable,0) else %Vuelvo a leer los datos para que esten en formato tabla otra vez [path,name,~] = fileparts (app.filename2); %Coge el nombre del archivo txt name = strcat (app.Nombre_variable,'.xlsx'); %Coge el nombre del txt y lo hace tipo excel name = fullfile(path,name); %Crea un archivo excel llamado name A1 = app.Datos(:,1); A2 = app.Datos(:,2); A3 = app.Datos(:,3); A4 = app.Datos(:,4); A5 = app.Datos(:,5); A6 = app.Datos(:,6); A7 = app.Datos(:,7); A8 = app.Datos(:,8); R9 = app.Datos(:,9); R10 = app.Datos(:,10); R11 = app.Datos(:,11); R12 = app.Datos(:,12); R13 = app.Datos(:,13); R14 = app.Datos(:,14); R15 = app.Datos(:,15); R16 = app.Datos(:,16); if app.espanol == 1 Tiempo = hours(app.Datos(:,17)) + minutes(app.Datos(:,18)) + seconds(app.Datos(:,19)) ... + milliseconds(app.Datos(:,20)); Tiempo.Format = "hh:mm:ss.SS"; Temperatura = app.Datos(:,21); Humedad = app.Datos(:,22); Distancia1 = app.Datos(:,23); Distancia2 = app.Datos(:,24); AcelX = app.Datos(:,25); AcelY = app.Datos(:,26); AcelZ = app.Datos(:,27); Roll = app.Datos(:,28); Pitch = app.Datos(:,29); Yaw = app.Datos(:,30); VelAngX = app.Datos(:,31); VelAngY = app.Datos(:,32); VelAngZ = app.Datos(:,33); writetable(table(Tiempo, A1, A2, A3, A4, A5, A6, A7, A8, R9, R10, R11, R12, R13, R14, ... R15, R16, Temperatura, Humedad, Distancia1, Distancia2, AcelX, AcelY, AcelZ, ... Roll, Pitch, Yaw, VelAngX, VelAngY, VelAngZ), name); 131 elseif app.euskera == 1 Denbora = hours(app.Datos(:,17)) + minutes(app.Datos(:,18)) + seconds(app.Datos(:,19)) ... + milliseconds(app.Datos(:,20)); Denbora.Format = "hh:mm:ss.SS"; Tenperatura = app.Datos(:,21); Hezatasuna = app.Datos(:,22); Distantzia1 = app.Datos(:,23); Distantzia2 = app.Datos(:,24); AzelX = app.Datos(:,25); AzelY = app.Datos(:,26); AzelZ = app.Datos(:,27); Roll = app.Datos(:,28); Pitch = app.Datos(:,29); Yaw = app.Datos(:,30); AbiAngX = app.Datos(:,31); AbiAngY = app.Datos(:,32); AbiAngZ = app.Datos(:,33); writetable(table(Denbora, A1, A2, A3, A4, A5, A6, A7, A8, R9, R10, R11, R12, R13, R14, ... R15, R16, Tenperatura, Hezatasuna, Distantzia1, Distantzia2, AzelX, AzelY, AzelZ, ... Roll, Pitch, Yaw, AbiAngX, AbiAngY, AbiAngZ), name); elseif app.english == 1 Time = hours(app.Datos(:,17)) + minutes(app.Datos(:,18)) + seconds(app.Datos(:,19)) ... + milliseconds(app.Datos(:,20)); Time.Format = "hh:mm:ss.SS"; Temperature = app.Datos(:,21); Humidity = app.Datos(:,22); Distance1 = app.Datos(:,23); Distance2 = app.Datos(:,24); AcelX = app.Datos(:,25); AcelY = app.Datos(:,26); AcelZ = app.Datos(:,27); Roll = app.Datos(:,28); Pitch = app.Datos(:,29); Yaw = app.Datos(:,30); AngVelX = app.Datos(:,31); AngVelY = app.Datos(:,32); AngVelZ = app.Datos(:,33); writetable(table(Time, A1, A2, A3, A4, A5, A6, A7, A8, R9, R10, R11, R12, R13, R14, ... R15, R16, Temperature, Humidity, Distance1, Distance2, AcelX, AcelY, AcelZ, ... Roll, Pitch, Yaw, AngVelX, AngVelY, AngVelZ), name); end app.HojadeclculoxlsxButton.Enable = 'off'; end 132 end % Button pushed function: DetenerButton function DetenerButtonPushed(app, event) app.Prueba = 0; app.sujeto = 0; app.repeticion = 0; if app.espanol == 1 app.DetenerButton.Text = 'Detener'; elseif app.euskera == 1 app.DetenerButton.Text = 'Gelditu'; elseif app.english == 1 app.DetenerButton.Text = 'Stop'; end app.Switch.Visible = 'off'; app.DetenerButton.Enable = 'off'; app.VisualizarButton.Enable = 'on'; app.Image_Seleccionar.Enable = 'on'; app.ArchivoEditField.Enable = 'on'; app.PuertoCOMDropDown.Enable = 'on'; app.SujetoEditField.Enable = 'on'; app.RepeticionEditField.Enable = 'on'; cla(app.UIAxes_Orientacion); app.XLabel.Visible = 'off'; app.YLabel.Visible = 'off'; app.ZLabel.Visible = 'off'; app.parentesis_Label.Visible = 'off'; cla(app.UIAxes_Vibraciones); app.RollLabel.Visible = 'off'; app.PitchLabel.Visible = 'off'; app.YawLabel.Visible = 'off'; app.parentesis_Label_2.Visible = 'off'; cla(app.UIAxes_Vel_Angular); app.XLabel_2.Visible = 'off'; app.YLabel_2.Visible = 'off'; app.ZLabel_2.Visible = 'off'; 133 app.parentesis_Label_3.Visible = 'off'; cla(app.Asiento); cla(app.Respaldo); colorbar(app.Asiento,'off'); colorbar(app.Respaldo,'off'); app.Contador.Value = ''; app.Humedad.Value = ''; app.Temperatura.Value = ''; app.R1.Value = ''; app.R2.Value = ''; app.t = 0; app.y1 = 0; app.y2 = 0; app.y3 = 0; app.y4 = 0; app.y5 = 0; app.y6 = 0; app.y7 = 0; app.y8 = 0; app.y9 = 0; app.LabelA1.Text = ''; app.LabelA2.Text = ''; app.LabelA3.Text = ''; app.LabelA4.Text = ''; app.LabelA5.Text = ''; app.LabelA6.Text = ''; app.LabelA7.Text = ''; app.LabelA8.Text = ''; app.LabelR9.Text = ''; app.LabelR10.Text = ''; app.LabelR11.Text = ''; app.LabelR12.Text = ''; app.LabelR13.Text = ''; app.LabelR14.Text = ''; app.LabelR15.Text = ''; app.LabelR16.Text = ''; %Pregunta si quieres guardar los datos app.guardar_datos = 0; ruta=app.ArchivoEditField.Value; 134 if app.espanol == 1 opts.Interpreter = 'none'; opts.Default = 'Guardar'; pregunta = strcat('¿Desea guardar los datos obtenidos? Se guardarán en'," ",ruta); respuesta = questdlg(pregunta,'Guardar datos','Guardar','Cancelar',opts); switch respuesta case 'Guardar' app.guardar_datos = 1; case 'Cancelar' app.guardar_datos = 0; end end if app.euskera == 1 opts.Interpreter = 'none'; opts.Default = 'Gorde'; pregunta = strcat('Eskuratutako datuak gorde nahi dituzu?'," ", ruta," ",'-n gordeko dira.'); respuesta = questdlg(pregunta,'Datuak gorde','Gorde','Utzi',opts); switch respuesta case 'Gorde' app.guardar_datos = 1; case 'Utzi' app.guardar_datos = 0; end end if app.english == 1 opts.Interpreter = 'none'; opts.Default = 'Save'; pregunta = strcat('Do you want to save the obtained data? They will be saved in'," ", ruta); respuesta = questdlg(pregunta,'Save data','Save','Cancel',opts); switch respuesta case 'Save' app.guardar_datos = 1; case 'Cancel' app.guardar_datos = 0; end end if app.guardar_datos == 1 app.Datos_Sensores_Fuerza(1,:) = []; app.Datos_Sensores_Tension(1,:) = []; app.Datos_Sensores(1,:) = []; 135 guardar1 = app.Datos_Sensores_Fuerza; guardar2 = app.Datos_Sensores_Tension; guardar3 = app.Datos_Sensores; guardar4 = [guardar1, guardar3]; guardar5 = [guardar2, guardar3]; if app.espanol == 1 name1 = strcat('S',app.SujetoEditField.Value,'_R',app.RepeticionEditField.Value,'_iKuxin_fuerza _y_iChair'); name2 = strcat('S',app.SujetoEditField.Value,'_R',app.RepeticionEditField.Value,'_iKuxin_tensio n_y_iChair'); elseif app.euskera == 1 name1 = strcat('S',app.SujetoEditField.Value,'_E',app.RepeticionEditField.Value,'_iKuxin_indarr a_eta_iChair'); name2 = strcat('S',app.SujetoEditField.Value,'_E',app.RepeticionEditField.Value,'_iKuxin_tentsi oa_eta_iChair'); elseif app.english == 1 name1 = strcat('S',app.SujetoEditField.Value,'_R',app.RepeticionEditField.Value,'_iKuxin_force_ and_iChair'); name2 = strcat('S',app.SujetoEditField.Value,'_R',app.RepeticionEditField.Value,'_iKuxin_voltag e_and_iChair'); end eval([name1 '=guardar4;']); eval([name2 '=guardar5;']); if ~exist(strcat(app.filename2,'.mat')) save(app.filename2,name1); save(app.filename2,name2,'-append'); else save(app.filename2,name1,'-append'); save(app.filename2,name2,'-append'); end end app.SujetoEditField.Value = ''; app.RepeticionEditField.Value = ''; list = serialportlist('all'); app.PuertoCOMDropDown.Items = list; end % Button pushed function: SimularButton 136 function SimularButtonPushed(app, event) app.MonitorizarButton.Visible = 'off'; app.SimularButton.Visible = 'off'; app.MonitorizacionPanel.Visible = 'off'; app.Image_silla.Visible = 'off'; app.EnglishButton.Visible = 'off'; app.EuskeraButton.Visible = 'off'; app.EspaolButton.Visible = 'off'; app.IdiomaButton.Visible = 'off'; app.Image_pause.Enable = 'off'; app.Image_play.Enable = 'off'; app.iKuxinButton.Enable = 'off'; app.Panel_ikuxin.Visible = 'on'; app.SimulacionPanel.Visible = 'on'; app.DispositivoPanel.Visible = 'on'; app.iChairButton.Enable = 'on'; app.ArchivoEditField_2.Value = ''; app.DuracionEditField.Value = ''; app.Slider.Value = 0; end % Value changed function: Slider function SliderValueChanged(app, event) value = app.Slider.Value; if value == 0 value = 1; end app.Num_simu = round((value*size(app.Datos,1))/100); end % Button pushed function: xButton_Simulacion function xButton_SimulacionPushed(app, event) app.Prueba = 1; app.x = 1; app.UIAxes_Vibraciones.Visible = 'on'; app.UIAxes_Orientacion.Visible = 'on'; app.UIAxes_Vel_Angular.Visible = 'on'; app.Ver_Vibraciones_Button.Icon = 'simb_no_ver.png'; app.Ver_Orientacion_Button.Icon = 'simb_no_ver.png'; app.Ver_Vel_Ang_Button.Icon = 'simb_no_ver.png'; 137 app.ver_vibraciones = 1; app.ver_orientacion = 1; app.ver_vel_ang = 1; app.Ver_Tiempo_Total_Button.Icon = 'simb_no_ver_30s.png'; app.Ver_Tiempo_Total_Button_2.Icon = 'simb_no_ver_30s.png'; app.Ver_Tiempo_Total_Button_3.Icon = 'simb_no_ver_30s.png'; app.t_total = 0; app.t_total_2 = 0; app.t_total_3 = 0; app.VibracionesLabel.Visible = 'off'; app.OrientacinLabel.Visible = 'off'; app.VelocidadangularLabel.Visible = 'off'; app.SimulacionPanel.Visible = 'off'; app.DispositivoPanel.Visible = 'off'; app.Panel_ichair.Visible = 'off'; app.Panel_ikuxin.Visible = 'off'; app.MonitorizarButton.Visible = 'on'; app.SimularButton.Visible = 'on'; app.Image_silla.Visible = 'on'; app.IdiomaButton.Visible = 'on'; app.id = 0; app.Image_open.Enable = 'on'; app.Slider.Value = 0; end % Button pushed function: xButton_Monitorizacion function xButton_MonitorizacionPushed(app, event) app.Prueba = 0; app.sujeto = 0; app.repeticion = 0; app.SujetoEditField.Value = ''; app.RepeticionEditField.Value = ''; app.ArchivoEditField.Value = ''; if app.espanol == 1 app.DetenerButton.Text = 'Detener'; elseif app.euskera == 1 app.DetenerButton.Text = 'Gelditu'; elseif app.english == 1 144 % Value changed function: RespaldoCheckBox function RespaldoCheckBoxValueChanged(app, event) if app.RespaldoCheckBox.Value == 1 if app.R9CheckBox.Value == 0 app.R9CheckBox.Value = 1; app.a9 = plot(app.Sensores, app.t4, app.F9,'DisplayName','R9 (mN)'); end if app.R10CheckBox.Value == 0 app.R10CheckBox.Value = 1; app.a10 = plot(app.Sensores, app.t4, app.F10,'DisplayName','R10 (mN)'); end if app.R11CheckBox.Value == 0 app.R11CheckBox.Value = 1; app.a11 = plot(app.Sensores, app.t4, app.F11,'DisplayName','R11 (mN)'); end if app.R12CheckBox.Value == 0 app.R12CheckBox.Value = 1; app.a12 = plot(app.Sensores, app.t4, app.F12,'DisplayName','R12 (mN)'); end if app.R13CheckBox.Value == 0 app.R13CheckBox.Value = 1; app.a13 = plot(app.Sensores, app.t4, app.F13,'DisplayName','R13 (mN)'); end if app.R14CheckBox.Value == 0 app.R14CheckBox.Value = 1; app.a14 = plot(app.Sensores, app.t4, app.F14,'DisplayName','R14 (mN)'); end if app.R15CheckBox.Value == 0 app.R15CheckBox.Value = 1; app.a15 = plot(app.Sensores, app.t4, app.F15,'DisplayName','R15 (mN)'); end if app.R16CheckBox.Value == 0 app.R16CheckBox.Value = 1; app.a16 = plot(app.Sensores, app.t4, app.F16,'DisplayName','R16 (mN)'); end lgd = legend (app.Sensores); lgd.NumColumns = 2; else app.R9CheckBox.Value = 0; 145 app.R10CheckBox.Value = 0; app.R11CheckBox.Value = 0; app.R12CheckBox.Value = 0; app.R13CheckBox.Value = 0; app.R14CheckBox.Value = 0; app.R15CheckBox.Value = 0; app.R16CheckBox.Value = 0; delete(app.a9); delete(app.a10); delete(app.a11); delete(app.a12); delete(app.a13); delete(app.a14); delete(app.a15); delete(app.a16); end end % Value changed function: iChairCheckBox function iChairCheckBoxValueChanged(app, event) if app.iChairCheckBox.Value == 1 if app.TemperaturaCheckBox.Value == 0 app.TemperaturaCheckBox.Value = 1; app.a18 = plot(app.Sensores, app.t4, app.F18,'DisplayName','Temperatura (°C)'); end if app.HumedadCheckBox.Value == 0 app.HumedadCheckBox.Value = 1; app.a19 = plot(app.Sensores, app.t4, app.F19,'DisplayName','Humedad (%)'); end if app.Distancia1CheckBox.Value == 0 app.Distancia1CheckBox.Value = 1; app.a20 = plot(app.Sensores, app.t4, app.F20,'DisplayName','Distancia1 (m)'); end if app.Distancia2CheckBox.Value == 0 app.Distancia2CheckBox.Value = 1; app.a21 = plot(app.Sensores, app.t4, app.F21,'DisplayName','Distancia2 (m)'); end if app.AcelXCheckBox.Value == 0 app.AcelXCheckBox.Value = 1; app.a22 = plot(app.Sensores, app.t4, app.F22,'DisplayName','AcelX (m/s^2)'); end if app.AcelYCheckBox.Value == 0 app.AcelYCheckBox.Value = 1; app.a23 = plot(app.Sensores, app.t4, app.F23,'DisplayName','AcelY (m/s^2)'); 146 end if app.AcelZCheckBox.Value == 0 app.AcelZCheckBox.Value = 1; app.a24 = plot(app.Sensores, app.t4, app.F24,'DisplayName','AcelZ (m/s^2)'); end if app.RollCheckBox.Value == 0 app.RollCheckBox.Value = 1; app.a25 = plot(app.Sensores, app.t4, app.F25,'DisplayName','Roll (°)'); end if app.PitchCheckBox.Value == 0 app.PitchCheckBox.Value = 1; app.a26 = plot(app.Sensores, app.t4, app.F26,'DisplayName','Pitch (°)'); end if app.YawCheckBox.Value == 0 app.YawCheckBox.Value = 1; app.a27 = plot(app.Sensores, app.t4, app.F27,'DisplayName','Yaw (°)'); end if app.VelAngXCheckBox.Value == 0 app.VelAngXCheckBox.Value = 1; app.a28 = plot(app.Sensores, app.t4, app.F28,'DisplayName','VelAngX (rad/s)'); end if app.VelAngYCheckBox.Value == 0 app.VelAngYCheckBox.Value = 1; app.a29 = plot(app.Sensores, app.t4, app.F29,'DisplayName','VelAngY (rad/s)'); end if app.VelAngZCheckBox.Value == 0 app.VelAngZCheckBox.Value = 1; app.a30 = plot(app.Sensores, app.t4, app.F30,'DisplayName','VelAngZ (rad/s)'); end lgd = legend (app.Sensores); lgd.NumColumns = 2; else app.TemperaturaCheckBox.Value = 0; app.HumedadCheckBox.Value = 0; app.Distancia1CheckBox.Value = 0; app.Distancia2CheckBox.Value = 0; app.AcelXCheckBox.Value = 0; app.AcelYCheckBox.Value = 0; app.AcelZCheckBox.Value = 0; app.RollCheckBox.Value = 0; app.PitchCheckBox.Value = 0; 147 app.YawCheckBox.Value = 0; app.VelAngXCheckBox.Value = 0; app.VelAngYCheckBox.Value = 0; app.VelAngZCheckBox.Value = 0; delete(app.a18); delete(app.a19); delete(app.a20); delete(app.a21); delete(app.a22); delete(app.a23); delete(app.a24); delete(app.a25); delete(app.a26); delete(app.a27); delete(app.a28); delete(app.a29); delete(app.a30); end end % Button pushed function: TablaButton function TablaButtonPushed(app, event) app.Panel_grafica.Visible = 'off'; app.TablaButton.Enable = 'off'; app.UITable.Visible = 'on'; app.GrficaButton.Enable = 'on'; end % Button pushed function: GrficaButton function GrficaButtonPushed(app, event) app.UITable.Visible = 'off'; app.GrficaButton.Enable = 'off'; app.Panel_grafica.Visible = 'on'; app.TablaButton.Enable = 'on'; end % Value changed function: A1CheckBox function A1CheckBoxValueChanged(app, event) if app.A1CheckBox.Value == 1 %Si F1 esta activado muestra los datos F1 app.a1 = plot(app.Sensores, app.t4, app.F1,'DisplayName','A1 (mN)'); else delete(app.a1); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: A2CheckBox function A2CheckBoxValueChanged(app, event) 148 if app.A2CheckBox.Value == 1 app.a2 = plot(app.Sensores, app.t4, app.F2,'DisplayName','A2 (mN)'); else delete(app.a2); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: A3CheckBox function A3CheckBoxValueChanged(app, event) if app.A3CheckBox.Value == 1 app.a3 = plot(app.Sensores, app.t4, app.F3,'DisplayName','A3 (mN)'); else delete(app.a3); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: A4CheckBox function A4CheckBoxValueChanged(app, event) if app.A4CheckBox.Value ==1 app.a4 = plot(app.Sensores, app.t4, app.F4,'DisplayName','A4 (mN)'); else delete(app.a4); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: A5CheckBox function A5CheckBoxValueChanged(app, event) if app.A5CheckBox.Value == 1 app.a5 = plot(app.Sensores, app.t4, app.F5,'DisplayName','A5 (mN)'); else delete(app.a5); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: A6CheckBox 149 function A6CheckBoxValueChanged(app, event) if app.A6CheckBox.Value ==1 app.a6 = plot(app.Sensores, app.t4, app.F6,'DisplayName','A6 (mN)'); else delete(app.a6); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: A7CheckBox function A7CheckBoxValueChanged(app, event) if app.A7CheckBox.Value == 1 app.a7 = plot(app.Sensores, app.t4, app.F7,'DisplayName','A7 (mN)'); else delete(app.a7); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: A8CheckBox function A8CheckBoxValueChanged(app, event) if app.A8CheckBox.Value ==1 app.a8 = plot (app.Sensores, app.t4, app.F8,'DisplayName','A8 (mN)'); else delete(app.a8); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: R9CheckBox function R9CheckBoxValueChanged(app, event) if app.R9CheckBox.Value == 1 app.a9 = plot(app.Sensores, app.t4, app.F9,'DisplayName','R9 (mN)'); else delete(app.a9); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end 150 % Value changed function: R10CheckBox function R10CheckBoxValueChanged(app, event) if app.R10CheckBox.Value == 1 app.a10 = plot(app.Sensores, app.t4, app.F10,'DisplayName','R10 (mN)'); else delete(app.a10); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: R11CheckBox function R11CheckBoxValueChanged(app, event) if app.R11CheckBox.Value == 1 app.a11 = plot(app.Sensores, app.t4, app.F11,'DisplayName','R11 (mN)'); else delete(app.a11); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: R12CheckBox function R12CheckBoxValueChanged(app, event) if app.R12CheckBox.Value == 1 app.a12 = plot (app.Sensores, app.t4, app.F12,'DisplayName','R12 (mN)'); else delete(app.a12); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: R13CheckBox function R13CheckBoxValueChanged(app, event) if app.R13CheckBox.Value == 1 app.a13 = plot(app.Sensores, app.t4, app.F13,'DisplayName','R13 (mN)'); else delete(app.a13); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: R14CheckBox function R14CheckBoxValueChanged(app, event) if app.R14CheckBox.Value == 1 151 app.a14 = plot(app.Sensores, app.t4, app.F14,'DisplayName','R14 (mN)'); else delete(app.a14); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: R15CheckBox function R15CheckBoxValueChanged(app, event) if app.R15CheckBox.Value == 1 app.a15 = plot(app.Sensores, app.t4, app.F15,'DisplayName','R15 (mN)'); else delete(app.a15); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: R16CheckBox function R16CheckBoxValueChanged(app, event) if app.R16CheckBox.Value == 1 app.a16 = plot(app.Sensores, app.t4, app.F16,'DisplayName','R16 (mN)'); else delete(app.a16); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: TemperaturaCheckBox function TemperaturaCheckBoxValueChanged(app, event) if app.TemperaturaCheckBox.Value == 1 if app.espanol == 1 app.a18 = plot (app.Sensores, app.t4, app.F21,'DisplayName','Temperatura (°C)'); elseif app.euskera == 1 app.a18 = plot (app.Sensores, app.t4, app.F21,'DisplayName','Tenperatura (°C)'); elseif app.english == 1 app.a18 = plot (app.Sensores, app.t4, app.F21,'DisplayName','Temperature (°C)'); end else delete(app.a18); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end 152 % Value changed function: HumedadCheckBox function HumedadCheckBoxValueChanged(app, event) if app.HumedadCheckBox.Value == 1 if app.espanol == 1 app.a19 = plot (app.Sensores, app.t4, app.F22,'DisplayName','Humedad (%)'); elseif app.euskera == 1 app.a19 = plot (app.Sensores, app.t4, app.F22,'DisplayName','Hezetasuna (%)'); elseif app.english == 1 app.a19 = plot (app.Sensores, app.t4, app.F22,'DisplayName','Humidity (%)'); end else delete(app.a19); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: Distancia1CheckBox function Distancia1CheckBoxValueChanged(app, event) if app.Distancia1CheckBox.Value == 1 if app.espanol == 1 app.a20 = plot (app.Sensores, app.t4, app.F23,'DisplayName','Distancia1 (m)'); elseif app.euskera == 1 app.a20 = plot (app.Sensores, app.t4, app.F23,'DisplayName','Distantzia1 (m)'); elseif app.english == 1 app.a20 = plot (app.Sensores, app.t4, app.F23,'DisplayName','Distance1 (m)'); end else delete(app.a20); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: Distancia2CheckBox function Distancia2CheckBoxValueChanged(app, event) if app.Distancia2CheckBox.Value == 1 if app.espanol == 1 app.a21 = plot (app.Sensores, app.t4, app.F24,'DisplayName','Distancia2 (m)'); elseif app.euskera == 1 app.a21 = plot (app.Sensores, app.t4, app.F24,'DisplayName','Distantzia2 (m)'); elseif app.english == 1 app.a21 = plot (app.Sensores, app.t4, app.F24,'DisplayName','Distance2 (m)'); end else 153 delete(app.a21); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: AcelXCheckBox function AcelXCheckBoxValueChanged(app, event) if app.AcelXCheckBox.Value == 1 if app.espanol == 1 || app.english == 1 app.a22 = plot (app.Sensores, app.t4, app.F25,'DisplayName','AcelX (m/s^2)'); elseif app.euskera == 1 app.a22 = plot (app.Sensores, app.t4, app.F25,'DisplayName','AzelX (m/s^2)'); end else delete(app.a22); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: AcelYCheckBox function AcelYCheckBoxValueChanged(app, event) if app.AcelYCheckBox.Value == 1 if app.espanol == 1 || app.english == 1 app.a23 = plot (app.Sensores, app.t4, app.F26,'DisplayName','AcelY (m/s^2)'); elseif app.euskera == 1 app.a23 = plot (app.Sensores, app.t4, app.F26,'DisplayName','AzelY (m/s^2)'); end else delete(app.a23); end lgd = legend (app.Sensores); lgd.NumColumns = 2; end % Value changed function: AcelZCheckBox function AcelZCheckBoxValueChanged(app, event) if app.AcelZCheckBox.Value == 1 if app.espanol == 1 || app.english ==1 app.a24 = plot (app.Sensores, app.t4, app.F27,'DisplayName','AzelZ (m/s^2)'); elseif app.euskera == 1 app.a24 = plot (app.Sensores, app.t4, app.F27,'DisplayName','AzelZ (m/s^2)'); end