Sistema de control y monitorización de datos de una bicicleta eléctrica con sensor de par en el pedalier, utilizando teléfonos inteligentes
Full text
Títol: Sistema de control y monitorización de datos de una bicicleta eléctrica con sensor de par en el pedalier utilizando teléfonos inteligentes Volum:1 Alumne:Carlos Morata Núñez Director/Ponent: Antonio B. Martínez Velasco Departament:ESAII Data: 12 de Maig de 2012
DADES DEL PROJECTE Títol del Projecte: Sistema de control y monitorización de datos de una bicicleta eléctrica con sensor de par en el pedalier utilizando teléfonos inteligentes Nom de l'estudiant: Carlos Morata Núñez Titulació: Enginyeria Informàtica Crèdits: 37,5 Director/Ponent: Antonio B. Martínez Velasco Departament: ESAII MEMBRES DEL TRIBUNAL (nom i signatura) President: Joan Climent Vilaró Vocal: Francisco Javier Larrosa Bondia Director: Antonio B. Martínez Velasco QUALIFICACIÓ Qualificació numèrica: Qualificació descriptiva: Data:
Índice 1. Introducción!9 2. Estado del Arte!11 2.1.Bicicleta eléctrica!11 2.2.Aplicaciones para smartPhones!16 2.3.Sensores de fuerza!17 2.4.Medidores del par realizado por el ciclista!19 2.4.1.SRM!19 2.4.2.Power Tap!21 2.4.3.Look keo power!22 2.4.4.Ergomo!23 2.4.5.Encoders ESAII!24 2.4.6.Galgas ESAII!26 3. Objetivos!29 4. Banco de Pruebas!33 4.1.Funcionamiento!33 4.2.Control del freno electromagnético!34 4.2.1.Modificación electrónica ecocontrol!35 4.2.2.Firmware!39 4.3.Electrónica 4PGA!44 4.3.1.Escalado de la ganancia!46 4.3.2.Ajuste del “offset”!47 4.3.3.Coeficientes de temperatura y EEPROM!47 4.3.4.Microcontrolador!48 4.4.Medición de fuerzas!49 4.4.1.Principios de la extensiometría!49 4.4.2.Calibración!49 4.4.3.Recalibración en laboratorio!50 i
4.5.Encoder!56 4.6.Modificaciones en la estructura del rodillo!60 4.7.Cálculo del par realizado por la bicicleta!65 5. Pedalier Thun!67 5.1.Especificaciones!67 5.2.Principios de funcionamiento!70 5.3.Desensamblaje del pedalier!72 5.4.Incorporación al diseño de la bicicleta!74 5.5.Simulación de la bicicleta!77 5.6.Modelo para la emulación del control de la bicicleta!86 5.6.1.Bloque CAN Interface!86 5.6.2.Bloques CanWrite y CanRead!88 5.6.3.Bloque SampleTimeSync!89 5.6.4.Bloque Ecocontrol!90 5.6.5.Bloque Rodillo!91 5.6.6.Bloque 4PGA!91 5.6.7.Bloque ecogate!91 5.7.Obtención de la curva motor!92 5.7.1.Entrega de par del freno eléctrico!92 5.7.2.Curva motor!95 6. Estrategias de Control: Diseño y Selección!97 6.1.Estrategias diseñadas!99 6.1.1.Estrategia 1!99 6.1.2.Estrategia 2!100 6.1.3.Estrategia 3!101 6.2.Estrategia seleccionada!101 6.3.Implementación en Simulink!101 6.4.Implementación de la estrategia en el controlador de la bicicleta!103 6.5.Evaluación de la estrategia seleccionada!104 ii
6.5.1.Evaluación en el banco de pruebas!104 6.5.2.Evaluación en el exterior!105 7. Monitorización!107 7.1.Bluetooth!108 7.1.1.Electronica ecoGate!109 7.1.2.Modbus serie!110 7.1.3.Modbus sobre java!115 7.2.Aplicación para teléfono Android!115 7.2.1.Ciclo de vida de una aplicación Android!116 7.2.2.Estructura de la aplicación!117 7.2.3.Conexión de un dispositivo!118 7.2.4.Pestaña Speed!119 7.2.5.Pestaña Energy!120 7.2.6.Pestaña Map!121 7.2.7.Pestaña Summary!122 7.3.Aplicación para tablet Android!123 7.3.1.Grabación de datos!125 7.3.2.Visualización de experimentos!126 8. Evaluación de Resultados!129 8.1.Metas conseguidas!129 8.2.Ampliaciones/mejoras!129 9. Valorción Económica!131 9.1.Recursos materiales!131 9.2.Recursos humanos!132 9.3.Coste Total!132 10.Planificación!133 11.Bibliografía!135 12.Agradecimientos!137 13.Anexos!139 iii
Anexo 1: El puente de Wheatstone!139 Anexo 2: Fragmentos de código de las aplicaciones Android!141 Anexo 3: Bus CAN!159 iv
Capítulo 1 Introducción 1. Este proyecto final de carrera (PFC) es parte de un proyecto donde colabora la UPC con la empresa Ecobike y que consiste en el desarrollo de una bicicleta eléctrica que requiere incorporar tecnologías de la información. Ecobike es una empresa pionera en la comercialización y desarrollo de bicicletas eléctricas en España. La fabricación de las bicicletas se produce en Cataluña y gracias a la colaboración con la UPC, Ecobike dispone de un sistema electrónico propio. Ambos puntos permiten tener un control directo sobre el diseño y la tecnología de las bicicletas, así como estar preparados para desarrollar nuevos productos en función de las necesidades del mercado. Figura 1.1: Bicicleta Ecobike modelo elegance Actualmente el uso de las bicicletas eléctricas está experimentando un crecimiento espectacular, sobretodo para desplazamientos urbanos, y muchos fabricantes, tanto los nuevos como los tradicionales productores de bicicletas, están comenzando a comercializar modelos de bicicletas eléctricas intentando ocupar una cuota del cada vez más importante mercado de las ebikes. Para hacernos una idea de la situación actual del mercado, en la feria Eurobike (la más importante de Europa) se dedicó un pabellón completo a las bicicletas eléctricas. Con toda esta competencia, desarrollar una bicicleta con un alto nivel de prestaciones, así como disponer de una extensa
2.2.Aplicaciones para smartPhones Los teléfonos móviles se han convertido en el gadget ideal de acompañamiento en cualquier momento, pues sus funciones son cada día más variadas. Sin embargo, las aplicaciones que se emplean en el móvil cumplen un rol importante, y cada vez su número es mayor. Dentro de las aplicaciones genéricas para la práctica deportiva, una de las más completas y utilizadas es Endomondo. Ésta es un aplicación para móviles con GPS que se puede usar en el IPhone, en un Blackberry, en teléfonos Nokia o con Android, es una herramienta muy válida para todos aquellas personas que practican deporte al aire libre. Endomondo permite un seguimiento en tiempo real del recorrido realizado por el ciclista, midiendo distancia, velocidad, altitud y localización gracias al GPS y los mapas de Google Maps. Además, en endomondo.com se encuentra un sitio donde ver la historia de los entrenamientos realizados, el progreso, etc. Endomondo cuenta con una fuerte función social que permite competir con amigos, compartir opiniones e invitar a concursos. Además, funciona con Polar WearLink lo que permite monitorizar la frecuencia cardíaca mientras se realiza la ruta en bicicleta. Figura 2.7: Pantalla principal de la aplicación Endomondo 2. Estado del Arte 16
Las diferentes alternativas que se encuentran en el mercado (como por ejemplo My Tracks de google, Cardio Trainer, Andando, Buddy Runner) ofrecen unas características muy similares a las ofrecidas por Endomondo. Todas ofrecen el seguimiento por GPS de la actividad física realizada. 2.3.Sensores de fuerza Un sensor de fuerza es un dispositivo que permite medir las deformaciones o esfuerzos que se producen en un objeto cuando se le aplica una fuerza. Inventado por Edward E. Simmons i Arthur C. Rige, el tipo más común de sensor de fuerza está compuesto por una bobina plana de cable conductor introducida dentro de un aislante eléctrico. Figura 2.8: Sensor de fuerza de Simmons y Ruge Este dispositivo se fija en el objeto mediante un adhesivo, como por ejemplo cyanocrilato. Cuando el objeto es deformado, la bobina plana (galga) también se deforma, provocando un cambio en su resistencia eléctrica. Este cambio en la resistencia, normalmente medido por un puente de Wheatstone (mirar anexo), está relacionado con el esfuerzo mediante una cantidad llamada “Factor de Galga” (GF) de la forma siguiente: donde RG es la resistencia de la galga sin deformar, ΔR es al cambio en la resistencia provocado por el esfuerzo y ε es el esfuerzo. Sistema de control y monitorización de datos de una bicicleta eléctrica 17
Figura 2.9: Variación de la resistencia debida a la deformación En función del uso i las condiciones de funcionamiento del sensor de fuerza, se requieren diferentes configuraciones de galgas. Encontramos por ejemplo galgas que deben funcionar durante décadas y galgas que son usadas sólo durante unos días. Las variaciones térmicas pueden causar multitud de efectos sobre la medida realizada. El objeto puede cambiar de dimensiones debido a la dilatación térmica, cosa que puede hacer variar la resistencia de la galga. Para evitar este fenómeno se fabrican galgas que presentan la misma resistencia eléctrica en un amplio rango de temperaturas, como por ejemplo el constantano. Por otro lado, algunas galgas son diseñadas para que la variación de resistencia debida a la temperatura que sufre la galga, cancele la variación de resistencia debida a la dilatación del material sobre el cual está montada. En el caso de galgas que no auto-compensan, es posible minimizar las medidas derivadas de variaciones de temperatura utilizando puentes de Wheatstone. Para conseguirlo es necesario montar un puente formado por cuatro galgas: dos colocadas en el objeto y dos colocadas de forma que no se vean deformadas al aplicar un esfuerzo al objeto. Las cuatro galgas deben estar a la misma temperatura. 2. Estado del Arte 18
2.4.Medidores del par realizado por el ciclista En el apartado anterior se ha visto la teoría mediante la que funcionan los sensores de fuerza más comunes. En este se ahonda en los diferentes productos que se pueden encontrar en el mercado para medir el par realizado por un ciclista sobre los pedales. Se muestran también dos prototipos de pedales sensorizados realizados en el departamento ESAII. El sistema elegido para desarrollar este proyecto (pedalier Thun) dispone de su propio capítulo, pues el estudio realizado sobre él es más extenso. 2.4.1.SRM El sistema de entrenamiento SRM permite conocer en el momento y de forma contínua la potencia que está desarrollando el ciclista. El Powermeter se compone de bielas, platos y unidad de medición. La unidad de medición, situada entre la biela y los platos, está fabricada de una aleación de aluminio de alta resistencia y templado especial. En su interior se encuentran galgas extensiométricas que miden la deformación entre las bielas y el plato que transmite el par a la cadena. La deformación del material registra la fuerza resultante (par de giro) así como también se registra la frecuencia de pedaleo (velocidad angular). Estos parámetros se transforman en una señal digital y se transmiten por telemetría (inductivamente) a un sensor en el cuadro de la bicicleta. La medida de la energía se realiza sin efecto retroactivo, de forma que no se pierde energía. El Powermeter trabaja con compensación de temperatura, es 100% lineal y resistente al agua. Figura 2.10: SRM, unidad de medición Sistema de control y monitorización de datos de una bicicleta eléctrica 19
Figura 2.11: Electrónica de la unidad de medición SRM El principio de funcionamiento del SRM (la medición de la deformación entre biela y plato) queda bastante claro en la imagen 2.12 Figura 2.12: prototipo de bielas SRM (1986) 2. Estado del Arte 20
Srm permite medir el par realizado por ambas piernas, pues tanto con el pedal derecho, como con el izquierdo, se produce la deformación entre plato y biela. Precio aproximado: 2000€ 2.4.2.Power Tap Los sensores de potencia PowerTap miden de forma precisa la potencia que se ejerce mientras se pedalea. El sensor mide la potencia desde el buje trasero de la rueda enviando la información a un computador de forma inalámbrica. Además de la potencia se obtienen datos de velocidad y cadencia de pedaleo desde el buje. Existen varios modelos de sensores, todos con las mismas funcionalidades, cuya diferencia principal está en el material y peso del buje, así como en el precio. El principio de funcionamiento se basa en medir, mediante galgas extensiométricas, la deformación entre el eje y la carcasa del buje. Figura 2.13: buje powerTap Sistema de control y monitorización de datos de una bicicleta eléctrica 21
Figura 2.14: elementos internos del powerTap Power Tap permite medir el par realizado por ambas piernas, pues tanto con el pedal derecho, como con el izquierdo, se produce la deformación en el buje trasero. Precio aproximado: 2000€ 2.4.3.Look keo power A finales de 2011, se presentaron los pedales sensorizados look keo power. El transmisor de los datos de potencia, denominado Polar P5 power transmiter, se inserta en el eje de los pedales instrumentados Look Keo Power que utilizan 8 galgas para la medición de las fuerzas que operan sobre cada uno de los pedales permitiendo calcular la potencia mecánica aportada por cada pierna del ciclista de manera independiente. 2. Estado del Arte 22
Figura 2.15: Pedal look keo power Figura 2.16: Situación de las galgas y la electrónica Según el fabricante, el error de medición de potencia es menor al 2% y el precio de venta al público en Europa se estima entre 1500-1800 euros sin la ciclocomputadora. 2.4.4.Ergomo En el sistema de medición ergomo, es en el pedalier donde se determina la potencia realizada por el ciclista sobre los pedales. Durante pedaleo, el eje gira ligeramente, esta torsión se mide mediante la comparación de dos señales. El sistema es suficientemente sensible para detectar una distorsión mínima de sólo 0,0025 grados. La medición de la torsión del eje se realiza mediante dos encoders colocados en cada extremo. Mediante el desfase de un encoder sobre el otro, podemos inferir la torsión realizada sobre el eje, y por lo tanto, el par realizado por el ciclista. Sistema de control y monitorización de datos de una bicicleta eléctrica 23
Figura 2.17: Esquema de funcionamiento del pedalier ergomo El sistema ergomo solo permite saber la potencia realizada con la pierna izquierda, pues es la única que deforma el eje. El par realizado con la pierna derecha no deforma el eje ya que es transmitido por la biela directamente al sistema plato/cadena. Precio aproximado: 800€ 2.4.5.Encoders ESAII En el año 2009, en el departamento de ESAII, se realizó un proyecto para conseguir medir el par realizado por un ciclista midiendo la deformación del eje al igual que hace el sistema Ergomo. 2. Estado del Arte 24
Figura 2.18: Banco de pruebas utilizado para la experimentación con los encoders Después de experimentar con discos dentados fabricados por diferentes proveedores se desestimó continuar con el proyecto debido a la dificultad de conseguir discos dentados suficientemente precisos como para obtener una medida fiable. Los problemas encontrados en los discos fueron los siguientes: •Los discos no eran exactamente iguales. •Las ranuras y los dientes no eran perfectamente radiales ya que incorporaban irregularidades en la superficie de corte. •El ángulo formado por las diferentes ranuras y dientes presentaba una oscilación considerable. En la siguiente gráfica puede observarse como, girando a velocidad constante, el tiempo entre los flancos producidos por el disco no es constante. Sistema de control y monitorización de datos de una bicicleta eléctrica 25
Capítulo 4 Banco de Pruebas 4. Para la consecución de los diferentes objetivos marcados en este PFC se requiere la construcción de un banco de pruebas para facilitar el trabajo de creación y test de las estrategias de control del motor. Este banco de pruebas medirá el par realizado por la bicicleta (conjunto motor-ciclista) que aparece al aplicar un freno sobre la rotación de la rueda trasera de la bicicleta. Esta información también será accesible en el bus CAN. Tener el par resistente que genera el freno en todo momento nos permitirá calibrar otros elementos como por ejemplo el par realizado por el ciclista o obtener las gráficas reales del motor que lleva incorporada la bicicleta. Para la implementación del banco de pruebas, se utilizará un banco de entrenamiento (rodillo) de la marca italiana Elite, más concretamente el modelo RealPower CT, que permite generar hasta 1500W de resistencia. Figura 4.1: Elite Real Power CT 4.1.Funcionamiento Cuando montamos la bicicleta en el banco de entrenamiento, la rueda tractora de la bicicleta toca un rodillo y cuando esta gira hace girar el rodillo. El eje de este rodillo va unido al rotor del freno magnético. Por tanto, el par generado por la rueda tractora de la bicicleta se transmite, mediante el rodillo, hasta el rotor del freno magnético, tal y como se muestra en la figura 4.2. 33
El estator del freno electromagnético es solidario a la palanca incorporada en el montaje y los dos elementos pueden girar libremente respecto al eje del rotor, de tal manera que la palanca queda apoyada en una plancha metálica deformable Cuando alimentamos el estator, el freno magnético comienza a actuar y el estator intenta girar como el rotor debido a que se genera una atracción electromagnética entre rotor y estator que frena al rotor. En esta situación se induce un par en el conjunto estator-palanca que se traduce en una fuerza aplicada en el punto donde la palanca se apoya en la plancha deformable. Esta fuerza deforma la plancha y, midiendo esta deformación mediante galgas extensiométricas y utilizando la electrónica 4PGA, se puede saber el valor de la fuerza, y por tanto, el par del freno. Figura 4.2: Esquema de funcionamiento del freno (vista en sección). 4.2.Control del freno electromagnético 4. Banco de Pruebas 34
De serie, el rodillo incorpora una electrónica que permite indicar, mediante el software de Elite o un selector, el nivel de frenado que queremos realizar. Este control, al ser un sistema propietario de Elite, no permite ser incorporado al diseño de nuestro banco de pruebas. Es por ello que para controlar el nivel de frenado del rodillo, adaptaremos una electrónica Econcontrol, cosa que permitirá además, enviar la consigna de par resistente al rodillo mediante el bus CAN. Figura 4.3: Selector de potencia de frenado del rodillo. 4.2.1.Modificación electrónica ecocontrol Para controlar el freno se utiliza una electrónica Econcontrol, desarrollada en el departamento de ESAII. Se utiliza esta electrónica, debido a la facilidad con las que nos permite alcanzar nuestra meta y a que dispone de todos lo elementos requeridos para poder controlar el rodillo: un microcontrolador con salidas de PWM, transistores mosfets, modulo CAN, etapa de alimentación a 5V y 12V. Originalmente, una Ecocontrol, se utiliza para controlar un motor brushless de tres bobinas. Una electrónica ecocontrol La modificación realizada en la electrónica consiste en: •Soldar solo los componentes necesarios (ver esquemáticos) •Conexión de una línea de 18V a la electrónica •Adaptar el ancho de las vías necesarias para poner la línea de 18V •La salida del PWM generado debe ser a 18V Sistema de control y monitorización de datos de una bicicleta eléctrica 35
Se pueden observar los esquemáticos de la Ecocontrol modificada a continuación: Figura 4.4: Modificación del ancho de las pistas para alimentar la salida de los mosfets a 18V Figura 4.5: Esquemático de la fuente de alimentación de 5V 4. Banco de Pruebas 36
Figura 4.6: Esquemático de la fuente de alimentación de 5V Sistema de control y monitorización de datos de una bicicleta eléctrica 37
Figura 4.7: Sección y holes de montaje de los cables. 4. Banco de Pruebas 38
Figura 4.8: Esquemático del microcontrolador Figura 4.9: Esquematico de la rama mosfet high de salida del pwm 4.2.2.Firmware La electrónica utilizada dispone de un microcontrolador dsPIC30F4011. como se ha visto en el apartado anterior, para controlar el nivel de frenado del rodillo tenemos que generar una señal eléctrica variable que permita controlar la corriente consumida por el freno. Esta señal será un PWM (señal modulada). Uno de los motivos por los que se ha escogido la alternativa de utilizar una señal PWM, es por tal de poder reutilizar una electrónica desarrollada en el departamento con todos los beneficios que ello conlleva. De esta forma, se puede diseñar el sistema de forma análoga al del control del motor de la bicicleta. Este control del motor, utiliza una señal PWM para Sistema de control y monitorización de datos de una bicicleta eléctrica 39
activar y desactivar el motor que hace girar la rueda. En el esquema anterior (figura 4.9), se puede ver que la señal PWM, no se conecta directamente al mosfet de control, esto es debido a que el puerto de salida del microcontrolador no da suficiente corriente como para activar un transistor de estas características a la frecuencia deseada. Por esta razón, la señal generada por el microcontrolador pasa por un driver que permite proporcionar la corriente necesaria para que el mosfet se active/desactive según el valor específico de la señal de control. Figura 4.10: Ejemplo de señales PWM Por lo tanto, el modulo PWM del microcontrolador es el encargado de generar la señal PWM encargada de variar la corriente que consume el freno. También es necesario variar el tiempo de duty cycle con tal de conseguir variar la corriente de frenado. 4. Banco de Pruebas 40
Figura 4.11: Lógica del módulo PWM del dsPIC30F4011 Figura 4.12: Output timming del PWM Para conseguir el PWM deseado se necesita especificar los siguientes parámetros: Sistema de control y monitorización de datos de una bicicleta eléctrica 41
La primera parte de la EEPROM externa contiene los datos de configuración para la PGA309: •Registro 3: Control de referencia y linealización •Registro 4: Offset tosco de la PGA y ganancia del Front End PGA y Output Amplifier •Registro 5: Configuración de la PGA y límites sobre/sota escala. •Registro 6: Control del temp ADC Esta sección contiene su propio checksum . La segunda parte de la EEPROM externa contiene hasta 17 indices de temperatura y los correspondientes coeficientes para el Zero DAC y el Gain DAC. En el caso del corriente proyecto, se utilizan tres coeficientes de temperatura, correspondientes a las tres recalibraciones realizadas. Esta segunda parte de la EEPROM contiene su propio checksum. La lógica de la PGA309 contiene un algoritmo de interpolación para ajustar los valores de los DACs entre los indices de temperatura guardados. Si los checksums son incorrectos, la salida de la PGA se mantiene en alta impedáncia. 4.3.4.Microcontrolador En la electrónica 4PGA utilizada en estre proyecto, se emula la EEPROM haciendo uso de un microcontrolador. De esta forma, cuando se pida la configuración, el microcontrolador contestará como si de una EEPROM se tratase. Esto nos permitirá cambiar más fácilmente la configuración de la PGA309 simplemente cambiando el firmware del microcontrolador, a parte del ahorro que supone no poner una EEPROM. Figura 4.17: Emulación de la EEPROM en la electrónica 4PGA Después de la configuración inicial, la PGA309 habilita su salida con la amplificación de la señal proveniente de la galga. Esta señal, todavía en formato analógico, es digitalizada mediante el conversor A/D ADS1100 de 16 bits, consiguiendo así una alta resolución. 4. Banco de Pruebas 48
Figura 4.18: Conexión del conversor A/D al bus i2c 4.4.Medición de fuerzas Como se ha comentado en el apartado 4.1, el rodillo ha sido modificado para incorporar una plancha metálica deformable que permita saber el par ejercido por el freno. Veremos ahora el principio en el que se basa esta medida del par del freno. 4.4.1.Principios de la extensiometría La extensiometría es una técnica experimental para la medida de fuerzas y deformaciones, basada en el cambio de conductividad eléctrica de un material cuando se le aplica una fuerza. La extensiometría es experiementalmente útil en fuerzas vibracionales y detección de resonancias a altas frecuencias (la respuesta en frecuencia de una galga extensiométrica es de unos 100kHz) donde otros métodos como por ejemplo los algoritmos de simulación por elementos finitos no ofrecen resultados fiables. En sus múltiples variantes, permite determinar estados tensionales, unidereccionales o completos, medir deformaciones a alta temperatura, fabricar acelerometros, etc. Su uso requiere la utilización de un amplificador analógico debido a las débiles señales que se generan (normalmente inferiores a 1mV) 4.4.2.Calibración En LERMA (Laboratorio de Elasticidad y&Resistencia de Materiales de la UPC), se ha realizado una calibración estática de las galgas extensiométricas para comprobar que miden con precisión deformaciones similares a las que se generarán dinámicamente. Esta primera calibración también sirve por comprobar que la plancha trabaja en su zona elástica, es decir, que las deformaciones son proporcionales a la carga y que vuelve a la posición inicial en cuando se encuentra en reposo. La fuerza que genera la deformación de la plancha depende de la excitación del estator y está limitada por las características técnicas del freno electromagnético; se ha comprobado Sistema de control y monitorización de datos de una bicicleta eléctrica 49
experimentalmente y se sitúa a 60N como máximo (correspondiente a un par de freno de 6.45*Nm) por lo tanto la calibración se ha hecho a medidas que van de 0N a 60N. Para hacer las medidas se han colgado pesos de 0.5kg en la posición donde la palanca se apoya en la plancha y se ha medido la deformación detectada por las galgas para cada situación. En la siguiente tabla se muestran los resultados: Figura 4.19: Tabla de calibración proporcionada por LERMA Notas: •En gris se representa la deformación medida después de aplicar toda la carga. •La media teórica se ha hecho considerando a partir de la máxima deformación que todas las deformaciones se comportan linealmente con la carga. 4.4.3.Recalibración en laboratorio La estructura interior del sensor de fuerza incorporado en el rodillo es un puente de Wheatstone, donde se utilizan 4 líneas, por lo tanto, tenemos que saber la cual es la correspondencia de cada salida del sensor con respecto al puente. 4. Banco de Pruebas 50
Figura 4.20: Puente de Wheatstone Como podemos observar en la figura 4.20, dos nodos son para la alimentación del sensor (polo positivo - A y polo negativo - D) y dos más para la señal de salida del sensor (B y C). Conociendo el valor de las resistencias y con un multímetro para medir las resistencias entre dos conexiones podemos deducir la correspondencia entre el cableado físico y las interconexiones del puente de Wheatstone. Una vez conocido el pinout del sensor, podemos proceder a conectarlo con el amplificador de señal programable (PGA) de la placa integrada (explicado en el apartado 4.3) que nos permitirá obtener las lecturas del sensor. Estas lecturas serán una interpretación digital de la señal analógica que obtendríamos del sensor, por lo tanto, no pedemos relacionarla directamente con la tabla que nos proporciona el departamento de resistencia de materiales. Debido a esto, hemos tenido que realizar un recalibrado en el laboratorio para saber la relación entre microdeformaciones y la salida en mV de la salida del sensor. El primer paso es configurar la ventana de trabajo del conversor AD. El conversor utilizado en este proyecto nos proporciona una medida digital de 15 bits, es decir, entre 0x0000 y 0x7FFF. La idea es conseguir colocar la ventana de trabajo para que el valor leído proveniente del sensor sea, para la fuerza máxima, cercano pero inferior a 0x7FFF. De esta forma optimizaremos el funcionamiento del conversor AD y obtendremos una lectura lo más precisa posible. Suponemos, según los datos facilitados por LERMA, que la fuerza máxima que se medirá en la galga del rodillo será de 70N y que la fuerza no será nunca en el sentido negativo. Encontramos entonces, que el sensor tiene que trabajar en un intervalo de 70N. Con el sensor mal calibrado perderemos mucha resolución en la medida, por ejemplo con una ventana de trabajo de 1000N, tendremos una Sistema de control y monitorización de datos de una bicicleta eléctrica 51
resolución de 31bits/N en contrapartida a los 468 bits/N que podríamos llegar con una configuración ideal. El siguiente paso, es conectar las galgas a la electrónica 4PGA (explicada en el siguiente apartado). Conectando la electrónica a su vez a un PC mediante el bus CAN incorporado, podemos saber la lectura del amplificador que realiza el AD. Para la recalibración, se ha seguido el mismo procedimiento que realiza LERMA: colgar pesos de 1 kg en la posición donde la palanca se apoya en la plancha y medir la deformación detectada por las galgas para cada situación. Se ha repetido esta calibración a diferentes temperaturas ambiente, más concretamente se han realizado medidas a 7ºC, 21ºC y 26ºC. Disponer de estas calibraciones permite configurar el amplificador PGA para que compense los efectos de la temperatura sobre el valor leído de las galgas extensiométricas. Una galga encolada tiene variaciones de resistencia causadas por los efectos térmicos sobre la propia galga y por las dilataciones del material sobre el que está colocada. Por ejemplo, en el acero, 5ºC de elevación en la temperatura crean la misma deformación que una tensión de 1Kg/mm2. En la práctica, eliminar completamente el error es imposible. Los resultados de las calibraciones pueden verse en las siguientes tablas: Figura 4.21: Resultado de la calibración a una temperatura ambiente de 7ºC 4. Banco de Pruebas 52
Figura 4.22: Resultado de la calibración a una temperatura ambiente de 21ºC Figura 4.23: Resultado de la calibración a una temperatura ambiente de 26ºC Con los datos obtenidos de las calibraciones a diferentes temperaturas, se puede obtener la siguiente tabla, que relaciona la temperatura ambiente con el valor medio amplificado por la PGA. Figura 4.24: Relación entre temperatura y valor amplificado por la PGA Sistema de control y monitorización de datos de una bicicleta eléctrica 53
Gráficamente, los diferentes valores leídos de la galga según la temperatura y la fuerza aplicada pueden representarse por la siguiente gráfica: Figura 4.25: Valores leídos por el AD según la temperatura ambiente y la fuerza ejercida en la galga Todo este proceso permite configurar el valor de la ganancia y offset fino de la PGA309 (Gain Dac y Zero DAC) según la temperatura ambiente detectada. La salida de la PGA se calcula teniendo en cuenta la siguiente equación: Donde es la señal de entrada de la PGA309. es el offset tosco del front end PGA. es la ganancia tosca. es el offset fino. es la ganancia fina. 4. Banco de Pruebas 54
es la ganancia de la etapa de output. Mediante esta función se pueden calcular los coeficientes de temperatura fácilmente utilizando las siguientes expresiones: Donde C es el valor de la galga en reposo para la temperatura base. B es el valor de la galga en reposo para la temperatura de la que se está calculando el coeficiente. A es el valor estándar para la temperatura base en el que se incrementa la lectura de la galga al hacer un paso de calibración más C. D es el valor estándar en el que se incrementa la lectura de la galga al hacer un paso de calibración más B, para la temperatura de la que se está calculando el coeficiente. Utilizando este razonamiento, se configuran tres coeficientes de temperatura y la PGA309 se encarga de calcular el valor de ganancia fina según la temperatura ambiente interpolando el valor según los coeficientes dados. Figura 4.26: Coeficientes de Gain DAC calculados según la temperatura Figura 4.27: Coeficientes de Zero DAC calculados según la temperatura Sistema de control y monitorización de datos de una bicicleta eléctrica 55
Al utilizar estos coeficientes, se comete un error al leer el esfuerzo realizado por la galga. Partiendo de los 7ºC como temperatura base, el error cometido se puede cuantificar y representar según la siguiente gráfica: Figura 4.28: Error cometido con los coeficientes de temperatura calculados Cometer un error máximo de 242mV a la salida de la PGA es cometer un error máximo de un 4% es perfectamente asumible, pues el error medio es del 1,5%. 4.5.Encoder Para obtener el par realizado por la bicicleta, es necesario saber a que velocidad gira el rodillo. Saber la velocidad de giro nos permite también (sabiendo la velocidad de la rueda) detectar si el neumático de la bicicleta hace contacto con el freno o si por lo contrario se están produciendo perdidas de adherencia. El encoder que se instalará en el rodillo es un Osram SFH9240. Se ha elegido este encoder debido a que tiene unas especificaciones suficientes para el propósito que queremos desempeñar y a que se tenían muestras disponibles para ser utilizadas, ahorrando así tiempo y dinero. Se ha diseñado una pcb para alojar la electrónica y poder acoplarla de forma consistente a la estructura del rodillo. Esta operación es de suma importancia, pues de la geometría resultante entre el sensor y el encoder es buena responsable del éxito de los datos obtenidos. En la figura 4.29 puede verse el esquemático de la pcb diseñada. 4. Banco de Pruebas 56
Figura 4.29: Esquemático de la PCB encoder Figura 4.30: Diseño de la PCB del encoder La pcb ya terminada tiene el siguiente aspecto: Figura 4.31: PCB encoder construida Debido a la posición del encoder, muy cercana a elementos en movimiento y sensible a virutas de goma procedentes del desgaste de los neumáticos, se ha encapsulado la electrónica en un Sistema de control y monitorización de datos de una bicicleta eléctrica 57
0 $$ 0 6(&&,Ð1$$ & % $ ' ( ) 9DVRPP &DUORV0RUDWD 3(62 $FHUR&URPDGR $ +2-$'( (6&$/$ 1'(',%8-2 7Ì78/2 5(9,6,Ð1 12&$0%,(/$(6&$/$ 0$7(5,$/ )(&+$ ),50$ 120%5( 5(%$5%$5< 5203(5$5,67$6 9,9$6 $&$%$'2 6,126(,1',&$/2&2175$5,2 /$6&27$66((;35(6$1(100 $&$%$'2683(5),&,$/ 72/(5$1&,$6 /,1($/ $1*8/$5 &$/,' )$%5 $352% 9(5,) ',%8- Figura 4.41: Planos del soporte diseñado (II). 4. Banco de Pruebas 64
El resultado final ha sido muy satisfactorio, pues desde que se utiliza el nuevo soporte no se han vuelto a tener problemas con los cables del motor. Figura 4.42: Detalle de la salida de cables del motor con el nuevo soporte.. 4.7.Cálculo del par realizado por la bicicleta Una vez se tiene el par realizado por el freno y la velocidad de giro de la rueda de la bicicleta y del disco de inercia del rodillo se puede calcular el par que está realizando en cada momento el motor de la bicicleta. La potencia mecánica realizada por la bicicleta se puede representar de la siguiente forma: Donde es el torque realizado por el motor de la bicicleta y es la velocidad angular de la rueda de la bicicleta. De la misma forma, podemos representar la potencia realizada en el rodillo por la siguiente fórmula, variando los términos por los valores calculados en el rodillo: Se cumple pues que la potencia realizada por la bicicleta es igual detectada en el rodillo: Sistema de control y monitorización de datos de una bicicleta eléctrica 65
De donde se deduce que el par realizado por la bicicleta es: Otro aspecto interesante es conocer el rendimiento ( ) de la bicicleta. Conociendo la potencia eléctrica suministrada ( ) y la potencia mecánica ( ) de la bicicleta se puede calcular el rendimiento de forma sencilla: Donde V es el voltaje de la batería e I es la corriente consumida por la bicicleta. El rendimiento de la bicicleta puede tomar valores entre 0 y 1 4. Banco de Pruebas 66
Capítulo 5 Pedalier Thun 5. El sistema para la medición de par elegido para incorporar en el diseño de la bicicleta ha sido el pedalier sensorizado de la marca alemana Thun. Se ha elegido este pedalier debido a su reducido precio (76€), a que es fácilmente integrable en el diseño actual de la bicicleta. En este capítulo se ahonda en el diseño, las especificaciones y la integración del pedalier. Figura 5.1: Pedalier Thun 5.1.Especificaciones El pedalier Thun utilizado es el modelo X-CELL RT que ofrece una medida del par realizado por el ciclista y del giro de los pedales. Incorpora sensores Hall PCME y una electrónica que queda integrada en el diseño del pedalier, haciendo que sea invisible e inaccesible a simple vista. Este aspecto consigue hacerlo más robusto y duradero pues no le afectan las vibraciones, polvo, agua... La electrónica, al no ser accesible no tiene mantenimiento. Permite un montaje similar a la de cualquier otro pedalier, sin necesidad de herramientas específicas. 67
Figura 5.2: Especificaciones técnicas del pedalier thun X-CELL RT 5. Pedalier Thun 68
Figura 5.3: Gráfica de la salida de la señal de Par Figura 5.4: Gráfica de la salida sinus/cosinus asociada al giro del pedal Sistema de control y monitorización de datos de una bicicleta eléctrica 69
5.2.Principios de funcionamiento Se puede dividir el funcionamiento del pedalier en dos funciones básicas: •Detección del giro del pedal •Medida del par realizado por el ciclista Para la detección del giro del pedal se utilizan sensores hall con salida analógica. El sensor de efecto Hall o simplemente sensor Hall se sirve del efecto Hall para la medición de campos magnéticos para la determinación de la posición. Si fluye corriente por un sensor Hall y se aproxima a un campo magnético que fluye en dirección vertical al sensor, entonces el sensor crea un voltaje de salida proporcional al producto de la fuerza del campo magnético y de la corriente. Si se conoce el valor de la corriente, entonces se puede calcular la fuerza del campo magnético; si se crea el campo magnético por medio de corriente que circula por una bobina o un conductor, entonces se puede medir el valor de la corriente en el conductor o bobina. Figura 5.5: Ejemplo de voltaje de salida de un sensor hall analógico El campo magnético que detectan los sensores hall es generado por un imán de 32 pulsos. La colocación de los sensores de hall con respecto a este imán da como resultado la señal analógica 5. Pedalier Thun 70
de salida del pedalier. En el siguiente esquema puede apreciarse la colocación de los sensores con respecto al imán. Figura 5.6: Esquema colocación de los sensores hall respecto del imán de 32 pulsos (se visualizan 3 pulsos) El desfase entre la colocación de un sensor respecto al otro da como resultado la detección del sinus y del cosinus. Por otro lado, al tener el imán 32 pulsos, se observa que el sensor realiza un ciclo de sinus/cosinus entero cada 4 pulsos (norte-sur, sur-norte, norte-sur, sur-norte) es por ello que por cada pedalada el pedalier da 8 sinus completos. Por lo que respecta a la medida del par se hace uso del un eje ligeramente magnetizado y del primcipio de magnetoestricción. Se denomina magnetostricción a la propiedad de los materiales magnéticos que hace que estos cambien de forma al encontrarse en presencia de un campo magnético. Las vibraciones en forma de sonido son causadas por la frecuencia de las fluctuaciones del campo. Éste fenómeno es parte de la causa de que se encuentren vibraciones de 100 Hz ó 120 Hz en máquinas eléctricas como motores y transformadores, Para generar electricidad se utiliza la magnetrostricción inversa, la aplicación de compresión cambia el flujo magnético lo que según la ley de Faraday induce un campo eléctrico. El efecto fue identificado por el científico James Prescott Joule en 1842 cuando observaba níquel puro. Internamente, los materiales ferromagnéticos tienen una estructura que esta dividida en dos dominios, cada uno de los cuales es una región polarizada magnéticamente. Cuando un campo magnético es aplicado, las fronteras entre los dominios cambian y los dominios rotan, estos dos efectos se ven reflejados en el cambio dimensional del material. El efecto recíproco es el cambio de la susceptibilidad (respuesta a un campo magnético) de un material cuando esta sujeto a deformación mecánica, se le llama efecto magnetoestrictivo inverso, y es el utilizado por el pedalier thun. El efecto Wiedemann que se manifiesta en la torsión de este tipo de materiales cuando un campo magnético helicoidal se aplica en ellos nos permite calcular el ángulo de torsión del eje: Sistema de control y monitorización de datos de una bicicleta eléctrica 71
Donde es la torsión del eje. j es la densidad de corriente h es el parametro de magnetoelasticidad G es el modulo de Shear (modulo de rigidez) 5.3.Desensamblaje del pedalier Dado el propósito académico de este proyecto, se ha procedido a desmontar un pedalier sensorizado con tal de ver con más detalle como es en su interior. En las siguientes imágenes se puede observar las diferentes etapas para su desmontado, así como la explicación de los componentes del pedalier. Figura 5.7: Pedalier fijado al banco de trabajo. Se ha empezado a recortar la cubierta. 5. Pedalier Thun 72
Figura 5.8: Comenzando a dejar la electrónica al descubierto Figura 5.9: Electrónica del pedalier thun. En azul el sensor PCME y en rojo los sensore hall Sistema de control y monitorización de datos de una bicicleta eléctrica 73
y torque utilizadas por una lookup table oara dar el par asociado a una velocidad concreta del motor. Las tablas de velocidad y par, son generadas por aproximación polinómica utilizando las funciones polyval y polyfit de Matlab. Estas funciones permiten generar un polinomio que representa la tabla motor y nos ayuda a representar todos los valores de este de forma que no sea necesario entrar todos los datos de forma manual. Figura 6.3: Gráficos que caracterizan a un motor BLDC de 250W El bloque de la bicicleta es el encargado de simular la dinámica de la bicicleta, es por tanto, el encargado de proporcionar el par resistente que sufre la rueda debido a las fuerzas en contra. El 6. Modelo Simulink de una bicicleta eléctrica 80
bloque de la bicicleta permite configurar diversos parámetros, como son la masa, el coeficiente aerodinámico, la sección de penetración en el aire y el coeficiente de rodadura. Consta de cinco salidas: •Distancia •Velocidad •Aceleración angular de las ruedas •Velocidad angular de las ruedas •Par de las ruedas Y de dos entradas: •Pendiente •Par en el eje Estas cinco salidas permiten obtener el estado actual de la bicicleta para comprobar su correcto funcionamiento. Por otro lado, las entradas permiten transmitir el par del eje de la rueda y el pendiente actual en el que se encuentra la bicicleta que permite calcularla fuerza debida a la gravedad que actúa sobre el ciclista. Figura 6.4: Implementación del bloque bicicleta Por último, el bloque de la transmisión es el encargado de transmitir la fuerza realizada por el ciclista al resto del conjunto. Este bloque incorpora además las ruedas libres que permiten al motor girar sin afectar a los pedales, así como un cambio de marchas. Sistema de control y monitorización de datos de una bicicleta eléctrica 81
Figura 6.5: Implementación del bloque transmisión Figura 6.6: Implementación del sistema de ruedas libres El sistema de transmisión cuenta con dos ruedas libres al igual que en una bicicleta eléctrica real: uno que permite el giro de la rueda sin necesidad de mover el motor, y una segunda rueda libre que permite avanzar a la bicicleta sin necesidad de mover los pedales. 6. Modelo Simulink de una bicicleta eléctrica 82
A continuación se muestran algunos ejemplos de ejecuciones del modelo, que permiten a su vez demostrar su funcionamiento: Funcionamiento en llano. Persona sin pedalear Figura 6.7: Funcionamiento en llano. Datos de la bicicleta Explicación: Como se puede apreciar en este gráfico, el comportamiento de la bicicleta es el esperado de la bicicleta avanzando sin la ayuda de la persona.Al accionar el acelerador, la bicicleta comienza su marcha, aumentando su velocidad. La aportación de la persona al movimiento de la bicicleta es nula. El fin de este experimento es comprobar como la rueda libre de la carcasa del motor funciona. Sistema de control y monitorización de datos de una bicicleta eléctrica 83
Funcionamiento en llano. Persona pedaleando hacia atrás Figura 6.8: Funcionamiento en llano pedaleando hacia atrás. Datos de la bicicleta Explicación: La persona pedalea hacia atrás sin hacer aportación de par al movimiento de la bicicleta. el comportamiento de la bicicleta es el esperado de la bicicleta avanzando sin la ayuda de la persona. Al accionar el acelerador, la bicicleta comienza su marcha, aumentando su velocidad. La aportación de la persona al movimiento de la bicicleta es nula.. La rueda libre de la transmisión funciona. 6. Modelo Simulink de una bicicleta eléctrica 84
Funcionamiento en llano. Persona pedaleando sin motor Figura 6.9: Funcionamiento en llano pedaleando sin motor. Datos de la bicicleta Explicación: La persona comienza a pedalear y la bicicleta se mueve. Se puede apreciar como a más par aplicado por la persona, las rpm del pedal aumentan, y en consecuencia , más velocidad consigue la bicicleta. El objetivo de este experimento es comprobar que la la transmisión y la rueda libre del motor funcionan. Sistema de control y monitorización de datos de una bicicleta eléctrica 85
Funcionamiento en llano. Pedal asistido por motor Figura 6.10: Funcionamiento en llano pedal asistido por motor. Datos de la bicicleta Explicación: En este caso, tanto como la persona como el motor hacen aportación al movimiento de la bicicleta. Se puede apreciar, comparando con los casos anteriores, que la bicicleta acelera más rápido cuando la persona aplica par sobre los pedales y como pierde velocidad cuando el ciclista deja de pedalear. Se puede obtener la conclusión que el conjunto motor transmisión funcionan. 6.2.Modelo para la emulación del control de la bicicleta Para poder desarrollar el modelo de control compartido (parte emulado en Matlab y parte en la electrónica ecogate de la bicicleta), es necesario contar con un modelo Simulink capaz de conectarse al bus CAN para poder leer las tramas provenientes de la bicicleta, así como tener la capacidad de escribir en el bus para enviar las consignas de control a la bicicleta. En este apartado se explica la implementación de este modelo. 6.2.1.Bloque CAN Interface Tal y como se ha comentado anteriormente, surge la necesidad de implementar una comunicación bidireccional con el bus can. Para interconectar el modelo creado en Simulink con las diferentes electrónicas presentes en la arquitectura de la bicicleta, se ha elegido una interfaz CAN a USB del fabricante Lawicel. 6. Modelo Simulink de una bicicleta eléctrica 86
Figura 6.11: Lawicel Canusb Lawicel nos proporciona una API que permite desarrollar aplicaciones que interactuen con el dispositivo canusb. Las llamadas esenciales que nos ofrece la API de Lawicel son: Figura 6.12: Llamadas implementadas por la API del Lawicel CANUSB Para poder utilizar estas funciones desde Simulink. se necesita utilizar un bloque de Simulink llamado S-Function. El contenido de este bloque puede ser escrito en el lenguaje de programación C. Las funciones implementadas en este bloque pueden ser utilizadas durante el ciclo de vida del modelo Simulink. Sistema de control y monitorización de datos de una bicicleta eléctrica 87
Figura 6.13: Bloque canInterface y sus parámetros La programación de todas las S-Functions ha sido realizado por Toni Benedico del departamento de ESAII. 6.2.2.Bloques CanWrite y CanRead Una vez se ha iniciado la comunicación con el modulo Lawicel, se necesita un mecanismo para poder leer las tramas que viajan por el bus, así como poder generar nuestras propias tramas. Los bloques encargados de este cometido, canWrite y canRead están implementados mediante una S-Function. La implementación de los bloques se puede observar en las figuras 6.14 y 6.15 Figura 6.14: Implementación CanRead 6. Modelo Simulink de una bicicleta eléctrica 88
Figura 6.15: Implementación CanWrite 6.2.3.Bloque SampleTimeSync Este bloque implementa una espera activade 0,01s. De esta forma se consigue una ejecución en pseudotiempo real del modelo Simulink. Este bloque está implementado al igual que el anterior en una S-Function. Figura 6.16: Bloque sampleTymeSync y sus parámetros Sistema de control y monitorización de datos de una bicicleta eléctrica 89
Figura 6.25: Curva del motor BLDC utilizado por ecobike 6. Modelo Simulink de una bicicleta eléctrica 96
Capítulo 7 Estrategias de Control: Diseño y Selección 7. En este capítulo se explican las diferentes estrategias diseñadas para el control del motor de la bicicleta. También se describe de forma detallada la implementación de la estrategia de control elegida para la bicicleta. La variable que se pretende controlar, es la relación entre el trabajo que realiza el ciclista y el trabajo ejercido por el motor. El controlador debe comparar esta relación con la relación de trabajo deseada (consigna) y actuar en consecuencia sobre el motor de la bicicleta. Para testear las estrategias de control diseñadas se hará uso del modelo Simulink desarrollado y explicado en el capítulo 6. El esquema de control compartido entre el modelo Simulink y el controlador de la bicicleta puede observarse en la figura 7.1. Figura 7.1: Esquema de control compartido El controlador de la bicicleta ya ofrece un control mediante PID de la velocidad del motor y de la corriente máxima consumida. El doble lazo encadenado de control de velocidad y corriente permite establecer una consigna de velocidad a la que se puede limitar el consumo de corriente a voluntad. El esquema de este doble lazo de control es el siguiente: 97
Figura 7.2: Doble lazo de control de velocidad y corriente. Marcadas en rojo las consignas sobre las que se actúa. El objetivo final de la estrategia de control es que la relación de trabajo, el business entre la bicicleta y el usuario, se mantenga constante, independientemente de la ruta seguida. Este concepto queda expresado gráficamente en el siguiente esquema: ! Figura 7.3: Proporciones de trabajo realizados por la bicicleta y el usuario según el nivel de ayuda del motor. El esquema está dividido en dos casuísticas, el comportamiento de la bicicleta en llano y el comportamiento en subida. El trabajo realizado por el conjunto motor ciclista en el caso de la 7. Estrategias de control: Diseño y selección 98
conducción en llano viene determinado por la velocidad, el rozamiento que frena la bicicleta y el tiempo que dura el experimento. En el caso de conducción en subida, hay que añadir además, la gravedad como fuerza que se opone al movimiento, con una magnitud dependiente de la pendiente que se sube. Se puede apreciar en el diagrama como el trabajo realizado cuando se supera un desnivel es mayor que cuando se circula en llano, pero la proporción de esfuerzo aportado por el ciclista con respecto al aportado por el motor se mantiene. 7.1.Estrategias diseñadas Se han diseñado tres estrategias para el control del motor. En los siguientes subapartados se especifican los conceptos básicos de cada estrategia. Para todas las estrategias diseñadas, dado que el pedalier solo da el torque realizado por la pierna izquierda, se supone que el torque realizado por la pierna derecha es igual con un desfase de 180º. 7.1.1.Estrategia 1 La estrategia queda definida según el siguiente esquema: Figura 7.4: Esquema de la estrategia número 1 En esta estrategia se calcula el trabajo realizado por el ciclista integrando el valor de la potencia instantánea obtenida del pedalier Thun. Posteriormente se calcula la relación existente entre el trabajo realizado por el ciclista y el trabajo desarrollado por el motor en un periodo de tiempo concreto (por ejemplo 20 segundos). Según el resultado de la relación trabajo ciclista - trabajo motor, se ajusta la consigna de trabajo para asegurar que la relación deseada se cumple. La principal ventaja de esta estrategia es la precisión que muestra cumpliendo el objetivo de trabajo fijado. Su principal inconveniente es que puede ajustar el nivel de ayuda a la baja en un momento Sistema de control y monitorización de datos de una bicicleta eléctrica 99
en el que sea necesario, con la consiguiente molestia para el usuario. Por ejemplo, si durante un periodo concreto, el motor ha realizado más trabajo del que le corresponde, en el siguiente periodo ajustará la consigna para que el ciclista trabaje más. Este ajuste puede coincidir con una subida, dando la sensación al usuario de que no recibe la ayuda que le correspondería. 7.1.2.Estrategia 2 La estrategia queda definida según el siguiente esquema: Figura 7.5: Esquema de la estrategia número 2 En esta estrategia se ajusta constantemente el nivel de ayuda que proporciona el motor en relación a la potencia con que pedalea el usuario. El mayor inconveniente de esta estrategia es que el par realizado por el ciclista sobre los pedales no es constante, y en consecuencia, la ayuda que brinda el motor tampoco lo es, dando sensación de “tirones”. 7. Estrategias de control: Diseño y selección 100
7.1.3.Estrategia 3 La estrategia queda definida según el siguiente esquema: Figura 7.6: Esquema de la estrategia número 3 La estrategia número 3 es, en esencia, igual a la estrategia número 2, con la salvedad que la potencia realizada por el ciclista es filtrada para evitar la sensación de “tirones”. El mayor inconveniente de esta estrategia es la pérdida de precisión debida al filtro de pedaleo, que introduce error en el objetivo de relación entre el trabajo del ciclista y el trabajo realizado por el motor. 7.2.Estrategia seleccionada Después de valorar las diferentes estrategias diseñadas, se ha optado por implementar la estrategia número 3. Se ha seleccionado esta estrategia por la inmediatez con la que trata la consigna del motor. No se puede olvidar que este PFC tiene un objetivo comercial, y la sensación que produce al ciclista la respuesta de la bicicleta es importante. A falta de un estudio estadístico entre usuarios de bicicletas eléctricas, la estrategia 3 es, la que a mi parecer, resulta más agradable cuando se pedalea. 7.3.Implementación en Simulink Partiendo del modelo Simulink que se conecta vía can a la bicicleta, se ha implemenado la estrategia de control planteada. Emular el trabajo que debe realizar el controlador con el modelo Simulink permite desarrollar un prototipo de forma gráfica y relativamente rápida para poder testear y debugar la estrategia de control diseñada. Sistema de control y monitorización de datos de una bicicleta eléctrica 101
! Figura 7.7: Implementación del modelo de control en Simulink La fuerza ejercida por el ciclista sobre los pedales no es continua, y de hecho varía en cada fase de la pedalada. Es por ello que debe ser filtrada, para que la consigna de control que se envía al motor no se adapte continuamente a la fase de pedaleo en la que se encuentra el ciclista pues resultaría muy incomoda la conducción de la bicicleta. El filtro que se ha implementado en el lenguaje m de Matlab tiene el siguiente código: function [ out ] = filtroPedal( pedal ) global estado; global potPedal; global ultimoPotPedal; vsubida=10; vbajada=6; if (estado==0) %detectamos flancos de subida if (pedal > vsubida) %comenzamos una subida estado=1; end elseif (estado==1) %detectamos flancos de bajada if (pedal < vbajada) %acabamos una bajada estado=0; ultimoPotPedal=potPedal; potPedal=0; end end if (estado==1) potPedal=potPedal+(pedal*0.01); %integramos el valor end out=ultimoPotPedal; end El resultado de filtrar el par realizado por el ciclista puede observarse en el siguiente gráfico: 7. Estrategias de control: Diseño y selección 102
Figura 7.8: Resultado del filtrado del par realizado por el ciclista. El par filtrado es el resultado de contar con las dos piernas. Se ha decidido en favor de este filtrado porqué no introduce una pérdida en el trabajo realizado por el ciclista, cosa que haría errar la estrategia de control. 7.4.Implementación de la estrategia en el controlador de la bicicleta Una vez testeada la estrategia de control sobre el modelo Simulink, ésta, simplemente se debe programar en el lenguaje C30 para permitir que el controlador de la bicicleta la ejecute. Un extracto de las partes más importantes del código se muestran a continuación. Tratamiento del pedaleo del ciclista void tratamientoPedalPar(void){ ! !float relacionPedalMotor=0.0; !//calibramos el par !torqueCiclista=torque-2500; ! ! !if (torqueCiclista>0) torqueCiclista=0; !torqueCiclista=-torqueCiclista; !filtroPedal(); ! ! !potenciaCiclista=torqueFiltrado*((float)rpm_pedal*2*3.14/60.0); !potenciaMotor=(corrent_mA/1000)*36.0*((float)rendimiento)/100.0; ! !if (potenciaCiclista>0) { !! relacionPedalMotor=(potenciaMotor/potenciaCiclista)*100.0; //lo expresamos en tanto por ciento !! accPID=calcPID((3*consigna)-relacionPedalMotor); !! //saturamos el pid Sistema de control y monitorización de datos de una bicicleta eléctrica 103
!! if (accPID<0) accPID=1; !! if (accPID>150) accPID=150; !} ! ! !if (pedaleo.estado==PEDALEO_EN_MARCHA && pedaleo.sentido==FW && Simulink==0){ !! if (consigna_frenos==0){ !! ! scaBikeSpeed=25.0; !! ! scaCurrentLimit=((float)accPID)/10.0; //le damos la corriente calculada por el PID !! } else { //sin ayuda !! ! scaBikeSpeed=0.0; !! ! scaCurrentLimit=0.0; !! } !} else { //sin ayuda !! if (Simulink==0){ //modelo no conectado !! ! scaBikeSpeed=0.0; !! ! scaCurrentLimit=0.0; !! } !} } Filtrado del par void filtroPedal(void) { ! !int vsubida=10; !int vbajada=6; ! !int auxpedal = torqueCiclista*0.1; ! !if (auxestado==0){ //detectamos flancos de subida !! if (auxpedal > vsubida){ //comenzamos una subida !! ! auxestado=1; !! } !} !else if (auxestado==1){ //detectamos flancos de bajada !! if (auxpedal < vbajada){ //acabamos una bajada !! ! auxestado=0; !! ! torqueFiltrado=potPedal; !! ! potPedal=0; !! } !} ! !if (auxestado==1){ !! potPedal=potPedal+(auxpedal*0.001); //integramos el valor de par instantaneo !} } 7.5.Evaluación de la estrategia seleccionada Una vez seleccionada e implementada la estrategia de control, llega el momento de realizar las pruebas para comprobar su funcionamiento. Se han dividido los tests en dos partes: los realizados sobre el banco de pruebas y los que se han sido hechos circulando por la calle. 7.5.1.Evaluación en el banco de pruebas Para evaluar la implementación de la estrategia de control, se ha utilizado el banco de pruebas desarrollado y del modelo Simulink para la emulación del control de la bicicleta. Gracias a la galga incorporada en el rodillo se puede saber el trabajo realizado por el conjunto ciclista-motor. 7. Estrategias de control: Diseño y selección 104
Integrando la potencia del ciclista (obtenida gracias al pedalier Thun) se obtiene el trabajo realizado por éste. La diferencia entre el trabajo calculado en la galga del rodillo y el aportado por el ciclista es el trabajo realizado por el motor. Conocido el trabajo del ciclista y del motor se puede saber la relación que existe entre ellos y evaluar la estrategia de control. Figura 7.9: Potencia realizada por el ciclista (rojo) y potencia realizada por el motor (azul) Realizando la integral de la potencia se obtiene el trabajo. La consigna para el test de la figura 7.9 era del 20% de trabajo realizado por el ciclista y un 80% de trabajo realizado por el motor. El resultado de la estrategia de control es de un 19.45% de trabajo realizado por el ciclista y un 80.55% de trabajo realizado por el motor de la bicicleta. 7.5.2.Evaluación en el exterior El test ha consistido en realizar un recorrido por la calle de seis minutos aproximadamente de duración. Se han dado tres vueltas al siguiente circuito: Sistema de control y monitorización de datos de una bicicleta eléctrica 105
Figura 8.7: Diagrama de estados de las transacciones Modbus Las funciones modbus implementadas son las siguientes: Read Holding Registers (codigo de función: 03) Esta función se utiliza para leer el contenido de un bloque de registros consecutivos de un dispositivo remoto. Permite leer hasta 125 registros. Los datos se empaquetan utilizando 2 bytes por registro. 8. Monitorización 112
Figura 8.8: Datos de los paquetes read/response/error para función código 03 de Modbus Write Single Register (código de función: 06) Esta función permite escribir el valor de un único registro en un dispositivo remoto. El request PDU especifica la dirección del registro que debe ser escrito. Los registros son direccionados a partir del 0. La respuesta normal de esta función es un echo de la request, añadiendo al final de la PDU el valor del registro escrito. Figura 8.9: Datos de los paquetes read/response/error para función código 06 de Modbus Write Multiple registers (código de función: 16) Sistema de control y monitorización de datos de una bicicleta eléctrica 113
Esta función es utilizada para escribir un bloque contiguo de registros (hasta 123) en un dispositivo remoto. Los valores a ser escritos están especificados en el request. Los datos se empaquetan utilizando 2 bytes por registro. La respuesta normal de esta función, retorna el function code, la dirección de inicio y la cantidad de registros leídos. Figura 8.10: Datos de los paquetes read/response/error para función código 16 de Modbus El mapa de memoria implementado es el siguiente: Dirección R/W Variable Unidades Rango 0 R Motor Speed rpm/10 0...2000 1 R Pedal Speed rpm/10 -1200...1200 2 R Bike Speed (Km/h)/10 0...600 3 R Motor Temp dºC -10...40 4 R External Temp dºC Sin usar 5 R Battery Voltage dV 24...41 6 R Battery Current dA ʻ0...15 7 R/W Control Mode 0,1,2,3 8 R Accelerator dV ʻ0...5 8. Monitorización 114
Dirección R/W Variable Unidades Rango 9 R Left Brake 0,1 10 R Right Brake 0,1 11 R/W Dist. Traveled Dm 0...2^16-1 12 R Pedal Torque dNm -200...200 13 R Motor Torque dNm 0...25 8.1.3.Modbus sobre java Como se ha mencionado con anterioridad, las aplicaciones para Android, están desarrolladas en su mayoría utilizando el lenguaje de programación java. Se necesita pues, una forma de acceder al modbus serie desde la aplicación Java. Para conseguir este fin, se ha utilizado la librería Modbus4Java desarrollada en el departamento de ESAII por Xavier Gallego. Modbus4Java nos ofrece una interfaz para poder trabajar con modbus de una forma cómoda. Las funcionalidades implementadas se pueden observar en el siguiente extracto de código: !//Read Register --> Function Code, Starting @, Qty !public ModbusPacket newRequestReadRegisterPacket(short startingAddr, short quantity); !//Write Register --> Function Code, Register @, Value !public ModbusPacket newRequestWriteRegisterPacket(short register, short value); !public ModbusPacket newResponsePacket(byte[] data, int bytes); Modbus4Java nos permite crear paquetes modbus para los tres functions codes implementados en la electrónica ecoGate. La creación de la cabecera y del CRC del paquete, así como la validación del CRC de los paquetes recibidos es gestionada por esta librería. 8.2.Aplicación para teléfono Android Para cumplir el segundo gran objetivo de este PFC, la visualización de los datos de la bicicleta eléctrica, se tiene que conseguir un cliente Bluetooth que se conecte a un servidor y escuche por su servicio de puerto serie (SPP). Para gestionar toda la API de Android para la utilización del Bluetooth, se ha partido de base del ejemplo Bluetooth Chat, incluido en la documentación oficial de Android. Esta aplicación permite a dos dispositivos Android comunicarse mediante mensajes de texto enviados vía Bluetooth. Demuestra todas las capacidades fundamentales de la API Bluetooth de Android, tales como: •Búsqueda de otros dispositivos Bluetooth •Consulta al adaptador local de los dispositivos vinvulados. Sistema de control y monitorización de datos de una bicicleta eléctrica 115
•Establecimiento de los canales/sockets RFCOMM •Conexión a un dispositivo remoto •Transferencia de datos vía Blueetoth En este apartado, se muestran y comentan las diferentes funcionalidades implementadas, pero no se da el código programado. Se pueden ver las partes más importantes del código de la aplicación en el anexo 2. 8.2.1.Ciclo de vida de una aplicación Android El ciclo de vida de una aplicación en Android es manejado por el sistema operativo, basándose en las necesidades del usuario, los recursos disponibles, etc. Si se tiene una aplicación que está consumiendo muchos recursos y se arranca otra nueva, el sistema operativo probablemente le diga a la aplicación que se queda en segundo plano que libere todo lo que pueda, y si es necesario la cerrará. En Android los recursos son normalmente muy limitados y por eso el sistema operativo tiene más control sobre las aplicaciones que en programas de escritorio. En la mayoría de los casos, cada aplicación Android corre en su propio proceso de Linux. Este proceso es creado para la aplicación cuando se arrancama y seguirá corriendo hasta que no sea necesario y el sistema reclame recursos para otras aplicaciones y se los de a estas. Android puede en cualquier momento pausar, parar, destruir nuestra aplicación según las necesidades del momento. Las llamadas que nos permiten controlar el destino de nuestra aplicación durante su ciclo de vida son: •onCreate() Llamada cuando la actividad es creada por primera vez. Después de esta llamada siempre se llama al onStart(). •onRestart() Llamada cuando la actividad ha sido parada, antes de volver a ser ejecutada. Siempre viene después un onStart(). •onStart() Llamada cuando la actividad esta siendo visible por el usuario. Después de ésta, se puede ir al onResume() si la actividad va a ser visible o se puede ir al onStop() si se ejecuta en segundo plano. •onResume() Llamada cuando la actividad va a empezar a interactuar con el usuario. •onPause() LLamada cuando el sistema va a empezar una nueva actividad.. Después de esta llamada puede venir un onResume() si la actividad vuelve a primer plano o un onStop() si se hace invisible para el usuario. 8. Monitorización 116
•onStop() Llamada cuando la actividad ya no es visible al usuario, porque otra actividad ha pasado a primer plano. Desde aquí se puede ir al onRestart() si vuelve a primer plano o al onDestroy() si se destruye del todo. •onDestroy() Esta es la llamada final a la actividad, después de ésta, es totalmente destruida. Figura 8.12: Ciclo de vida de una aplicación Android. 8.2.2.Estructura de la aplicación La cantidad de datos a mostrar en la aplicación desarrollada, hacen que no quepan todos en una pantalla, o como mínimo no con el tamaño suficiente para ser leíbles. Para este caso se pueden utilizar varias soluciones, como por ejemplo el scroll, pero la solución que se ha utilizado en este proyecto es la creación de pestañas. Para crear pestañas en Android se necesita una clase TabActivity que será la encargada de crear todas las pestañas necesarias y una clase del tipo necesitado con su correspondiente layout(xml) por cada pestaña que se quiera introducir. Este sistema tiene muchas ventajas como pueden ser tener el código más dividido y limpio, que una pestaña pueda ser una lista y otra una simple Sistema de control y monitorización de datos de una bicicleta eléctrica 117
Activity, que cada pestaña(clase) tenga su propio menú, etc. Las pestañas que componen la aplicación son: •Speed: pestaña donde se presentan los datos correspondientes a la velocidad de la bicicleta, el pedal y el motor •Energy: muestra los datos referentes a la batería y al consumo de corriente del motor. Permite seleccionar el grado de ayuda que queremos del motor. •Map: mapa online de Google Maps con posicionamiento GPS •Summary: otros datos no recogidos en otras pantallas, como pueden ser el estado de los frenos, distancia recorrida, etc. Una descripción más detallada de las funcionalidades de éstas pantallas es dada en los siguientes subapartados. Tal y como se ha comentado, cada pestaña implementa una activity independiente. Para que el controlador de la tarea modbus pueda interactuar con cada pestaña e intercambiar los datos que se reciben por Bluetooth, cada activity hereda de una clase abstracta llamada EcoBikeActivity y es obligada a implementar el método update, que es donde el controlador de mobus se comunica para poder enviar los datos que se deberán mostrar por pantalla. 8.2.3.Conexión de un dispositivo Al iniciar la aplicación, ésta comprueba mediante el BluetoothAdapter, si el teléfono tiene activado el Bluetooth. Si está apagado, se pide permiso para activarlo y se enciende. Si no se concede el permiso la aplicación se cierra. El primero paso para poder visualizar los datos en la aplicación, es conectar con el Bluetooth de una bicicleta. Dentro del menú implementado, se encuentra la opción para conectar con un dispositivo. Se muestran por defecto los dispositivos que han sido vinculados con anterioridad al smartphone, así como también la posibilidad de iniciar una búsqueda de dispositivos y vincular nuevas electrónicas ecogate. 8. Monitorización 118
Figura 8.13: Conectar con un dispositivo. 8.2.4.Pestaña Speed En esta pantalla se muestran de forma gráfica los velocímetros que presentan los datos de las diferentes velocidades que se pueden medir en la bicicleta: velocidad de la bicicleta, velocidad del motor y cadencia de pedaleo. Figura 8.14: Pantalla speed. Sistema de control y monitorización de datos de una bicicleta eléctrica 119
La velocidad del motor y la cadencia de pedaleo son valores que calcula la electrónica ecocontrol de la bicicleta, y que por lo tanto solo se deben leer y mostrar. Por el contrario, la velocidad de la bicicleta no se calculaba por defecto en la bicicleta de serie, es por ello que a la bicicleta utilizada en este PFC se le ha instalado un sensor hall que lee los pasos de un imán instalado en la rueda trasera. Calculando el tiempo entre los flancos generados por el imán y sabiendo la circunferencia de la rueda se puede calcular la velocidad de la bicicleta. Figura 8.15: Sensor hall e imán instalados en la bicicleta para calcular su velocidad. 8.2.5.Pestaña Energy En esta pestaña, se muestra de forma gráfica mediante dos barras de nivel el voltaje de la batería (medido por la electrónica ecoGate) y el consumo de corriente en amperios del motor (medido por la electrónico ecoControl). También se nos permite en esta pantalla elegir el grado de ayuda que queremos que nos proporcione el motor. Más concretamente, este parámetro nos permite elegir la proporción de trabajo que realiza el motor respecto al trabajo que realiza el usuario pedaleando. Los diferentes valores que se permite seleccionar son: •Off: el motor no ayuda. •Eco: el trabajo realizado por el motor representa el 30% del total •Normal: el trabajo realizado por el motor representa el 60% del total •Full: el trabajo realizado por el motor representa el 90% del total 8. Monitorización 120
Figura 8.16: Pantalla Energy. 8.2.6.Pestaña Map En esta pestaña se muestra un mapa utilizando la API que proporciona Android para utilizar los mapas de Google Map. Si se activa la opción de localización mediante GPS, se dibuja una bicicleta en la posición donde se localiza el SmartPhone. Se da también la información sobre el error cometido por el GPS en la medida de la posición. Esta pantalla permite realizar zoom de forma multitáctil (con dos dedos), adaptando la proyección de la información del error cometido en la localización al nuevo nivel de zoom. Esta adaptación de la proyección, permite hacerse una idea visual y realista de la zona en la que puede encontrarse el usuario. Sistema de control y monitorización de datos de una bicicleta eléctrica 121
Figura 8.23: Representación gráfica de los datos grabados durante un experimento. Estas gráficas permiten la realización de zoom de forma multitáctil (dos dedos), así como la posibilidad de moverse en todo el dominio de los datos guardados. 8. Monitorización 128
Capítulo 9 Evaluación de Resultados 9. En este apartado se hace reflexión sobre las metas conseguidas al finalizar este PFC. Se tratan también las líneas de trabajo que hay que seguir para mejorar el sistema desarrollado y conseguir ampliar sus funcionalidades. 9.1.Metas conseguidas Con el sistema desarrollado se ha conseguido: •Crear un entorno de trabajo que permite trabajar de forma fácil con la bicicleta eléctrica, así como conectarla mediante el bus CAN a un modelo Simulink. •Se ha diseñado, implementado y testeado una estrategias de control del motor dependiente del par ejercido sobre los pedales por un usuario. •Mostrar de forma gráfica el trabajo realizado por el ciclista en comparación al aportado por el motor, utilizando un Smartphone. Se muestran también los datos más importantes relacionados con la odometría de la bicicleta. Se ha implementado este sistema también sobre tablets con Android 3.0, permitiendo además la grabación y posterior visualización de los datos. Considero entonces conseguidos los objetivos marcados al inicio del proyecto. 9.2.Ampliaciones/mejoras Hay varios aspectos en los que se podría seguir trabajando. Por ejemplo, solo se ha explorado una estrategia para el control del motor, y con el banco de pruebas desarrollado se podría experimentar fácilmente con nuevas posibilidades. La interfaz gráfica desarrollada para la aplicación Android es visualmente muy poco atractiva. Mejorar la apariencia, sobretodo si se pretende conseguir un producto comercial, debería ser una de las líneas de trabajo principales a seguir. Se podría completar la aplicación desarrollada, además, incorporando la grabación de los tracks proporcionados por el GPS, así como permitir la incorporación de tracks externos para poder realizar rutas mediante la navegación GPS. 129
Por último, se podría incorporar también la funcionalidad de pulsometro a la aplicación para tener todos los datos relativos al esfuerzo realizado por el ciclista. Para incorporar esta funcionalidad se debería utilizar una banda pulsómetro Bluetooth como por ejemplo las fabricadas por Polar o Zephyr. 9. Evaluación de resultados 130
Capítulo 10 Valorción Económica 10. Al realizar la valoración económica del proyecto se puede diferenciar entre dos tipos de recursos: materiales y humanos. 10.1.Recursos materiales Son los recursos hardware y software que se han utilizado y que se muestran en la siguiente tabla: Hardware Concepto Coste Electrónica ecocontrol €&70 Electrónica ecogate €&60 Electrónica 4pga €&50 Electrónica encoder €&20 Rodillo elite powermag €&1.200 ICD2 €&120 Motorola Xoom €&525 Total €"2.045 Software Concepto Coste ORCAD (estudiante) Gratuito MPLAB 8 Gratuito MPLAB X Gratuito Microchip C30 Gratuito Microsoft Office 2007 (estudiante) Gratuito 131
Concepto Coste Matlab 2008 (Estudiante) Gratuito 10.2.Recursos humanos Por lo que respecta al trabajo realizado en mi PFC, podemos diferenciarlo en distintas tareas. Estas tareas tienen un valor diferente dentro de un proyecto de ingeniería Los diferentes perfiles que pueden tomar parte son: •Analista: Encargado de realizar el estudio y diseño general. Toma decisiones que determinan el buen funcionamiento del sistema. •Programador: Se encarga de diseñar e implementar el software del sistema tal y como ha especificado el analista •Técnico: Se encarga de diseñar e implementar el hardware a desarrollar. En la siguiente tabla se puede ver el resumen de horas según cada tarea: Tarea Horas Coste Hora Coste Análisis y diseño software 100 €&35 3500 Implementación software 180 €&25 4500 Análisis y diseño hardware 240 €&35 4900 Implementación hardware 420 €&25 10500 Total 23400 10.3.Coste Total El coste total del proyecto es la suma de los diferentes coste descritos en las tablas anteriores: Recurso Coste (€) Materiales 2045 Humanos 23400 Total 25445 10. Valoración Económica 132
Capítulo 11 Planificación 11. Al inicio del proyecto se realizó una planificación temporal que ha sido modificada iterativamente a lo largo de todo el desarrollo de este. Esta planificación está separada en las siguientes tareas: •Estado del arte. •Integración del pedalier Thun. •Creación del banco de pruebas. •Modelo Simulink control banco de pruebas. •Implementación modbus. •Emulación estrategias de control en Simulink. •Implementación estrategias de control en la electronica de la bicicleta. •Test estrategias de control y correcciones. •Desarrollo de la aplicación Android. •Documentación. El diagrama de Gannt para la planificación ha sido el siguiente: 133
Durante todo el proyecto se ha ido cumpliendo de forma razonable con la planificación. Debido a una serie de problemas hardware, algunas tareas se ha retrasado una semana, acarreando retrasos también en el resto de tareas, sobre todo en la documentación. 11. Planificación 134
Bibliografía [1] Margaret Estivatel, Pierre Brisso. The Engineering of Sport 7, Volume 1. 2008 [2] Mateu Martín i Batlle, Francesc Roure i Fernández, Jesús Sanz i Rubies. Extensiometría. Maig 1992 [3] http://www.srm.de [4] http://www.cycleops.com/ [5] http://www.cyclepowermeters.com/ [6] http://www.amtriathlon.com/2010/09/look-keo-power-polar-p5.html [7] http://www.ergomousa.com [8] Thun. BB X-CELL RT datasheet [9] Texas Instrument. PGA309 datasheet [10] Texas Instrument. PGA309 userʼs manual [11] Texas Instrument. PGA [12] http://www.kalkhoffusa.com/pedal-assisted-bikes.php [13] http://www.microchip.com [14] Microchip. dsPIC30F family reference manual [15] Microchip. dsPIC30F4011 datasheet [16] Open Handset Alliance. http://developer.Android.com [17] http://www.wikipedia.org [18] Osram. sfh9240 datasheet [19] http://www.electricbikesales.co.uk/info/buyingguide/ [20] http://www.kalkhoffusa.com/pedal-assisted-bikes.php [21] http://imagenes.w3.racc.es/uploads/file/8364_PEDELECS_test_2010.pdf [22] http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=CELEX:32002L0024:ES:HTML 135
Agradecimientos Me gustaría dedicar este pequeño hueco en la memoria de este PFC para dar mi más sincero agradecimiento a todas aquellas personas que me han ayudado a llegar a escribir estas palabras. En primer lugar me gustaría dar las gracias a todos aquellos que comenzaron siendo compañeros de trabajo para acabar convirtiendose en amigos: Laure, Toni, Xisco, Miquel, Jose, Valentí, Dani, Atia i Guiem. Gracias por todos los momentos. Gracias a Joan Vidos por iniciarme en el mundo del diseño de PCBs. Gracias a mi director, Antonio B. Martínez por darme el privilegio de aprender en este entorno. Gracias a mis padres, José y Paqui, sin su soporte nada de esto hubiese sido posible. Gracias a mi mujer Raquel y a mi hija Ada por darme fuerzas y una sonrisa siempre que lo he necesitado. ¡Gracias a todos! 137
} private void setupApp() { Log.d(TAG, "setupApp()"); // Initialize the BluetoothService to perform bluetooth connections mBTService = new BluetoothService(this, mHandler); } @Override public synchronized void onPause() { super.onPause(); if(D) Log.d(TAG, "- ON PAUSE -"); } @Override public void onStop() { super.onStop(); if(D) Log.d(TAG, "-- ON STOP --"); } @Override public void onDestroy() { super.onDestroy(); if(D) Log.d(TAG, "--- ON DESTROY ---"); if (locManager!=null) locManager.removeUpdates(locListener); // Stop the Bluetooth Services if (mBTService != null) mBTService.stop(); } // The Handler that gets information back from the BluetoothService private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { ! case MESSAGE_STATE_CHANGE: ! if(D) Log.i(TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1); ! ! switch (msg.arg1) { !! case BluetoothService.STATE_CONNECTED: !! !//Set device title text !! mTitle.setText(R.string.title_connected_to); !! mTitle.append(" "); !! mTitle.append(mConnectedDeviceName); !! //TODO aixo s'hauria de canviar per tal que el ModbusControllerTask !! // tingues un handler que interactues amb el mBTService !! ModbusControllerTask.getInstance().setmBTService (mBTService); !! break; !! case BluetoothService.STATE_CONNECTING: !! mTitle.setText(R.string.title_connecting); !! break; !! case BluetoothService.STATE_LISTEN: !! case BluetoothService.STATE_NONE: !! mTitle.setText(R.string.title_not_connected); !! ModbusControllerTask.getInstance().stop(); !! break; ! } ! break; ! case MESSAGE_WRITE: ! !//Don't need message write for the moment ! !//Message_write is the message sended from APP to Accessory ! break; ! case MESSAGE_READ: ! byte[] readBuf = (byte[]) msg.obj; ! ! updateView(readBuf,(msg.arg1-5)/2); ! break; Anexo 2: Fragmentos de Código de las Aplicaciones Android 144
! case MESSAGE_DEVICE_NAME: ! // save the connected device's name ! mConnectedDeviceName = msg.getData().getString(DEVICE_NAME); ! Toast.makeText(getApplicationContext(), "Connected to " ! + mConnectedDeviceName, Toast.LENGTH_SHORT).show(); ! break; ! case MESSAGE_TOAST: ! Toast.makeText(getApplicationContext(), msg.getData().getString (TOAST), ! Toast.LENGTH_SHORT).show(); ! break; } } }; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data){! !switch (requestCode) { !! ! case REQUEST_CONNECT_DEVICE_INSECURE: !! ! ! if (resultCode == Activity.RESULT_OK) { ! connectDevice(data, false); ! } !! ! ! break; !! ! case REQUEST_ENABLE_BT: !! ! ! if(resultCode == Activity.RESULT_OK){ !! ! ! ! setupApp(); !! ! ! }else{ !! ! ! ! Log.e(TAG,"BT not enabled"); !! ! ! ! Toast.makeText(this, R.string.bt_not_enabled_leaving, Toast.LENGTH_SHORT).show(); !! ! ! ! finish(); !! ! ! } !! ! ! break; !! ! default: !! ! ! break; !! } } protected void updateView(byte[] readBuf, int registers) { short reg[] = new short[registers]; //Size of registers int i = 0; for(int j=0; j < registers; j++){ !short regVal = ByteUtils.byteArrayToShort(readBuf[i], readBuf[i+1]); !reg[j] = regVal; !i+=2; } if (!mTabSelected.equals("map")) { EcoBikeActivity activity = (EcoBikeActivity) getLocalActivityManager ().getActivity(mTabSelected); activity.update(reg, registers); } !} !private void connectDevice(Intent data, boolean secure) { // Get the device MAC address String address = data.getExtras() .getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS); // Get the BLuetoothDevice object BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); // Attempt to connect to the device mBTService.connect(device, secure); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.option_menu, menu); return true; } ! Sistema de control y monitorización de datos de una bicicleta eléctrica 145
!@Override !public boolean onPrepareOptionsMenu(Menu menu) { !! !! if (gps){ !! ! MenuItem gpsmenu =!menu.getItem(1); ! ! ! gpsmenu.setTitle(R.string.disablegps); !! } else { !! ! MenuItem gpsmenu =!menu.getItem(1); ! ! ! gpsmenu.setTitle(R.string.enablegps);! ! ! !! } !! return super.onPrepareOptionsMenu(menu); !} @Override !public boolean onOptionsItemSelected(MenuItem item) { !! Intent serverIntent = null; !! switch (item.getItemId()) { !! case R.id.connect_scan: !! ! // Launch the DeviceListActivity to see devices and do scan !! ! serverIntent = new Intent(this, DeviceListActivity.class); ! ! ! startActivityForResult(serverIntent, REQUEST_CONNECT_DEVICE_INSECURE); !! ! return true; !! case R.id.enable_gps: !! ! if(!gps){ !! ! ! gps=true; !! ! ! comenzarLocalizacion(); !! ! ! !! ! } else { !! ! ! gps=false; ! ! ! ! locManager.removeUpdates(locListener); !! ! } !! ! return true; !! } !! return false; !} private void comenzarLocalizacion() !{ !! Toast.makeText(getApplicationContext(), "Enable gps ", Toast.LENGTH_SHORT).show(); !! //Obtenemos una referencia al LocationManager !! locManager = ! ! ! ! (LocationManager)getSystemService(Context.LOCATION_SERVICE); !! //Obtenemos la ˙ltima posiciÛn conocida !! Location loc = ! ! ! ! locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); !! //Mostramos la ˙ltima posiciÛn conocida !! //mostrarPosicion(loc); !! //Nos registramos para recibir actualizaciones de la posiciÛn !! locListener = new LocationListener() { !! ! public void onLocationChanged(Location location) { !! ! ! //mostrarPosicion(location); !! ! ! if (mTabSelected.equals("map")) { ! ! ! ! ! Activity activity = (Activity) getLocalActivityManager ().getActivity("map"); ! ! ! ! ! ((Map_Activity) activity).mostrarPosicion(location); !! ! ! } !! ! } !! ! public void onProviderDisabled(String provider){ ! ! ! ! Toast.makeText(getApplicationContext(), "Provider OFF", Toast.LENGTH_SHORT).show();! !! ! } Anexo 2: Fragmentos de Código de las Aplicaciones Android 146
!! ! public void onProviderEnabled(String provider){ ! ! ! ! Toast.makeText(getApplicationContext(), "Provider ON", Toast.LENGTH_SHORT).show();! !! ! } !! ! public void onStatusChanged(String provider, int status, Bundle extras){ !! ! ! Log.i("", "Provider Status: " + status); ! ! ! ! Toast.makeText(getApplicationContext(), "Provider status: "+ status, Toast.LENGTH_SHORT).show();! !! ! } !! }; !! locManager.requestLocationUpdates( ! ! ! ! LocationManager.GPS_PROVIDER, 30000, 0, locListener); !} } Código ejemplo de una implementación de una EcobikeActivity: package com.ecobike.Android.app; import com.ecobike.Android.app.R; import Android.app.Activity; import Android.graphics.Color; import Android.os.Bundle; import Android.util.Log; import Android.view.View; import Android.widget.Button; import Android.widget.TextView; public class EnergyActivity extends EcoBikeActivity{ !private LevelBarView currentBar = null; !private LevelBarView batteryBar = null; ! !@Override !public void onCreate(Bundle savedInstanceState) { !! super.onCreate(savedInstanceState); !! setContentView(R.layout.energy_layout); !! !! View energy_layout = (View) findViewById(R.id.energy_lin_layout); !! energy_layout.setDrawingCacheBackgroundColor(Color.WHITE); !! !! currentBar = (LevelBarView) findViewById(R.id.levelBar_current); !! !! currentBar.setLevel(0); !! !! batteryBar = (LevelBarView) findViewById(R.id.levelBar_battery); !! !! batteryBar.setLevel(0); !} !@Override !public void update(short[] data, int reg) { !! double voltage = (double) ((double)data[5]/(double)10); !! int vPercent = (int) (voltage*100)/42; !! double current = (double) ((double)data[6]/(double)10); !! int cPercent = (int) (current*100)/15; !! !! TextView vText = (TextView) findViewById(R.id.txt_battery_num); !! TextView cText = (TextView) findViewById(R.id.txt_current_num); !! !! batteryBar.setLevel(vPercent); !! currentBar.setLevel(cPercent); !! vText.setText(voltage+" V"); !! cText.setText(current+" A"); !} Sistema de control y monitorización de datos de una bicicleta eléctrica 147
} Código del controlador modbus: package com.ecobike.Android.app; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import Android.util.Log; import com.upc.ecobike.Android.modbus.ModbusPacket; import com.upc.ecobike.Android.modbus.ModbusService; import com.upc.ecobike.Android.modbus.ModbusServiceImpl; import static java.util.concurrent.TimeUnit.*; public class ModbusControllerTask implements Runnable{ !private static final String TAG = "ModbusControllerTask"; !private static final boolean D = true; ! !private final int mInitDelay = 100; //Time in ms !private final int mPeriod = 100; //Time in ms ! !private static ModbusControllerTask instance = null; //Singleton instance !private BluetoothService mBTService = null; !private ModbusService mdbService = null; ! !private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool (1); !private ScheduledFuture mdbControllerTaskHandle = null; ! !private short mStartingAddr = 0x0000; !private short mQuantity = 7; !private ModbusPacket mdbPacket = null; ! !private ModbusControllerTask(){ !! mdbService = new ModbusServiceImpl(); !! mdbControllerTaskHandle = scheduler.scheduleAtFixedRate(this, mInitDelay, mPeriod, MILLISECONDS); !} ! !private synchronized static void createInstance() { !! if (instance == null) instance = new ModbusControllerTask(); !} ! !public static ModbusControllerTask getInstance(){ !! if (instance == null) createInstance(); !! !! return instance; !} ! !public void run() { !! mdbPacket = mdbService.newRequestReadRegisterPacket(mStartingAddr, mQuantity); !! !! this.sendModbusPacket(mdbPacket); !} ! !public short getmStartingAddr() { !! return mStartingAddr; !} !public void setmStartingAddr(short mStartingAddr) { !! this.mStartingAddr = mStartingAddr; !} !public short getmQuantity() { !! return mQuantity; Anexo 2: Fragmentos de Código de las Aplicaciones Android 148
!} !public void setmQuantity(short mQuantity) { !! this.mQuantity = mQuantity; !} !/** ! * Stop modbus controller task using future task created on start ! * method. ! */ !public boolean stop(){ !! if(mdbControllerTaskHandle == null) return false; !! !! mdbControllerTaskHandle.cancel(true); !! mBTService = null; !! return true; !} ! !/** * Send a modbus packet. * @param message The modbus packet that you want to send */ private void sendModbusPacket(ModbusPacket mdbPacket) { // Check that there's actually something to send if (mdbPacket.length() > 0) { !if(D) Log.i(TAG, "Sending modbus packet: "+mdbPacket.toString()); ! ! // Get the message bytes and tell the BluetoothChatService to write !byte[] mdbPacketBytes = mdbPacket.toByteArray(); mBTService.write(mdbPacketBytes); } } !public BluetoothService getmBTService() { !! return mBTService; !} !public void setmBTService(BluetoothService mBTService) { !! this.mBTService = mBTService; !} } Código que implementa la capa para dibujar la posición de la bicicleta sobre el mapa: package com.ecobike.Android.app; import Android.content.Context; import Android.graphics.Bitmap; import Android.graphics.BitmapFactory; import Android.graphics.Canvas; import Android.graphics.Color; import Android.graphics.Paint; import Android.graphics.Point; import Android.widget.Toast; import com.google.Android.maps.GeoPoint; import com.google.Android.maps.MapView; import com.google.Android.maps.Overlay; import com.google.Android.maps.Projection; import Android.location.Location; public class OverlayMapa extends Overlay { ! !private Double latitud = 41.40*1E6; !private Double longitud = 5.99*1E6; Sistema de control y monitorización de datos de una bicicleta eléctrica 149
!private Float error = (float) 100; !//private int zoom=1; !int radio=0; ! !@Override !public void draw(Canvas canvas, MapView mapView, boolean shadow) !{ !! Projection projection = mapView.getProjection(); !! GeoPoint geoPoint = !! ! new GeoPoint(latitud.intValue(), longitud.intValue()); !! !! if (shadow == false) !! { !! ! Point centro = new Point(); ! ! ! projection.toPixels(geoPoint, centro); !! ! //Definimos el pincel de dibujo !! ! Paint p = new Paint(); !! ! p.setColor(Color.BLACK); !! ! !! ! !! ! canvas.drawText("GPS Accuracy: "+error+"m", 5, 20, p); !! ! if (radio<3) radio=0; ! ! ! Bitmap bm = BitmapFactory.decodeResource( ! ! ! ! ! mapView.getResources(), ! ! ! ! ! R.drawable.ic_bike); !! ! ! ! ! canvas.drawBitmap(bm, centro.x - bm.getWidth()/2, ! ! ! ! ! centro.y - bm.getHeight()/2, p); !! ! !! ! !! ! !! ! Paint innerCirclePaint; ! innerCirclePaint = new Paint(); ! innerCirclePaint.setARGB(120, 198, 226, 255); ! innerCirclePaint.setAntiAlias(true); // ! innerCirclePaint.setStyle(Paint.Style.FILL); ! canvas.drawCircle( centro.xbm.getWidth()/8, centro.ybm.getHeight()/8, radio*2, innerCirclePaint); ! ! innerCirclePaint.setARGB(255, 0, 0, 255); ! innerCirclePaint.setAntiAlias(true); // ! innerCirclePaint.setStyle(Paint.Style.STROKE); ! canvas.drawCircle( centro.xbm.getWidth()/8, centro.ybm.getHeight()/8, radio*2, innerCirclePaint); !! ! !! ! !! ! !! } !} ! !private int metersToRadius(float meters, MapView map, double latitude) { ! return (int) (map.getProjection().metersToEquatorPixels(meters) *Math.abs( (1/ Math.cos(Math.toRadians(latitude))))); // !} ! ! !public void setLocation (Location l){ !! latitud=l.getLatitude()*1E6; !! longitud=l.getLongitude()*1E6; !! error=l.getAccuracy(); !! !! !} ! !public void setZoom (MapView map){ !! radio=metersToRadius(error, map, latitud); !! Anexo 2: Fragmentos de Código de las Aplicaciones Android 150
!} } Tablet - Android 3.0 Ejemplo de programación de un fragment: package com.Android.upc.tablet; import Android.app.Fragment; import Android.os.Bundle; import Android.view.LayoutInflater; import Android.view.View; import Android.view.ViewGroup; import Android.widget.TextView; public class BatteryFragment extends Fragment { !private LevelBarView currentBar = null; !private LevelBarView batteryBar = null; ! !@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.battery, container, false); } ! !public void repintar(double v, double a) { !! int vPercent = (int) (v*100)/42; !! int cPercent = (int) (a*100)/15; !! !! !! TextView vText = (TextView) getActivity().findViewById (R.id.txt_battery_num); !! TextView cText = (TextView) getActivity().findViewById (R.id.txt_current_num); !! !! batteryBar.setLevel(vPercent); !! currentBar.setLevel(cPercent); !! vText.setText(v+" V"); !! cText.setText(a+" A"); !! !! !! !} ! !public void setCero() { !! currentBar = (LevelBarView) getActivity().findViewById (R.id.levelBar_current);! ! !! currentBar.setLevel(0);! ! !! batteryBar = (LevelBarView) getActivity().findViewById (R.id.levelBar_battery);! ! !! batteryBar.setLevel(0); !! !! TextView vText = (TextView) getActivity().findViewById (R.id.txt_battery_num); !! TextView cText = (TextView) getActivity().findViewById (R.id.txt_current_num); !! !! batteryBar.setLevel(0); !! currentBar.setLevel(0); !! vText.setText("0 V"); !! cText.setText("0 A"); !! !! !} } Sistema de control y monitorización de datos de una bicicleta eléctrica 151
Codigo de la activity para la visualización de gráficas: package com.Android.upc.tablet; import Android.os.Bundle; import Android.util.FloatMath; import Android.view.MotionEvent; import Android.view.View; import Android.view.View.OnTouchListener; import Android.widget.Button; import Android.widget.Toast; import Android.app.Activity; import Android.content.res.Configuration; import Android.drm.DrmStore.RightsStatus; import Android.graphics.Color; import Android.graphics.PointF; import Android.os.Bundle; import com.Androidplot.xy.SimpleXYSeries; import com.Androidplot.series.XYSeries; import com.Androidplot.xy.*; import java.text.DecimalFormat; import java.util.Arrays; import java.util.Timer; import java.util.TimerTask; public class BikeActivity extends EcoBikeActivity implements OnTouchListener{ !public static Number[] bikeSpeed; ! !public static Number[] pedalSpeed; !public static Number[] pedalTorque; !public static Number[] motorTorque; ! !private XYPlot bikeSpeedPlot; !private XYPlot pedalSpeedPlot; !private XYPlot pedalTorquePlot; !private XYPlot motorTorquePlot; !private PointF minXY; !private PointF maxXY; !private float absMinX; !private float absMaxX; !private float minNoError; !private float maxNoError; !private double minDif; !final private double difPadding = 0.1; !@Override !public void onCreate(Bundle savedInstanceState) !{ !! super.onCreate(savedInstanceState); !! setContentView(R.layout.bike); !! bikeSpeedPlot = (XYPlot) findViewById(R.id.bikespeedplot); !! bikeSpeedPlot.setOnTouchListener(this); !! pedalSpeedPlot = (XYPlot) findViewById(R.id.pedalspeedplot); !! pedalSpeedPlot.setOnTouchListener(this); !! pedalTorquePlot = (XYPlot) findViewById(R.id.pedaltorqueplot); !! pedalTorquePlot.setOnTouchListener(this); !! motorTorquePlot = (XYPlot) findViewById(R.id.motortorqueplot); !! motorTorquePlot.setOnTouchListener(this); !! layoutConfig(bikeSpeedPlot); !! layoutConfig(pedalSpeedPlot); !! layoutConfig(pedalTorquePlot); !! layoutConfig(motorTorquePlot); !! Anexo 2: Fragmentos de Código de las Aplicaciones Android 152
!! // Turn the above arrays into XYSeries: !! XYSeries bspeed = new SimpleXYSeries( ! ! ! ! Arrays.asList(bikeSpeed), // SimpleXYSeries takes a List so turn our array into a List ! ! ! ! SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, // Y_VALS_ONLY means use the element index as the x value !! ! ! "Bike Speed"); // Set the display title of the series !! XYSeries pspeed = new SimpleXYSeries(Arrays.asList (pedalSpeed),SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Pedal Speed"); !! XYSeries ptorque = new SimpleXYSeries(Arrays.asList (pedalTorque),SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Motor Torque"); !! XYSeries mtorque = new SimpleXYSeries(Arrays.asList (motorTorque),SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Pedal Torque"); !! // Create a formatter to use for drawing a series using LineAndPointRenderer: !! LineAndPointFormatter leftFormat = new LineAndPointFormatter( !! ! ! Color.rgb(255, 0, 0), // line color !! ! ! Color.rgb(128, 0, 0), // point color !! ! ! null); ! ! ! ! ! ! ! ! // fill color (optional --> no el volem) !! LineAndPointFormatter rightFormat = new LineAndPointFormatter(Color.rgb(0, 191, 255),Color.rgb(0, 0, 128),null); !! !! // Add series1 to the xyplot: !! bikeSpeedPlot.addSeries(bspeed, leftFormat); !! !! pedalSpeedPlot.addSeries(pspeed, rightFormat); !! !! pedalTorquePlot.addSeries(ptorque, leftFormat); !! !! motorTorquePlot.addSeries(mtorque, rightFormat); !! //Enact all changes !! bikeSpeedPlot.redraw(); !! pedalSpeedPlot.redraw(); !! pedalTorquePlot.redraw(); !! motorTorquePlot.redraw(); !! trackBoundaries(bikeSpeedPlot, bspeed); !! trackBoundaries(pedalSpeedPlot, pspeed); !! trackBoundaries(pedalTorquePlot, ptorque); !! trackBoundaries(motorTorquePlot, mtorque); !! //Check x data to find the minimum difference between two neighboring domain values !! //Will use to prevent zooming further in than this distance !! double temp1 = bspeed.getX(0).doubleValue(); !! double temp2 = bspeed.getX(1).doubleValue(); !! double temp3; !! double thisDif; !! minDif = 1000000;!//increase if necessary for domain values !! for (int i = 2; i < bspeed.size(); i++) { ! ! ! temp3 = bspeed.getX(i).doubleValue(); ! ! ! thisDif = Math.abs(temp1 - temp3); !! ! if (thisDif < minDif) !! ! ! minDif = thisDif; !! ! temp1 = temp2; !! ! temp2 = temp3; !! } !! minDif = minDif + difPadding; //with padding, the minimum difference !! //Toast.makeText(this, "girar", Toast.LENGTH_LONG).show(); !} ! ! !public void layoutConfig(XYPlot plot) { !! //Plot layout configurations --> Forces X !! plot.getGraphWidget().setTicksPerRangeLabel(1); !! plot.getGraphWidget().setTicksPerDomainLabel(1); Sistema de control y monitorización de datos de una bicicleta eléctrica 153