Universidad de Costa Rica Facultad de Ingeniería Escuela de Ingeniería Eléctrica IE – 0502 Proyecto Eléctrico Diseño e implementación de un cuadracóptero con sistema de control automático de estabilidad y comunicación inalámbrica de datos utilizando plataformas de hardware y software libre Por: Daniel Barrera Núñez Ciudad Universitaria Rodrigo Facio Julio del 2012 Diseño e implementación de un cuadracóptero con sistema de control automático de estabilidad y comunicación inalámbrica de datos utilizando plataformas de hardware y software libre Por: Daniel Barrera Núñez Sometido a la Escuela de Ingeniería Eléctrica de la Facultad de Ingeniería de la Universidad de Costa Rica como requisito parcial para optar por el grado de: BACHILLER EN INGENIERÍA ELÉCTRICA Aprobado por el Tribunal: _________________________________ Ing. Fabián Abarca Calderón Profesor Guía _________________________________ Ing. Fabián Garita Gonzales Ingeniero lector _________________________________ Dr. Lucky Lochi Yu Lo Profesor lector ii DEDICATORIA A mi familia y seres queridos, por el constante apoyo y ayuda brindada durante los años de mi carrera universitaria, sin la cual no hubiese podido lograr culminar esta etapa de manera exitosa. iii RECONOCIMIENTOS A mi profesor guía, el Ing. Fabián Abarca, por su apoyo y consejo a lo largo del desarrollo del proyecto. A mis profesores lectores, el Dr Lochi Yu, y el Ing. Fabián Garita. A mi padre, Edmundo Barrera, por el gran interés y ayuda que fueron fundamentales en la construcción del primer prototipo del cuadracóptero. iv ÍNDICE GENERAL 1. CAPÍTULO 1: INTRODUCCIÓN ....................................................... 1 1.1 Objetivos ................................................................................................. 3 1.1.1 Objetivo general .......................................................................................................... 3 1.1.2 Objetivos específicos .................................................................................................. 3 1.2 Metodología ............................................................................................ 4 2 CAPÍTULO II: DESARROLLO TEÓRICO ...................................... 5 2.1 Aerodinámica ......................................................................................... 5 2.2 Vehículos Aéreos No Tripulados .......................................................... 7 2.2.1 Introducción ................................................................................................................ 7 2.2.2 El Cuadracóptero ........................................................................................................ 8 2.3 Plataforma de Prototipos Electrónicos: Arduino ............................. 16 2.3.1 Breve Introducción a Arduino .................................................................................. 16 2.3.2 Hardware del Arduino Uno....................................................................................... 17 2.3.3 Programación ............................................................................................................ 21 2.4 Sensores ................................................................................................. 22 2.4.1 Giroscopio ................................................................................................................. 24 v 2.4.2 Acelerómetro ............................................................................................................ 27 2.4.3 Sensor Ultrasónico de Proximidad ........................................................................... 29 2.5 Actuadores ............................................................................................ 32 2.5.1 Motores DC sin escobillas ........................................................................................ 32 2.5.2 Controles electrónicos de Velocidad (ESC´s) .......................................................... 35 2.6 Comunicaciones Inalámbricas ............................................................ 37 2.6.1 Comunicación Serial ................................................................................................. 37 2.6.2 Protocolo Bluetooth .................................................................................................. 38 2.7 Procesamiento de Señales.................................................................... 40 2.7.1 Introducción .............................................................................................................. 40 2.7.2 Manipulación de los datos de los sensores (IMU) .................................................... 41 2.7.3 Media Móvil ............................................................................................................. 41 2.8 Control Automático ............................................................................. 44 2.8.1 Controlador PID ........................................................................................................ 44 2.9 Fuente de Poder ................................................................................... 46 2.9.1 Batería de Polímero de Ion de Litio (LiPo) .............................................................. 46 3. CAPÍTULO III: DESARROLLO E IMPLEMENTACIÓN DEL UAV 47 3.1 Diagramas de Bloques del Cuadracóptero ........................................ 47 vi 3.2 Experimentos ........................................................................................ 52 3.2.1 Validación del módulo Bluetooth ............................................................................. 52 3.2.2 Validación de los controles electrónicos de velocidad (ESC) .................................. 54 3.2.3 Validación de la Unidad de Medición Inercial (IMU) ............................................. 55 3.2.4 Validación del Transductor Ultrasónico de Proximidad........................................... 59 3.2.5 Validación del sistema de control automático. ......................................................... 60 3.3 Lista de Componentes Utilizados ....................................................... 64 4. CAPÍTULO 4: CONCLUSIONES Y RECOMENDACIONES ...... 67 4.1 Conclusiones ......................................................................................... 67 4.2 Recomendaciones ................................................................................. 70 4.3 Trabajo Futuro .................................................................................... 71 BIBLIOGRAFÍA ............................................................................................ 72 APÉNDICES ................................................................................................... 76 Apéndice 1. Sketch de validación del módulo bluetooth. ........................... 76 Apéndice 2. Código completo de programación del cuadracóptero ......... 78 vii ÍNDICE DE FIGURAS Figura 1. Ángulo de ataque de un ala [30] .............................................................................. 6 Figura 2. Modelo tridimensional de un cuadracóptero ........................................................... 8 Figura 3. Diagrama rotación de cuadracóptero alrededor del eje Z [9]. ............................... 12 Figura 4. Diagrama rotación de cuadracóptero alrededor del eje X [9]................................ 13 Figura 5. Diagrama rotación de cuadracóptero alrededor del eje Y [9]................................ 13 Figura 6. Diagrama traslación de cuadracóptero a lo largo del eje Z [9]. ............................ 15 Figura 7. Parte superior de Arduino Uno [http://arduino.cc/en/Main/ArduinoBoardUno] .. 17 Figura 8. Entorno de programación de Arduino (programa de ejemplo). ............................ 22 Figura 9. Respuesta de Ganancia y Fase del Filtro del IDG-500 ......................................... 25 Figura 10. Diagrama de bloques de acelerómetro ADXL335. Hoja de Especificaciones .... 28 Figura 11. Diagrama de Operación de Sensor Ultrasónico de Proximidad. Fuente: Google Images. .................................................................................................................................. 30 Figura 12. Sensor Ultrasónico de Proximidad (HC-SR04). Fuente: Manual de Fabricante. 30 Figura 13. Representación gráfica de funcionamiento de sensor ultrasónico de proximidad. .............................................................................................................................................. 32 Figura 14. Representación de Motor DC sin Escobillas ....................................................... 35 Figura 15. Principio de funcionamiento de motores sin escobillas [6] ................................. 37 Figura 16. Ilustración Media Móvil ...................................................................................... 42 Figura 17. Gráfico Ilustrativo de Media Móvil..................................................................... 43 viii Figura 18. Diagrama de bloques de controlador PID Paralelo ............................................. 46 Figura 19. Diagrama de Bloques de Controlador PID .......................................................... 47 Figura 20. Cuadracóptero en configuración "x" ................................................................... 48 Figura 21. Cuadracóptero en configuración "+". .................................................................. 48 Figura 22. Diagrama de bloques funcionales para cada motor ............................................. 50 Figura 23. Lazo de ejecución y realimentación del cuadracóptero. ...................................... 50 Figura 24. Diagrama de método de validación de módulo bluetooth en conjunto con Arduino. ................................................................................................................................ 53 Figura 25. Captura de Monitor Serial de Aplicación de Programación de Arduino. ........... 53 Figura 26. Comparación entre señal original y señal filtrada de uno de los acelerómetros. 57 Figura 27. Prueba para observar el desfase entre la señal filtrada y la original, con los motores apagados. ................................................................................................................. 57 Figura 28. Prueba realizada para observar la inmunidad del sistema ante señales no deseadas. ............................................................................................................................... 58 Figura 29. Experimento para la obtención de los parámetro de PID de inclinación Eje X .. 61 Figura 30. Modelo tridimensional del primer prototipo del cuadracóptero. ......................... 65 Figura 31. Modelo Real del Primer Prototipo del Cuadracóptero. ....................................... 65 Figura 32. Modelo Real del Primer Prototipo del Cuadracóptero. ....................................... 66 Figura 33. Parte inferior del primer prototipo del cuadracóptero. ........................................ 66 ix ÍNDICE DE TABLAS Tabla 1. Cronograma tentativo del desarrollo del dispositivo. ............................................... 4 Tabla 2. Especificaciones Técnicas del Arduino Uno .......................................................... 18 Tabla 3. Salidas analógicas del IDG-500.............................................................................. 26 Tabla 4. Especificaciones de Acelerómetro ADXL335........................................................ 29 Tabla 5. Tabla de asignación de pines de Arduino ............................................................... 51 Tabla 6. Lista de Componentes y Costos del Cuadracóptero ............................................... 64 x NOMENCLATURA ESC: Controlador Electrónico de Velocidad (Del inglés Electronic Speed Controller) IEEE: Instituto de Ingenieros Eléctricos y Electrónicos. IMU: Unidad de Medición Inercial. MEMS: Sistemas micro-electro-mecánicos (Micro Electro-Mechanical Systems.) UAV: Vehículo Aéreo No Tripulado (Del inglés Unmanned Air Vehicle). PWM: Modulación por ancho de pulso (del inglés Pulse Width Modulation). SPI: Interfaz Serial de Periféricos (Del inglés “Serial Peripheral Interface”). xi RESUMEN El presente trabajo constituye un proyecto de investigación y desarrollo de un vehículo aéreo no tripulado con control de estabilidad autónomo, específicamente un cuadracóptero. La finalidad del proyecto fue tener la oportunidad de poder ahondar más en determinados conocimientos obtenidos a los largo de la carrera de ingeniería eléctrica, y ponerlos en práctica mediante el desarrollo de un proyecto multidisciplinario. Para lograr esto, se realizó una investigación previa de los componentes requeridos y conceptos necesarios para el proceso de desarrollo del cuadracóptero. Se logró realizar un primer prototipo de un cuadracóptero con control automático de estabilidad y altitud con comunicación inalámbrica vía bluetooth con un teléfono inteligente que servía de control remoto para el usuario. Todos los bloques funcionales del cuadracóptero fueron validados previamente a ser integrados al sistema. Este desarrollo se realizó utilizando hardware y software libre, y componentes de fácil acceso al público. Se logró obtener un primer prototipo capaz de volar pequeñas distancias, sin embargo, a la hora de concluir el proyecto se determinó que requería de algoritmos más robustos y un mejor microcontrolador para poder implementarlos. Esto con la finalidad de lograr obtener una mayor robustez y seguridad a la hora de volar el vehículo en ambientes con obstáculos. xii 1. CAPÍTULO 1: Introducción La conceptualización y creación de máquinas que tengan la capacidad de operar de manera autónoma data desde la era clásica. Sin embargo, no fue sino hasta el siglo XIX, junto con el surgimiento y auge de la revolución industrial, que se empezaron a vislumbrar las primeras máquinas relevantes de automatización de tareas. A partir de ese momento, éste se convirtió en un campo de estudio en constante desarrollo, el cual, a partir de mediados del siglo XX, empezó a crecer de manera exponencial, impulsado principalmente por los grandes avances que se estaban dando en el área de la electrónica. El área de la aeronáutica actualmente constituye una de las ramas con más presencia dentro del campo de la robótica, en especial con el surgimiento de UAVs (Unmanned Aerial Vehicles) desarrollados para una gran diversidad de tareas, que van desde aplicaciones militares, hasta equipos de investigación científica. Esta constituye el área que se pretende explorar con el avance del proyecto. Para el desarrollo del presente proyecto, se pretende elaborar un vehículo aéreo de vuelo autónomo (UAV), y para ello se buscó una plataforma versátil y de construcción sencilla. Tras realizar una investigación previa, se eligió tomar como modelo base un quad-rotor, o también conocido como cuadracóptero, el cual consiste, como se pude intuir de su nombre, en una plataforma con cuatro rotores ubicados en los extremos de los ejes de simetría de su chasis. Esta plataforma presenta varias ventajas en cuanto a su maniobrabilidad y la poca 1 cantidad de componentes mecánicos requeridos para su elaboración (lo cual muchas veces representa el verdadero reto de los proyectos de esta índole). Para su construcción se pretende hacer uso de hardware “open source” (Arduino) para el sistema de control principal y de comunicaciones del dispositivo, y de componentes electrónicos y mecánicos de fácil acceso al consumidor para el resto de la plataforma. Dentro de las principales razones por las cuales se toma la decisión de abordar un proyecto de este índole, es por la gran cantidad de tópicos que se encuentran involucrados en el desarrollo de un prototipo de esta categoría, y dado que este proyecto se encuentra ligado a la finalización del grado académico, permite la oportunidad de aplicar y demostrar una gran cantidad de conocimientos que se han adquirido a través de la carrera. Entre las áreas de estudio que se pretenden aplicar se pueden mencionar: microcontroladores, programación, sistemas de control automático, sistemas de comunicación, análisis de sistemas, máquinas eléctricas, electrónica analógica, circuitos digitales… y ¡hasta un poco de mecánica! 2 1.1 Objetivos 1.1.1 Objetivo general Diseñar e implementar un vehículo aéreo no tripulado (Cuadracóptero) con sistemas de control automático de estabilidad y comunicación inalámbrica mediante el uso de plataformas de hardware y software libres. 1.1.2 Objetivos específicos 1.1.2.1 Implementar un sistema eficiente de control de potencia para el manejo de motores DC para el cuadracóptero. 1.1.2.2 Diseñar e implementar un módulo de sensado de posición y movimiento, haciendo uso de sensores de aceleración y giroscopios. 1.1.2.3 Implementar un sistema de comunicación inalámbrica mediante el uso de módulo Bluetooth. un 1.1.2.4 Implementar un módulo de procesamiento y control principal para unificar e interlazar los módulos de sensado, comunicación y potencia utilizando un microcontrolador ATmega 328 en conjunto con una plataforma Arduino. 3 1.2 Metodología La metodología que se implementó para el desarrollo del proyecto fue una extensa investigación de los componentes necesarios (tanto físicos como teóricos) para realizar el desarrollo del sistema de manera exitosa. Además, cada uno de los sistemas estudiados, fueron implementados y validados de manera individual, para luego ser unificados en el sistema final (cuadracóptero). Esto requirió de una extensa investigación y experimentación para poder llegar a obtener el comportamiento esperado de cada uno de los subsistemas. El cronograma original del proyecto a desarrollar fue evolucionando con el transcurso del tiempo, sin embargo, a continuación se muestra el cronograma tentativo para el desarrollo que se llevó a cabo: Tabla 1. Cronograma tentativo del desarrollo del dispositivo. 4 2 CAPÍTULO II: Desarrollo Teórico En el desarrollo del capítulo II, se sintetizarán los temas de mayor importancia para el desarrollo y entendimiento de los conceptos necesarios para la implementación del prototipo del cuadracóptero. Estos temas se tratarán de exponer de una manera sencilla para que sea apto para lectores con o sin mayor conocimiento técnico del tema. 2.1 Aerodinámica Con la finalidad de ir desarrollando los temas en un orden estructurado, se iniciará con una breve sección de aerodinámica, la cual a grandes rasgos, constituye la base que permite entender el comportamiento y la forma de operar del cuadracóptero. En este apartado se explicarán brevemente los conceptos aerodinámicos de mayor relevancia para crear la base teórica que permita un mejor entendimiento y desarrollo del proyecto. Uno de los conceptos fundamentales que surge cuando se empieza a estudiar el campo de la aerodinámica es el de la fuerza de sustentación. La fuerza de sustentación se define como la fuerza perpendicular al flujo de un fluido (en nuestro caso el aire) que se crea cuando el fluido pasa por la superficie de un objeto. El paso del fluido por la superficie del objeto crea una fuerza con varios componentes, pero la fuerza de sustentación es solamente la componente vertical al vector de dirección del fluido. Dentro de los otros componentes de esta fuerza creada por el paso del fluido, también se encuentra la fuerza de arrastre, la cual 5 también juega un papel muy importante en la dinámica de operación de los vehículos aéreos. En el caso de los vehículos que poseen aspas adheridas a rotores, ésta fuerza es la encargada de crear un par rotacional en el vehículo cuya dirección va en contra del sentido de giro de las aspas. Por esta razón es que los helicópteros convencionales poseen rotores de cola que compensan este par rotacional y evita que giren sin control alrededor del eje de rotación del rotor principal. El ángulo de ataque de un ala se encuentra definido como el ángulo que forma la cuerda geométrica de un perfil alar con la dirección del aire que incide sobre el ala. Este parámetro juega un papel muy importante en la generación de la fuerza de sustentación y la fuerza de arrastre de una hélice. Para un mejor entendimiento de este concepto se puede observar la figura a continuación. Figura 1. Ángulo de ataque de un ala [30] La correcta elección del ángulo de ataque de las hélices es de suma importancia para obtener los parámetros de fuerza de sustentación y de arrastre que son requeridos. 6 2.2 Vehículos Aéreos No Tripulados 2.2.1 Introducción Los vehículos aéreos no tripulados (popularmente conocidos como UAVs por sus siglas en inglés), son vehículos aéreos que están diseñados para poder volar sin necesidad de un piloto humano a bordo. El vuelo de estas máquinas, normalmente se encuentra controlado por un piloto humano que se encuentra en un centro de mando en tierra, desde donde puede transmitirle las instrucciones de vuelo de manera remota, o también, éstas máquinas pueden ser controladas de manera autónoma por un controlador o computador que se encuentre programado para tal fin. Dentro de la gama de vehículos aéreos no tripulados, se puede encontrar una gran escala de tamaños , configuraciones y formas (vehículos de ala fija, vehículos multirotores, etc), los cuales inicialmente fueron surgiendo como plataformas controladas remotamente por un piloto, pero que en los últimos años, gracias a los grandes avances de la tecnología en el campo de la computación, la electrónica y comunicaciones, han migrando poco a poco al sector de vehículos autónomos. Los cuadracópteros entran dentro de esta categoría de vehículos aéreos no tripulados, y dependiendo de las características de cada uno, éstos se pueden construir como vehículos totalmente autónomos, o como vehículos controlados remotamente por un ser humano. 7 2.2.2 El Cuadracóptero El cuadracóptero (también conocido como quadrotor o quadcopter) representa una plataforma muy versátil y de creciente popularidad que se encuentra dentro de la categoría de vehículos aéreos no tripulados (UAVs). Este tipo de vehículo aéreo multirotor se encuentra formado (como su nombre lo dice) por cuatro rotores, los cuales normalmente se encuentran dispuestos simétricamente a en los extremos del bastidor del vehículo (el cual es en forma de X). A diferencia de los helicópteros convencionales, la mayoría de los cuadracópteros poseen hélices con aspas fijas, en contraste con los helicópteros convencionales, cuyas aspas tienen la capacidad de cambiar su ángulo de ataque. Un modelo tridimensional general de un cuadracóptero se puede observar en la figura a continuación: Figura 2. Modelo tridimensional de un cuadracóptero 8 Dinámica de Movimiento La dinámica del movimiento de los cuadracópteros se puede resumir en 3 tipos distintos de movimientos básicos, los cuales se pueden ejecutar por sí solos o en conjunto para lograr el tipo de movimiento específico que el controlador del vehículo desee. Estos tipos de movimientos son los siguientes: Rotación alrededor del Eje Z Para la ilustración de este movimiento, primero se procede con la definición del eje “z” del vehículo. Este eje imaginario, se encuentra en el centro del bastidor de la máquina, (el centro de la equis formada por la estructura del vehículo), y es perpendicular al plano formado por la misma estructura del vehículo. Como se mencionó anteriormente, la rotación de las aspas crean un torque que tratan de girar el vehículo alrededor del eje de giro de las aspas. En los helicópteros convencionales, este problema se corrige mediante un rotor en su cola que genere una fuerza tangente al radio de giro del rotor principal, la cual sea suficiente para crear un par opuesto que contrarreste el efecto del par generado por el rotor principal. En un cuadracóptero no se cuenta con rotores de cola (ni colas en sí), de modo que este problema se soluciona de una manera distinta (la cual resulta muy ingeniosa). Como se 9 sabe, los cuadracópteros poseen un número par de rotores, por lo tanto se puede tener dos rotores girando en un sentido, y dos rotores girando en otro sentido. De esta manera, al manipular la velocidad de rotación de los distintos motores se puede llegar a un punto de operación donde el par rotacional neto del vehículo sea igual a cero. Según lo expuesto en [5], se puede concluir que tanto la fuerza de sustentación como la fuerza de arrastre son funciones que dependen del cuadrado de la velocidad angular. A continuación se muestran las ecuaciones de dichas fuerzas: Ecuación 2.1 Ecuación 2.2 Donde son parámetros propios del fluido (aire) y del tipo de hélices y corresponde a la velocidad angular de rotación de los motores. Por lo tanto, si se mantienen constantes el tipo de fluido donde se está volando, y el tipo de hélices que se están utilizando, la única variable que queda es la velocidad angular. Por esta razón, el par rotacional creado por la propela de cada motor puede ser conocido y modificado de acuerdo a las necesidades de vuelo del vehículo. 10 Ahora, como lo que se trata de controlar es la rotación alrededor del eje z del cuadracóptero, basta con igualar los pares rotacionales creados por los motores que giran en contra de las manecillas del reloj, y los pares rotacionales creados por los motores que giran a favor de las manecillas del reloj (en caso de que se quiera que el cuadracóptero no gire alrededor del eje z). Esto lo logramos controlando las velocidades netas de cada uno de los sentidos de giro (partiendo del hecho que las hélices sean simétricas y con las mismas características constructivas). Sean y las velocidades angulares de los motores girando a favor de las manecillas del reloj y y las velocidades angulares de los motores girando en contra de las manecillas del reloj, se pueden obtener 3 casos: Si + + , se obtiene un comportamiento del vehículo en donde no hay rotación alrededor del Eje Z. Si + + , se obtiene un comportamiento del vehículo en donde hay una rotación alrededor del Eje Z y en contra de las manecillas del reloj. Si + + , se obtiene un comportamiento del vehículo en donde hay una rotación alrededor del Eje Z y a favor de las manecillas del reloj. A continuación se encuentra un diagrama de la configuración de los motores en el cuadracóptero para visualizar de una mejor manera lo explicado anteriormente. 11 Figura 3. Diagrama rotación de cuadracóptero alrededor del eje Z [9]. Rotación alrededor del Eje X o el Eje Y La dinámica de ambas rotaciones es la misma. Lo que cambia es alrededor de cual eje se quiera girar. Para realizar esta rotación lo que se realiza es disminuir/aumentar la velocidad de rotación de uno de los motores y realizar la acción inversa en el motor que se encuentre al lado opuesto del eje. Cabe resaltar que la velocidad neta (ya sea en contra o a favor de reloj) de los motores debe permanecer constante en caso de que no se quiera que el cuadracóptero rote inesperadamente alrededor del su eje Z). A continuación se puede observar la figura que ilustra el caso anterior para que se visualice de una manera más sencilla. 12 Figura 4. Diagrama rotación de cuadracóptero alrededor del eje X [9]. De este modo, si lo que se quiere modificar es el ángulo de rotación permanecerán constantes, mientras que y , entonces y cambiarán su valor dependiendo si el desplazamiento angular es positivo o negativo. Cabe resaltar que si se realiza un cambio de en , entonces debe realizarse al mismo tiempo un cambio de en para mantener la velocidad neta de rotación a favor de las manecillas del reloj constante. La dinámica resulta la misma para el caso análogo de la rotación alrededor del eje Y. Figura 5. Diagrama rotación de cuadracóptero alrededor del eje Y [9]. 13 Una consecuencia de provocar una rotación alrededor de alguno de los ejes X o Y, es que se va a obtener un desplazamiento traslacional en caso de que el cuadracóptero ya se encuentre en vuelo, el cual va a ser correspondiente al tipo de inclinación que tenga el cuadracóptero. Por ejemplo, si el cuadracóptero rota alrededor del eje X, se va a obtener una traslación a lo largo del eje Y, y si el cuadracóptero rota alrededor del eje Y, se va a obtener una traslación a lo largo del eje X. Cabe resaltar que también se puede obtener una rotación simultánea en ambos ejes, lo cual va a provocar una traslación análoga a esa rotación. Control de Altitud El control de altitud resulta de una manera muy intuitiva. Se parte de que la altitud se asocia con el desplazamiento del cuadracóptero a lo largo su eje Z (el cual no necesariamente se encuentra perpendicular al suelo). Para realizar el control de altitud, basta con aumentar o disminuir de manera equivalente las velocidades de los cuatro motores del cuadracóptero. Si se quiere ganar altitud, se procede a aumentar la velocidad de todos los motores en un factor equivalente a la rapidez con la que se quiere lograr este cambio de altitud, y de manera análoga para disminuirla. 14 A continuación se encuentra el esquema que ilustra el proceso descrito: Figura 6. Diagrama traslación de cuadracóptero a lo largo del eje Z [9]. Resulta fácil llegar a la conclusión de que con una determinada combinación de cualquiera de los tres tipos de movimientos descritos anteriormente se puede obtener un control total sobre la trayectoria y postura del cuadracóptero en un determinado momento. El control de movimiento del cuadracóptero se basa en un principio de superposición, en donde la velocidad final de cada uno de los motores va a ser la suma dinámica de cada uno de las velocidades necesarias para lograr cada uno de los tres tipos de movimiento que se estén ejecutando en determinado momento. 15 2.3 Plataforma de Prototipos Electrónicos: Arduino Arduino ha surgido en los últimos años como una plataforma de creación de prototipos electrónicos muy revolucionaria, la cual ha desarrollado de gran manera el campo del movimiento de “Hágalo usted mismo” (Do It Yourself). Esto se debido a su gran facilidad, versatilidad y flexibilidad de uso tanto de su hardware como de su software, la cual requiere poca experiencia y conocimiento del tema para iniciar con el desarrollo de prototipos. 2.3.1 Breve Introducción a Arduino Arduino nace como una plataforma que puede percibir su entorno mediante una gran gama de sensores, y puede afectar sus alrededores controlando motores, luces y otra gran variedad de actuadores. El microcontrolador de sus tarjetas es programado mediante el lenguaje de programación propio de Arduino (basado en el lenguaje de programación “Processing”, y muy similar a C), y el entorno de desarrollo de Arduino (basado en el entorno desarrollado para la plataforma de prototipado “Wiring”). Los proyectos realizados con Arduino pueden ser utilizados de manera independiente, o pueden comunicarse con software que se encuentre corriendo en otro computador. La familia de Arduino cuenta con una gran variedad de integrantes (tipos de tarjetas distintas), cada una con su forma y características propias. Esto resulta muy práctico para seleccionar una que se adapte lo mejor posible a las características de cada proyecto. 16 2.3.2 Hardware del Arduino Uno Dado que para el presente proyecto se decidió utilizar el Arduino Uno, se va a profundizar un poco en sus características particulares. El Arduino Uno es uno de los integrantes de la familia de PCBs de Arduino, y es un microcontrolador basado en el ATmega328. Este microcontrolador posee 14 pines de entrada/salida digitales, de los cuales 6 se pueden utilizar como salidas PWM (señales de modulación por ancho de pulso). Además, posee 6 entradas analógicas, un oscilador de 16 MHz, un conector USB para comunicación con una PC, un conector de alimentación y un botón de reset. Figura 7. Parte superior de Arduino Uno [http://arduino.cc/en/Main/ArduinoBoardUno] 17 A continuación se presenta una tabla resumen con las principales características del Arduino Uno: Tabla 2. Especificaciones Técnicas del Arduino Uno Adicional a la tabla anterior, en la sección de la bibliografía se puede encontrar un link a la hoja de especificaciones del microcontrolador ATmega328 en caso de que se quiera profundizar más en las especificaciones técnicas. Fuente de Poder El Arduino Uno puede ser alimentado desde su conector USB o mediante una fuente de poder externa, como por ejemplo una batería. La fuente de poder es seleccionada de manera 18 automática por el dispositivo, y se puede acoplar al Arduino por medio de su conector de 2.1mm o mediante los pines de “Vin” y “GND”. La tensión de alimentación de la tarjeta puede variar entre 6 y 20 volts, sin embargo cuando la tensión es inferior a 7 volts, el regulador de 5 volts puede actuar de manera inestable y no suplir los 5 volts deseados (que se obtienen a través del pin de 5V). Además, cuando se usa una tensión de alimentación superior a 12 volts existe la posibilidad de que el regulador se sobrecargue y se dañe. Por las razones anteriores, la tensión de entrada recomendada para el Arduino es de 7 a 12 volts. Los pines de potencia de la tarjeta son los siguientes: Vin: Es el pin de entrada cuando se está utilizando una fuente de poder externa (no USB). La tensión recomendada en este pin es de 7 a 12 volts. Este pin se encuentra en paralelo con el conector de entrada de 2.1 mm. 5V: Es la salida del regulador de tensión de 5 volts de la tarjeta. 3.3V: Es la salida del regulador de 3.3 volts de la tarjeta utilizado para sensores y actuadores que requieran de esta tensión de alimentación especial. La corriente máxima que se puede entregar por medio de este canal es de 50 mA. GND: Es el pin de tierra. 19 Memoria El ATmega 328 posee 32 kB de memoria, de los cuales 0.5 kB son utilizados por el “bootloader” de la tarjeta. Además posee 2 kB de SRAM y 1 kB de EEPROM, los cuales pueden ser accesados o modificados mediante una de las librerías destinadas para tal fin. Entradas y Salidas El Arduino Uno posee 14 pines digitales, los cuales pueden ser utilizados como entradas o salidas. Estos pines trabajan a 5 volts, y pueden entregar un máximo de 40 mA. Además, ciertos pines tienen funciones especializadas, las cuales se mencionan a continuación: Pines Seriales: 0 (RX) y 1 (TX). Son utilizados para recibir y transmitir datos seriales TTL. Estos pines están conectados a los pines correspondientes del chip serial USB-TTL ATmega8U2. Pines de Interrupción: 2 y 3. Estos pines se pueden configurar para provocar una interrupción en la ejecución del programa. Pines de PWM: 3,5,6,9,10 y 11. Proveen una salida PWM de 8 bits de resolución mediante la función analogWrite(). Pines de comunicación SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Estos pines son utilizados para realizar conexión de dispositivos mediante protocolo SPI utilizando la librería destinada para tal fin. 20 El Arduino Uno también posee 6 entradas analógicas con un convertidor analógico-digital de 10 bits de resolución. Por default, esos convertidores miden desde 0 hasta 5 volts, pero este valor superior se puede modificar mediante el pin AREF y la función analogReference(). 2.3.3 Programación La programación del Arduino se realiza mediante el entorno de programación propio de Arduino. Los programas que se realizan para Arduino son denominados “Sketch”. Una vez que se escribe un programa, el entorno de programación se encarga de compilarlo y cargarlo al Arduino que se tenga conectado al computador. Para un mayor detalle de las funciones, estructuras y valores del lenguaje de programación se puede referir a la página web oficial: “http://arduino.cc/en/Reference/HomePage”. Además, Arduino posee una gran cantidad de librerías realizadas por sus usuarios, las cuales pueden ser descargadas de manera gratuita para su respectivo uso. A continuación se muestra una imagen del entorno de programación: 21 Figura 8. Entorno de programación de Arduino (programa de ejemplo). 2.4 Sensores Las palabras “sensor” y “transductor” son dos términos muy utilizados para referirse a dispositivos de sensado de alguna variable física, sin embargo no significan lo mismo. El término transductor se utiliza cuando se quiere considerar un sistema completo de sensado, donde se lleva a cabo un cambio entre tipos de energía. Un ejemplo de estos sistemas son los acelerómetros (transductores de aceleración), donde un cambio de estado de un sistema mecánico se manifiesta como una salida de tensión eléctrica en el dispositivo. Por otro lado 22 el término sensor es utilizado principalmente para referirse a dispositivos que responden ante algún estímulo del ambiente en el que se encuentran cambiando algún parámetro intrínseco del dispositivo, pero sin realizar ninguna conversión de energía. Un ejemplo de sensores son los termistores, los cuales son dispositivos que simplemente cambian el valor de su resistividad en función de la temperatura del ambiente donde se encuentren. En el presente proyecto, se harán uso de transductores para la medición de los parámetros de control del quadcopter. Dos características de suma importancia para caracterizar los transductores son la “responsividad” y la “detectabilidad”. El primero de los términos se refiere a la respuesta del transductor ante un cambio de la variable medida, y el segundo se refiere al valor más pequeño de la variable medida que el transductor puede detectar. Estos parámetros resultan más prácticos a la hora de caracterizar un sistema que el término “sensibilidad” (el cual resulta un poco ambiguo). Dentro de la familia de los transductores se encuentran los sistemas micro electromecánicos, o MEMS por sus siglas en inglés, los cuales son la base de los transductores que son utilizados para la adquisición de la postura del cuadracóptero. 23 2.4.1 Giroscopio 2.4.1.1 Descripción Generalizada Los giroscopios son dispositivos utilizados para medir o mantener una orientación específica. Antiguamente solo se contaba con los giroscopios mecánicos, que consistían en discos giratorios suspendidos sobre un eje que podía rotar en varias direcciones. La dinámica consistía en que el disco rotatorio permanecía en la misma posición indiferentemente de cómo rotara la plataforma sobre la cual estuviera montado. Actualmente se cuenta con otro tipo de giroscopios, los cuales son basados en sistemas micro-electromecánicos, y han aumentado su popularidad en los dispositivos electrónicos debido a su reducido tamaño, bajo precio y buena precisión. Una de las mayores aplicaciones de los giroscopios es para el desarrollo de unidades de medición inercial (IMU) de vehículos o dispositivos que requieran de este tipo de mediciones, como es el caso de los vehículos aéreos no tripulados (UAV) para sus sistemas de estabilización. 2.4.1.2 Dispositivo Utilizado (IDG-500) El IDG-500 es un giroscopio de dos ejes que consiste en dos giróscopos MEMS vibratorios independientes. Uno de ellos detecta la velocidad de rotación alrededor del eje X, y el otro detecta la velocidad de rotación alrededor del eje Y. Ambas estructuras se encuentran 24 selladas herméticamente al nivel de la oblea de silicio. Las masas vibratorias de ambos giróscopos, se hacen oscilar electrostáticamente a una frecuencia de resonancia mediante un control automático muy preciso que controla la oscilación de las masas. Cuando el sensor es rotado alrededor del eje X o el eje Y, el efecto Coriolis causa una vibración que puede ser detectada por un sensor capacitivo. La señal resultante es amplificada, demodulada, y filtrada para dar paso a una señal analógica que es proporcional a la tasa de cambio de la posición angular en un determinado eje. A continuación se puede observar un diagrama de Bode del filtro paso bajo que posee el giroscopio para acondicionar la señal de salida: Figura 9. Respuesta de Ganancia y Fase del Filtro del IDG-500 25 El IDG-500 posee dos salidas de velocidad para el eje X, y dos para el eje Y. A continuación se muestra una tabla con sus principales parámetros: Tabla 3. Salidas analógicas del IDG-500 Para más especificaciones técnicas del dispositivo, se puede recurrir a la hoja de especificaciones incluida en la sección de la bibliografía [36]. 26 2.4.2 Acelerómetro 2.4.2.1 Dispositivo Utilizado (ADXL335) El ADXL335 es un sistema completo de medición de aceleración de 3 ejes del proveedor Analog Devices. Este dispositivo tiene un rango de medición de ±3g. Contiene un sensor micro-electromecánico y un circuito de acondicionamiento de señal para implementar una arquitectura de medición de aceleración de lazo abierto. La salida del transductor, son tensiones eléctricas analógicas directamente proporcionales a la aceleración en cada eje. El sistema puede medir aceleración estática (como la gravedad), o aceleración dinámica (como sistemas en movimiento a velocidades no constantes). El sensor es un sistema micro-electromécanico hecho en silicio sobre la superficie de una oblea de silicio. Posee resortes de silicio que suspenden una estructura sobre la superficie de la oblea, y proveen una resistencia contra las fuerzas de aceleración. La deformación de la estructura cuando es sometida a fuerzas de aceleración es medida mediante un capacitor diferencial que consiste en una placa fija en la oblea y otra placa adherida a la masa suspendida. El sensor utiliza una sola estructura para la medición de la aceleración de los tres ejes ortogonales. 27 A continuación se puede observar un diagrama de bloques funcionales del sistema de medición: Figura 10. Diagrama de bloques de acelerómetro ADXL335. Hoja de Especificaciones Seguidamente, también se muestra una tabla con los parámetros de mayor importancia para el desarrollo del proyecto, sin embargo también se puede recurrir a la hoja de especificaciones completa en la sección de bibliografía [37] en caso de que sea necesario. 28 Tabla 4. Especificaciones de Acelerómetro ADXL335 2.4.3 Sensor Ultrasónico de Proximidad 2.4.3.1 Descripción Generalizada Los sensores ultrasónicos de proximidad (que en realidad son transductores pero son conocidos popularmente como sensores), trabajan bajo un principio muy similar a un radar, en el cual se evalúa la distancia de un objetivo al interpretar los ecos de ondas sonoras o de radio. Los sensores ultrasónicos generan ondas de alta frecuencia, detectan el eco, y calculan el intervalo de tiempo entre el momento en que se envió la señal, y el momento en el que se recibió el eco, para determinar la distancia del objeto que se está avaluando. Esta tecnología se encuentra un poco limitada por la forma de las superficies o la consistencia 29 del material del objeto que se está midiendo, dado que determinados materiales pueden dar lecturas erróneas en el transductor. Figura 11. Diagrama de Operación de Sensor Ultrasónico de Proximidad. Fuente: Google Images. 2.4.3.2 Dispositivo Utilizado (HC-SR04) El sensor ultrasónico de proximidad que se eligió para la realización del proyecto es el HCSR04, de la compañía ITead Studios. A continuación se puede apreciar una imagen del sensor: Figura 12. Sensor Ultrasónico de Proximidad (HC-SR04). Fuente: Manual de Fabricante. 30 2.4.3.3 Teoría de Operación del Sensor Ultrasónico La manera en la que este transductor detecta la proximidad de un objeto es la siguiente. Cuando se introduce un pulso mayor de 10µs en la terminal de “trigger” del dispositivo, el transductor envía una señal ultrasónica que se encuentra compuesta de 8 pulsos de 40 kHz, la cual eventualmente será reflejada por un objeto (en caso de que lo hubiese). A esta señal reflejada se le denomina eco. Desde el momento en el que se emite la señal de 40 kHz hasta que se recibe su eco, el transductor mantendrá un 1 lógico en su terminal denominada “ECO”. Cuando el transductor recibe de vuelta esta señal la convierte en una señal eléctrica, y el siguiente pulso no podrá ser transmitido hasta que el eco de la señal anterior haya desaparecido. Este tiempo que transcurre entre el momento en que se envía el primer pulso ultrasónico hasta que se puede enviar el próximo se denomina periodo de ciclo (cycle period). El periodo de ciclo mínimo recomendado es de 50 ms. La distancia medida por el transductor es proporcional al tiempo que dure la señal de la terminal de ECO en alto (que en este caso es una tensión de 5 volts). Si no se detecta ningún obstáculo frente al sensor ultrasónico, este dará una señal de 38 ms en alto en su terminal de ECO. La expresión que se utiliza para calcular la distancia en centímetros del objeto (o superficie, una vez dada la duración del pulso de ECO es la siguiente: 31 Para un mejor entendimiento, a continuación también se brinda una explicación gráfica de su operación: Figura 13. Representación gráfica de funcionamiento de sensor ultrasónico de proximidad. 2.5 Actuadores 2.5.1 Motores DC sin escobillas Los motores DC sin escobillas (también conocidos como motores DC brushless), son motores síncronos que son alimentados por una fuente eléctrica DC. Sin embargo, a diferencia de los motores DC con escobillas, los motores sin escobillas requieren de un conmutador electrónico y sensores adicionales para generar una señal de control que energice cada una de las bobinas del motor en forma secuencial para dar paso a la rotación 32 del motor. La gran mayoría de estos motores se encuentran dentro de la categoría de motores síncronos de imanes permanentes, pero también existen en menor proporción, motores DC sin escobillas de reluctancia o de inducción. Los motores DC sin escobillas presentan grandes ventajas frente a su contraparte de escobillas, como por ejemplo, la obvia ausencia de escobillas, que representan una gran desventaja debido a su desgaste y mantenimiento. Además los motores sin escobillas son más livianos comparados contra un motor con escobillas de su misma potencia, y también presentan eficiencias y pares superiores por cada watt consumido. Una característica muy importante derivada de la ausencia de escobillas, es que los motores DC sin escobillas no producen chispa alguna cuando se encuentran trabajando. Esto hace a los motores DC sin escobillas más robustos, confiables y eficientes. Una de las desventajas de los motores DC sin escobillas, es que requieren de un sistema electrónico por aparte para poder operar, normalmente denominado como “controlador electrónico de velocidad” (ESC por sus siglas en inglés), y del cual se hablará más adelante. El motor DC con escobillas puede operar sin problemas conectado únicamente a una fuente DC o también con un conmutador electrónico o reóstato para regular su velocidad. Un parámetro muy importante de los motores DC sin escobillas es la constante “Kv”, la cual indica la cantidad de revoluciones por minuto a la que gira un motor por cada volt de 33 alimentación. Por ejemplo, un motor sin escobillas de 1000 Kv conectado a una fuente de 2 volts, puede girar a 2000 rpm. Típicamente los motores DC sin escobillas poseen imanes permanentes adheridos a una armadura fija, eliminando así los problemas generados para suplir corriente a una armadura móvil. El controlador electrónico de velocidad es el análogo los conmutadores mecánicos en los motores con escobillas, y éste se encarga de cambiar continuamente cada una de las fases del motor para generar un campo magnético rotativo que se encargue de inducir el movimiento del motor. Las bobinas de los motores sin escobillas se pueden encontrar tanto en configuraciones Delta (las cuales entregan menor torque a bajas velocidades, pero generan mayores velocidades) como configuraciones Estrella (que generan mayor torque a bajas velocidades pero menor velocidad máxima que la configuración en Delta). [33] 34 Figura 14. Representación de Motor DC sin Escobillas 2.5.2 Controles electrónicos de Velocidad (ESC´s) Los Controladores Electrónicos de Velocidad (ESC por sus siglas en inglés) son los dispositivos encargados de coordinar y dar paso a la rotación y control de los motores sin escobillas. Estas unidades se encargan de generar la secuencia de pulsos trifásicos que son requeridos para provocar el movimiento de los motores sin escobillas. Para controlar la rotación del motor, el controlador requiere de un medio para determinar la orientación del rotor con respecto al estator. Para este fin, algunos diseños utilizan sensores de efecto Hall (los cuales detectan el campo magnético del rotor) y otros métodos detectan la fuerza contra electromotriz inducida en las bobinas no energizadas para inferir la posición del rotor. Este método mencionado anteriormente no requiere de sensores adicionales, y por ende este tipo de sistemas son llamados controladores sin sensores. 35 Los controladores típicos poseen 3 salidas bidireccionales, las cuales popularmente consisten en un arreglo de FETs controlados por un circuito lógico. Normalmente este circuito es un microcontrolador el cual se encarga de administrar la aceleración, controlar la velocidad de rotación y afinar la eficiencia adaptándose al sistema en el cual se encuentra trabajado el controlador. Para realizar el proceso anterior, normalmente los ESC tienen que ser configurados con los parámetros del sistema en el cual están trabajando (como por ejemplo el tipo de baterías al cual está conectado, las tensiones mínimas de operación segura, el tipo de arranque del motor, etc). El reto al que se enfrentan los controladores que infieren la posición del rotor con respecto a la fuerza contra electromotriz de las bobinas que no están en uso, es a la hora de iniciar el movimiento, ya que no hay una fuerza contra electromotriz (el rotor se encuentra estático, y por ende no hay tensión inducida). Usualmente, el procedimiento que se sigue es iniciar el movimiento desde una fase arbitraria, y luego corregirla en caso de que no sea la correcta. A continuación se encuentra una figura que ilustra el principio de funcionamiento de los motores sin escobillas trifásicos. Consiste en un motor de 3 bobinas por fase, cuyo rotor es su armadura. La secuencia trifásica de pulsos que se encargan de energizar las bobinas de las fases A, B y C son generados por el ESC. Para este ejemplo en particular, se necesita repetir 6 veces una secuencia de 6 combinaciones distintas de pulsos para lograr una revolución completa del motor (para un total de 36 pasos). 36 Figura 15. Principio de funcionamiento de motores sin escobillas [6] 2.6 Comunicaciones Inalámbricas 2.6.1 Comunicación Serial Las comunicaciones seriales se refieren al proceso de transmitir datos un bit a la vez, de una manera secuencial por medio de algún canal de comunicación. Este tipo de comunicaciones se realiza cuando el costo de tener varios canales es muy alto, o cuando realizar un proceso de sincronización de varias señales resulta complicado. La desventaja 37 de las comunicaciones seriales, es que poseen tasas de transmisión de datos más bajas que las comunicaciones en paralelo, dado que se pueden transmitir menos datos por unidad de tiempo, sin embargo, resulta ventajoso para reducir costos cuando la velocidad de transmisión de datos no es un factor fundamental para la operación del dispositivo. Como ejemplos de los buses más conocidos que implementan comunicación de tipo serial se pueden mencionar: SPI, I2C (ambas pueden ser implementadas mediante el Arduino), USB, PCI, Bluetooth y 1-Wire. 2.6.2 Protocolo Bluetooth Bluetooth es un estándar abierto de comunicaciones inalámbricas, que permite intercambiar datos de manera serial a distancias cortas mediante radiofrecuencias que van desde los 2400 MHz hasta los 2480 MHz. Este protocolo fue creado por la empresa de telecomunicaciones Ericsson en 1994, el cual fue concebido originalmente como una alternativa inalámbrica a los cables RS-232. Este protocolo está diseñado para comunicar dos o más dispositivos al mismo tiempo, los cuales normalmente se encuentran gobernados por un dispositivo maestro que se encarga de realizar la sincronización de datos del grupo. 38 El protocolo Bluetooth se encuentra regido por el “Bluetooth Special Interest Group” o SIG por sus siglas en inglés, el cual es un grupo formado por más de dieciséis mil compañías de áreas de telecomunicaciones, computación y dispositivos electrónicos. Este grupo se encarga de velar por que se cumplan los estándares requeridos para los nuevos dispositivos que requieran hacer uso de esta tecnología. Dada la naturaleza de comunicación inalámbrica de esta tecnología, esta presenta ciertos riesgos de seguridad, debido a la exposición de los datos que se transmiten. Para evitar exponer datos privados a receptores no deseados, este protocolo cuenta con un proceso de emparejamiento, en el cual se crea un primer enlace donde el usuario identifica los dispositivos que quiere comunicar entre sí, y una vez realizado el proceso, los dispositivos pueden seguir comunicándose entre sí con la seguridad del conocimiento del usuario de donde se están transmitiendo los datos. Una vez realizado el emparejamiento, los dispositivos guardan esta configuración para futuras transacciones, o bien se puede restablecer la configuración y modificar la lista de dispositivos autorizados a compartir información entre sí. Para información adicional se puede recurrir al estándar de telecomunicaciones de la IEEE 802.15.1-2002, donde se detalla más profundamente las características de este estándar. 39 2.7 Procesamiento de Señales 2.7.1 Introducción Debido a la naturaleza analógica de los sensores y transductores que se utilizan para percibir el entorno y el estado del cuadracóptero, éstos proporcionan señales de salida que se van a ver sometidas a ciertos niveles de ruido (causado tanto por vibraciones mecánicas como por interferencias electromagéticas). Por esta razón, resulta de gran importancia para el adecuado control del vehículo, acondicionar estas señales de manera que se puedan eliminar los datos provenientes de los sensores que no sean provechosos para el control del vehículo (o dicho de manera más sencilla, el ruido). Para el acondicionamiento de estas señales se encuentran un gran número de técnicas de procesamiento digital de señales (tanto así que es todo un campo de estudio de la ingeniería eléctrica), sin embargo, debido al alcance de este proyecto y las limitaciones de tiempo y hardware, solamente se podrán implementar las técnicas de menor complejidad matemática, y que no requieran de mucho recurso computacional (recordemos que solo se va a contar con un microcontrolador de 8 bits y 16 MIPS). Esto debido a que la ejecución de los algoritmos de control (y por ende el acondicionamiento de las señales), se debe ejecutar en tiempo real. 40 2.7.2 Manipulación de los datos de los sensores (IMU) Como una técnica para disminuir el nivel de ruido propio de los acelerómetros, y disminuir el efecto del deslizamiento de las medidas de los giroscopios, se puede hacer uso de una fusión de las mediciones tomadas de ambos transductores. Dado que se puede obtener una medida del desplazamiento angular por medio de ambos sensores, entonces, al asignar pesos dinámicos que sean relativos a la confiabilidad de las medidas de cada uno de los sensores, se puede obtener una medida más robusta del desplazamiento angular real del vehículo al sumar mediante pesos dinámicos y promediar el resultado final. 2.7.3 Media Móvil En estadística, una media móvil, es un tipo de filtro utilizado para analizar grupos de datos creando una serie de promedios de diferentes subgrupos del grupo global de datos. La dinámica simplificada de una media móvil se describe a continuación. Dada una serie de números y un tamaño de subgrupo fijo, el primer elemento de la media móvil es obtenido sacando el promedio de los valores del primer subgrupo de la serie de números. Luego, este subgrupo de datos es modificado excluyendo el primer número de su serie, y reemplazándolo por el siguiente número de la serie original de datos. Esto genera 41 un nuevo subgrupo de datos, el cual a su vez tiene un valor de promedio numérico nuevo. Este proceso es repetido hasta abarcar todos los datos de la serie numérica original. A la gráfica que conecta los valores de cada una de las medias obtenidas se le denomina “media móvil”. Las medias móviles también pueden ser utilizadas agregando pesos distintos a los valores que son de mayor interés, para que estos tengan mayor o menor impacto sobre el promedio de cada subgrupo. Para ilustrar de manera más sencilla lo explicado anteriormente se puede observar la siguiente figura: Figura 16. Ilustración Media Móvil 42 Dado un grupo de 8 datos, y un tamaño de subgrupo de 3 datos, se procede a sacar el promedio de los tres primeros datos. Luego el subgrupo se desplaza una casilla hacia la izquierda y se obtiene de nuevo el promedio del subgrupo. Este proceso se repite hasta llegar al final de los datos, o en el caso de que sea un proceso que genera datos continuamente, hasta que termine el proceso (como lo será nuestro caso). Seguidamente se observa un gráfico lineal donde se pueden observar los datos originales del ejemplo, y los de la media móvil. Se puede observar como la media móvil sigue la misma tendencia de los datos originales, solamente que se ve menos afectada por los picos que existan en la serie de datos original. Figura 17. Gráfico Ilustrativo de Media Móvil 43 Esta es una de las principales utilidades de la media móvil, el atenuar las fluctuaciones de pequeña duración de los datos originales, y darles más importancia a las tendencias de largo plazo. La diferencia entre largo y corto plazo depende de cada aplicación, por ende, el tamaño de los subgrupos, y el peso de los valores (en caso de que se requieran agregar) se deben programar adecuadamente dependiendo del fin para el cual se utilicen. La media móvil también se puede ver como un tipo de filtro paso bajo, donde los datos aleatorios de alta frecuencia pueden ser atenuados por medio del promediado de valores para obtener una tendencia más adecuada y eliminar el ruido del sistema. Cabe resaltar que esto también causa problemas si los parámetros no se encuentran debidamente programados dado que mientras más se trate de atenuar el ruido, más lenta será la respuesta del sistema. 2.8 Control Automático 2.8.1 Controlador PID Los algoritmos de control PID (Proporcional Integro-Diferencial) son los sistemas de control más utilizados en la industria de la automatización de procesos debido a su versatilidad y adaptabilidad a diversos procesos controlables. Los controladores PID son sistemas que trabajan bajo el principio de realimentación de lazo cerrado, los cuales se encargan de manipular una o más variables de un sistema (las cuales 44 se trabajan como entradas del sistema) con la finalidad de reducir la diferencia existente entre la salida real del sistema y la salida deseada del sistema (conocido como el error). Los algoritmos de control PID poseen 3 componentes cuya suma da resultado al parámetro de control de la variable manipulada (entrada del sistema). Estos elementos son: la componente proporcional, la componente integral y la componente derivativa. Una correcta sintonización de las ganancias de estos parámetros, y un apropiado modelado de todo el sistema, es lo que da paso a lograr una respuesta de la salida del sistema en la que se minimice su diferencia con respecto al valor esperado, de la manera más rápida y estable posible. La ecuación generalizada de los controladores PID viene dada por la siguiente expresión: Donde: t: corresponde al tiempo transcurrido, o tiempo instantáneo. u(t): corresponde a la salida del controlador. e(t): corresponde al error (valor deseado – salida real del sistema). : corresponde a la ganancia proporcional del controlador. : corresponde a la ganancia integral del controlador. : corresponde a la ganancia derivativa del controlador. 45 A continuación se puede observar una representación gráfica del controlador: Figura 18. Diagrama de bloques de controlador PID Paralelo 2.9 Fuente de Poder 2.9.1 Batería de Polímero de Ion de Litio (LiPo) Las baterías de Polímero de Ión de Litio, también conocidas como baterías de Polímero de Litio o LiPo por su abreviatura en inglés, son un tipo de baterías recargables de alto rendimiento, las cuales normalmente se encuentran compuestas de una o varias celdas que se disponen tanto en serie (para aumentar la tensión de salida de la batería) como en paralelo (para aumentar la capacidad y la corriente de descarga de la batería). Se caracterizan porque permiten niveles altos de descargas de corriente eléctrica, motivo por el cual, estas serán las baterías seleccionadas para el desarrollo del presente cuadracóptero. 46 3. CAPÍTULO III: Desarrollo e Implementación del UAV 3.1 Diagramas de Bloques del Cuadracóptero A continuación se presenta el diagrama de bloques a grandes rasgos con el cual se va proceder con el modelado del cuadracóptero por desarrollar. Cada uno de los bloques representa un subsistema que será diseñado y validado por aparte, para luego formar parte de todo el sistema. Esto permite segmentar el proyecto en diversas etapas las cuales hacen que la validación y la puesta en funcionamiento de cada una de ellas resulte más accesible al desarrollador. Módulo de Sensado Módulo de Comunicaciones Módulo de control principal Control de Potencia Motores Fuente de Alimentacion Figura 19. Diagrama de Bloques de Controlador PID 47 Cabe aclarar que el cuadracóptero que se construirá, se diseñará en configuración “+”. A continuación se detalla visualmente los dos tipos de configuraciones posibles para el diseño de cuadracópteros: Figura 20. Cuadracóptero en configuración "x" Figura 21. Cuadracóptero en configuración "+". 48 Por sutil que parezca la diferencia, esto influye en la programación y calibración que se realizará en los sistemas de control. Se elige la configuración “+” debido a que resulta de más sencilla aplicación. A continuación se expone el diagrama de bloques funcional para cada uno de los motores. La velocidad final de cada uno de ellos, estará constituida por la suma de la salida del PID de control de altitud, el PID de control de rotación alrededor del eje X (o Y), y un valor de velocidad fijo para iniciar con una velocidad conocida cuando se encienda el cuadracóptero. El resultado de dicha suma (la cual se convertirá en una señal PWM por el microcontrolador), será ingresado en el bloque de control de potencia de los motores (ESC), donde se convertirá la señal PWM resultante, en el conjunto de señales trifásicas correspondientes para lograr la velocidad angular requerida para cada uno de los motores. Motor X Entrada de Señales de Transductores PID Altitud PID Rotacion Eje X S Salida de Velocidad de Motores Velocidad Motor X Valor Fijo 49 Figura 22. Diagrama de bloques funcionales para cada motor Seguidamente, en el gráfico que se muestra a continuación, se ilustra a grandes rasgos el lazo de realimentación y ejecución. Cada uno de los bloques de los motores se debe interpretar como el subsistema que se explicó anteriormente. Como se puede apreciar en la figura, la posición y postura del cuadracóptero va a estar determinada por la interacción del comportamiento de cada uno de los cuatro motores. Esta postura va a ser traducida en un conjunto de señales eléctricas por los transductores, las cuales van a ser introducidas en los bloques de control por medio del micro-controlador (Arduino). Motor 1 Motor 2 S Transductores de Posición y Postura Posición y Postura Deseada Motor 3 Motor 4 Figura 23. Lazo de ejecución y realimentación del cuadracóptero. 50 La tabla de asignación de entradas y salidas del Arduino será como se muestra a continuación. Cabe resaltar que hay un pin de entrada analógica libre, sin embargo, próximamente este será destinado para la salida del eje “Z” de un nuevo giroscopio. Este nuevo eje del giroscopio será requerido para la corrección de la rotación alrededor del eje Z del cuadracóptero, la cual es causada por la diferencia de los pares rotacionales entre los motores CW y los motores CCW. Esta tabla se propuso de esta manera dado que el giroscopio con el cual se cuenta actualmente solo posee dos grados de libertad. Como se observa, se tienen seis entradas/salidas digitales libres, las cuales se pueden utilizar en un futuro para LEDs de señalización. Tabla 5. Tabla de asignación de pines de Arduino 51 3.2 Experimentos 3.2.1 Validación del módulo Bluetooth La validación de este módulo se realizó de una manera muy sencilla. Primero se procedió a la programación de los parámetros propios del módulo, como lo es su tasa de transmisión de datos y su respectivo emparejamiento con la computadora y el teléfono inteligente. Este proceso se realizó siguiendo los pasos detallados en la hoja de especificaciones del dispositivo. Luego, se realizó un sketch sencillo para el Arduino, el cual permitiera observar que se estaban transmitiendo los datos correctamente entre la plataforma Android y el Arduino. El sketch utilizado se puede observar en el apéndice 1 de la sección de anexos. La dinámica consistió en utilizar 5 leds de distintos colores que se encontraban conectados a las salidas digitales del microcontrolador, y prenderlos o apagarlos desde el teléfono inteligente de manera remota por medio del adaptador bluetooth utilizado en conjunto con el microcontrolador Arduino. A continuación, se puede observar un diagrama sencillo del proceso que se detalló anteriormente para la validación del módulo bluetooth del Arduino. 52 Figura 24. Diagrama de método de validación de módulo bluetooth en conjunto con Arduino. La validación resultó exitosa, no hubo ningún tipo de comportamiento anómalo, y se logró transmitir a una distancia de aproximadamente 15 metros con el arduino en un cuarto y el transmisor en otro cuarto distinto. Sumado a la prueba visual realizada mediante los LEDs, se comprobó la integridad de los datos transmitidos mediante la comunicación serial entre el Arduino y el computador por medio del monitor serial de datos que posee la misma aplicación con la cual se realiza la programación del Arduino (se puede observar una captura del monitor serial en la figura a continuación). Figura 25. Captura de Monitor Serial de Aplicación de Programación de Arduino. 53 3.2.2 Validación de los controles electrónicos de velocidad (ESC) Para la experimentación con los controladores electrónicos de velocidad se procedió de la siguiente manera: Programación de parámetros de los controladores de velocidad (ESC). Cada ESC debe ser programado antes de su primera utilización. Esto debido a que requieren de diversos parámetros propios del sistema donde van a ser utilizados para un funcionamiento óptimo. El proceso a seguir para la programación de los controladores de velocidad varía dependiendo de la marca y el modelo, de modo que para la programación de los controladores utilizados se siguieron las instrucciones suministradas por el proveedor. Luego de que los cuatro controladores fueron programados, se procedió a su respectiva validación en conjunto con el Arduino Uno. Para esto se realizó un pequeño sketch exclusivo para el control de velocidad de los motores. A grandes rasgos, el concepto del experimento de validación fue utilizar una señal analógica de entrada, generada mediante un potenciómetro y una fuente de tensión no variable, con la cual se lograra obtener un control lineal proporcional de la velocidad de los motores en función de la tensión variable generada mediante el potenciómetro. Los cuatro pines de control de cada uno de los controladores de velocidad fueron ubicados en las correspondientes salidas PWM del 54 Arduino, y la tensión variable del potenciómetro se colocó en una de las entradas analógicas del microcontrolador. El experimento de validación resultó exitoso, y el control de los motores se pudo llevar a cabo mediante la señal analógica de entrada que fue generada por el potenciómetro. 3.2.3 Validación de la Unidad de Medición Inercial (IMU) Este apartado correspondió a uno de los mayores retos del desarrollo del proyecto. Como se mencionó en el II Capítulo, los sensores utilizados para el sistema de medición inercial (acelerómetros y giroscopios), poseen salidas cuyas señales poseen un determinado nivel de ruido que va en detrimento de la robustez del control automático del cuadracóptero. Este ruido es dependiente del tipo de componentes mecánicos que se estén utilizando (como por ejemplo las características de las hélices, el material del marco, etc). Por esta razón se tuvo que implementar una etapa de filtrado digital de las señales para tratar de eliminar la mayor parte del ruido de cada una de las señales de entrada. Para lograr esto, se implementó la técnica de la media móvil para realizar un promediado dinámico de los valores de cada una de estas señales, de modo que se disminuyera el nivel de ruido, sin desfasar en gran medida la señal filtrada de la señal real. Esto es de suma importancia debido a que los controladores PID requieren obtener su señal de entrada en tiempo real para un correcto funcionamiento del sistema. 55 El parámetro requerido para este filtro (cantidad de muestras que se promedian en cada ciclo de ejecución), se obtuvo experimentalmente, con un método de prueba y error, hasta obtener el parámetro que mostrara el mejor resultado posible. Además, con la finalidad de disminuir el ruido de las señales, se configuró la frecuencia de muestreo de las señales de los acelerómetros y giroscopio a 100 Hz, mientras que la frecuencia de muestreo del sensor ultrasónico de proximidad se configuró a 10 Hz. Esto debido a que cada muestreo de este sensor puede durar hasta 25 ms (varía dependiendo de la distancia del objeto o superficie), de modo que si se realizara a la misma frecuencia que el muestreo de los acelerómetros y giroscopios, se alargaría mucho el tiempo de ejecución de cada ciclo, y por ende se disminuiría la frecuencia del lazo principal. A continuación se observa un gráfico que muestra la señal sin filtrar (en azul) junto con la señal filtrada (rojo). Esta captura fue tomada con los motores encendidos a un 15% de su velocidad máxima. Se puede apreciar la gran reducción del ruido que se logró al realizar la fusión de las señales de los acelerómetros y los giroscopios, junto con el promediado dinámico expuesto anteriormente. El promediado se realizó con un índice de 20 muestras por ciclo. 56 Figura 26. Comparación entre señal original y señal filtrada de uno de los acelerómetros. Además se puede observar el desfase que se obtiene entre la señal filtrada (roja) y la señal sin procesar (azul). Para este experimento se conservaron los mismos parámetros de la prueba anterior, solamente que se apagaron los motores para observar una señal más limpia de los acelerómetros. También cabe mencionar que para estas pruebas se utilizó un peso relativo del 80% para la señal del acelerómetro y un peso de 20% para la señal del giroscopio. Se observó que mientras mayor peso se le asigne a las lecturas del giroscopio, mayor es el desfase experimentado entre la señal filtrada y la señal original. Figura 27. Prueba para observar el desfase entre la señal filtrada y la original, con los motores apagados. 57 Por último, se realizó una prueba para observar la inmunidad del sistema ante la presencia de señales no deseadas. Para este caso, se aplicaron pequeños golpes al sensor, y se observaron ambas señales de interés (señal filtrada y señal original). Se puede observar que el sistema final resulta bastante inmune a este tipo de perturbaciones anómalas en el sistema. Esto es muy importante para evitar comportamientos no deseados de todo el sistema ante la presencia de perturbaciones no deseadas en las lecturas de los sensores. Figura 28. Prueba realizada para observar la inmunidad del sistema ante señales no deseadas. Una de las principales razones por la cual se le asigna tanta importancia al acondicionamiento de las señales, es porque estas serán introducidas en el controlador PID, de modo que dependiendo de las ganancias de cada una de las componentes, así será el impacto en cada una de ellas. En el caso de la parte integral del controlador, no se tiene mayor problema con el ruido, dado que si este presenta una distribución gaussiana, no afectará en gran medida el comportamiento del controlador. Sin embargo, la componente 58 diferencial del controlador, si se verá muy afectada, dado que la pendiente de las señales de ruido de alta frecuencia es muy pronunciada, motivo por el cual la derivada de estas señales resulta en una cifra muy alta. Debido a esta razón, la ganancia de la componente derivativa del controlador se tiene que subdimensionar para lograr que sea inmune a este ruido. El problema con esto, es que mientras más se disminuye esta ganancia, el controlador no reacciona de manera adecuada ante cambios bruscos reales en la postura del cuadracóptero, y su debida corrección de postura no se ejecuta de la manera adecuada. De aquí la importancia de tener una señal bien acondicionada, para poder dimensionar correctamente la ganancia de la componente derivativa del controlador, y de esta manera logar que el cuadracóptero responda de una mejor manera ante cambios bruscos en su postura. 3.2.4 Validación del Transductor Ultrasónico de Proximidad Para la validación del transductor ultrasónico se decidió utilizar la librería facilitada por el fabricante del dispositivo. La dinámica consistió en conectar el dispositivo al Arduino, y luego observar si las distancias obtenidas mediante el sensor ultrasónico coincidían con las medidas reales de distancia (las cuales fueron medidas con una cinta métrica). Los resultados fueron los esperados, y las lecturas fueron muy precisas. Cabe resaltar que mediante la experimentación se pudieron medir distancias que fueron desde los 2 cm hasta los 500 cm. Fuera de ese rango, las lecturas eran inestables. 59 El Sensor Ultrasónico de Proximidad se validó con el siguiente sketch: #include "Ultrasonic.h" Ultrasonic ultrasonic(12,13); // Trigger en Pin 12 y Echo en Pin 13 void setup() { Serial.begin(115200); Serial.print("testing..."); } void loop() { Serial.println (ultrasonic.Ranging(CM)); //La salida se puede obtener en centímetros (CM) o pulgadas (IN). delay(500); } El resultado de la altura que percibe el módulo una vez instalado en el cuadracóptero es de 6 cm. Las medidas son muy estables. 3.2.5 Validación del sistema de control automático. Para la validación del sistema de control automático, primero se procedió a obtener las ganancias de las componentes de cada uno de los controladores PID. Dado que no se cuenta con un modelo matemático del sistema, y la respuesta del sistema a los escalones es un proceso complejo de obtener sin el equipo necesario, las ganancias de cada PID se obtuvieron mediante un proceso de experimentación hasta llegar a los parámetros que dieran los mejores resultados. 60 Para realizar este proceso, la dinámica que se siguió fue calibrar cada PID por separado hasta obtener el comportamiento deseado, para luego ponerlos a trabajar todos juntos una vez que ya estuvieran correctamente calibrados. Primero se procedió con la obtención de los parámetros para el PID de control de rotación alrededor del eje X. Para realizar esto, se restringió la rotación del cuadracóptero alrededor del eje Y al apoyar el eje X en una superficie libre de fricción que lo permitiera rotar. De esta manera, solo se trabajó con los motores 2 y 4 encendidos, los cuales eran los encargados de mantener el equilibrio del cuadracóptero (mientras tanto, los motores 1 y 3 permanecen apagados). Figura 29. Experimento para la obtención de los parámetro de PID de inclinación Eje X Inicialmente, el proceso que se siguió, fue configurar todas las ganancias de este PID en 0. Luego, poco a poco se fue aumentando la ganancia proporcional del controlador hasta 61 llegar a un punto donde el cuadracóptero se encontrara cerca de empezar a oscilar alrededor de su punto de referencia (ángulo de inclinación de cero grados con respecto a la horizontal). Ya una vez que se obtuvo el valor de este parámetro, se siguió el mismo proceso pero para la ganancia diferencial, solo que esta vez con la ganancia proporcional en el valor encontrado anteriormente. Una vez que se encuentra el valor de la ganancia proporcional de esta manera, se prosigue a buscar el valor de la ganancia de la componente integral, partiendo del hecho que se conocen las otras dos. Cabe resaltar, que los parámetros encontrados para el sistema con un tipo de hélice, no son válidos si se cambian las hélices, de modo que se tienen que volver a obtener los parámetros. Luego de obtener los parámetros del PID del Eje X, se procede a realizar el procedimiento análogo pero para el controlador PID del Eje Y. Esto debido a que el cuadracóptero no es completamente simétrico, de modo que los parámetros varían dependiendo de la distribución de la masa del vehículo. El proceso de experimentación fue bastante largo, sin embargo, se encontró un punto de operación donde el cuadracóptero se logra estabilizar de manera automática alrededor del punto de referencia que se le definiera. Los resultados de esta configuración se pueden 62 observar más claramente en el video que se encuentra ingresando en el siguiente link: http://www.youtube.com/watch?v=-r1t5x4S7XY&feature=plcp. Para este punto de operación, las ganancias que se obtuvieron fueron las siguientes: Para el Eje X: Kp=5; Ki=4.5; Kd=3.1 Para el Eje Y: Kp=5.4; Ki=4.5; Kd=3.3 Los parámetros se obtuvieron con hélices de 8 pulgadas de diámetro. Cabe destacar que la diferencia entre los parámetros del eje X y del Eje Y se debió principalmente a la forma de la batería (dado que constituye un 30% del peso total) y como se encontraba dispuesta en el vehículo (dado que no es simétrica). Este proceso de obtención de los parámetros se puede facilitar y optimizar al contar con el equipo necesario para poder modelar el cuadracóptero y poder obtener la respuesta al escalón de cada uno de los ejes. Sin embargo, por motivo de tiempo y recursos, para la realización del presente proyecto no se pudo contar con las herramientas requeridas. No obstante, fuera del hecho que la obtención de los parámetros no se dio de la manera científica-matemática deseada, los resultados que se obtuvieron fueron muy aceptables. Además se aclara que para la experimentación que se detalló anteriormente, se incluyó una protección en la salida de los controladores PID, de modo que la salida se sature a cierto nivel conocido (en nuestro caso un 30% de la velocidad máxima de los motores). Esto para evitar que por algún error de programación o algo similar, el cuadracóptero se salga de 63 control y ocurra algún accidente. La adición de todo tipo de protecciones es una práctica recomendada en caso de que se vaya a experimentar o realizar algún cambio del que no se esté completamente seguro de su resultado, de modo que haya seguridad de que el cuadracóptero no se va a salir de control y dañarse o lastimar a alguien. 3.3 Lista de Componentes Utilizados A continuación se puede observar una tabla resumen con los componentes utilizados en la construcción del prototipo y sus costos correspondientes. Se aclara que el marco se realizó de manera casera, motivo por el cual no se encuentra dentro de la tabla de costos: Tabla 6. Lista de Componentes y Costos del Cuadracóptero 64 El código de programación del Arduino que se utilizò para realizar las pruebas se encuentra en el Anexo2. Una vez que se ensambló por completo el prototipo, el resultado final fue el siguiente: Figura 30. Modelo tridimensional del primer prototipo del Cuadracóptero. Figura 31. Modelo Real del Primer Prototipo del Cuadracóptero. 65 Figura 32. Modelo Real del Primer Prototipo del Cuadracóptero. Figura 33. Parte inferior del primer prototipo del cuadracóptero. 66 4. Capítulo 4: Conclusiones y Recomendaciones 4.1 Conclusiones El desarrollo de todos los sistemas separados del cuadracóptero y su posterior integración resultó ser un proceso de mayor complejidad que lo proyectado inicialmente. La etapa de pruebas y verificación de cada subsistema del cuadracóptero resultó de gran importancia y ayuda para entender mejor su funcionamiento y corregir los errores de diseño que se realizaron inicialmente. De esta manera, a la hora de ser integrados se tiene un mayor nivel de confiabilidad de que van a funcionar correctamente. La etapa de validación y pruebas de los sistemas que requirieron el uso de las hélices resultó ser más peligroso de lo pensado, dado que los motores se encuentran girando a muy altas velocidades y existe el riesgo de un malfuncionamiento por algún error de programación. Se tuvieron que tomar todas las precauciones del caso para hacer las pruebas de una manera segura. 67 El Filtro Kalman resultó tener una complejidad más alta de lo pensado inicialmente, motivo por el cual, dadas las limitaciones del alcance del proyecto, no se pudo implementar en la entrega final del primer prototipo del cuadracóptero. El desarrollo de un proyecto multidisciplinario como el presente, requiere de mucho tiempo, dedicación y planeamiento, debido a la gran cantidad de investigación, pruebas y experimentos que se tienen que llevar a cabo en un lapso de tiempo muy limitado. Esto es de mucha importancia para poder llegar a tener un prototipo estable y funcional. El microcontrolador del arduino se encuentra subdimensionado para la apliación. Para obtener un prototipo de vuelo autónomo se requiere de mucho procesamiento matemático en tiempo real, motivo por el cual el Arduino no es adecuado para un vuelo que no sea asistido por un piloto. Al tener mucho procesamiento matemático, el ATmega328 muestra una disminución en la frecuencia del lazo de ejecución del programa hasta llegar a un nivel donde es muy bajo para la correcta operación dinámica de los motores. La comunicación de datos vía bluetooth se realizó de manera exitosa en ambas vías (transmisión y recepción), motivo por el cual se pudo completar exitosamente ese objetivo específico. El Arduino se pudo comunicar sin ningún problema tanto con la 68 computadora personal como con el dispositivo Android para enviar los datos de postura y otras variables de interés para el usuario por medio del shield bluetooth. Los motores sin escobillas mostraron un desempeño superior al esperado, al trabajar en conjunto con sus respectivos controladores electrónicos de velocidad. Estos motores poseen una relación potencia efectiva/peso mucho más elevada que su contraparte con escobillas. La elección y balanceo correcto de las hélices de los motores resulta fundamental para el buen funcionamiento del sistema, ya que provoca menos vibración en el sistema, y un vuelo más estable. El uso de un teléfono inteligente como mando a distancia del cuadracóptero resultó ser un muy buen ejercicio académico, sin embargo resulta poco práctico tener que controlar un sistema tan dinámico y de rápida respuesta por medio de una pantalla táctil. 69 4.2 Recomendaciones Se recalca el cuidado que hay que tener al hacer las pruebas con las hélices puestas. Se recomienda utilizar el equipo de protección requerido. Realizar pruebas independientes de cada sistema y entender el impacto del cambio de cada uno de sus parámetros en su comportamiento final. Realizar un buen cronograma del proyecto y apegarse. No olvidar dejar un lapso de tiempo para imprevistos en el desarrollo del proyecto. Tener cuidado de vigilar la tensión de la batería utilizada para no descargarla más allá de los límites recomendados. Esto puede causar un daño perjudicial en la batería que va en detrimento de su vida útil. Realizar la sintonización de los controladores PID con un método analítico de sintonización para mejorar la robustez y confiabilidad del sistema. Tomar en cuenta la necesidad de plataformas de prueba que se van a tener que utilizar para validaciones. Este es un recurso muy importante dado que permite realizar los experimentos requeridos de una manera segura y versátil. 70 Documentar muy bien todos los experimentos que se realicen, y los cambios que se le hagan a los sketches (a manera de bitácora). Hacer buen uso de los profesores tutores para orientar la resolución de los problemas de alta complejidad que se presenten durante el desarrollo del proyecto. 4.3 Trabajo Futuro Realizar un modelado matemático del cuadracóptero para poder crear un sistema de control más robusto mediante el uso de este modelo (Como por ejemplo con Filtros de Kalman). Realizar un estudio del consumo de potencia de cada uno de los bloques funcionales del dispositivo para buscar maneras de optimizar su tiempo de vuelo. Cambiar el microcontrolador actual por uno más potente, de modo que se puedan implementar algoritmos más complejos, y añadirle más funcionalidades al cuadracóptero. Además se requieren más entradas analógicas para añadir más sensores al vehículo (magnetómetros). 71 BIBLIOGRAFÍA Artículos y Papers: 1. Martin, Philippe; Salaun, Erwan. “The True Role of Accelerometer Feedback in Quadrotor Control”. 2010 IEEE International Conference on Robotics and Automation. Mayo 2010. 2. Norafizah, Abas; Ari, Legowo; Rini, Akmeliawati. “Parameter Identification of an Autonomous Quadrotor”. 2011 4th International Conference on Mechatronics (ICOM). Malaysia, Mayo 2011. 3. Atheer L. Salih, M. Moghavvemi, Haider A. F. Mohamed. “Modelling and PID Controller Design for a Quadrotor Unmanned Air Vehicle”. Centre for Research in Applied Electronics (CRAE), University of Malaya. 4. Paul Pounds, Robert Mahony, Peter Corke. “Modelling and Control of a QuadRotor Robot”. Australian National University, Canberra, Australia. 5. Jun Li, Yuntang Li. “Dynamic Analysis and PID Control for a Quadrotor”. 2011 IEEE International Conference on Mechatronics and Automation. Agosto 2010. 6. Roman Czyba. “Design of Attitude Control System for an UAV Type-Quadrotor Based on Dynamic Contraction Method”. 2009 IEEE/ASME International Conference on Advanced Intelligent Mechatronics. Singapore, 2009. 72 7. Alexandros Soumelidis, P´eter G´asp´ar, Gergely Regula, B´ela Lantos. “Control of an experimental mini quad-rotor UAV”. 16th Mediterranean Conference on Control and Automation. France, 2008. 8. Kento Yamasaki, Takashi Takimoto, Keiichi Yoshino. “Attitude Control of Quadrotor Helicopters with Sensor Offsets”. 9. A. Zul Azfar, D. Hazry. “A Simple Approach on Implementing IMU Sensor Fusion in PID Controller for Stabilizing Quadrotor Flight Control”. 2011 IEEE 7th International Colloquium on Signal Processing and its Applications. Libros: 10. Usher M.J. and Keating D.A. “Sensors and Transducers”, Segunda Edición, Macmillan, Inglaterra, 1996. 11. Subir Kumar, Saha. “Introducción a la Robótica”. I Edición, Mc Graw Hill, 2010. Páginas Web: 12. “Teoría de Diseño Electromagnético de Motores DC y Actuadores” http://www.consult-g2.com/course/chapter9/chapter.html 13. “Baterías de Níquel-Cadmio” http://en.wikipedia.org/wiki/Nickel%E2%80%93cadmium_battery 73 14. “Motores Sincrónicos” http://en.wikipedia.org/wiki/Synchronous_motor 15. “Controlando Motores DC sin escobillas con Arduino” http://elabz.com/brushless-dc-motor-with-arduino/ 16. Nicolas Oros. “Carro a Control Remoto Android” http://www.cogsci.uci.edu/~noros/android_car.html 17. “Arduino Bluetooth Shield” http://iteadstudio.com/store/index.php?main_page=product_info&cPath=18&produ cts_id=307 18. “Declaración de Funciones en Arduino” http://arduino.cc/en/Reference/FunctionDeclaration 19. “Librería de Comunicaciones Seriales de Arduino” http://arduino.cc/en/Reference/SoftwareSerial 20. “Comunicaciones seriales mediante Arduino” http://www.smacula.co.uk/2011/07/arduino-serial-communication.html 21. “Comunicaciones Seriales de Plataforma Arduino” http://arduino.cc/en/Reference/Serial 22. “Mejorando el controlador PID para Arduino” http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/ 23. “Librería PID para Arduino” http://arduino.cc/playground/Code/PIDLibrary. 24. “Página Oficial Aeroquad” http://aeroquad.com/content.php?116 25. “ Propelas” http://en.wikipedia.org/wiki/Propeller_(aircraft) 74 26. “Implementación de Filtro Kalman Simplificado mediante Arduino” http://www.starlino.com/imu_kalman_arduino.html 27. “Filtro Kalman” http://www.cs.unc.edu/~welch/kalman/ 28. “Uso de Acelerómetros y Giroscópios para captura de posición” http://www.starlino.com/quadcopter_acc_gyro.html 29. “Guía de Sistema de Medición Inercial” http://www.starlino.com/imu_guide.html 30. “Ángulo de Ataque de Alas” http://es.wikipedia.org/wiki/%C3%81ngulo_de_ataque 31. “Fuerza de Sustentación” http://en.wikipedia.org/wiki/Lift_(force) 32. “Perfil Alar” http://en.wikipedia.org/wiki/Planform 33. “Media Móvil” http://en.wikipedia.org/wiki/Moving_average 34. “Uso de Media Móvil en Mercados Financieros” http://www.investopedia.com/articles/technical/060401.asp#axzz1xSRDjgzN 35. Hoja de Especificaciones Técnicas de ATmega328” http://www.atmel.com/Images/8271S.pdf 36. “Hoja de Especificaciones Técnicas de Giroscopio IDG-500”. http://www.sparkfun.com/datasheets/Components/SMD/Datasheet_IDG500.pdf 37. “Hoja de Especificaciones Técnicas de Acelerómetro ADXL-335”. http://www.sparkfun.com/datasheets/Components/SMD/adxl335.pdf 75 APÉNDICES En este apartado se debe de incluir información que por su naturaleza no puede ser incluida en el desarrollo mismo del proyecto, pero que fue utilizada para su elaboración. Apéndice 1. Sketch de validación del módulo bluetooth. int incomingByte = 0; // variable para almacenar dato transmitido int arriba = 12; int abajo = 11; int derecha = 10; int izquierda = 9; int centro = 8; void setup() { Serial.begin(115200); // define el baudrate a 115200 bps pinMode(arriba, OUTPUT); pinMode(abajo, OUTPUT); pinMode(derecha, OUTPUT); pinMode(izquierda, OUTPUT); pinMode(centro, OUTPUT); } void loop() { if (Serial.available() > 0) { // lee el byte transmitido: incomingByte = Serial.read(); // se imprime lo que se recibió: Serial.print("Recibí: "); Serial.println(incomingByte, DEC); if (incomingByte == 85)//encender el led de arriba 76 { digitalWrite(arriba, HIGH); delay(100); digitalWrite(arriba, LOW); delay(100); } if (incomingByte == 68)//encender el led de abajo { digitalWrite(abajo, HIGH); delay(100); digitalWrite(abajo, LOW); delay(100); } if (incomingByte == 82)//encender el led de izquierda { digitalWrite(derecha, HIGH); delay(100); digitalWrite(derecha, LOW); delay(100); } if (incomingByte == 76)//encender el led de izquierda { digitalWrite(izquierda, HIGH); delay(100); digitalWrite(izquierda, LOW); delay(100); } Serial.flush(); } } 77 Apéndice 2. Código completo de programación del cuadracóptero //Sketch para probar controlador PID con el IMU. Se va a utilizar para variar la frecuencia de muestreo del IMU y ver su impacto en la senal de salida. Se utiliza solamente un PID por eje y las helices pequenas. Da buen resultado con los parametros actuales. Todavía es inestable. //Se usa una frecuencia de muestreo de 100 Hz /* Hardware: AccX AccY AccZ GyroX GyroY <---> ANALOG 0 <---> ANALOG 1 <---> ANALOG 2 <---> ANALOG 3 <---> ANALOG 4 PWM Motor 1 PWM Motor 2 PWM Motor 3 PWM Motor 4 <---> <---> <---> <---> DIGITAL 3 DIGITAL 9 DIGITAL 10 DIGITAL 11 Ultrasonic Trigger <---> DIGITAL 12 Ultrasonic Echo <---> DIGITAL 13 */ #include "Ultrasonic.h" #include "PID_v1.h" #include <EEPROM.h> #define INPUT_COUNT 5 #define VDD 5000.0f #define PI 3.14159265358979f //número de entradas analogicas //voltaje de referencia en milivolts //Valores e inicialización de transductor ultrasónico double altura; int altura2; Ultrasonic ultrasonic(12,13); // Trigger en Pin 12 y Echo en Pin 13 double time_1_debug; double time_now_debug; //Valores para estructura de IMU int an[INPUT_COUNT]; //analog inputs char firstSample; //marks first sample struct { char inpInvert[INPUT_COUNT]; int zeroLevel[INPUT_COUNT]; int inpSens[INPUT_COUNT]; float wGyro; // bits 0..5 invert input // 0..2 accelerometer zero level (mV) @ 0 G // 3..5 gyro zero level (mV) @ 0 deg/s // 0..2 acceleromter input sensitivity (mv/g) // 3..5 gyro input sensitivity (mV/deg/ms) // gyro weight/smooting factor 78 } config; // "w" se refiere a cada uno de los ejes, por ejemplo RwAcc[0],RwAcc[1],RwAcc[2] means RxAcc,RyAcc,RzAcc //Variables tienen que ser globales (se utilizan en getEstimatedInclination) float RwEst[3]; //Rw estimado de la combinación de RwAcc y RwGyro unsigned long lastMicros; //Variables para la obtencion del angulo de inclinacion unsigned long interval; //intervalo entre muestras float RwAcc[3]; //proyeccion del vector de gravedad en cada eje, medido por acelerometro float RwGyro[3]; //Rw obtenido de la ultima lectura del giroscopio float Awz[2]; //Variables para uso del controlador PID. Todas tienen que tener formato de double por definicion de la funcion. double vel_adelante, vel_derecha, vel_altura; double adelante_sp=0.00, derecha_sp=0.00, altura_sp=0.00; double x_angle, y_angle; // Salidas de los controladores PID //Setpoints iniciales de los controladores PID //Entradas de controladores PID //Constantes PID double kp=5, ki=4, kd=3; //Constantes de ganancia de controladores PID inclinacion double kpa=2, kia=0.0, kda=0.0; //Constantes de ganancia de controladores PID altura //Controladores PID. Se dedica 1 controlador a cada eje de rotación y otro para la altura. Nomenclatura PID(&Input, &Output, &Setpoint, Kp, Ki, Kd, Direction) PID PID_EJE_X(&x_angle, &vel_adelante, &adelante_sp, kp, ki, kd, REVERSE); PID PID_EJE_Y(&y_angle, &vel_derecha, &derecha_sp,kp,ki,kd, DIRECT); PID PID_Altura(&altura, &vel_altura, &altura_sp, kpa,kia,kda, DIRECT); //Valores para control de velocidad de los motores int vel1, vel2, vel3, vel4; //Velocidades individuales finales de los motores int motor1=3, motor2=9, motor3=10, motor4=11; //Pines de ubicación de los motores unsigned long time_now, time_1, time_2; byte incomingByte1[4]; // Para datos seriales de dispositivo android int ib; //Variables de control y valores consigna int Activado=0; //Para inicializar el dispositivo con los motores apagados. Cero Apagados, uno encendidos int altitud_maxima= 100; //Altitud maxima deseada en centimetros int general_vel=155; //Velocidad general de los motores int vel_limit_PID = 20; //Limite de velocidad para ámbito de salida de controlador PID postura int vel_limit_PID_altura = 20; //Limite de velocidad para ámbito de salida de controlador PID altitud double vel_prot = 200; //Limite de protección de velocidad para las pruebas. 79 double sensibilidad_control = 0.4; double vel_altura_manual = 0; double vel_altura_manual2 = 0; //Sensibilidad del joystick. No usar valores superiores a 0.5! void setup() { static int i; Serial.begin(115200); //Se asignan los pines de salida para los PWM de los motores pinMode(motor1, OUTPUT); pinMode(motor2, OUTPUT); pinMode(motor3, OUTPUT); pinMode(motor4, OUTPUT); //Se inicializan las salidas de los motores para activar los ESCs analogWrite(motor1,140); analogWrite(motor2,140); analogWrite(motor3,140); analogWrite(motor4,140); delay(3000); //Valor de espera para inicializacion de los ESCs //Ahora se inicializan los parámetros del Acelerometro y giroscopio for(i=0;i<=2;i++){ // X,Y,Z axis config.zeroLevel[i] = 1360; // Accelerometer zero level (mV) @ 0 G --> Se obtuvo en experimento config.inpSens[i] = 300; // Accelerometer Sensisitivity mV/g ---> Se obtuvo del datasheet. } for(i=3;i<=4;i++){ config.inpSens[i] = 2000; // Gyro Sensitivity mV/deg/ms config.zeroLevel[i] = 1350; // Gyro Zero Level (mV) @ 0 deg/s } config.inpInvert[0] = 1; //Acc X config.inpInvert[1] = 1; //Acc Y config.inpInvert[2] = 1; //Acc Z //Gyro readings are sometimes inverted according to accelerometer coordonate system config.inpInvert[3] = -1; //Gyro X config.inpInvert[4] = -1; //Gyro Y config.wGyro = 10; //Variable para asignar el peso de las lecturas del giroscopio firstSample = 1; //Inicializacion de controlador PID PID_EJE_X.SetMode(AUTOMATIC); //Activa control PID de correccion eje X. PID_EJE_X.SetOutputLimits(-vel_limit_PID, vel_limit_PID); 80 PID_EJE_Y.SetMode(AUTOMATIC); PID_EJE_Y.SetOutputLimits(-vel_limit_PID, vel_limit_PID); //Activa control PID de corrección eje Y. PID_Altura.SetMode(AUTOMATIC); PID_Altura.SetOutputLimits(0, vel_limit_PID_altura); //Activa control PID de altitud. PID_EJE_X.SetSampleTime(20); PID_EJE_Y.SetSampleTime(20); PID_Altura.SetSampleTime(100); } void loop() { ComunicacionBluetooth(); time_now=millis(); //Mediciones a 100 Hz if((time_now-time_1)>10) { time_1=time_now; getEstimatedInclination(); if(abs(RwEst[0]-x_angle)<0.10) //Esto es para filtrar picos no deseados en la lectura de la inclinacion x_angle= RwEst[0]; if(abs(RwEst[1]-y_angle)<0.10) //Esto es para filtrar picos no deseados en la lectura de la inclinacion y_angle= RwEst[1]; } //Mediciones a 10 Hz if((time_now-time_2)>100) { time_2=time_now; altura2= altura; altura= ultrasonic.Ranging(CM); if(abs(altura-altura2)>3) altura=altura2; //Si la diferencia es mayor a 3 cm se pone de nuevo el valor anterior. Esto para evitar valores no deseados en forma de picos. } PID_EJE_X.Compute(); PID_EJE_Y.Compute(); PID_Altura.Compute(); actualizar_velocidades(); if(vel1>vel_prot||vel2>vel_prot||vel3>vel_prot||vel4>vel_prot){ Activado=0; //apaga motores 81 } imprimir_valores_debug(); } void imprimir_valores_debug(){ //Datos para generación de curvas con serial chart software time_now_debug=millis(); if((time_now_debug-time_1_debug)>50) { time_1_debug=time_now_debug; Serial.print(interval); //microseconds since last sample, please note that printing more data will increase interval Serial.print(","); Serial.print((vel_adelante*0.01)); //velocidad PID derecha Serial.print(","); Serial.print(x_angle); //Inclination Y axis (estimated / filtered) Serial.println(""); } /* //Data para debug de la velocidad de los motores time_now=millis(); if((time_now-time_1)>200) { time_1=time_now; Serial.println("Xaxis "); Serial.println(x_angle, DEC); Serial.println("Yaxis "); Serial.println(y_angle, DEC); Serial.println(" "); Serial.println("Vel1"); Serial.println(vel1, DEC); Serial.println("Vel2"); Serial.println(vel2, DEC); Serial.println("Vel3"); Serial.println(vel3, DEC); Serial.println("Vel4"); Serial.println(vel4, DEC); //Obtencion de datos con el proposito de Debug de Acelerometro Serial.println("XaxisRaw: "); Serial.print(analogRead(0)); 82 Serial.print(", "); Serial.print("YaxisRaw: "); Serial.print(analogRead(1)); Serial.print(", "); Serial.print("ZaxisRaw: "); Serial.print(analogRead(2)); Serial.print(", "); Serial.print("Zero Level: "); Serial.print(config.zeroLevel[0]); Serial.println(""); } */ } void actualizar_velocidades(){ vel1= general_vel + vel_adelante + vel_altura; vel2= general_vel + vel_derecha + vel_altura; vel3= general_vel - vel_adelante + vel_altura; vel4= general_vel - vel_derecha + vel_altura; if(Activado==0){ //Apaga los motores analogWrite(motor1,140); analogWrite(motor2,140); analogWrite(motor3,140); analogWrite(motor4,140); } if(Activado==1){ //Prende los motores analogWrite(motor1,vel1); analogWrite(motor2,vel2); analogWrite(motor3,vel3); analogWrite(motor4,vel4); } } void ComunicacionBluetooth(){ //Para uso con interfaz Bluebots static int i; if (Serial.available() > 0) { // // // Lee los 4 bytes del control remoto: for(i=0;i<4;i++) { incomingByte1[i] = Serial.read(); Serial.print("I received: "); Serial.println(incomingByte1[i], DEC); 83 } //Comando para aumentar el setpoint de la altitud if (incomingByte1[0]==83) { altura_sp= (incomingByte1[1]*altitud_maxima)/100; vel_altura_manual2 =vel_altura_manual; vel_altura_manual= (incomingByte1[1]*altitud_maxima)/100; if(vel_altura_manual==255) vel_altura_manual=vel_altura_manual2; Serial.print("Vel Manual: "); Serial.println(vel_altura_manual, DEC); } //Comando para los setpoints de inclinacion. Recibe los comandos del joystick de la aplicacion. if (incomingByte1[0]==43 || incomingByte1[0]==45) { //Indica posicion y signo de joystick en eje X if(incomingByte1[0]==43){ if(incomingByte1[1]<=5) adelante_sp=0; else adelante_sp= (incomingByte1[1]*sensibilidad_control)/125; } if (incomingByte1[0]==45){ if(incomingByte1[1]<=5) adelante_sp=0; else adelante_sp= (-1*incomingByte1[1]*sensibilidad_control)/125; } if (incomingByte1[2]==43){ if(incomingByte1[3]<=5) derecha_sp=0; else derecha_sp= (incomingByte1[3]*sensibilidad_control)/125; } if (incomingByte1[2]==45){ if(incomingByte1[3]<=5) derecha_sp=0; else derecha_sp= (-1*incomingByte1[3]*sensibilidad_control)/125; } 84 } //Comando para parar todos los motores if (incomingByte1[0]==66) { //66 es el valor del primer byte correspondiente a los botones del 1 al 5 if (incomingByte1[1]==49) Activado=1; //Enciende los motores. Boton 1 if (incomingByte1[1]==50) Activado=0; //Apaga los motores. Boton 2 if (incomingByte1[1]==51) { //Reset de setpoints adelante_sp=0; altura_sp=0; derecha_sp=0; } } } } //Tomado de libreria creada Por Starlino para obtención de ángulos de inclinación. void getEstimatedInclination(){ static int i,w; static float tmpf,tmpf2; static unsigned long newMicros; //new timestamp static char signRzGyro; //get raw adc readings newMicros = micros(); //save the time when sample is taken for(i=0;i<INPUT_COUNT;i++) an[i]= analogRead(i); //compute interval since last sampling time interval = newMicros - lastMicros; //please note that overflows are ok, since for example 0x0001 - 0x00FE will be equal to 2 lastMicros = newMicros; //save for next loop, please note interval will be invalid in first sample but we don't use it //get accelerometer readings in g, gives us RwAcc vector for(w=0;w<=2;w++) RwAcc[w] = getInput(w); //normalize vector (convert to a vector with same direction and with length 1) normalize3DVector(RwAcc); if (firstSample){ for(w=0;w<=2;w++) RwEst[w] = RwAcc[w]; }else{ //evaluate RwGyro vector if(abs(RwEst[2]) < 0.1){ //initialize with accelerometer readings 85 //Rz is too small and because it is used as reference for computing Axz, Ayz it's error fluctuations will amplify leading to bad results //in this case skip the gyro data and just use previous estimate for(w=0;w<=2;w++) RwGyro[w] = RwEst[w]; }else{ //get angles between projection of R on ZX/ZY plane and Z axis, based on last RwEst for(w=0;w<=1;w++){ tmpf = getInput(3 + w); //get current gyro rate in deg/ms tmpf *= interval / 1000.0f; //get angle change in deg Awz[w] = atan2(RwEst[w],RwEst[2]) * 180 / PI; //get angle and convert to degrees Awz[w] += tmpf; //get updated angle according to gyro movement } //estimate sign of RzGyro by looking in what qudrant the angle Axz is, //RzGyro is pozitive if Axz in range -90 ..90 => cos(Awz) >= 0 signRzGyro = ( cos(Awz[0] * PI / 180) >=0 ) ? 1 : -1; //reverse calculation of RwGyro from Awz angles for(w=0;w<=1;w++){ RwGyro[0] = sin(Awz[0] * PI / 180); RwGyro[0] /= sqrt( 1 + squared(cos(Awz[0] * PI / 180)) * squared(tan(Awz[1] * PI / 180)) ); RwGyro[1] = sin(Awz[1] * PI / 180); RwGyro[1] /= sqrt( 1 + squared(cos(Awz[1] * PI / 180)) * squared(tan(Awz[0] * PI / 180)) ); } RwGyro[2] = signRzGyro * sqrt(1 - squared(RwGyro[0]) - squared(RwGyro[1])); } //combine Accelerometer and gyro readings for(w=0;w<=2;w++) RwEst[w] = (RwAcc[w] + config.wGyro* RwGyro[w]) / (1 + config.wGyro); normalize3DVector(RwEst); } firstSample = 0; } void normalize3DVector(float* vector){ static float R; R = sqrt(vector[0]*vector[0] + vector[1]*vector[1] + vector[2]*vector[2]); vector[0] /= R; vector[1] /= R; vector[2] /= R; } float squared(float x){ return x*x; } //For accelerometer it will return g (acceleration) , applies when xyz = 0..2 //For gyro it will return deg/ms (rate of rotation) , applies when xyz = 3..5 float getInput(char i){ static float tmpf; //temporary variable tmpf = an[i] * VDD / 1023.0f; //voltage (mV) tmpf -= config.zeroLevel[i]; //voltage relative to zero level (mV) tmpf /= config.inpSens[i]; //input sensitivity in mV/G(acc) or mV/deg/ms(gyro) tmpf *= config.inpInvert[i]; //invert axis value according to configuration return tmpf; } 86