scieee AI-readable full text Open interactive document viewer

Repositorio Institucional de Documentos

Abstract

La memoria de este proyecto describe el desarrollo del prototipo de un sistema de control de un dispositivo de estimulación eléctrica. Partiendo de un sistema ya existente en ordenadores de sobremesa, el controlador se implementó sobre una plataforma más flexible y económica, pero también más limitada: Raspberry Pi. El proyecto incluye desde la configuración del protocolo de comunicación entre el dispositivo de estimulación y la Raspberry Pi, hasta el diseño de un interfaz sencillo que permita, a usuarios sin conocimientos técnicos, controlar la estimulación en tiempo real. Además el sistema será responsable de controlar la frecuencia de estimulación y habilitará opciones de recopilación de datos sobre la estimulación eléctrica. Torrecilla Maynar, Pablo; Gollee, Henrik

Full text

Proyecto Fin de Carrera Programación integrada para el rápido prototipado de sistemas de rehabilitación Autor: Pablo Torrecilla Maynar Director: Dr. Henrik Gollee Ponente: Prof. José Ramón Beltrán Blázquez University of Glasgow / School of Engineering Centre for Rehabilitation Engineering 2014 Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 2 0. Resumen El propósito de este proyecto es desarrollar el prototipo de un sistema de control de un dispositivo de estimulación eléctrica. Partiendo de un sistema ya existente en ordenadores de sobre mesa, el controlador se implementara sobre una plataforma más flexible y económica, pero también más limitada: Raspberry Pi. El proyecto incluye desde la configuración del protocolo de comunicación entre el dispositivo de estimulación y la Raspberry Pi, hasta el diseño de un interfaz sencillo que permita, a usuarios sin conocimientos técnicos, controlar la estimulación en tiempo real. Además el sistema será responsable de controlar la frecuencia de estimulación y habilitará opciones de recopilación de datos sobre la estimulación eléctrica. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 3 Indice 0. Resumen ……………………………………………………….……………………………………………….. 2 1. Introducción …………………………………………………………………………………………..………. 5 1.1 Contexto y motivación ………………………………………………………………………. 5 1.2 Objectivos …………………………………………..…………………………………………..… 6 1.3 Plannig y tareas ………………………………………………………………………………… 6 1.4 Estructura de la memoria ….…………………………………………………………….… 7 2. Punto de partida …………………………………………………………………………………………….. 8 2.1 EMG y la M-wave …….…………………………………………………………….….………. 8 2.2 Dispositivo de grabación de EMG y dispositivo de estimulación .…….. 11 2.2.1 Dispisitivo de estimulación RehaStim TM ………………….……...... 11 2.2.2 Pre-amplificador y dispositivo de grabación de EMG ………… 12 2.3 Raspberry Pi …………………………………………………………………………………... 13 2.4 ScienStim. Versión para ordenador del controlador …………………….….. 14 3. Desarrollo del proyecto ………………………………………………………………………………. 14 3.1 Controlar la estimulación ..……………………………………………………………… 14 3.1.1 Modeos de estimulación …….……………………………………………. 14 3.1.2 Timing ………………………..……………………………………………………. 15 3.1.3 Englobando todas las tareas ..…………………………………………… 17 3.2 Hardware del controlador .……………………………………………………………… 17 3.2.1 Diseño del Hardware .……………………………………………………….. 18 3.2.2 Señal de blanqueo ..………………………………………………………….. 19 3.3 Interfaz gráfico sobre GTK+ …………………………………………………………….. 20 3.3.1 Interfaz gráfico …..………………………..…………………………………… 20 3.3.2 Cinco escenarios de estimulación ……………………………………… 23 Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 4 3.3.3 Autoarranque del sistema ..………………………………………………. 23 4. Conclusión y trabajo futuro ………………………….....…………………………………………. 24 5. Bibliografía …….………………………………………………………………..…………………………. 25 Anexos ………………………………………………………………………..……………………………………. 24 Anexo I: Stimberry - Description and Protocol …………………………………………. 24 Anexo II: Datasheets …………………………….…………………………….…………………… 34 i. Dual Channel 10-Bit A/D Converter ……………………………………….. 34 ii. High-speed CMOS logic analog multiplexers ………………………..… 35 iii. RehaStim Device - Description and protocol ………………………….. 36 iv. Gertboard Overview ………………………………………………………………. 36 v. Raspberry Pi ……………………………………………………………………........ 37 Anexo III: Simulink Model: data recorder …………………………………………………. 37 Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 5 1. Introducción 1.1 Contexto y motivación La investigación en el Centro de Ingeniería de Rehabilitación (CRE) de la Universidad de Glasgow se centra principalmente en el uso de la ingeniería para mejorar la salud y calidad de vida de las personas con lesión de médula espinal. Sus actividades van desde las investigaciones sobre los principios fundamentales del control de balance y el modelado de huesos y músculos, pasando por las aplicaciones clínicas tales como la estimulación de los músculos abdominales para la tos y la función respiratoria en tetraplejía, hasta el desarrollo y la evaluación de los sistemas para permitir el entrenamiento funcional y el ejercicio para las personas con lesión de médula espinal. En la investigación de la estimulación muscular uno de los elementos de estudio es la respuesta eléctrica del cuerpo a un impulso eléctrico cuando el músculo es estimulado por un impulso eléctrico externo. Sin embargo, a la hora de leer las señales del cuerpo la propia señal estimulante oculta la respuesta eléctrica real del cuerpo debido a su gran amplitud, en comparación, saturando los sistemas de captación y grabación. Existen varios estudios acerca de cómo obtener una respuesta eléctrica limpia todos ellos dependen de los dispositivos que se utilizan para registrar el electromiograma (EMG). En la estimulación mediante un pulso externo, es decir de manera no natural, se ha observado que al cabo de un tiempo la respuesta eléctrica se ve alterada debido a la fatiga del músculo. Por ello, otro punto a estudiar es cómo mejorar el tiempo antes de que el músculo se fatigue, y la respuesta eléctrica a la estimulación cambie. Una de las líneas de la investigación actual se centra en saber cómo una frecuencia aleatoria afectaría a este problema. Además de dar solución a estos problemas, el objetivo principal de este proyecto es desarrollar un primer prototipo de un controlador de dispositivo de estimulación eléctrica en la plataforma Raspberry Pi. Hasta ahora, los controladores se ejecutan en los ordenadores y, la mayoría de ellos, debian ser manejados por un usuario técnico, este proyecto pretende abrir la puerta a una nueva plataforma más portátil y económica que podría ser utilizada por un personal sin conocimientos técnicos como, por ejemplo, personal médico. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 6 1.2 Objetivos - Desarrollar un sistema integrado para el control de un dispositivo de estimulación RehaStimTM basado en la plataforma Raspberry Pi. - Investigar la grabación la señal EMG de manera limpia para el estudio de la respuesta eléctrica del cuerpo a una estimulación externa. - Habilitar una opción para estimular con una frecuencia aleatoria con el fin de poder llevar a cabo la investigación futura sobre la fatiga del músculo. - Diseñar una interfaz de control que permita una interacción fácil entre el usuario y el sistema de estimulación. 1.3 Planning y tareas A lo largo siete meses, se han desarrollado las diferentes tareas del proyecto. El siguiente gráfico y la explicación posterior pretenden describir cada una de las funciones de las tareas y su temporalización. Fig. 1. Gantt Graphic with the task of the project and their duration - Documentación: En primer lugar debía tomar contacto con la máquina y su entorno. Así que, sobre todo el primer mes lo dedique al estudio de manuales y la realización de tutoriales sobre Linux, la Raspberry Pi, sus puertos GPIO y el estimulador y la compresión de las tareas de las bibliotecas de C ++ de la versión para ordenadores de sobre mesa. - Programa Básico: Con programas sencillos probé todas las funciones disponibles del estimulador. Estos programas se ejecutaban desde la línea de comandos, sólo para probar Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 7 una o dos tareas simples. En un principio funcionaban mediante simples bucles y al final incluyeron también el control de la temporización. - Arduino: Durante unos días estuve trabajando con un estudiante de doctorado para enseñarle las ventajas que la Raspberry Pi aportaba frente al sistema Arduino, en el control de la estimulación en un sistema de ayuda en la respiración. - DAQ: Para poder registrar y almacenar los datos de estimulación, desarrollé un diagrama de bloques en similink. Dicho diagrama utiliza una tarjeta DAQ de National Instruments y permite guardar los parámetros de estimulación, la señal de estimulación, la señal de blanqueo y después de grabarla, calcular el retardo entre ellas. - Global program: En este punto diseñé un programa que abarcara todas las tareas de estimulación probadas antes así como los tres modos de estimulación. Todavía se ejecuta desde la línea de comandos, pero el usuario ya puede detener la estimulación, seleccionar otro modo diferente y continuar. - Graphical Interface: Desarrollada en GTK+, este ha sido mi primer interfaz gráfico, por lo que necesité un trabajo previo de estudio sobre el lenguaje de programación antes de empezar a diseñarlo. Con la interfaz, no solo conseguimos un entorno más “agradable” sino que también facilitamos la interacción con el programa. - Hardware design: Es el medio que el usuario utiliza para comunicarse con el programa, permitiéndole introducir parámetros, iniciar y detener la estimulación. Es un diseño sencillo con un interruptor, cuatro potenciómetros y un chip conversor de analógico a digital. - Depuration: Una vez que la interfaz gráfica y el hardware fueron incluidos en el programa global y él programa funcionaba, dedique un tiempo a buscar y solucionar los posibles problemas que no habían aparecido hasta ahora. - Final report: Se compone de dos documentos: el Manual para mis compañeros en Glasgow que quedaron el sistema y que van a trabajar con él, y el informe final para mi universidad de origen, que es, de hecho, este documento. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 8 1.4 Estructura de la memoria En las siguientes secciones están expuestos siete meses de trabajo de manera que den una visión global del problema y de cómo se afrontó. En primer lugar se expone el Punto de partida, explicando la forma en que se registra el EMG, las características de la onda-M y cómo se consigue una señal limpia. En este punto será también introducido el dispositivo de estimulación, sus funciones y sus diferentes modos, y la Raspberry Pi, el microordenador que se va a utilizar para controlar el dispositivo de estimulación. En la sección tres, Desarrollo del proyecto, se explican los tres grandes ámbitos que comprenden el proyecto. El control de la estimulación incluye la secuencia de comandos para obtener la estimulación y la configuración de todos los parámetros necesarios a la misma. En ella, se resuelve el problema de controlar el momento de la estimulación y cómo ser capaz de hacer la estimulación con una frecuencia fija o aleatoria. Y se afrontará también el problema de crear un gran programa con los limitados recursos de la Raspberry Pi que no son suficientes para trabajar con dos procesos diferentes al mismo tiempo y controlar su correcta ejecución. Hardware del controlador expone el control de los puertos GPIO de la Raspberry Pi y el diseño de un dispositivo de interacción externo con cable que permite al usuario controlar los cuatro parámetros principales de la estimulación sin la necesidad de teclado o ratón. Y en Interfaz gráfica sobre GTK+, se describe el desarrollo de la interfaz gráfica, para un entorno de escritorio GNOME, que muestre el estado de la actual estimulación. Además se describe cómo se arreglaron los problemas de funcionamiento que aparecieron cuando el proceso gráfico funcionaba al mismo tiempo que el proceso de estimulación. En el apartado cuarto, Conclusión y trabajo futuro, se evalúan los objetivos marcados en el inicio del proyecto, y se comentan cuáles serían, en mi punto de vista, los próximos pasos para mejorar este prototipo. Después, en la Bibliografía, se comparte los libros, artículos y sitios web que han ayudado en el desarrollo del proyecto, y se incluyen varios anexos que son necesarios para comprender el trabajo y su resultado, la interfaz de control integrado para el dispositivo estimulación RehaStim TM , Stimberry. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 9 2. Punto de partida 2.1 EMG y la onda-M La señal de electromiografía (EMG) es la manifestación de la actividad eléctrica producida por la contracción activa de unidades motoras. La monitorización de la EMG se utiliza ampliamente en la biomecánica y la investigación del control de movimiento para determinar cómo el sistema nervioso central (SNC) controla la contracción muscular para producir el movimiento. Más recientemente, la señal EMG producida por la estimulación eléctrica se ha utilizado para proporcionar información sobre el rendimiento muscular en la Estimulación Eléctrica Funcional del sistema (FES), el cual trata de restaurar la función de los miembros paralizados mediante la activación artificial de las neuronas motoras y de los músculos que se inervan. 1 Fig. 1. Imagen comparativa entre la EMG resultante de un movimiento voluntario y una Estimulación Eléctrica Funcional (FES). En la respuesta eléctrica del cuerpo para una FES se incluyen el reflejo de Hoffmann (reflejoH) y la respuesta motora directa (onda-M). Estas dos señales se utilizan para estudiar la actividad eléctrica del cuerpo en la investigación para mejorar el movimiento en personas con lesión de la médula espinal. La onda-M, respuesta directa, generalmente tiene un umbral de activación más alto que el reflejo-H debido al tamaño relativamente más fino de los nervios motores en comparación con los husos musculares aferentes. La onda-M también se produce a una menor latencia (aproximadamente 5-8 ms en el sóleo) que el reflejo-H (aproximadamente 30-45 ms en el sóleo). Esto se debe a que la onda M sólo tiene que viajar a lo largo del axón motor mientras el reflejo-H se Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 16 3. Desarrollo del proyecto 3.1 Controlar la estimulación 3.1.1 Modos Estimulación El dispositivo de estimulación, RehaStimTM, aunque puede ser utilizado por sí solo, también tiene la opción de ser controlado por un dispositivo externo. Esta opción se activa con el modo CienceMode del menú principal. Aprovechando este punto es cómo la versión de sobremensa controlaba el estimulador y es cómo este sistema lo controlará. Teniendo en cuenta que el sistema ya se había desarrollado para otra plataforma, el primer paso fue comprobar que partes del código anterior se podían utilizar en la versión para Raspberry Pi. Para esta tarea me serví de la ayuda del Manual de Protocolo 4 del dispositivo, para identificar las funciones que eran útiles en la comunicación con un controlador externo. Y así una vez comprendido el funcionamiento de las bibliotecas que disponía, explicadas en el apartado anterior, nacieron los algoritmos para la cada uno de los tres modos. Estos algoritmos se componían de un bucle finito simple, de manera que realizaran un par de estimulaciones con el fin de comprobar que la Raspberry Pi era capaz de controlar el estimulador. Fig. 6. Los tres modos de estimulación disponibles. La diferencia entre el modo OSCL y el CCL es que en el primero el control del tiempo lo realiza la Raspberry Pi, para ser capaces de esto Main Time debe ser igual a cero, de esta forma el estimulador entiende, en el proceso de inicialización, de qué modo se trata. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 17 3.1.2 Timing Una vez que todos los modos se ejecutaban correctamente en la Raspberry Pi, el siguiente paso fue ser capaz de controlar el momento de la estimulación. Esta fue la primera vez que me di cuenta de los límites de la CPU de la Raspberry Pi. A sabiendas de que el uso de funciones como "usleep ()" no era una buena idea, ya que simplemente detenían la CPU y todos los procesos en curso, lo que lo que es un problema cuando se desea una información en tiempo real, la función lógica a usar parecía ser "setitimer ()". Esta función configura un temporizador que, cuando expira, envía una señal al proceso que lo crea, dicha señal puede ser atrapada para ejecutar una instrucción específica. Sin embargo, como la Raspberry Pi no puede ejecutar dos procesos en paralelo, no se controla el momento de captura de la señal, ni lo que la CPU está haciendo en ese momento ni el tiempo que tarda en terminarlo, por lo que se no puede garantizar que la estimulación ocurra en el mismo instante en cada iteración. Si la Raspberry Pi pudiera ejecutar dos procesos en paralelo el problema no existiría. Una solución a este problema podría ser utilizar una señal externa. Entre los dispositivos que disponía allí había una tarjeta de expansión a través de los puertos GPIO conocida como Gertboard. Esta placa viene con una gran variedad de componentes, incluyendo un microcontrolador ATmel ATmega 328p AVR (Arduino) que puede ser utilizado para enviar un pulso a la Raspberry Pi en el momento de la estimulación. Sin embargo, un objetivo importante del proyecto es que el sistema sea lo más pequeño y portátil como sea posible, y el uso de un dispositivo externo sólo para una señal no parecía una buena opción. Aunque, la Gertboard no se incluyó en la versión final, resultó ser muy útil gracias a la cantidad de bibliotecas que existen para controlar el GPIO desarrolladas para ella. De modo hubo que buscar otra solución que no necesitara un dispositivo externo y que pudiera garantizar el orden de la secuencia de instrucciones. Esta resulto ser una función de librería llamada "clock_gettime ()". Esta función lee uno de los relojes disponibles de forma que permite calcular cuánto falta para la siguiente estimulación, leyendo en cada iteración el reloj. Esta opción, además de cumplir con la tarea de controlar la temporización, permite utilizar una frecuencia aleatoria fácilmente. Simplemente se necesita calcular un número aleatorio después de cada estimulación y usarlo como una variación de la frecuencia. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 18 Fig. 7. Diagrama descriptivo del control del tiempo. 3.1.3 Englobando todas las tareas En este punto, los tres modos de estimulación funcionaban correctamente, pero en diferentes programas. La versión final, en cambio, tenía que incluir todas las opciones para que el usuario pudiera seleccionar entre los tres modos de estimulación sin necesidad de salir del programa y tener que ejecutar otro. Este fue el siguiente paso. La primera idea fue utilizar un pequeño programa como su menú principal. En el cual el usuario pudiera introducir los parámetros de la estimulación y seleccionar el modo, y, en el momento de iniciar la estimulación, se ejecutara el programa correspondiente en función del modo de estimulación. De esta forma, este programa sería el “proceso padre” del proceso de estimulación y estarían comunicados por una tubería. Sin embargo, una vez más me encontré con que el Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 19 Raspberry Pi no disponía de suficientes recursos para realizar dos procesos, el padre y el niño, al mismo tiempo. El orden de la secuencia de instrucciones no podía ser garantizado. Al final, la solución fue utilizar cada modo como funciones del programa de menú principal, y los parámetros de la estimulación como variables globales. De esta forma, pueden ser modificados durante la estimulación y ser almacenados cuando la estimulación se ha terminado quedando disponibles para el próximo experimento. 3.2 Hardware del controlador Como ya he indicado varias veces antes, uno de los objetivos más importantes para este proyecto era conseguir un sistema lo más portátil como fuera posible. Esto supuso una gran restricción a la hora de diseñar un hardware que permite el cambio de algunos parámetros de la estimulación en tiempo real. Los parámetros que el usuario tenía que ser capaz de modificar mientras la estimulación está sucediendo son: - Frecuencia de la estimulación. - Corriente, o intensidad del pulso. - Ancho del pulso de estimulación. - Varianza, para los escenarios con frecuencia aleatoria. Para desarrollar un dispositivo controlador que pudiera comunicar estos valores a la Raspberry Pi en tiempo real, tuve que sacar partido a sus puertos GPIO. 3.2.1 Diseño del Hardware Algunos puertos GPIO pueden ser configurados de un modo alternativo, en particular, cinco de ellos pueden ser configurados para desarrollar un BUS SPI (Serial Peripheral Intrerface). Este tipo de Bus permite la comunicación en serie con dispositivos periféricos como por ejemplo un conversor Analógico/Digital que lea los valores de los parámetros de cuatro potenciómetros. Además, dado que mucha gente ha trabajado con la Raspberry Pi y la Gertboard antes yo existen bibliotecas muy útiles diseñadas para sacar el máximo partido a estos puertos GPIO y sus funciones. 5 Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 20 El complemento de expansión GPIO Gertboard introducido ya en la sección timing, además de tener el chip ATmega, tenía también un chip de A/D con dos canales que podía ser utilizado para leer el valor de los cuatro potenciómetros con la ayuda de un multiplexor. Incluso, cuando al final decidí no utilizar la Gertboard, la idea continuaba siendo una buena opción, así que compre los componentes y los emcapsule en forma de mando de control. Este es el esquema final del controlador: cuatro potenciómetros multiplexados, digitalizados conenctados a la Raspberry Pi a traves del Bus SPI. Fig. 8. Esquema final del Hardware La siguiente imagen muestra el controlador encapsulado con sus cuatro potenciómetros para especificar los parámetros de estimulación: varianza, frecuencia, corriente de pulso y ancho de pulso, y un interruptor para iniciar y detener la estimulación. Como se ve en la imagen del controlador es tan pequeño como el Raspberry Pi y se puede unir a la parte posterior de la misma, ocupando el mínimo espacio. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 21 Fig 9. Apariencia final del controlador con sus cuatro potenciómetros, el botón de inicio y las salidas en la parte trasera que facilitan la lectura de información en caso de que sea necesario. En experimentos de investigación resulta útil ser capaz de almacenar los parámetros empleados. En caso de necesitar guardar el valor analógico, este se puede obtener en tiempo real por un puerto situado justo detrás de cada potenciómetro. 3.2.2 Señal de Blanqueo La señal de supresión es una señal digital que indica, con un nivel alto, el momento de la estimulación. Como se explicó antes, la grabadora de EMG necesita una señal de disparo para bloquear el sistema y no saturarse con la señal de estimulación. Esta señal de supresión está disponible en la parte posterior del controlador marcada como “blanking signal” y debe ser conectado a la entrada MUTE de grabadora de EMG. Esta señal sólo está disponible en modos Single Pulse Mode y OSCL Mode, donde el tiempo es controlado por el Raspberry Pi. Para obtener una mayor precisión, la señal de supresión se genera al mismo tiempo que es enviada la instrucción de estimular al estimulador. Esto sucede las instrucciones Send_Update_Parameter (para el modo OSCL) y Send_Single_Pulse (para el modo de un solo pulso) ambas definidas en el archivo “sciencemode.h”. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 22 Fig. 10. La señal de blanqueo y la señal de estimulacion para Single Pulse and OSCL mode La imagen de arriba muestra la señal de supresión y la estimulación en ambos modos. Esta señal, con 3,3 voltios de amplitud, está definida por dos parámetros de t 1 y t 2 . Experimentalmente el parámetro t 1 no siempre es el mismo, pues depende del tiempo de ejecución de las instrucciones, y oscila entre 460 a 860 microsegundos para Single Pulse Mode y entre 400 a 840 microsegundos para el modo OSCL. El otro parámetro, t 2, está definido por la suma de la anchura de pulso de la estimulación y la constante MUTE_PULSE (definida en "PARAMETERS.h"). Esta constante puede ser modificada según las especificaciones del dispositivo de grabación. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 23 3.3 Interfaz gráfico sobre GTK+ 3.3.1 Interfaz Gráfico Una interfaz gráfica, desarrollada en GTK para entornos de escritorio GNOME, hace más fácil el control de la estimulación para el usuario. Esta interfaz permite especificar y ver en tiempo real los parámetros de la estimulación. Fig 11. Interfaz gráfico El programa principal, que hasta ahora era sólo un menú para fijar los parámetros y seleccionar el modo, ahora tiene que englobar además toda la configuración gráfica que permita leer, escribir y controlar todos objetos del interfaz. Para hacer esto posible, todos los objetos gráficos (escalas, botones...), sus atributos y las señales que generan cuando se interactúa con ellos, han sido definidos y especificados en el archivo "interfaceStimberry.glade". De esta forma, cada señal generada es manejada por el programa principal ejecutando la función específica definida para esa señal. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 24 Tras incluir la interfaz gráfica, el programa principal tiene la siguiente estructura: Fig. 12. Diagrama descriptive sobre el control de la interfaz gráfica. Todas las interacciones entre el usuario y los objetos del interface son controladas por un bucle sin fin llamado gtk_main(). De manera que cuando pulsamos o modificamos el valor de algún dato, el objeto lanza una señal que es atrapada por esta función, y se ejecuta la secuencia Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 25 correspondiente a esa señal. Al terminal la secuencia de instrucciones el programa vuelve al estado de alerta a la espera de nuevas señales o eventos. Sin embargo, el problema con el bucle gtk_main() es que cuando se captura la señal de inicio, y se comienza un modo de estimulación, el resto de señales o eventos quedan a la espera de que termine para ser tratados por la función gtk_main(). De modo que la interfaz gráfica se quedaba congelada y no se actualizaban los datos hasta que se detenía la estimulación y se devolvía el control al gtk_main(). Este problema se pudo resolver este gracias a la función gtk_main_iteration_do (). El uso de este comando resuelve una iteración del bucle gtk_main(), por lo que utilizándolo en el código de la estimulación cada pocos milisegundos, se controlaban todos los posibles eventos. 3.3.2 Cinco escenarios de simulación Para hacer más fácil la interacción con un usuario no-técnico y conseguir no utilizar nada más que lo esencial, plantee la opción de no necesitar utilizar ni el teclado ni el ratón. Con este fin, el programa fue preparado para ser capaz de almacenar cinco escenas de estimulación con sus parámetros específicos que se pueden fijar en un paso previo de instalación. Para este paso sólo necesitamos un ratón para seleccionar las preferencias de la estimulación: Modo, Frecuencia Aleatoria, Canales,... y después guardar la escena en una de los cinco escenarios disponibles. Una vez realizado esto, la próxima vez que se inicie el programa, se cargará el último escenario guardado. Estas opciones permiten no sólo guardar escenarios determinados para repetir los experimentos más tarde, sino también preparar el sistema para funcionar de forma automática con nada más, que el mando del controlador. 3.3.3 Autoarranque del sistema Una vez desarrollados los escenarios sólo quedaba una cosa para conseguir no necesitar ni teclado ni ratón, y era poder ejecutar automáticamente el programa cuando la Raspberry Pi arrancase. Así, cuando el usuario encienda el Raspberry Pi el programa abrirá y cargará la última escena guardada y el usuario sólo necesita presionar el botón de inicio. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 32 program, what, although spend more resources from the CPU, allows control the frequency and be able to do it, for example, ramdon. Being able to select a random frequency could be useful in the researching about the EMG behaviour at the muscles. To make the frequency random, Stimberry use the fourth parameter: Variance. This parameters is used as a maximun value of a pseudo-random sequence with a normal distribution, which takes values between - Variance and Variance. Besides with the purpose to be able to repeat a experiment with the same conditions, there is a special parameter called "seed" which start the generation of the sequence of pseudo-random. Thus these sequences are repeatable using same seed value. NOTE: There are more parameters which controls other features of the stimulation, like be able to use a fraction frequency at some channels or send pulses doubles or triples, but they are not interesting in our case. 3 Graphical Interface To make easier the stimulation control to the user, Stimberrry has a graphical interface developed on GTK for GNOME desktop environments. This interface allows specify and see on real time the parameters of the stimulation. Fig 3. Graphical Interface The main program can read, write and control the objects and their behaviour thanks to the gtk+ libraries. To do this possible all the objects, their attributes and the signals that they generate, are defined in “interfaceStimberry.glade”. Every object generate a signal when something interact with it and this signal is handled by the main program which runs a specific function for each signal. In this way the main program has the next structure. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 33 Fig 4. Main program chart All the interactions between the main program and the objects are controlled by the endless loop gtk_main(). As we’ll see at “Control Protocol” section if there is some event meanwhile it’s happening other one, this second goes to the queue until the current event returns to the gtk_main. 4 Electronic Interface An important target for the Stimberry Interface was being as embedded as possible. With this purpose, it was designed an specific wired control which allowed use the interface with nothing else that the Raspberry Pi and the controller (No keyboard nor mouse). Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 34 Fig 5. Stimberrry controller. Front potentiometers As it sees at the picture the controller has four potentiometers to specify the stimulation parameters: variance, frequency, pulse current and pulse width, and a switch to start and stop the stimulation. The analog value of these parameters can be recorded on real time by the port behind of every potentiometer. Fig 6. Stimberrry controller. Front potentiometers The controller is connected to the Raspberry Pi through the GPIO ports. some of these ports, besides being I/O digital ports, have an alternative function which makes easier the communication. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 35 Fig 7. Raspberry Pi I/O ports configuration The Serial Peripheral Interface or SPI bus is a synchronous serial data link which operates in full duplex mode and allows us read a analog values from the A/D chip. The next schematic shows the structure of the controller and its connections to the Raspberry Pi. Fig 8. Hardware Schematic 5 Control Protocol Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 36 Fig 9. Stimulation Flow Chart When the start button is pushed, a gtk_event is generated and in that moment, the gtk_main stops its endless loop and manage this event. As while is running a stimulation, the gtk_main is stopped, the graphical interface is not being updated. So the simulation functions have to, besides control the stimulation timing and their Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 37 parameters, refresh the values of the graphical interface. Which makes it through the function gtk_main_interantion_do, which does one iteration of the loop, managing the pending events. 6 Scenes and Preferences The file “PARAMETERS.dat” contains the values maximun, minumun and step of the parameters: frequency, variance, pulse width and pulse current. Defined here this parameters are used along the entire program. And it also define the width of the blanking signal pulse. Stimberry Inteface can store five stimulation scenes what can be fixed in a setting up step. For this step we just need a mouse to select the preferences of the stimulation: Mode, Random Frequency, Channels,... and then save the scene in one of the five available stores. Once done this, the next time that the program be started, the last saved scene will be loaded. Fig 10. Load and save flow charts These options allows not just save determinate states to repeat experiments later, if not it also prepare the system to run automatically with anything more but the controller. 7 Blanking Signal Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 38 Stimberry provides an output square signal to be used as a blanking signal. This signal is just available at the Single Pulse Mode and OSCL Mode, modes where the timing is controlled by the Raspberry Pi. The blanking signal pulse is generated at the same time that the instruction to stimulate is sent to the stimulator. This happens in the instructions Send_Update_Parameter (for the OSCL mode) and Send_Single_Pulse (for the Single Pulse mode) both of them defined in the file “sciencemode.h” Fig 11. Blanking singnal for Single Pulse and OSCL mode The image up shows the blanking signal and the stimulation in both modes. This signal, with 3.3 volt of amplitude, is defined by two parameters t1 and t2. The parameters t1 is not always the same, it oscillate between 460-860 microseconds for the Single Pulse mode and between 400-840 microseconds for OSCL mode. The other parameter, t2, goes defined by addition of the Pulse Width of the stimulation and the constant MUTE_PULSE (defined at “PARAMETERS.h”). This constant can be modified according the specification of the device which needs the blanking signal. 8 Libraries Besides of the C libraries necessaries to use functions own to C, it’s necessary include others which contains function and macros to communicate with the stimulator through the USB port and with the controller through the GPIO ports. “sciencemode.h" defines the stimulator class, and define the flow bytes that compose the instructions for the stimulator. “serial_linux.h” defines the SerialPort class, and its functions that open, set up and close the USB port, doing possible the communication “gb_common.h" contains the macros and functions to control the Raspberry Pi I/O ports "gb_spi.h" contains the macros and functions to control the SPI port which communicates the A/D chip to the Raspberry Pi. "GPIOport.h” defines the GPIOport class and it used functions from gb_common and gb_spi to connect the controller with the program. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 39 Anexo II: Datasheets i. Dual Channel 10-Bit A/D Converter Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 40 Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 41 ii. High-speed CMOS logic analog multiplexers Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 48 Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 49 Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 50 Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 51 Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 52 Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 53 Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 54 Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 55 Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 56 Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 57 iv. Gertboard Overview Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 64 2.2.4. Super Easy Way using Minicom Run minicom with the following parameters: minicom -b 115200 -o -D Port_Name 2.2.5. GUI method with GtkTerm Start GtkTerm, select Configuration->Port and enter the values above in the labelled fields. 2.2.6. Windows Users Windows 7 or Vista users must download putty or a comparable terminal program. Users of XP and below can choose between using putty and Hyperterminal. 2.2.7. First Dialog If you get the prompt below, you are connected to the Raspberry Pi shell! prompt> # First command you might want try is "help": prompt> # help If you get some output, you are correctly connected to the Raspberry Pi! Congratulations! 2.3. SD card setup Now we want to install a GNU/Linux distro on an SD card and make space for our stuff. You can use either an SD or SDHC card. In the latter case of course take care that your PC card reader also supports SDHC. Be aware that you are not dealing with an x86 processor, but instead a completely different architecture called ARM, so don't forget to install the ARM port for the distro you are planning to use. 2.3.1. Formatting the SD card via the mkcard.txt script 1. Download mkcard.txt . 2. $ chmod +x m kcard.txt 3. $ ./mkcard.txt /dev/sdx, where x is the letter of the card. You can find this by inserting your card and then running dmesg | tail. You should see the messages about the device being mounted in the log. Mine mounts as sdc . Once run, your card should be formatted. 2.3.2. Formatting the SD card via fdisk "Expert mode" First, lets clear the partition table: =========================================================================== $ sudo fdisk /dev/sdb Command (m for help): o Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 65 Building a new DOS disklabel. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) =========================================================================== Print card info: =========================================================================== Command (m for help): p Disk /dev/sdb: 128 MB, 128450560 bytes .... =========================================================================== Make a note of the card size in bytes. You will need it later. Then go into "Expert mode": =========================================================================== Command (m for help): x =========================================================================== Now we want to set the geometry to 255 heads, 63 sectors and calculate the number of cylinders required for the particular SD/MMC card: =========================================================================== Expert command (m for help): h Number of heads (1-256, default 4): 255 Expert command (m for help): s Number of sectors (1-63, default 62): 63 Warning: setting sector offset for DOS compatiblity =========================================================================== NOTE: Be especially careful in the next step. First calculate the number of cylinders as follows: C = B / 255 / 63 / 512 where • B = Card size in bytes (The number you wrote down earlier.) • C = Number of cylinders When you get the number, round it DOWN. Thus, if you got C = 108.8 you'll be using 108 cylinders. =========================================================================== Expert command (m for help): c Number of cylinders (1-1048576, default 1011): 15 =========================================================================== Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 66 In this case a 128MB card is used (reported as 128450560 bytes by fdisk above), thus 128450560 / 255 / 63 / 512 = 15.6 rounded down to 15 cylinders. There are 255 heads, 63 sectors, 512 bytes per sector. So far so good, now we want to create two partitions: one for the boot image, one for our distro. Create the FAT32 partition for booting and transferring files from Windows. Mark it as bootable. =========================================================================== Expert command (m for help): r Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-245, default 1): (press Enter) Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-245, default 245): +50 Command (m for help): t Selected partition 1 Hex code (type L to list codes): c Changed system type of partition 1 to c (W95 FAT32 (LBA)) Command (m for help): a Partition number (1-4): 1 =========================================================================== Create the Linux partition for the root file system. =========================================================================== Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (52-245, default 52): (press Enter) Using default value 52 Last cylinder or +size or +sizeM or +sizeK (52-245, default 245):(press Enter) Using default value 245 =========================================================================== Print and save the new partition records. =========================================================================== Command (m for help): p Disk /dev/sdc: 2021 MB, 2021654528 bytes 255 heads, 63 sectors/track, 245 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 67 Device Boot Start End Blocks Id System /dev/sdc1 * 1 51 40 9 626 c W95 FAT32 (LBA) / dev/sdc2 52 245 15 5 8305 83 Linux Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot. WARNING: If you have created or modified any DOS 6.x partitions, please see the fdisk manual page for additional information. Syncing disks. =========================================================================== Now we've got both partitions, next step is formatting them. NOTE: If the partitions (/dev/sdc1 and /dev/sdc2) do not exist, you should unplug the card and plug it back in. Linux will now be able to detect the new partitions. =========================================================================== $ sudo mkfs.msdos -F 32 /dev/sdc1 -n LABEL mkfs.msdos 2.11 (12 Mar 2005) $ sudo mkfs.ext3 /dev/sdc2 mke2fs 1.40-WIP (14-Nov-2006) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 195072 inodes, 389576 blocks 19478 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=402653184 12 block groups 32768 blocks per group, 32768 fragments per group 16256 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 Writing inode tables: done Creating journal (8192 blocks): done Writing superblocks and filesystem accounting information: =========================================================================== All done! NOTE: For convenience, you can add the -L option to the mkfs.ext3 command to assign a volume label to the new ext3 filesystem. If you do that, the new (automatic) mount point under /media when you insert that SD card into some Linux hosts will be based on that label. If there's no label, the new mount point will most likely be a long hstring, so assigning a label makes manual mounting on the host more convenient. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 68 2.4. Setting up the boot partition The boot partition must contain: • bootcode.bin : 2nd stage bootloader, starts with SDRAM disabled • loader.bin : 3rd stage bootloader, starts with SDRAM enabled • start.elf: The GPU binary firmware image, provided by the foundation. • kernel.img: The OS kernel to load on the ARM processor. Normally this is Linux -see instructions for compiling a kernel. • cmdline.txt: Parameters passed to the kernel on boot. Optional files: • config.txt: A configuration file read by the GPU. Use this to override set the video mode, alter system clock speeds, voltages, etc. • vlls directory: Additional GPU code, e.g. extra CODECs. Not present in the initial release. 2.5. Additional files supplied by RPi Foundation These files are also present on the SD cards supplied by the Foundation. Additional kernels. Rename over kernel.img to use them (ensure you have a backup of the original kernel.img first!): • kernel_emergency.img : kernel with busybox rootfs. You can use this to repair the main Linux partition using e2fsck if the Linux partition gets corrupted. Additional GPU firmware images, rename over start.elf to use them: • arm128_start.elf : 128MB ARM, 128MB GPU split (use this for heavy 3D work, possibly also required for some video decoding) • arm192_start.elf : 192MB ARM, 64MB GPU split (this is the default) • arm224_start.elf : 224MB ARM, 32MB GPU split (use this for Linux only with no 3D or video processing. It’s enough for the 1080p frame buffer, but not much else) 2.6. Writing the image to the SDcard and booting GNU/Linux The easiest way to do this is to use PiCard. It even saves you from some hassles explained above. You will need your SD card + reader and a Linux PC to use PiCard. After that, just plug the card into your Rpi. 2.7. Wire up your Raspberry Pi and power it up As explained in Section 1 2.8. SD Card Cloning/Backup Note: Update these instructions if required once they've been tried. From windows you can copy the full SD card by using Win32DiskImager. Alternatively, you can use the following instructions; Note: Many built-in SD card readers do not work, so if you have problems use an external SDUSB adapter for this. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 69 2.9. Required Software Setup • Download a windows utility dd.exe from http://www.chrysocome.net/dd • Rename it: windd.exe (This executable can to write to your hard disk so exercise caution using it!) • Make a copy named: dd-removable.exe (That executable refuses to write to your hard disk as it is named dd-removable As long as you use dd-removable.exe you cannot lose your hard disk) • Connect an SD card to the computer • Run: "dd-removable –list" Should give something like this: rawwrite dd for windows version 0.6beta3. Written by John Newbigin <[email protected].edu.au> This program is covered by terms of the GPL Version 2. NT Block Device Objects \\?\Device\Harddisk1\Partition0 link to \\?\Device\Harddisk1\DR8 Removable media other than floppy. Block size = 512 size is 4075290624 bytes This "\\?\Device\Harddisk1\Partition0" is the part you need. 2.10. Reading an image from the SD Card BEWARE: DO THIS WRONG AND YOU MIGHT CORRUPT YOUR HARD DISK! Obviously, you can NOT use 'dd-removable' to read an image as that executable refuses to write to your hard disk (so extra care is required here as you use 'windd'). • To read an SD-card image from the SD-card use: windd bs=1M if=\\?\Device\Harddisk1\Partition0 of=THE_IMAGE_READ –size Your disk name ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2.11. Copying an image to the SD Card BEWARE: DO THIS WRONG AND YOU MIGHT CORRUPT YOUR HARD DISK! • To copy an image named "THEIMAGE" to the SD-card do this: dd-removable bs=1M if=THEIMAGE of=\\?\Device\Harddisk1\Partition0 Your disk name ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 70 2.12. Software Development/Proving A supported platform for the Raspberry is Qt , which is already being worked on. C/C++ is supported through a gcc cross-compiling tool chain. After compiling, using QEMU and a Linux VM would be one way of testing your apps. This also works on Windows. Search the forum for the readymade ARM images. The choice of programming languages, IDEs and other tools on the RPi is only determined by: • The operating system compatibility (at the moment the specific Linux distro used) • The status of the respective ARM package repositories and their binary compatibility • The possibility to build other software + its dependencies for the RPi from sources. For more guides and projects involving the Raspberry Pi, see RPi Projects http://elinux.org/RPi_Projects Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 71 Annex III: Simulink Model: data recorder During the project, sometimes is useful can record the generated signal to analyze them and compare different results. The next diagram was programing on Simulink with this purpose, actually, some of the signal showed at the report comes from this diagram. To acquire the signal I had a National Instruments USB DAQ board. This board can sample at 400 KSanmples per second in total, which was so enough for me. Programación integrada para el rápido prototipado de sistemas de rehabilitación University of Glasgow 72