ESCUELA POLITÉCNICA NACIONAL FACULTAD DE INGENIERÍA ELÉCTRICA Y ELECTRÓNICA CONSTRUCCIÓN Y PROGRAMACIÓN DE UN GRUPO DE ROBOTS MÓVILES SOBRE LA BASE DEL PRODUCTO LEGO MINDSTORMS NXT PROYECTO PREVIO A LA OBTENCIÓN DEL TÍTULO DE INGENIERO EN ELECTRÓNICA Y CONTROL MEDARDO ÁNGEL SILVA AMORES medsilva@yahoo.com.mx DIRECTORA: Ing. ANA RODAS ana.rodas@epn.edu.ec Quito, julio de 2011 i DECLARACIÓN Yo, Medardo Ángel Silva Amores, declaro bajo juramento que el trabajo aquí descrito es de mi autoría; que no ha sido previamente presentado para ningún grado o calificación profesional; y, que he consultado las referencias bibliográficas que se incluyen en este documento. A través de la presente declaración cedo mis derechos de propiedad intelectual correspondientes a este trabajo, a la Escuela Politécnica Nacional, según lo establecido por la Ley de Propiedad Intelectual, por su Reglamento y por la normatividad institucional vigente. _______________________ Medardo Ángel Silva Amores ii CERTIFICACIÓN Certifico que el presente trabajo fue desarrollado por Medardo Ángel Silva Amores, bajo mi supervisión. _________________________ Ing. Ana Rodas B. DIRECTORA DEL PROYECTO iii AGRADECIMIENTO Mi profundo agradecimiento a la Ing. Ana Rodas, cuya ayuda y estímulo ha sido determinante para facilitar la terminación de este tan esperado proyecto. iv DEDICATORIA Mucho tiempo tomó el llegar a este momento y posiblemente la persona que más se alegrará porque finalmente se produjo es mi madre, a quien va dedicado este trabajo. v RESUMEN El presente trabajo tiene como principal objetivo el construir y programar un conjunto de robots móviles sobre la base del producto Lego Mindstorms en su versión NXT 1.0. Para ello se ha propuesto la construcción y programación de algunos prototipos que pretenden principalmente mostrar las diferentes opciones que ofrece el producto mencionado. Los prototipos diseñados usan, en conjunto, todos los sensores con los que viene equipado el kit 8527: de contacto, de luz, de sonido, de ultrasonido y de rotación. Los programas desarrollados intentan aprovechar las principales características con las que puede ser programado el ladrillo programable NXT: manejo de entradas y salidas, contadores, temporizadores, subrutinas, estructuras de lazo, funciones que permiten tomar decisiones, almacenamiento de datos, generación de tonos, comunicación entre ladrillos mediante bluetooth, etc. Como lenguajes de programación se utilizan, de entre las múltiples opciones existentes en el mercado y en el ciberespacio, el lenguaje propio del fabricante, NXT-G, y otro que se encuentra dentro de la categoría de software libre y que es conocido como NXC. El lenguaje de programación NXT-G está desarrollado sobre la plataforma de Labview y tiene características gráficas que lo hacen simple de manipular, pero que resulta engorroso cuando se trata de hacer programas un poco largos o cuando se requiere de una mayor capacidad de procesamiento numérico. El segundo lenguaje presentado, el NXC (Not eXactly C), tiene mejores características frente al anterior ante los dos criterios mencionados y está desarrollado sobre una plataforma de lenguaje C. Se han desarrollado las siguientes aplicaciones: un medidor de longitud, una calculadora de área y volumen a partir de la medición de longitudes, un escorpión que reacciona ante estímulos externos, un brazo mecánico que incluye la posibilidad de reconocer colores, un auto controlado con un algoritmo PID para mantener una posición relativa hacia un objeto, un seguidor de línea y una aplicación de control remoto mediante bluetooth. vi PRESENTACIÓN El trabajo desarrollado ha sido estructurado de tal manera que se puede estudiar, de forma separada, la construcción del hardware y el diseño del software. Aún cuando los dos aspectos están siempre íntimamente relacionados, esta forma de presentación permite descubrir fácilmente las dificultades que muestra cada aspecto del diseño. En el capítulo 1 se presentan algunos conceptos básicos sobre la robótica y sus aplicaciones, colocando mayor énfasis en la parte educativa y en la investigación. Se hace una presentación del producto Lego Mindstorms y de su evolución a través del tiempo y se ofrecen también algunos ejemplos de universidades que trabajan en proyectos de investigación y lo usan como recurso principal, dada su gran versatilidad. En el capítulo 2 se realiza una descripción detallada del hardware contenido en un kit de Lego Mindstorms 8527. Se mencionan lo principios físicos y eléctricos con los que funcionan los sensores incluidos en el equipo, así como los de los servomotores existentes. Una gran parte de este capítulo está destinada a la descripción física de los prototipos diseñados en todo el trabajo. En el capítulo 3 se presentan los lenguajes de programación que van a ser utilizados durante el desarrollo de este proyecto, no sin antes mencionar las diferentes opciones que existen en el mercado y de forma libre en el ciberespacio. Los programas desarrollados para los prototipos diseñados son también detallados en este capítulo. En el capítulo 4 se muestran los resultados de algunas de las pruebas realizadas sobre los prototipos armados y se mencionan adicionalmente las dificultades mostradas por los diseños propuestos en su funcionamiento y, por tanto, sus limitaciones. vii Finalmente se presentan conclusiones válidas sobre el trabajo desarrollado y algunas recomendaciones que podrían ser tomadas en cuenta por futuros usuarios del producto y de este documento. viii CONTENIDO Página CAPÍTULO 1: Estudio de sistemas y aplicaciones robóticas 1 1.1 Robótica 1 1.2 Robótica didáctica 3 1.2.1 Campo de aplicación 5 1.3 Fabricantes de kits para la educación 6 1.4 Historia de Lego 7 1.5 Lego Mindstorms en la universidad 10 1.6 Aplicaciones a desarrollar 13 1.6.1 Medidores de varias magnitudes 13 1.6.2 Escorpión 13 1.6.3 Brazo mecánico 14 1.6.4 Vehículo con control de posición PID 14 1.6.5 Seguidor de línea 14 1.6.6 Control remoto mediante bluetooth 14 CAPÍTULO 2: Diseño e implementación de los módulos 16 2.1 Características de Lego Mindstorms NXT 16 2.1.1 Hardware (CPU) 16 2.1.1.1 Estructura interna del ladrillo NXT 19 2.1.1.2 Puertos del ladrillo NXT 20 2.1.1.3 Manejo de energía 21 2.1.1.4 Comunicaciones 22 2.1.1.4.1 Comunicación entre ladrillos mediante bluetooth 23 2.1.1.5 Sonido 24 2.1.1.6 Botones 24 2.1.2 Sensores 25 2.1.2.1 Sensor de contacto 25 2.1.2.2 Sensor de luz 26 ix Página 2.1.2.3 Sensor de ultrasonido 27 2.1.2.4 Sensor de sonido 28 2.1.3 Los motores de Lego NXT 29 2.1.4 Conjunto de piezas 31 2.2 Desarrollo de los módulos 37 2.2.1 Medidor de variables múltiples 37 2.2.1.1 Medidor de longitudes 37 2.2.1.2 Calculadora de área y volumen 41 2.2.1.3 Medidor de sonido 42 2.2.2 Escorpión 44 2.2.3 Brazo mecánico 50 2.2.4 Vehículo controlado mediante algoritmo PID 58 2.2.5 Seguidor de línea 63 2.2.6 Aplicaciones remotas 68 CAPÍTULO 3: Desarrollo de la programación 69 3.1 Lenguajes de programación 69 3.2 Lenguaje de programación NXT-G 74 3.2.1 Entorno de programación del lenguaje NXT-G 75 3.2.2 Bloques 76 3.2.3 Controles de salida 77 3.2.4 Controles de entrada 79 3.2.5 Las comunicaciones 81 3.2.6 Flujo del programa 82 3.2.7 Otros bloques 83 3.2.8 Bloques definidos por el usuario 84 3.2.9 Variables 85 3.2.10 Operaciones matemáticas 86 3.2.11 Bloques especiales 87 3.2.12 Cables de datos 89 3.3 Lenguaje de programación NXC 90 3.3.1 Entorno de programación para el lenguaje NXC 91 x Página 3.3.2 Programación en NXC 92 3.3.2.1 Programas con NXC 93 3.3.2.2 Variables 94 3.3.2.3 Conjuntos definidos por el usuario 95 3.3.2.4 Arreglos 95 3.3.2.5 Asignaciones 95 3.3.2.6 Estructuras 96 3.3.2.7 Expresiones 97 3.3.2.8 Condiciones 98 3.3.2.9 NXC API 98 3.3.2.9.1 Funciones de temporización 98 3.3.2.9.2 Funciones de control del programa 99 3.3.2.9.3 Funciones de cadenas de caracteres 100 3.3.2.9.4 Funciones numéricas 100 3.3.2.10 Módulo de entrada 100 3.3.2.11 Módulo de salida 101 3.3.2.12 Módulo de sonido 102 3.3.2.13 Módulo de pantalla LCD 102 3.3.2.14 Módulo de comunicaciones 103 3.3.2.15 Manejo de archivos 104 3.4 Programación de los módulos desarrollados 105 3.4.1 Medidor de variables múltiples 105 3.4.1.1 Medidor de longitudes 105 3.4.1.1.1 Diagrama de flujo del medidor de longitudes 107 3.4.1.1.2 Código NXT-G del medidor de longitudes 108 3.4.1.2 110 Calculadora de área y volumen 3.4.1.2.1 Diagrama de flujo de la calculadora de áreas y volúmenes 110 3.4.1.2.2 Código NXT-G de la calculadora de áreas y volúmenes 112 3.4.1.3 115 Medidor de sonido 3.4.1.3.1 Diagrama de flujo del medidor de sonido 116 3.4.1.3.2 Código NXT-G del medidor de sonido 117 3.4.2 118 Escorpión xi Página 3.4.2.1 Diagrama de flujo del programa del “escorpión” 118 3.4.2.2 Código NXC del programa del “escorpión” 120 3.4.3 Brazo mecánico 122 3.4.3.1 Diagrama de flujo del programa del brazo mecánico 123 3.4.3.2 Código NXC del programa del brazo mecánico 125 3.4.4 Vehículo controlado mediante un algoritmo PID 129 3.4.4.1 Diagrama de flujo del programa del controlador PID 132 3.4.4.2 Código NXC del programa del controlador PID 133 3.4.5 Seguidor de línea 137 3.4.5.1 Diagrama de flujo del seguidor de línea 139 3.4.5.2 Código NXC del programa del seguidor de línea 139 3.4.6 Aplicaciones remotas 141 3.4.6.1 Programa del controlador (mando) 141 3.4.6.1.1 Diagrama de flujo del mando a distancia 142 3.4.6.1.2 Código NXT-G del controlador (mando) 144 3.4.6.2 145 Programa del vehículo controlado 3.4.6.2.1 Diagrama de flujo del programa del vehículo controlado 145 3.4.6.2.2 Código NXT-G del vehículo controlado 147 CAPÍTULO 4: Pruebas y resultados 149 4.1 Medidores de variables múltiples 149 4.1.1 Medidor de longitudes 149 4.1.2 Calculadora de áreas y volúmenes 150 4.1.3 Medidor de sonido 152 4.2 Escorpión 154 4.3 Brazo mecánico 155 4.4 Vehículo controlado mediante algoritmo PID 156 4.5 Seguidor de línea 160 4.6 Aplicaciones remotas 164 CAPÍTULO 5: Conclusiones y recomendaciones 166 5.1 166 Conclusiones xii Página 5.2 Recomendaciones 167 Referencias bibliográficas 169 Anexos 173 Anexo A: Sistema de bola y viga desarrollado sobre la base del producto Lego Mindstorms NXT Anexo B: Menú principal del NXT Anexo C: Diagramas eléctricos del hardware utilizado en el producto Lego Mindstorms NXT 1 CAPÍTULO 1 ESTUDIO DE SISTEMAS Y APLICACIONES ROBÓTICAS 1.1 ROBÓTICA El término robot fue introducido por el escritor checoslovaco Karen Čapeck, fallecido en 1938, quien incluyó en una de sus obras la palabra robota, que significa trabajo. La obra se llamaba “R.U.R.” (Rossum´s Universal Robots) y en ella se presenta al obrero moderno como un esclavo mecánico. Los robots y el término robótica se volvieron populares en los años cuarenta gracias al autor de ciencia ficción Isaac Asimov, quien asimismo planteó las leyes de la robótica (Runabout, 1942). En general se entiende como robot a una máquina que tiene forma humana y realiza tareas humanas. Otra definición dice que robot es un manipulador multifuncional y reprogramable, diseñado para mover materiales, piezas, herramientas o dispositivos especiales, mediante movimientos programables y variables que permitan llevar a cabo diversas tareas. En el inicio del desarrollo de los robots se perseguía que estos realicen las tareas que son peligrosas o que traen riesgos para el hombre; actualmente se busca además que puedan ejecutar procesos cognitivos y no necesariamente seguirán la inconveniente forma humana -para algunos procesos- en su diseño. Entre las principales características de un robot se encuentran su gran versatilidad al poder ejecutar diversas tareas o una misma tarea de diversas maneras y su autoadaptabilidad al entorno, lo que exige que el mismo cuente con sentidos artificiales que le permitan "darse cuenta" de la forma en la que debe cumplir su tarea. Los robots son, por lo tanto, dispositivos compuestos de sensores que reciben datos de entrada, un sistema central de control que al recibir tal información 2 ordena al robot que efectúe una determinada acción y, finalmente, los dispositivos que ejecutan las acciones en el medio externo. En resumen, un robot consiste básicamente de cinco componentes: 1. Un cerebro que ordena la ejecución de acciones y que reacciona frente a la información proveniente de los sensores. El cerebro es normalmente un sistema microprocesado. 2. El cuerpo del robot o simplemente el chasis, que mantiene unidas a sus diferentes partes. 3. Los actuadores que permiten el movimiento del robot. Se tratan normalmente de motores eléctricos, pero también pueden haber otras posibilidades como pistones hidráulicos o neumáticos, etc. 4. Los sensores que dan al robot la información sobre su entorno. 5. Una fuente de energía que permite el funcionamiento del cerebro, actuadores y sensores. Este componente no siempre es parte del robot en sí mismo. Para clasificar los robots se pueden establecer diversos criterios: funcionalidad, geometría, inteligencia, etc. Las características con las que se clasifican los robots son: - propósito o función, - sistema de coordenadas empleado, - número de grados de libertad, - generación del sistema de control. A continuación se presenta una posible forma de clasificar los robots - [1] : Industriales o manipuladores: suelen tener la forma de un brazo articulado en cuyo extremo se incorporan elementos de sujeción o herramientas. Estas máquinas realizan tareas repetitivas en industrias de automoción y se usan para montar piezas, moverlas, ajustarlas, soldarlas, pintarlas, etc. 3 - Móviles o vehículos robot: se desplazan usando ruedas, orugas o patas articuladas y se utilizan para suministrar herramientas o materiales a los manipuladores, para transportar materiales peligrosos, para colocar cables submarinos, explorar el fondo del mar o para hacer exploraciones espaciales. - Prótesis para uso humano: son dispositivos electromecánicos que realizan el trabajo de las manos, los dedos o las piernas de los seres humanos. - Didácticos o experimentales: se utilizan en la enseñanza y el aprendizaje de la robótica. Dentro de este tipo de robots se incluyen los juguetes que imitan algunas funciones de los robots experimentales. - Manos teledirigidas (telchirs): dedicadas a manipular productos radioactivos o peligrosos y a colaborar en operaciones quirúrgicas controladas de forma remota por cirujanos expertos (telecirugía). - Instalaciones inteligentes: sirven para controlar de manera automatizada las mercancías de almacenes o los libros de bibliotecas, entre otras aplicaciones. - Microrobots o nanorobots: constituyen la última tendencia en las investigaciones en el campo de la robótica. Se trata de dispositivos de tamaños de centímetros y milímetros con los que se actúa, por ejemplo, en el cuerpo humano para realizar intervenciones en vasos sanguíneos dañados o en el interior de máquinas para diagnosticar posibles averías. 1.2 ROBÓTICA DIDÁCTICA [2][3][4][5] Durante las últimas décadas investigadores e industrias han propuesto y desarrollado kits que permiten la construcción de robots, diseñados para estimular el aprendizaje de conceptos y métodos relativos a la educación de estudiantes en contenidos científicos tales como informática, mecánica, matemática y física. Los kits incluyen pequeños motores, sensores, ruedas, engranajes, poleas y relés, es decir, todo aquello que el estudiante necesita para construir robots. Existen productos que incluyen cables y/o equipamientos de radio que posibilitan conectar al robot con un computador personal, lo que a su vez permite al usuario programar y controlar el invento. 4 Algunos de estos kits han sido desarrollados de acuerdo a los principios educativos derivados de las teorías del desarrollo cognitivo de Jean Piaget (1966) y revisados por Seymour Papert (1980-1986), profesor del Media Lab del Instituto Tecnológico de Massachusetts. Su enfoque indica que, en el centro de todo proceso de aprendizaje, es el papel activo de quien aprende el que amplía su conocimiento a través de la manipulación y construcción de objetos. Esta filosofía sugiere que la tradicional construcción a partir de kits concebidos para ello, es muy adecuada como herramienta de aprendizaje. Sin embargo, dar vida a un objeto por medio de la interacción con un computador personal hace posible desarrollar aplicaciones que van más allá de la idea original de los que propusieron esta metodología. En los cursos tradicionales de informática pocas veces se enseña a los alumnos sobre las indeterminaciones de la interacción en el mundo real; de hecho, a menudo intentan abstraerse del mundo real y construyen sistemas completamente deterministas. Esto puede generar problemas a los ingenieros que posteriormente deben diseñar y/o programar sistemas de control para el mundo real. Los problemas son, a menudo, debidos a que los estudiantes yerran al ver al robot desde su propio punto de vista, ya que confían en abstracciones poco realistas en las que han sido adiestrados a lo largo de su educación. Por medio de la experimentación con sensores, motores y su control, los estudiantes modifican gradualmente su percepción de la interacción entre el robot y el mundo real, modificando continuamente sus diseños hasta convertirlos en realistas y funcionales. El éxito de este tipo de experimento educativo es parcialmente debido a la facilidad del ensamblaje de los kits de construcción disponibles en el mercado, los mismos que permiten a los estudiantes encontrar soluciones sencillas a problemas físicos no siempre sencillos. Los estudiantes adquieren una comprensión profunda de las discrepancias entre los resultados pronosticados en la fase de diseño y los realmente producidos por sus máquinas, aprendiendo a 5 reducir tal diferencia entre diseño y construcción, lo que es fundamental para la innovación tecnológica. 1.2.1 CAMPO DE APLICACIÓN Se han construido, por ejemplo, pequeñas máquinas que simulan el comportamiento de animales en sus entornos, ambos construidos artificialmente y que consideran condiciones reales. Tales prototipos son esencialmente robots móviles que, como los animales reales, tienen un aparato sensorial (por ejemplo, sensores sensibles a la luz o el calor), un sistema motriz (por ejemplo, brazos mecánicos o ruedas controladas por motores) y un cerebro (programa de computador que reacciona ante las señales captadas por los sensores). Estas máquinas pueden ser consideradas como organismos artificiales y ser usadas con propósitos educativos y en investigación básica, como en la psicología (investigación del comportamiento), etología (ciencia de las costumbres) y robótica. Los experimentos que se desarrollan ayudan a los estudiantes a asimilar conceptos que de otra manera serían abstractos y confusos. Se asimilan nociones complejas a través de la construcción de sistemas compuestos por varios componentes de hardware y software y se aprende a estudiar la realidad desde diferentes puntos de vista, es decir, desde diferentes niveles de análisis, observando el comportamiento de robots individuales y el comportamiento global que surge de la interacción entre estos individuos. Es importante indicar que no se trata de introducir nuevas nociones o conceptos, sino nuevos modos de observación y razonamiento que puedan ayudar a las personas a evaluar con más atención la realidad en la que viven. El posible campo de aplicación de la creación de organismos artificiales es realmente ilimitado: se ha demostrado la pertinencia de su uso tanto a nivel escolar como a nivel superior. 6 La experiencia demuestra que muchos ingenieros tienen a menudo un excelente conocimiento de los conceptos teóricos fundamentales en su disciplina, pero insuficiente experiencia en el diseño y construcción de prototipos industriales. 1.3 FABRICANTES DE KITS PARA LA EDUCACIÓN[6] Hay varias propuestas de hardware para usar la robótica en aplicaciones educativas. En general, se puede agrupar estas sugerencias de la siguiente manera: 1) adquisición de un robot con una morfología predefinida, y 2) construcción de un robot a partir de pequeñas piezas. En cuanto a la primera opción, existen en el mercado muchas ofertas de robots de uso adecuado para el aula. Estos robots se venden en una configuración básica y es posible adquirir módulos adicionales de acuerdo a la necesidad específica. Este tipo de robots suele ser adecuado para su uso por parte de estudiantes universitarios y de postgrado. En muchos otros casos, un robot con una morfología predefinida es inapropiado. Por ejemplo, si la idea es aprender sobre engranajes, motores y sensores, es mejor tener la posibilidad de experimentar prácticamente al construir su propio robot físico. La segunda opción antes indicada es en este caso la más adecuada. En el mercado existen también algunas posibilidades, de entre las cuales se mencionan las marcas y/o productos: National Instruments y MobileRobots Inc., Handy Board y Super Cricket del MIT, LEGO, Fischertechnik, Meccano, Parallax Inc., NeoRobotic, etc. Los productos mencionados no proporcionan la misma precisión de los robots industriales, pero son usados en procesos didácticos y de investigación. En la situación que ocupa el presente trabajo, se tratará únicamente con el producto Lego Mindstorms en su versión NXT, la misma que se encontró disponible a partir de agosto de 2006 en su versión inicial. 7 1.4 HISTORIA DE LEGO [7] LEGO es el nombre de una empresa de juguetes de origen danés reconocida principalmente por sus bloques de plástico interconectables. La compañía fue fundada en 1932 y el nombre LEGO fue adoptado por la misma en 1934, formado por la frase del danés "leg godt", que significa "jugar bien". Los orígenes de este juguete corresponden a un pobre carpintero de Billund, Dinamarca, llamado Ole Kirk Christiansen. El concepto de “jugar bien” sigue siendo la filosofía de los productos Lego, alentando a los niños a ser abiertos y curiosos, a estimular su creatividad, imaginación y aprendizaje mientras se divierten. Los juguetes producidos por Lego fueron construidos hasta 1949 casi exclusivamente de madera. En este año se desarrollaron juguetes de plástico con bloques interconectables, los mismos que llevaron a la marca a la fama. El material que se usó en ese entonces fue acetato de celulosa y el éxito residía en que los bloques no solo podían apilarse unos sobre otros, sino también en que podían trabarse entre ellos, aunque fue recién en 1958 en que el diseño actualmente conocido fue desarrollado. Fue también en este año en que, ante el fallecimiento de Ole Kirk, su hijo Godtfred heredó el liderazgo de la compañía. En los años 1961 y 1962 se agregaron las primeras ruedas Lego, lo que permitió a la empresa emprender la construcción de camiones, automóviles, autobuses y otros vehículos. De la misma manera, Lego hizo convenios con empresas que le permitieron introducirse en el mercado pre-escolar. En 1963 se abandonó el acetato de celulosa como material para fabricar las piezas de Lego y se pasó a usar acrilonitrilo butadieno estireno, o plástico ABS, material que dio mayor estabilidad a los ladrillos de Lego. El ABS es más resistente al calor, a ácidos, a sales y a otros químicos y no es tóxico. Una gran ventaja de los ladillos Lego fabricados con ABS es que las piezas construidas en 8 1963 son perfectamente interconectables con piezas producidas en el año 2004, por ejemplo. Lego ha incursionado en algunas líneas con sus productos y ha fabricado modelos para armar trenes, los mismos que incluían motores de 4,5V y que luego fueron reemplazados por otros de 12V. De la misma manera, pensando en una mayor seguridad para los usuarios más pequeños, abrió la línea Duplo, la misma que incluye ladrillos de tamaño mayor que las piezas anteriores. La conectividad entre estos productos se mantiene. En 1974 fueron creadas las figuras humanas con brazos articulados y se convirtieron en producto estrella. Más adelante, entre los años 1975 y 1977 se crearon los juegos “serie experto” y luego “constructor experto”, los mismos que incorporaban engranajes, ruedas dentadas, palancas, ejes y coyunturas universales y así se permitió el ensamblaje de vehículos mucho más cercanos a los reales. De la misma manera se han producido expansiones significativas de la línea Lego incluyendo cada vez nuevos productos: FABULAND (orientada a niños pequeños); SCALA (elementos de joyería destinados a niñas pequeñas); LEGO DACTA (productos para uso educativo); Technic (incluye también elementos neumáticos); Bionicle (reemplazó al diseño de las clásicas figuras Lego); Pneumatic (elementos neumáticos); series de piratas, Star Wars, Harry Potter, basketball, transporte, etc. Existe una gran cantidad de ingeniería en el diseño y fabricación de cada pieza de Lego. Para que piezas de series antiguas puedan ser fácilmente combinadas con piezas de modelos nuevos se requiere de altos estándares de calidad. El grado de tolerancia máximo permitido está en 2 milésimas de milímetro (0,002mm) y se asegura que máximo 18 de cada un millón de piezas no cumplen con esta característica. Esto asegura el agarre que debe existir entre piezas Lego de diferentes colecciones y el hecho de que muchos aficionados de Lego acoplen fácilmente sus colecciones de la niñez a los nuevos modelos. 9 Uno de los productos que ha generado gran atractivo y expectativa en los últimos años es el que corresponde a la serie denominada Lego Mindstorms. En 1998 Lego proporciona el primer conjunto Mindstorms: Robotics Invention System (RIS 1.0). Este producto aparece como un juguete destinado a los mayores de 12 años, aunque tuvo su mayor aceptación en los usuarios adultos. Además de las típicas piezas de Lego, se incluyen motores de corriente continua, sensores y una pieza muy importante, el RCX. El RCX era un ladrillo programable que le permitía interactuar con el entorno. Está basado en el microprocesador H8 de Hitachi y proporciona convertidores A/D, comunicación serial y temporizadores. Internamente tiene 16 KB de memoria ROM y 33 KB de RAM, tiene una interfaz para tres actuadores y tres sensores y un puerto de comunicaciones de infrarrojos, así como una pantalla de cristal líquido, cuatro botones y un pequeño altavoz. El RCX fue elaborado en cooperación entre Lego y el Instituto Tecnológico de Massachusetts y existe un gran número de entusiastas que han publicado soluciones basadas en estos dispositivos en revistas como IEEE Robotics and Automation Magazine e IEEE Control Systems Magazine, entre otras. La versión NXT corresponde a la última existente del producto Mindstorms y fue lanzada al mercado en agosto de 2006. Esta versión incluye el nuevo ladrillo programable NXT, así como otros cambios menores en las piezas de construcción -la mayoría proveniente de la serie Technics- y en los sensores electrónicos. Una gran diferencia con el RCX es que permite las comunicaciones mediante USB y bluetooth, eliminándose así las limitaciones de los infrarrojos, propios de RCX, y permitiendo distancias de control mucho más grandes y sobre algunos obstáculos, sin exigir una determinada orientación entre emisor y receptor. La versión inicial de NXT, lanzada en el año 2006, traía 577 piezas, entre las que se incluían 3 servomotores, 4 sensores (ultrasónico, de contacto, de sonido y de luz), 7 cables de conexión, un cable de interfase USB y el ladrillo programable. El kit incluía NXT-G, un ambiente de programación que posibilita la creación y descarga de programas hacia el ladrillo NXT. 10 La nueva versión del NXT (2.0) fue lanzada en agosto de 2009 y contiene 619 piezas entre las que se incluyen motores y sensores (el nuevo sensor de color, dos sensores de contacto y el sensor ultrasónico). El NXT 2.0 permite la ejecución de operaciones aritméticas de punto flotante, mientras que las versiones anteriores solo permitían operaciones con números enteros. 1.5 LEGO MINDSTORMS EN LA UNIVERSIDAD Los productos Lego fueron inicialmente creados como juguetes para niños y lograron finalmente convertirse en equipos que atraen tanto a niños como adultos y que pueden ser fácilmente incorporados en medios educativos como herramienta para la investigación y aprendizaje en todos los niveles. En la actualidad, prácticamente todas las universidades a nivel mundial poseen kits de Lego que incluyen “ladrillos inteligentes” y se usan en áreas relacionadas con la robótica y la mecatrónica. En el Instituto Tecnológico de Massachusetts (MIT por sus siglas en inglés), por ejemplo, se han organizado cursos de "Diseño y Construcción de Robots Lego" con el objeto básico de estimular las capacidades de diseño y desarrollo en jóvenes estudiantes de ingeniería. Luego de dividir al total de estudiantes en grupos de trabajo, cada grupo se dedica a buscar la solución a un mismo problema. Al final, se presentan todas las soluciones y se escoge un ganador, que será quien presente la alternativa más eficiente. A continuación se mencionan algunas de las tantas universidades que hacen uso del producto Lego Mindstorms en sus versiones RCX y NXT tanto para el estudio de ingeniería como para la investigación en diferentes ámbitos de la ciencia: - En el Laboratorio de Computación de Ciencias de la Educación de la Universidad de Colorado Boulder se ofrecen cursos de Introducción al diseño en Ingeniería mediante productos Mindstorms[8]. El laboratorio de inteligencia artificial de la Universidad de Zurich, en Suiza, colabora 11 también con este proyecto como una de las entidades que aportan con investigaciones. - En el Centro de Enseñanza de la Ingeniería y la Divulgación (CEEO) de la Universidad Tufts (Massachusetts) y en asociación con la división educativa de Lego se ofrecen resultados de investigaciones y desarrollos en cuanto a aplicaciones, así como también se presenta una amplia oferta de recursos para educadores.[9] - En el Departamento de Ingeniería de Sistemas y Automática de la Universidad Politécnica de Valencia se han desarrollado estudios sobre “Desarrollo y Control de Robots Móviles de Bajo Coste”, apuntando al producto Lego Mindstorms como una de las principales soluciones en ese sentido. [10] - Un grupo de investigadores de la Universidad de Málaga (UMA) en España ha desarrollado un prototipo basado en Lego Mindstorms NXT que permite reconocer y sugerir temas musicales, esto dentro del campo de la inteligencia artificial. - En la Universidad Técnica Particular de Loja (UTPL) se han desarrollado proyectos dentro del campo de los videojuegos mediante el uso de la tecnología del NXT y LabView. - En la ESPOL, en el desarrollo de sistemas de adquisición de datos mediante la construcción de sensores compatibles con el ladrillo NXT. - En la Universidad RWTH de Aachen, Alemania, se ofrece a sus estudiantes de ingeniería cursos de programación de Lego Mindstorms con Matlab y se desarrollan aplicaciones en el campo del procesamiento digital de señales. En esta universidad se ha desarrollado un kit de herramientas para programar robots Lego mediante Matlab.[11] - En la Universidad de Cambridge, Reino Unido, se hace que los estudiantes de ingeniería planteen soluciones a problemas relacionados con el diseño de sistemas de ingeniería, desde su parte estructural hasta los sistemas de control, haciendo uso de herramientas como Matlab. - En la Universidad de Ciencia y Tecnología de New Jersey (NJIT) se realizan proyectos de construcción de robots capaces de realizar tareas de cirugía. 12 - En la Universidad de Magdeburg Otto-von-Guericke en Alemania se hace uso de Lego Mindstorms en los cursos de cibernética. - En la Universidad Friedrich Schiller de Jena, Alemania, se utiliza Lego Mindstorms en el desarrollo de proyectos de biomecánica. - En la Universidad de Lund, Suecia, en el desarrollo de proyectos de control y automatización. - En la Universidad de Ottawa, Canadá, en los cursos introductorios de Sistemas de Control. - En la Escuela de Ingeniería Eléctrica y Electrónica de la Universidad Tecnológica de Nanyang, Singapur, como posibilidad para el desarrollo de aplicaciones robóticas y de control. Como se observa, el número de universidades y centros de estudios superiores que aprovechan del producto es realmente interminable y esto se debe principalmente a sus notables ventajas, entre las cuales destacan: - Permitir una fácil validación experimental de la efectividad y robustez de los algoritmos con los que son programados robots móviles. - Hardware de costo relativamente bajo. - Permitir el crecimiento de alternativas abiertas de programación, ya que Lego abrió la arquitectura de su producto Mindstorms en la versión NXT. - Versatilidad para ser usados en un sinnúmero de experimentos, los mismos que van desde un único robot hasta un sistema de robots múltiples, desde un esquema de control centralizado hasta uno descentralizado, - En el tema educativo es importante el hecho de incentivar el trabajo en equipo, así como la programación de equipos reales, la construcción e integración de sistemas e informaciones multidisciplinarias. Entre las principales desventajas cabe mencionar que estos equipos no proporcionan la misma precisión que los robots industriales. 13 1.6 APLICACIONES A DESARROLLAR Para el desarrollo del proyecto se cuenta con tres módulos (número de producto: 8527), cada uno con un ladrillo programable NXT. La versión del producto es la 1.0, lo que quiere decir que no se cuenta por ejemplo con el sensor de color, propio de la versión NXT 2.0, ni tampoco se tiene la opción de programar con aritmética de punto flotante. En dependencia de la tarea que se vaya a resolver se utilizarán uno o más de los sensores disponibles: de contacto, de luz, de ruido y de ultrasonido, así como los motores existentes, en un número máximo de tres. De entre el gran abanico posible de aplicaciones para el producto Lego Mindstorms se ha escogido desarrollar algunas que permitirán reconocer sus características y mostrar la versatilidad del producto: 1.6.1 MEDIDORES DE VARIAS MAGNITUDES Mediante el uso de los sensores con los que cuenta el kit de Lego Mindstorms NXT se diseñará un medidor de distancia y, a partir de él, una calculadora de áreas y volúmenes, así como también se realizará un medidor de sonido que permite visualizar su nivel en la pantalla del NXT. Los prototipos usarán los sensores de rotación incluidos en los servomotores y el sensor de sonido. 1.6.2 ESCORPIÓN Se intenta simular el comportamiento de un escorpión ante la presencia de un “intruso”. El prototipo hace uso del sensor de ultrasonido para detectar la distancia a la que se encuentra el “intruso” y para saber cuándo “picar” con su aguijón y del sensor de sonido para actuar ante la existencia de un nivel de ruido que supera un cierto valor umbral. 14 1.6.3 BRAZO MECÁNICO Se diseñará un brazo mecánico que permitirá detectar la presencia de objetos de cierto color y moverlos de un lugar a otro. Previamente se tiene que definir los límites entre los cuales se va a desplazar su parte móvil. El prototipo hace uso de los sensores de rotación incluidos en los servomotores, del sensor de luz que permite “distinguir colores” de los objetos y del sensor de contacto, que en este caso actúa como un sensor de final de carrera. 1.6.4 VEHÍCULO CON CONTROL DE POSICIÓN PID Un vehículo de estructura mecánica sencilla debe mantener una distancia fija en relación a un objeto, la misma que ha sido previamente definida. Si el objeto de referencia cambia de ubicación, el vehículo tiene que seguirlo y al final ubicarse de tal forma que se consiga el objetivo inicial. El software, basado en un algoritmo PID, debe permitir cambiar los valores de las constantes que intervienen para poder probar algunas opciones de control. El prototipo utiliza principalmente el sensor ultrasónico para determinar en todo momento la distancia a la que se encuentra el objeto de referencia. 1.6.5 SEGUIDOR DE LÍNEA Un vehículo con una configuración mecánica que le permita realizar giros, se convertirá en un “robot seguidor de línea”. El robot utilizará principalmente un sensor de luz para determinar la trayectoria o línea a seguir. 1.6.6 CONTROL REMOTO MEDIANTE BLUETOOTH Un NXT controlará a otro de forma inalámbrica, haciendo uso de su módulo de comunicaciones mediante bluetooth. El robot controlado será un vehículo con características mecánicas que le permitan girar. El “comando” del control remoto 15 será un ladrillo NXT al que está conectado un motor, del cual se aprovechará el sensor de rotación. 16 CAPÍTULO 2 DISEÑO E IMPLEMENTACIÓN DE LOS MÓDULOS 2.1 CARACTERÍSTICAS DE LEGO MINDSTORMS NXT El sistema Lego Mindstorms se define como una plataforma completa de desarrollo de robots móviles, basada en la unión de bloques interconectables que contiene sensores y actuadores que se conectan mediante presión. El producto Lego Mindstorms viene en dos versiones: RCX y NXT, donde la última corresponde a la versión actualizada y mejorada de la anterior. El uso de Lego Mindstorms se ha extendido principalmente porque es un sistema fácil de montar y desmontar, es muy conocido en todo el mundo, permite una gran variedad de aplicaciones, es susceptible de ser programado mediante múltiples lenguajes y además es muy indicado para su aplicación en entornos educativos y de investigación. 2.1.1 HARDWARE (CPU)[12][13] La unidad de control, definida como ladrillo inteligente NXT, cuenta con los siguientes elementos: Figura 2.1. Ladrillo programable NXT - Procesador principal: ARM-7 de 32 bits (AT91SAM7S256 de Atmel) • Arquitectura Risc • reloj de 48 MHz • memoria flash de 256 kB (no volátil) • memoria RAM de 64 kB (volátil) 17 - Procesador secundario AVR de 8 bits (ATmega48 de Atmel) para gestionar entradas/salidas • reloj de 8 MHz • memoria flash de 4 kB • memoria RAM de 512 Bytes El coprocesador Atmel AVR está encargado de manejar los siguientes componentes: la creación de las señales de salida PWM para los motores, la fuente de poder principal de la tarjeta, los botones debajo de la pantalla y el sensor de carga de la batería. Se comunica con el procesador principal a través del bus de comunicaciones I2C (InterIntegrated Circuit: bus de comunicaciones seriales). Los dos procesadores intercambian periódicamente estructuras de datos a través del bus: el AVR recibe comandos del motor y de la fuente de poder y devuelve el estado de los botones de control y del nivel de carga de la batería. - Comunicación inalámbrica bluetooth: CSR (Cambridge Silicon Radio) BlueCore 4 v2.0 + sistema EDR (Enhanced Data Rate) • soporta SPP (Serial Port Profile) • 47 KB de RAM interna • 8 MBit de Flash externa • reloj de 26 MHz Las comunicaciones vía bluetooth (clase II) son manejadas a través de una tarjeta independiente BlueCore, la misma que se encuentra conectada al CPU a través de una línea serial. El firmware de Lego permite al controlador de bluetooth funcionar en el modo maestro, en el cual se puede comunicar hasta con tres esclavos, pero solo con uno a la vez, o en modo de esclavo, en el cual se puede comunicar con un solo maestro. - Comunicación vía USB 2.0: puerto full speed a 12 Mbps 18 Permite al ladrillo NXT comunicarse con un host USB. Este controlador no le posibilita al ladrillo NXT actuar en la función de host, lo que le hubiera permitido aumentar la cantidad de memoria, por ejemplo. - 4 puertos de entrada: interfaz de 6 hilos y soporte para conexiones AD y DA. El puerto 4 tiene como características el ser un puerto de alta velocidad compatible con IEC 61158 Tipo 4/EN 50170 (chip de comunicaciones RS485) para usos futuros. Todos los puertos de entrada cuentan con soporte del bus I2C. - 3 puertos de salida con interfaz de 6 hilos y soporte para lectura desde los codificadores. - Pantalla: • 1 pantalla LCD monocromo (blanco y negro) con resolución de 100x64 pixeles (26x40,6mm) • controlador de LCD UltraChip 1601 (UC1601) El chip se conecta al ARM7 a través del bus SPI (Serial Peripheral Interface) de 2MHz de velocidad y le permite calibrar la pantalla y otras acciones mediante un simple conjunto de comandos. - Altavoz de salida: • canal de sonido de salida con resolución de 8 bits y 8kHz de calidad de sonido • soporta tasas de muestreo de 2 a 16kHz • la señal de salida es tipo PWM controlada por el ARM7, que se filtra y pasa por un amplificador diferencial (SPY0030A de SunPlus) con ganancia máxima de 20 • - bocina de impedancia característica de 16Ω y 21mm de diámetro 4 botones de goma que permiten la interacción con el usuario. Mediante estos botones también se pueden crear pequeños programas para el ladrillo NXT sin necesidad de utilizar el computador. 19 - Fuente de poder: alimentación con 6 pilas AA (preferiblemente alcalinas) o batería de ión de litio de 1400 mAh. - Conectores de 6 hilos industriales estándar tipo RJ12 con mecanismo de ajuste a la derecha. - Capacidad para almacenar una cantidad de programas de usuario limitada únicamente por el tamaño de la memoria interna. Un esquema básico de la forma en que interactúa el ladrillo NXT se ve aproximadamente de la siguiente manera: Figura 2.2. Diagrama de bloques del hardware del NXT, tomado de [14] 2.1.1.1 Estructura interna del ladrillo NXT El NXT puede ser dividido en tres planos. 20 Figura 2.3. Estructura del NXT El primer plano corresponde al microcontrolador. Este se encarga de seguir las instrucciones dadas por la programación. El segundo plano está conformado por la memoria flash. En esta memoria se encuentra el programa entregado por el fabricante (firmware), el mismo que es comparable con el sistema operativo del PC y ejecuta el programa desarrollado. El tercer plano está constituido por la memoria RAM. Los programas realizados por el usuario que han sido previamente compilados se almacenan aquí. Junto al procesador principal, el NXT posee un coprocesador con una memoria flash y memoria RAM propias. Estos, en conjunto, están encargados de manejar los circuitos de entrada y salida al ladrillo NXT. 2.1.1.2 Puertos del ladrillo NXT Los puertos del ladrillo NXT disponen de terminales de seis hilos cada uno. Los sensores pueden ser analógicos o digitales y se mantiene la compatibilidad con los sensores del RCX: - El pin de entrada 1 está directamente conectado a un conversor A/D de 10 bits. A fin de mantener compatibilidad con sistemas anteriores de 2 21 hilos, existe en este pin suministro de tensión durante 3ms, en el que se incluye un intervalo de lectura de la señal de 0,1ms. - Los pines 5 y 6 son responsables de la comunicación digital. El protocolo establecido para la interfaz digital es I2C de Philips Semiconductors. Nombre • Pin 1, ANA • • • Pin 2, GND Pin 3, GND Pin 4, IPOWERA Pin 5, DIGIAI0 • • Pin 6, DIGIAI1 Función Color Entrada analógica y posible señal de salida de corriente Señal de tierra Señal de tierra Fuente de 4,3V blanco Pin de E/S digital conectado al procesador ARM7 (reloj I2C (SCL), RS-485 A) Pin de E/S digital conectado al procesador ARM7 (datos 2 I C (SDA), RS-485 B) amarillo negro rojo verde azul Figura 2.4. Distribución de los pines de los puertos NXT, tomado de [14] Los puertos equipados con el protocolo I2C permiten el control no solamente de sensores sino también de actuadores. Existen dispositivos comerciales que permiten la conexión de hasta 7 motores o 7 sensores en un mismo puerto. 2.1.1.3 Manejo de energía La energía para controlar al NXT proviene de 6 pilas AA o de una batería recargable de ión litio y es una fuente de alimentación conmutable, que genera una señal de 5V y otra de 3,3V para el ARM7 y para el chip BlueCore. Para proteger a la fuente existe a su entrada un interruptor de protección que tiene una corriente de mantenimiento de 1,85A y que se dispara aproximadamente a los 3,3A. En la siguiente tabla se muestran algunos valores de consumos en el NXT bajo determinadas condiciones: 22 Voltaje de alimentación Corriente Consumo (Vbatería = 9V) max (mA) normal (mA) max (mW) normal (mW) Sin carga en los motores 9V 339 114 5184 1422 5V 271 112 1744 448 3,3V 72 38 410 216 Con carga en los motores 9V 2901 848 26109 7632 5V 271 112 1142 307 3,3V 72 38 410 137 Standby Se asume una corriente de 46µA debida a detección de cortocircuitos Tabla 2.1. Mediciones de corriente en el NXT, tomado de [14] El ladrillo NXT tiene una función de ahorro de energía que hace que este se apague si no ha sido operado por un determinado tiempo. Este tiempo puede ser modificado a través del menú de configuración del ladrillo (2, 5, 10, 30, 60 minutos o nunca). 2.1.1.4 Comunicaciones El NXT tiene dos opciones para comunicarse con el exterior: un puerto USB 2.0 y bluetooth. El puerto USB permite la descarga rápida del firmware de Lego, así como de los programas del usuario. La comunicación bluetooth posibilita la comunicación inalámbrica entre el NXT y el PC, con otros NXT´s y con otros dispositivos que cuenten con bluetooth. El NXT se puede conectar simultáneamente de forma inalámbrica a otros tres NXT, pero solo se puede comunicar con uno a la vez. La información que se transfiere puede tratarse de programas, archivos de sonido u otros datos necesarios durante la ejecución de sus programas internos. La comunicación es posible hasta una distancia aproximada de 10 metros (dispositivo bluetooth clase II). 23 2.1.1.4.1 Comunicación entre ladrillos NXT mediante bluetooth La funcionalidad bluetooth en el NXT puede ser configurada de tal forma que el canal de comunicaciones funcione como maestro o esclavo. Esto significa que uno de los ladrillos NXT actuará como maestro y los demás se comunicarán con él si así lo requieren. La figura muestra la forma en que se posibilita la comunicación entre dispositivos. Figura 2.5. Comunicación entre ladrillos NXT usando bluettoth, tomado de [14] La figura indica que un dispositivo maestro puede comunicarse con otros tres dispositivos bluetooth al mismo tiempo, pero el intercambio de información se puede hacer solo con uno de ellos en un momento determinado. Así, si el NXT maestro está comunicándose con el NXT Slave 1 (esclavo 1) y el NXT Slave 3 (esclavo 3) inicia el envío de datos al NXT maestro, éste último no evaluará los datos recibidos hasta que se encuentre dispuesto a atenderlo. Un ladrillo NXT no está posibilitado para actuar como maestro y esclavo al mismo tiempo, pues esto ocasionaría pérdida de datos entre los dispositivos NXT. Las comunicaciones con otros dispositivos bluetooth se realiza a través de canales. El NXT tiene 4 posibles canales para comunicación vía bluetooth: el 24 canal 0 se usa siempre por parte de un NXT esclavo para comunicarse con el NXT maestro, mientras que los canales 1, 2 y 3 se usan para la comunicación de un maestro con tres dispositivos esclavos. 2.1.1.5 Sonido El NXT incluye un amplificador que mejora el nivel de salida del sonido y su calidad. La señal de salida del sonido es de tipo PWM y es controlada por el microcontrolador ARM7. Los filtros introducidos antes del amplificador reducen el ruido de sobre-muestreo de la señal. El parlante incorporado en el NXT tiene una impedancia característica de 16Ω y un diámetro de 21mm. En la tabla se muestra el consumo de corriente ante sonidos ejecutados en diferentes frecuencias: Frecuencia (Hz) 440 4000 Corriente (mA) 102 78 Potencia (mW) 169 97 Tabla 2.2. Consumo de corriente ante la ejecución de sonidos, tomado de [14] Es posible configurar el nivel o volumen del sonido emitido por el ladrillo NXT directamente desde el menú de configuración interno, accediendo a él mediante los botones disponibles y contando con la información en la pantalla. 2.1.1.6 Botones El NXT incorpora cuatro botones de goma que permiten operarlo, así como la navegación dentro de las opciones de su software: el botón naranja sirve para encender al NXT y permite activar una opción en el menú (On/Enter/Run), el botón rectangular de color gris oscuro permite retroceder en la selección del menú (Clear/Go back) y los botones de color gris claro posibilitan la navegación hacia la izquierda o la derecha en el menú del NXT. 25 Los botones del NXT también pueden ser utilizados como controles de entrada para el programa en ejecución. En dependencia de la aplicación, el botón naranja y los botones de navegación a la izquierda y derecha pueden también ser programados para que funcionen como sensores de tacto. 2.1.2 SENSORES Existe una amplia variedad de sensores que pueden ser conectados a los ladrillos RCX o NXT; inclusive existen posibilidades para diseñar propios sensores atendiendo únicamente a las exigencias de las entradas del producto. Los sensores NXT son digitales, lo que permite obtener mayor precisión en sus medidas y además son comparables las medidas obtenidas por dos de ellos con iguales características. Las marcas HiTechnic o Mindsensors ofrecen una amplia gama de sensores que hacen uso de la tecnología digital para ser acoplados al ladrillo NXT. 2.1.2.1 Sensor de contacto Figura 2.6. Sensor de contacto y principio de funcionamiento Permite detectar obstáculos encontrados en el camino del robot, en el caso de tratarse de un robot móvil, o permite reaccionar ante estímulos de contacto externos. La señal emitida por este sensor es de tipo digital binario, que permite reconocer dos y hasta tres estados: presión del botón, liberación del botón y presión y liberación del botón en conjunto. 26 Figura 2.7. Acciones reconocidas por el sensor de contacto, tomado de [15] 2.1.2.2 Sensor de luz Figura 2.8. Sensor de luz A través de este sensor se capacita al robot para reaccionar ante variaciones del nivel de luz y del color. Mide el nivel de luz y entrega un número entre 0 (oscuridad total) y 100 (muy brillante), sin que se pueda asignar alguna unidad a la medida mostrada. Permite medir la intensidad luminosa de un ambiente o la intensidad reflejada por superficies de distintos colores. Figura 2.9. En la parte superior, lo que ven nuestros ojos; en la parte inferior, lo que “ve” el sensor de luz. Tomado de [15] El sensor de luz de Lego actúa bajo un principio reflectivo. La intensidad de la radiación reflejada depende del color, la distancia al objeto y las perturbaciones luminosas del medio de trabajo. El led integrado es el encargado de emitir la radiación de color rojo (para los casos en que se tienen niveles de iluminación bajos) y el fototransistor (FT) capta la radiación reflejada y la convierte en una señal de corriente continua a través del circuito correspondiente. 27 Figura 2.10. Principio de funcionamiento del sensor de luz Para medir el nivel de iluminación del ambiente, el sensor apaga su luz propia, mientras que la enciende si se trata de medir la intensidad reflejada. El valor entregado es un porcentaje respecto del máximo valor capaz de ser medido por el sensor. 2.1.2.3 Sensor de ultrasonido Figura 2.11. Sensor de ultrasonidos El sensor le permite al robot medir la distancia a obstáculos y responder ante movimientos. Utiliza el principio del eco para detectar los objetos que se encuentran a su alrededor con una señal de 40 kHz. Su capacidad de detección va desde los 3cm y llega hasta los 255cm, con una precisión de ±3cm; habiendo una zona muerta en distancias muy cortas. 28 Figura 2.12. Principio de funcionamiento del sensor de ultrasonidos El sensor de ultrasonidos funciona de la siguiente manera: el emisor (E) entrega una serie de pulsos de sonido y existe un receptor (R) que los recibe luego de que estos se han reflejado en un objeto. El circuito electrónico se encarga de medir el tiempo que existe entre emisión y recepción y lo traduce en una distancia. El cálculo de la distancia corresponde a la aplicación de la sencilla fórmula que dice que distancia = velocidad y tiempo, donde la velocidad es la que corresponde al sonido (340ms-1 a una temperatura ambiente de 15°C y en el aire) y el tiempo es el medido por el circuito existente. Las medidas se entregan en centímetros o en pulgadas. Las mejores mediciones se producen cuando los objetos en que se reflejan las ondas emitidas por el sensor son grandes y la superficie es dura y lisa. Las superficies suaves y curvas causan dificultades al proceso de medición. 2.1.2.4 Sensor de sonido Figura 2.13. Sensor de sonidos 29 Permite al robot captar sonidos y así responder a órdenes que vienen desde el exterior y que han sido debidamente programadas. Puede distinguir patrones de sonido e incluso tonos musicales. Los valores medidos por este sensor, que esencialmente es un micrófono que detecta niveles de presión sonora de hasta 90dB, puede estar en decibelios (dB: para cualquier sonido, incluso aquellos que no son detectados por el oído humano) o en decibelios ajustados (dBA: sonidos que pueden ser distinguidos por el oído humano) y corresponde a una combinación de la amplitud y frecuencia de los sonidos percibidos. La respuesta a intensidades en decibelios crecientes es aproximadamente exponencial y corresponde a un valor porcentual sobre el máximo de 90dB antes mencionado. En la siguiente tabla se pueden observar las medidas obtenidas por el sensor de sonidos frente a algunos eventos, asumiendo que la distancia de la fuente de sonido al sensor es de aproximadamente 1m: Porcentaje 4% - 5% 5% - 10% 10% - 30% 30% - 100% Descripción Habitación en silencio Personas hablando lejos Conversación normal o música que se reproduce a un volumen “normal” Personas gritando y música a alto volumen Tabla 2.3. Valores entregados por el sensor de sonidos, tomado de [14] 2.1.3 Los motores de Lego NXT[16][17] Los actuadores de Lego Mindstorms son motores de corriente continua. La potencia que se va a manejar en las aplicaciones que se diseñen será baja, por lo que, de requerirse mayores potencias se podría pensar en arreglos con relés, electroválvulas u otros. 30 Figura 2.14. Motores Lego NXT Los motores Lego pueden ser también servomotores y tienen un sensor de rotación integrado. La versión anterior de motores para el RCX requería la colocación de un sensor de rotación adicional para realizar tareas de control. Gracias al sensor de rotación integrado, es posible medir el giro de su eje con una precisión de 1 grado sexagesimal. La configuración interna del motor se muestra a continuación: Figura 2.15. Interior de un motor Lego NXT, tomado de [16] Sus características físicas y eléctricas son: - Motor voluminoso de 80g. - Tiene internamente un tren de engranajes e incluye un codificador para controlarlo. - Al frenar el eje el consumo puede llegar a 2A. - Voltaje = 12V Corriente = 0,58A Potencia = 6,96w Rendimiento = 44,5% 31 - A un voltaje de 9 V y velocidad de rotación de 177 rpm proporciona un par de 16,7Ncm con un consumo de corriente de 0,55A. - La velocidad de giro máxima posible es de alrededor de 200 rpm. - Es posible usar el sensor de rotación del motor si es que así se requiere. - Para proteger al motor de intensidades de corriente muy altas, una resistencia PTC se encuentra montada en serie con él, de manera que el valor de ésta se incrementa rápidamente cuando la temperatura aumenta, limitando así la intensidad de corriente suministrada al dispositivo. Para el movimiento de un modelo motorizado el firmware del NXT dispone de un algoritmo PID (no modificable), el cual permite que el modelo se desplace con precisión. 2.1.4 Conjunto de piezas Entre el resto de piezas de los kits de Lego Mindstorms constan engranajes, ejes, cables, levas y pistones, juntas cardan y amortiguadores. En total, el producto 8527 de Lego, contiene 577 piezas: Figura 2.16. Conjunto de piezas del producto Lego Mindstorms 8527 Cantidad Descripción 1 Disco compacto NXT 3 Cono 1 x 1 Figura 32 Cantidad Descripción 1 Sensor eléctrico de luz NXT 1 Ladrillo programable NXT 1 Cable eléctrico Mindstorms NXT de 20 cm 4 Cable eléctrico Mindstorms NXT de 35 cm 2 Cable eléctrico Mindstorms NXT de 50 cm 3 Motor eléctrico NXT 1 Cable eléctrico serial USB 1 Sensor eléctrico de sonido NXT 1 Sensor eléctrico de contacto NXT 1 Sensor eléctrico de ultrasonidos NXT 1 Stickers para sensores NXT 4 Conector Technic en ángulo #1 2 Conector Technic en ángulo #2 Figura 33 Cantidad Descripción 2 Conector Technic en ángulo #4 16 Conector Technic en ángulo #6 22 Eje Technic 2 (con muesca) 17 Eje Technic 3 4 Eje Technic 3 (tipo tachuela) 4 Eje Technic 4 7 Eje Technic 5 2 Eje Technic 5,5 (con tope) 4 Eje Technic 6 4 Eje Technic 7 2 Eje Technic 8 4 Eje Technic 10 2 Eje Technic 12 8 Junta flexible doble para ejes Technic 2 Junta para ejes Technic 8 Junta para ejes Technic perpendiculares 4 Junta para ejes perpendiculares 3L 13 Junta para ejes perpendiculares 3L con 4 clavijas 6 Junta para ejes perpendiculares doble Figura 34 Cantidad 6 Descripción Junta para ejes perpendiculares con doble abertura 6 Junta para ejes perpendiculares con dos agujeros 4 Clavija con eje Technic 42 Clavija con eje Technic con fricción 2 Eje con gancho Technic 1 Bola Technic roja de 52 mm 1 Bola Technic azul de 52 mm 16 Viga Technic 3 8 Viga Technic 3 x 3 con clavijas 6 Viga Technic 3 x 3,8 x 7 con doble inclinación de 45 8 Viga Technic 3 x 5 con inclinación de 90 16 Viga Technic 4 x 4 con inclinación 53,5 5 Viga Technic 5 6 Viga Technic 7 7 Viga Technic 11 4 Viga Technic 13 Figura 35 Cantidad Descripción 11 Viga Technic 15 8 Diente Technic Bionicle 1 x 3 con agujero para eje 4 Arma Technic Bionicle (Pincer Suukorak) 4 Ladrillo Technic 1 x 4 con agujeros 2 Ladrillo Technic 1 x 6 con agujeros 18 8 Seguro Technic Seguro liso Technic 1/2 4 Conector Technic con agujero para eje 6 Engranaje Technic de 8 dientes 4 Engranaje Technic de 12 dientes, doble bisel 2 Engranaje Technic de 16 dientes 2 Engranaje Technic de 20 dientes, doble bisel 1 Engranaje Technic de 36 dientes, doble bisel 1 Engranaje Technic de 40 dientes 4 Rueda de perillasTechnic 10 Brazo Technic en forma de L 2 x 4 1 Instrucciones para construcciones de Mindstorms NXT Figura 36 Cantidad Descripción 1 Manual rápido de Mindstoms NXT 1 Almohadilla de prueba para Mindstorms 3 Clavija Technic 3 Clavija doble Technic 3L 4 Junta Technic para clavijas perpendiculares 1 Junta Technic para clavijas perpendiculares en curva 4 Junta Technic para clavijas redonda 13 Junta Technic larga 34 Junta Technic larga con fricción 8 Clavija Technic larga con tope 82 Clavija Technic con fricción y ranuras 8 Clavija Technic con fricción y gancho 1 Brazo Technic de polo invertido 5 Dirección Technic 9L 4 Triángulo Technic 1 Plato Technic con agujero en la base y cubierta negra 2 Rueda Technic 2 Tornillo sinfín Technic Figura 37 Cantidad Descripción 4 Rueda 56 x 26 4 Llanta 30.4 x 20 Figura Tabla 2.4. Grupo de piezas que conforman el kit Lego Mindstorms 8527, tomado de [18],[19] y [20] 2.2. DESARROLLO DE LOS MÓDULOS En cada uno de los diseños que se explicarán a continuación se han usado exclusivamente las piezas que corresponden a un kit de Lego Mindstorms NXT. De la misma forma, se ha procurado que cada aplicación provea la posibilidad de indicar la forma en la que operan los diferentes elementos de hardware existentes en estos kits. 2.2.1 MEDIDOR DE VARIABLES MÚLTIPLES [21] El medidor consta del ladrillo NXT y se le ha acoplado el sensor correspondiente para que se pueda medir y/o visualizar la variable física deseada: longitud, área, volumen o sonido. 2.2.1.1 Medidor de longitudes En esta aplicación se usa el sensor de rotación que se encuentra en el interior de un motor NXT para convertir el ángulo girado por el mismo en una longitud y la conversión se realiza mediante software. A continuación se muestra un diagrama simplificado del prototipo: 38 Figura 2.17. Esquema del medidor de longitudes Figura 2.18. Esquema simplificado del medidor de longitudes La rueda debe girarse sobre la superficie cuya longitud se va a medir. Se ha usado la salida C para conectar el motor con su sensor de rotación. Los elementos adicionales sirven únicamente para la sujeción del motor al ladrillo NXT y como guía para el cable de conexión. Puerto Tipo de hardware Se utiliza el puerto de salida C para conectar un motor. Sensor de rotación Utilidad Permite tomar medidas del ángulo girado y del sentido de giro Tabla 2.5. Puertos usados en el medidor de longitudes Las siguientes imágenes muestran al prototipo armado: 39 Tipo de vista Vista frontal Vista posterior Vista superior (salidas) Vista inferior (entradas) Imagen 40 Tipo de vista Imagen Vista desde la derecha Vista desde la izquierda Vista oblicua que permite ubicar a los elementos de sujeción usados (detalle 1) Vista oblicua que permite ubicar a los elementos de sujeción usados (detalle 2) Tabla 2.6. Imágenes del medidor de longitudes 41 Se ha previsto la posibilidad de acoplar diferentes ruedas disponibles en el kit de Lego Mindstorms y así poder probar algunas opciones distintas. En la siguiente tabla se presentan las tres diferentes ruedas que pueden ser conectadas al eje del motor para realizar las mediciones. Rueda Imagen 43,2x22 56x26 81,6x15 Tabla 2.7. Imágenes de las ruedas usadas en el medidor de longitudes 2.2.1.2 Calculadora de área y volumen Para esta calculadora se dispone del prototipo diseñado anteriormente, el medidor de longitudes y se lo usa con un programa distinto. 42 Figura 2.19. Dimensiones necesarias para la calculadora de áreas y volúmenes La rueda debe recorrer, una por una, las dimensiones del área o volumen a determinar. El programa incorporado deberá permitir el registro de cada una de las dimensiones por separado, la conversión de ángulo girado en distancia recorrida, la multiplicación de los valores correspondientes y la presentación de los resultados de tal forma que se puedan visualizar valores de áreas y volúmenes. 2.2.1.3 Medidor de sonido El medidor de sonido consiste en un ladrillo NXT y un sensor de sonido conectado a una de las entradas del mismo. Un diagrama esquemático de este medidor es el siguiente: Figura 2.20. Esquema simplificado del medidor de sonido Los puertos usados por este dispositivo se muestran en la siguiente tabla: 43 Puerto Tipo de hardware Puerto de entrada 2 Sensor de sonido Utilidad Permite tomar medidas del nivel de sonido ambiental Tabla 2.8. Puertos usados en el medidor de sonido La programación tiene especial importancia en este proyecto. Para probar su funcionamiento hace falta iniciar la ejecución del programa y acercar el sensor de sonido a la fuente que lo origina. Las imágenes que se presentan a continuación son suficientes para entender su configuración física. La programación permite, adicionalmente, congelar una muestra tomada y continuar con el proceso cuando se desee. Tipo de vista Imagen Vista frontal 1 Vista frontal 2 Tabla 2.9. Imágenes del medidor de sonido 44 2.2.2 ESCORPIÓN [12] El diseño mecánico del prototipo del escorpión tiene gran complejidad. Se utilizan los tres motores disponibles en el kit, dos de ellos para provocar el movimiento horizontal –sobre el piso- del escorpión y el tercero para producir el movimiento de la cola. Cada uno de los motores que provocan el movimiento horizontal activa a tres patas del escorpión. Esto se consigue mediante una configuración mecánica como la que se indica en la figura, donde se ha distinguido con un color distinto a cada una de las piezas que intervienen y se han marcado además los puntos fijos de la estructura. Los ejes de los motores se han pintado en azul. Figura 2.21. Esquema simplificado del escorpión Adicionalmente se colocó sobre esta estructura básica un sensor de sonido, de tal manera que el escorpión tenga la posibilidad de “oír” y reaccionar ante estímulos sonoros. Se ha previsto el siguiente funcionamiento para el escorpión: al iniciar el programa, el escorpión deberá avanzar hacia delante hasta que se encuentre con un obstáculo que está ubicado a una distancia “r”; entonces el escorpión deberá retroceder por un cierto tiempo y luego inicia nuevamente su proceso 45 de marcha hacia delante. Si existe de pronto un objeto que se encuentra a una distancia “p”, entonces, aparte de retroceder, el escorpión activará su cola y “picará”. El escorpión sabrá que alcanzó su objetivo y que debe retroceder su cola, si el sensor de contacto ubicado en su punta fue activado. La incorporación del sensor de sonido permite la activación inicial del escorpión y, cuando ya se encuentra en acción, hace que éste “pique” cada vez que el nivel sonoro rebase un cierto límite, independientemente de que se encuentre o no con un obstáculo delante de él. Las distancias “p” y “r” antes mencionadas, deben ser modificables por programación. Los elementos de hardware principales que han sido utilizados en este prototipo son los siguientes: Puerto Tipo de hardware Puerto de entrada 1 Sensor de contacto Puerto de entrada 2 Sensor de sonido Puerto de entrada 4 Sensor de ultrasonido Puerto de salida A Motor NXT Puerto de salida B Motor NXT Puerto de salida C Motor NXT Utilidad Permite iniciar el funcionamiento del escorpión y, cuando ha iniciado su operación, permite saber si el escorpión alcanzó su objetivo al “picar”. Permite iniciar el funcionamiento del escorpión y, cuando ha iniciado su operación, mide el nivel de sonido existente en el medio. Mide constantemente la distancia a la que se encuentran los objetos que se encuentran frente a él. Motor que hace que la “cola” se mueva para “picar”. Motor izquierdo (con el sensor de ultrasonido de frente) Motor derecho (con el sensor de ultrasonido de frente) Tabla 2.10. Puertos usados en el “escorpión” 46 Las siguientes imágenes pretenden mostrar las principales partes que constituyen este proyecto. Las imágenes mostradas no pueden entenderse como una descripción detallada del proceso de construcción, pero sí como una posibilidad de entender la forma en que está construido el prototipo en cuestión. Tipo de vista Vista frontal Vista posterior Vista superior (pantalla del NXT) Imagen 47 Tipo de vista Vista inferior Vista desde la derecha Vista desde la izquierda Detalle de las “patas” (1) Imagen 48 Tipo de vista Detalle de las “patas” (2) Detalle de las “patas” (3) Detalle de las “patas” (4) Detalle de la “cola” (extendida y vista desde arriba) Imagen 49 Tipo de vista Detalle de la “cola” (extendida y vista desde un lado) Detalle de la “cola” (extendida y vista desde la parte posterior) Detalle del sensor de contacto Detalle del sensor de sonido Imagen 50 Tipo de vista Imagen Detalle del sensor de sonido (2) Detalle del sensor de ultrasonido Detalle de las “tenazas” (elementos netamente decorativos) Tabla 2.11. Imágenes del “escorpión” 2.2.3 BRAZO MECÁNICO La complejidad de este prototipo es grande y su diseño mecánico es un reto a superar. El brazo diseñado cuenta con tres articulaciones o grados de libertad: se permite un movimiento de giro sobre su propio eje para provocar un desplazamiento sobre un plano horizontal; existe la posibilidad de realizar un cambio de altura del brazo o desplazamiento vertical y finalmente existe una garra que se puede abrir y cerrar. El diseño debe considerar que el movimiento del brazo hacia arriba/abajo y hacia los costados hace que aparezcan fuerzas y momentos de giro, que la estructura debe soportar. Por esta razón se han 51 colocado en algunas partes del prototipo elementos que, antes que ser decorativos, permiten dar estabilidad al equipo. Para el movimiento sobre el plano horizontal se ha conseguido acoplar al motor que lo activa un sistema reductor mediante engranajes y un tornillo sinfín. Esto permite que el movimiento en esa dirección pueda manejarse con relativa precisión y suavidad. Sin embargo, por la forma en que está hecho el brazo, esta posibilidad no se ha podido conseguir en el motor que produce el movimiento vertical; el hecho de colocar más elementos en el brazo hace que aumente su peso y por tanto dificulta el desempeño de la máquina completa. Es por esta razón que el movimiento vertical no se puede considerar “suave” y preciso. Para corregir parcialmente este problema hay que hacer un trabajo a nivel de software. Figura 2.22. Esquema simplificado del brazo mecánico Se ha previsto la posibilidad de que el brazo mecánico pueda ser movido manualmente tanto en forma horizontal como en forma vertical, para lo cual se dispone de dos perillas que permiten estos desplazamientos. 52 Ya que el brazo deberá contar con la posibilidad de reconocer el color del objeto que va a trasladar, en la parte de la garra se ha dispuesto un sensor de luz para que esta acción sea posible. Es conveniente colocar sensores de final de carrera para evitar que el brazo se desplace a zonas no adecuadas, donde se puede sobre exigir a los motores o donde exista mucha tensión en los cables de conexión. Lamentablemente el kit 8527 solo dispone de un sensor de contacto, por lo que éste se colocará en un lugar tal que impida un desplazamiento horizontal inconveniente. Los elementos de hardware utilizados en el diseño final son los siguientes: Puerto Tipo de hardware Puerto de entrada 1 Sensor de contacto Puerto de entrada 2 Sensor de luz Puerto de salida A Motor NXT Puerto de salida B Motor NXT y su sensor de rotación interno Puerto de salida C Motor NXT y su sensor de rotación interno Utilidad Actúa como un sensor de final de carrera en uno de los extremos del recorrido posible. Permite reconocer el “color” del objeto a ser movido por el brazo. Motor que abre y cierra la “garra” del brazo. Motor que permite que el brazo pueda subir o bajar. Motor que permite que el brazo pueda moverse horizontalmente. Tabla 2.12. Puertos usados en el brazo mecánico El funcionamiento previsto para el brazo mecánico es el siguiente: al iniciar el programa existirá la posibilidad de indicar al brazo cuáles son las posiciones extremas a las que debe llegar, tanto horizontal como verticalmente y las almacene en su memoria RAM, así como también deberá guardar los valores de las lecturas del sensor de luz ante dos objetos de distintos colores. Para la obtención de los valores extremos se hace uso de los sensores de rotación internos de los motores NXT. Cuando este proceso inicial ha terminado, el 53 brazo entrará en operación y comenzará a trasladar los objetos que se encuentran en la posición inicial hacia su destino final, el mismo que dependerá del color del objeto. Los objetos a ser trasladados son las bolas con las que viene provisto el kit 8527. Se ha pensado en una configuración fácil de desmontar, de tal forma que el cambio de baterías –cuando sea necesario- no sea un problema. Tipo de vista Vista frontal (entradas) Vista posterior (salidas) Imagen 54 Tipo de vista Vista superior (pantalla del NXT) Vista desde la derecha Vista desde la izquierda Detalle del arreglo que permite el movimiento horizontal (1) Imagen 55 Tipo de vista Detalle del arreglo que permite el movimiento horizontal (2) Detalle del arreglo que permite el movimiento horizontal (3) Detalle del arreglo que permite el movimiento vertical (1) Detalle del arreglo que permite el movimiento vertical (2) Imagen 56 Tipo de vista Detalle del sensor de contacto que actúa como sensor de final de carrera Detalle de la “garra” (1) Detalle de la “garra” (2) Detalle de la “garra” (3) Imagen 57 Tipo de vista Detalle del sensor de luz (1) Detalle del sensor de luz (2) Detalle del “brazo” (1) Detalle del “brazo” (2) Imagen 58 Tipo de vista Imagen Detalle del “brazo” (3) Tabla 2.13. Imágenes del brazo mecánico 2.2.4 VEHÍCULO CONTROLADO MEDIANTE ALGORITMO PID [22] Para este proyecto fue necesario construir un vehículo de cuatro ruedas de estructura mecánica sencilla, propulsado por dos servomotores y que, por construcción, no tiene la posibilidad de girar. Los motores funcionarán siempre de forma simultánea. Para conseguir una mayor velocidad en las llantas, se ha acoplado al eje que va al servomotor un engranaje de 40 dientes acoplado a uno más pequeño de 8 dientes que está directamente conectado al eje sobre las ruedas. De esta manera se consigue un aumento de la velocidad en un factor de 5, aunque en detrimento de su potencia. El sensor de ultrasonido se ha fijado en la parte delantera del robot, de tal manera que no cuente con ningún obstáculo directo para realizar sus mediciones. Vale la pena recordar que el sensor mencionado tiene un rango de operación que va desde los 3cm hasta los 255cm. El NXT ha sido colocado en la parte superior para facilitar el acceso a las teclas de control y a la pantalla LCD y su desmontaje es fácil, de tal forma que el cambio de baterías es un procedimiento sencillo. 59 Figura 2.23. Esquema simplificado del auto controlado mediante algoritmo PID El funcionamiento del vehículo es el siguiente: al iniciar el programa se permite la modificación de las constantes P, I y D del algoritmo, así como también se puede ingresar un valor de tolerancia máxima de los resultados. Terminado este proceso se comienza colocando un objeto delante del vehículo y tomando medida de la distancia, la misma que intentará mantener aún cuando el objeto sea movido y la distancia variada. Los elementos de hardware utilizados en este proyecto son los siguientes: Puerto Tipo de hardware Puerto de entrada 4 Sensor de ultrasonido Puerto de salida A Motor NXT Puerto de salida C Motor NXT Utilidad Mide de forma permanente la distancia a la que se encuentra el objeto que está frente a él. Motor que se encuentra a la izquierda (sensor de ultrasonido de frente) Motor que se encuentra a la derecha (sensor de ultrasonido de frente) Tabla 2.14. Puertos usados en el auto controlado mediante algoritmo PID 60 A continuación se presentan algunas fotografías que muestran la configuración física del automóvil diseñado. Tipo de vista Vista frontal (entradas) Vista posterior (salidas) Vista superior (pantalla del NXT) Imagen 61 Tipo de vista Vista inferior Vista desde la derecha Vista desde la izquierda Detalle del sensor de ultrasonido Imagen 62 Tipo de vista Imagen Detalle de la conexión motorrueda (1) Detalle de la conexión motorrueda (2) Detalle de la parte lateral posterior Detalle de la parte posterior (desde abajo) Tabla 2.15. Imágenes del auto controlado mediante algoritmo PID 63 2.2.5 SEGUIDOR DE LÍNEA Es necesario construir un vehículo que tenga la posibilidad de moverse en línea recta, así como girar independientemente hacia cualquiera de los lados. Asimismo, al vehículo debe estar convenientemente acoplado un sensor de luz que se encuentre lo suficientemente cerca del piso, de tal manera que pueda realizar las mediciones de la intensidad luminosa que incide sobre él con la mínima interferencia de la luz ambiental. Los elementos de hardware utilizados en este proyecto son los siguientes: Puerto Tipo de hardware Puerto de entrada 1 Sensor de luz Puerto de salida B Motor NXT Puerto de salida C Motor NXT Utilidad Mide la cantidad de luz que se refleja en el piso dependiendo del camino por el que circula. Motor que se encuentra a la izquierda (pantalla de frente) Motor que se encuentra a la derecha (pantalla de frente) Tabla 2.16. Puertos usados en el seguidor de línea El vehículo consta básicamente de un chasis compuesto por dos motores, elementos de sujeción y el NXT. Dos ruedas que se encuentran conectadas a los motores permiten un fácil movimiento del vehículo. La bola ubicada en la parte posterior da estabilidad al diseño y permite que el vehículo pueda girar fácilmente y avanzar hacia delante sin problema. 64 Figura 2.24. Esquema simplificado del seguidor de línea Cuando se inicia el programa almacenado en la memoria RAM no volátil del ladrillo NXT, el vehículo inicia automáticamente una secuencia de barrido y reconocimiento de valores máximos y mínimos por medio de su sensor de luz. Con estos valores se calcula internamente un valor intermedio y será ésta la referencia o set point que el algoritmo PID incorporado intentará mantener. Consecuentemente el vehículo programado no será exactamente un seguidor de línea, sino un seguidor de borde de línea. Figura 2.25. Recorrido del seguidor de línea que en realidad es un seguidor de borde de línea Para que el seguidor de línea funcione adecuadamente es necesario que exista una marcada diferencia entre los colores de la línea y de la superficie donde ésta se encuentra, así como también deben mantenerse relativamente constantes las condiciones de iluminación ambiental. Para verificar estos datos se puede acudir al mismo sensor de luz conectado al ladrillo NXT y realizar algunas mediciones de prueba antes de iniciar con el trazado de la trayectoria. 65 Finalmente, la configuración no debe ofrecer mayores dificultades para desmontar al ladrillo NXT, por lo que el cambio de baterías no representa ningún problema. Las fotografías que se incorporan a continuación permiten tener una clara idea de la forma del dispositivo armado, para ello se han realizado tomas desde diferentes ángulos y puntos de vista: Tipo de vista Vista frontal (entradas) Vista posterior (salidas) Vista superior (pantalla del NXT) Imagen 66 Tipo de vista Vista inferior Vista desde la derecha Vista desde la izquierda Detalle del sensor de luz (1) Imagen 67 Tipo de vista Imagen Detalle del sensor de luz (2) Detalle del contenedor de la bola que se encuentra en la parte posterior (1) Detalle del contenedor de la bola que se encuentra en la parte posterior (2) Detalle de los elementos de sujeción del NXT Tabla 2.17. Imágenes del seguidor de línea 68 2.2.6 APLICACIONES REMOTAS [21] Para este proyecto no se ha previsto la construcción adicional de nuevos prototipos, sino que se aprovechará de los construidos anteriormente. Así, para la construcción del mando a distancia se usará el prototipo diseñado en el numeral 2.2.1.1 Medidor de longitudes y el automóvil que se va a controlar se ha descrito en el numeral 2.2.5 Seguidor de línea. El trabajo especial que se hará para este proyecto será a nivel de software y su descripción se encuentra detallada en el siguiente capítulo. De todas maneras es pertinente una breve explicación del funcionamiento del equipo: el mando a distancia posee una rueda que actuará como un dial y cuyo giro representará la velocidad con la que debe moverse el vehículo controlado. El sentido en que se gira el dial indicará si el vehículo debe viajar hacia delante o hacia atrás. Los botones del mando a distancia también tienen un significado: las flechas a los lados harán que el vehículo gire en el sentido indicado y el botón central hará que éste se detenga y emita un sonido. Si no se presiona ningún botón, el vehículo se mueve en línea recta. Figura 2.26. Prototipos usados en el proyecto de “aplicaciones remotas”. A la izquierda se muestra el mando a distancia y a la derecha el vehículo a ser controlado. 69 CAPÍTULO 3 DESARROLLO DE LA PROGRAMACIÓN Para programar el microcontrolador del NXT se puede elegir entre distintos entornos. El entorno escogido dependerá, entre otras cosas, de la complejidad de las operaciones que se vayan a realizar. 3.1 LENGUAJES DE PROGRAMACIÓN Los robots de Lego Mindstorms pueden ser programados a través de diferentes lenguajes. La primera opción que se puede utilizar es programar directamente el NXT con los botones que se encuentran disponibles en el mismo. Para ello se tiene un sistema basado en íconos que permite desarrollar programas para algoritmos muy simples. Mediante estos íconos se puede especificar el tipo de movimiento, los sensores a utilizar, así como los tiempos de espera. Por la simplicidad del sistema, no es aconsejable para aplicaciones complejas. Entre las demás opciones de entornos de programación para el NXT hay algunas comerciales y otras que han sido desarrolladas por la comunidad que se ha creado a lo largo de estos años en torno a Lego Mindstorms. Como opciones de lenguajes de programación comerciales se pueden mencionar:[23] - NXT-G Edu: como software propio de Lego para la educación, este lenguaje sustituye a Robolab, lenguaje usado para la versión RCX. Está basado en LabVIEW, por lo que la programación se hace con bloques que se pueden arrastrar y soltar, así como interconectar. - NXT-G: su funcionalidad es similar a la del anterior y se distribuye con la versión comercial del producto. 70 - Robolab 2.9: corresponde a una versión que permite el paso de versiones anteriores a nuevas y se constituye en un Robolab para NXT (no permite la comunicación mediante bluetooth). - RobotC: software desarrollado por la Academia de Robótica de la Universidad Carnegie Mellon y que permite programar en C. El firmware que usa es más rápido que el original de Lego y permite programar tanto el RCX como el NXT. También existen otros lenguajes de programación de uso libre: - BricxCC (Bricx Command Center): plataforma que soporta la programación del ladrillo programable de Lego con NQC (para el RCX), NBC y NXC (para el NXT), C, C++, Pascal, Forth, y Java utilizando brickOS, pbForth y leJOS. Este software está disponible en código abierto y permite no solo la edición de los programas, sino que además suministra herramientas para transferir el programa desde el PC al microcontrolador del NXT, así como otras aplicaciones interesantes para el NXT. - NBC (Next Byte Codes): lenguaje dirigido a programadores con una sintaxis de lenguaje ensamblador, lo que permite llegar al nivel más bajo del hardware de forma directa. - NXC (Not eXactly C): lenguaje de alto nivel similar a C. - leJOS NXJ: facilita la programación del NXT con Java y se trata de un lenguaje de programación orientado a objetos. - leJOS OSEK (C/C++) - pbLua - NXT# - MindStorms for .NET: NXT# es una librería para .NET que permite controlar el Lego Mindstorms NXT con una aplicación C# o VB.NET por medio de bluetooth. - LOGO para NXT - URBI para Lego Mindstorms - Python: es un lenguaje de programación de alto nivel, fácil de aprender, muy extensible y multiplataforma. Por medio de una conexión bluetooth o USB se comunica con el NXT por medio del computador y puede leer los 71 valores de los sensores o manejar los servomotores. De esta forma el código escrito es ejecutado directamente por el PC y permite aprovechar toda la potencia de cálculo que este ofrece, así como la conexión con otros periféricos que complementen la labor del robot. Entre los lenguajes comerciales de uso libre se mencionan: - LabVIEW: la programación del NXT de forma directa desde esta plataforma es posible e inclusive se pueden desarrollar nuevos bloques de programación para NXT-G. - Microsoft Robotics Developer Studio: incluye un entorno de programación visual y permite hacer simulaciones 3D. Está dirigido a la educación y a desarrolladores tanto aficionados como comerciales. Otros lenguajes son: - MATLAB: permite controlar NXT vía bluetooth y se encuentra desarrollado en código abierto. - Simulink: se lo utiliza con robots NXT en la central de archivos de Matlab. - RoboRealm: software de visión artificial que permite el procesamiento de imágenes y control de robots. En septiembre de 2007 se creó la siguiente tabla comparativa entre algunos lenguajes de programación para el NXT: Lenguaje Característica Tipo de lenguaje Precio Plataforma necesaria Usuario final Instalación con un solo botón Facilidad de uso (en escala de 1 a 10, 10 es lo mejor) Velocidad relativa de ejecución NXT-G ROBOLAB ROBOTC NXC pbLua NXJ Gráfico $0 (version comercial) $50 (educación) Gráfico C Similar a C Lua JAVA $50 $30 vía web $50 – CD Open Source Open Source Open Source Windows, MAC OSX Windows, MAC OSX Windows Novato a intermedio Sí Novato a intermedio Sí 10 1X Windows, MAC OSX Windows Novato a avanzado Sí Windows, MAC OSX, LINUX Intermedio a avanzado Sí Intermedio o más No Intermedio o más Parcial 7 8 6 4 4 70X 130X (la más rápida) 35X No disponible 25X 72 Lenguaje NXT-G ROBOLAB ROBOTC NXC pbLua NXJ IDE Sí Sí Sí Sí Vía Eclipse Parcial (vía Eclipse) Desarrollador en tiempo real No No Parcial No No Capacidad de reproducción de sonidos Texto Capacidades Gráficos LCD Íconos Variables Punto flotante Funciones Características trigonométricas del lenguaje Estructura ‘switch’ Arreglos Conectividad con otros dispositivos Conectividad Soporta Bluetooth protocolo Fantom Duplex (velocidad) Sistema de manejo de archivos en el ladrillo Sistema de programación en el ladrillo DATA LOGGING integrado Compatibilidad con Lego RCX Tonos + WAV Básico Básico Sí Hard No Tonos + WAV Mejorado++ Mejorado Sí Hard Sí Full Featured Tonos + WAV Mejorado++ Mejorado Sí Sí Sí Tonos + WAV Básico Básico Sí Sí No Mejorado No No Sí Sí Tonos + WAV Mejorado Mejorado No Sí Sí No Sí Sí No Sí? Sí? Sí No Sí No No Sí No No Sí Sí Sí Sí PC, NXT Ninguna PC, NXT, GPS, otros PC, NXT PC, NXT, GPS, otros NXT, otros Sí No Sí Sí No No Half No disponible Full Half Full Full Sí Sí Sí Sí No No Característica Tonos Sí Sí Sí Sí No No No No Sí Sí Sí Sí No Parcial No No No Parcial Tabla 3.1. Comparación entre diferentes lenguajes de programación, tomado de [24] En cuanto a las características descritas en la Tabla 3.1, se pueden realizar las siguientes precisiones. Capacidad de reproducción de sonidos FUNCIONALIDAD DESCRIPCIÓN Reproduce un tono simple a la velocidad del NXT, a una frecuencia y una TONOS duración determinadas. Reproduce archivos “WAV” guardados en el NXT. Los archivos de sonido TONOS + WAV contienen sonidos simples que son reproducidos a alta velocidad. Tabla 3.2. Capacidad de reproducción de sonidos, tomado de [24] Capacidades de la pantalla LCD ATRIBUTO FUNCIONALIDAD Básico Mejorado TEXTO Mejorado++ DESCRIPCIÓN - Ubica un texto en la pantalla LCD en coordenadas específicas. - Controles de formato “Print” para caracteres alfanuméricos. - Opciones múltiples de fuentes de texto. ROBOTC y ROBOLAB manejan el tamaño 6x8, como otros sistemas, además del tamaño de fuente 12x16. - Se pueden eliminar, opcionalmente, líneas de texto antes de hacer nuevos gráficos. - Las rutinas para graficar son optimizadas para minimizar el tiempo real. 73 - Dibuja líneas, rectángulos, círculos y puntos simples en la pantalla LCD. - Funciones para borrar y rellenar rectángulos y círculos para dar una capacidad de dibujo Mejorado expandida. - Dibuja óvalos y círculos. - Habilidad de dibujar archivos de íconos en la pantalla. Tabla 3.3. Capacidades de la pantalla LCD, tomado de [24] Básico GRÁFICOS ÍCONOS Características del lenguaje ATRIBUTO CARACTERÍSTICAS - Todas las soluciones soportan variables definidas por el usuario. - Existe un mecanismo especial para definir variables en el lenguaje NXTG. VARIABLES - Las variables en lenguajes gráficos tienen alcance global. No es posible definir variables locales. - Las variables en lenguajes textuales dan importancia al tipo de letra usada. - Todas las soluciones soportan cálculos con números enteros (“integer”). Las expresiones resultantes se redondean siempre al entero. PUNTO FLOTANTE - Algunos lenguajes textuales soportan fracciones o números en punto flotante. - El soporte de funciones trigonométricas es útil en aplicaciones basadas FUNCIONES en un “cálculo al ojo” de los resultados entregados por el codificador del TRIGONOMÉTRICAS motor. - Una declaración “switch” permite verificar múltiples condiciones a la vez. ESTRUCTURA - Para muchos compiladores, el código para una declaración “switch” es "SWITCH" similar al de una serie de instrucciones “if” anidadas. ARREGLOS - Utilizados en programación. Tabla 3.4. Características del lenguaje, tomado de [24] Conectividad bluetooth ATRIBUTO OTROS DISPOSITIVOS DUPLEX (VELOCIDAD) CARACTERÍSTICAS - El firmware estándar del NXT-G soporta comunicaciones mediante bluetooth (BT) entre el PC y el NXT, así como entre diferentes NXTs. Incluye el uso del protocolo de mensajes de Lego “Fantom” para realizar las comunicaciones. - Existen requisitos que se deben cumplir para conectar un dispositivo BT que no soporta el protocolo “Fantom”. - El protocolo Fantom usa el enlace BT en la forma half-duplex. • El dispositivo máster del enlace BT puede enviar mensajes al esclavo en cualquier momento. • El dispositivo esclavo solo envía mensajes al dispositivo máster en respuesta a su requerimiento. Esto resulta en un uso ineficiente del enlace BT y en una gran latencia en el envío de mensajes del dispositivo esclavo al maestro. - Algunas soluciones utilizan el enlace BT en la forma full-duplex. El dispositivo esclavo puede enviar mensajes al dispositivo máster independientemente de la existencia de un requerimiento de su parte, esto reduce significativamente la “latencia” de la transmisión. Tabla 3.5. Conectividad bluetooth, tomado de [24] 74 En el presente trabajo, se van a utilizar los lenguajes de programación NXT-G (lenguaje con características gráficas) y NXC (lenguaje con código escrito). Mediante NXT-G se programarán los siguientes prototipos: - Medidor de longitud - Calculadora de áreas y volúmenes - Medidor de sonido - Aplicaciones remotas Los prototipos que se programarán con NXC son los siguientes: - Escorpión - Brazo mecánico - Auto controlado mediante algoritmo PID - Seguidor de línea 3.2 LENGUAJE DE PROGRAMACIÓN NXT-G [25] NXT-G es un lenguaje que se muestra similar a un diagrama de flujo. Este lenguaje viene incluido en el paquete Lego Mindstorms NXT y es desarrollado sobre la plataforma Labview 7.1 del fabricante National Instruments. El lenguaje es compatible con los sistemas operativos Mac OS X y Windows XP. Los programas desarrollados en NXT-G usan una notación gráfica donde los bloques que aparecen representan operaciones matemáticas, lógicas y otras y donde es fácil notar la secuencia en que se deben realizar éstas y las demás acciones relacionadas con los bloques. A diferencia de otros lenguajes de programación como BASIC, C y Java, en NXTG no existe una secuencia de comandos que el programador debe escribir. En lugar de ello, los programas NXT-G se escriben aplicando simples procesos de “arrastrar y dejar caer” los bloques necesarios hasta el lugar que les corresponde en el programa y luego se procede a realizar conexiones mediante “cables” entre los bloques deseados y con la información requerida. Para descargar el programa al ladrillo NXT, éste es previamente compilado en el lenguaje ensamblador que 75 luego será ejecutado en el ladrillo, donde ya existe un programa oficial del fabricante (firmware) que lo entiende. Adicionalmente a los bloques que incluye el paquete provisto por el fabricante, NXT-G permite crear bloques personales, lo que a su vez se convierte en una ventaja, pues se pueden también importar bloques creados por otros desarrolladores. Un programa informático en NXT-G es un conjunto de bloques organizados secuencialmente de forma que el robot realiza una tarea concreta al ejecutar ordenadamente todas las acciones que determinan los bloques de dicho programa. 3.2.1 ENTORNO DE PROGRAMACIÓN DEL LENGUAJE NXT-G Al instalar el software provisto por el fabricante de LEGO MINDSTORMS NXT e iniciar la programación de una tarea se puede observar la siguiente pantalla: Figura 3.1. Entorno de programación (IDE) del lenguaje NXT-G 76 El IDE o entorno de programación tiene de seis diferentes secciones que permiten realizar todas las tareas requeridas para realizar un programa para el NXT, descargarlo y ponerlo en acción: • (1) Barra de herramientas (Toolbar): se muestran los comandos que usualmente son de mayor uso, tales como abrir o guardar programas, administrar los bloques definidos por el usuario, actualizar el sistema operativo del NXT (firmware) y buscar ayuda. • (2) Paleta de programación (Programming palette): se almacenan los diferentes tipos de bloques, los mismos que están separados en tres categorías: paleta común (Common palette), que contiene los bloques de uso frecuente; paleta completa (Complete palette), que contiene todos los bloques disponibles y la paleta que contiene los bloques definidos por el usuario (Custom palette). • (3) Área de trabajo (Work area): área para realizar los programas. Los bloques son colocados sobre las “vigas” que ofrece esta ventana y luego son conectados entre sí. • (4) Panel de configuración (Configuration panel): área que permite configurar en detalle cada uno de los bloques del área de trabajo. Cada bloque contiene una serie de características que son especificadas en esta sección al seleccionarlo. • (5) Controlador (Controller): herramientas para compilar, descargar y ejecutar los programas desarrollados. Esta herramienta administrativa permite además consultar sobre el estado del ladrillo NXT: disponibilidad, memoria, estado de la batería. • (6) Robo Center: constituye el puente a la comunidad NXT y los recursos ofrecidos por la misma. Se ofrecen instrucciones para construir robots prediseñados y acceso directo al portal de la comunidad de Lego Mindstorms NXT. 3.2.2 BLOQUES En términos generales, los bloques que incluye NXT-G permiten realizar conversiones entre diferentes tipos de datos, operaciones matemáticas, generación de números aleatorios, acceso a un sistema de archivos y más. 77 Cada bloque representa una acción de un robot y puede configurarse a través de un menú propio presente en el llamado panel de configuración. Cada menú tiene sus propios parámetros, los mismos que son diferentes en cada bloque. 3.2.3 CONTROLES DE SALIDA El control de los dispositivos de salida tales como motores, sonidos o pantalla de cristal líquido (LCD), viene dado por los siguientes bloques: • Bloque Motor: permite el control preciso de la velocidad de un motor. Se puede aumentar la velocidad hasta un valor predeterminado siguiendo la forma de una rampa o se la puede disminuir hasta detenerse totalmente. Al seleccionar “Wait for Completion” el programa ejecutará el siguiente bloque una vez que el bloque Motor ha arrancado al mismo. Figura 3.2. Bloque Motor y su panel de configuración • Bloque Move: controla y sincroniza el movimiento de dos o más motores. Es un bloque muy útil cuando se desea que el robot se mueva en línea recta hacia adelante o hacia atrás. 78 Figura 3.3. Bloque Move y su panel de configuración • Bloque Rotation sensor: permite determinar la cantidad de grados sexagesimales que gira el eje del motor o la cantidad de rotaciones completas del mismo. Figura 3.4. Bloque Rotation sensor y su panel de configuración • Bloque Sound: emite un tono o reproduce un archivo de sonido. Figura 3.5. Bloque Sound y su panel de configuración 79 • Bloque Display: muestra un texto, una imagen o una figura prediseñada en la pantalla de cristal líquido del ladrillo NXT. Figura 3.6. Bloque Display y su panel de configuración 3.2.4 CONTROLES DE ENTRADA El control de los dispositivos de entrada, tales como los sensores, se puede realizar a través de los siguientes bloques: • Bloque Touch sensor: provee acceso al estado actual del sensor de contacto y la información la entrega a través de una señal lógica. Figura 3.7. Bloque Touch sensor y su panel de configuración • Bloque Sound sensor: sirve como un detector de sonidos y entrega un valor que corresponde a la cantidad de sonido actual y puede enviar una señal de “verdadero” o “falso” si el nivel de sonido está sobre o bajo un nivel dado. 80 Figura 3.8. Bloque Sound sensor y su panel de configuración • Bloque Light sensor: mide la cantidad de luz ambiental que incide sobre el sensor de luz o enciende/apaga la luz del sensor. Figura 3.9. Bloque Light sensor y su panel de configuración • Bloque Ultrasonic sensor: detecta las reflexiones de las señales emitidas por el sensor de ultrasonido y las convierte en una medida de distancia. Se puede programar al robot para que reaccione si se está por debajo o sobre una cierta medida. Figura 3.10. Bloque Ultrasonic sensor y su panel de configuración Existen otros tres métodos que pueden ser usados para que los robots basados en NXT puedan tener información del medio externo. Estos incluyen a los tres botones, los temporizadores y el uso de la tecnología bluetooth. • Bloque NXT buttons: detecta las acciones realizadas sobre los botones del NXT (botón naranja y botones de navegación lateral). 81 Figura 3.11. Bloque NXT buttons y su panel de configuración El bloque Rotation sensor también funciona como un control de entrada al contar la cantidad de grados sexagesimales girados por el eje del motor o las rotaciones completas del mismo 3.2.5 COMUNICACIONES Las comunicaciones se pueden realizar a través de los siguientes bloques: • Bloque Send message: envía mensajes vía bluetooth. Se debe seleccionar el tipo de datos a transmitir y el número de buzón del destinatario. Figura 3.12. Bloque Send message y su panel de configuración • Bloque Receive message: recibe mensajes vía bluetooth. Se debe configurar el tipo de datos a recibir y el número de buzón y debe corresponder a los datos almacenados en el remitente. Figura 3.13. Bloque Receive message y su panel de configuración 82 3.2.6 FLUJO DEL PROGRAMA El control general del flujo del programa se realiza a través de los siguientes bloques: • Bloque Wait: permite que el programa realice una pausa hasta que la medida de un sensor haya alcanzado un cierto valor o hasta que haya transcurrido cierto tiempo. Figura 3.14. Bloque Wait (tiempo transcurrido) y su panel de configuración • Bloque Loop: repite una porción del programa hasta que una condición haya sido cumplida, tal como el tiempo transcurrido, la cantidad de repeticiones realizadas, un valor lógico o un cierto estado del sensor. También se puede indicar que una porción de código se repita indefinidamente. Figura 3.15. Bloque Loop y su panel de configuración • Bloque Switch: permite escoger entre dos o más secuencias de código de acuerdo a una condición particular. Está asociado a la acción sobre uno de los sensores disponibles. 83 Figura 3.16. Bloque Switch (con sensor de contacto) y su panel de configuración • Bloque Stop: detiene al programa, a los motores, a las lámparas o sonidos. En el caso de este bloque no se requiere de un panel de configuración. Figura 3.17. Bloque Stop 3.2.7 OTROS BLOQUES Existen otros bloques que no necesariamente se pueden incluir en las categorías anteriores: • Bloque Timer: lee o resetea los valores de los tres temporizadores internos que tiene el NXT y que se inician automáticamente. Figura 3.18. Bloque Timer y su panel de configuración 84 • Bloque Record/play: permite “grabar” los movimientos del robot. Una vez que se ha grabado una secuencia de movimientos, es posible colocar el bloque en modo “reproducir” (play) y el robot repite los movimientos almacenados. Figura 3.19. Bloque Record/play y su panel de configuración 3.2.8 BLOQUES DEFINIDOS POR EL USUARIO Una de las características más útiles del software de LEGO MINDSTORMS NXT es la habilidad de crear bloques definidos por el usuario. Cada uno de estos bloques puede ser entendido como subprogramas que consisten de una secuencia de bloques conectados por “ejes” y “cables”. Para crear bloques personales es necesario acudir a la opción que permite hacerlo: My Block Builder. Posteriormente se debe escoger del área de trabajo el grupo de bloques que se desea incluir en el nuevo bloque y asignarle a éste el ícono que se crea conveniente. Figura 3.20. Ventana que permite acceder a My Block Builder 85 El nuevo bloque creado aparecerá en la paleta de bloques definidos por el usuario y podrá ser usado en programas posteriores o compartido con la comunidad de programadores. 3.2.9 VARIABLES NXT-G soporta el concepto de variables globales; esto es, si se requiere de un valor a ser compartido globalmente por otros bloques, se lo puede hacer mediante la definición de una variable. Para definir variables se usa el comando Define Variable que aparece en el menú Edit del entorno de programación del NXT-G. La variable a definir puede ser tipo texto, numérica o lógica. Figura 3.21. Ventana que permite definir variables La definición de variables cobra especial importancia en la definición de bloques creados por el usuario, pues a través de ellas se transfieren los parámetros que requiere el bloque. Para el trabajo con variables dentro del programa se usa el bloque Variable, el mismo que permite leerlas o escribir sobre ellas. 86 Figura 3.22. Bloque Variable y su panel de configuración 3.2.10 OPERACIONES MATEMÁTICAS El NXT-G permite realizar operaciones aritméticas con números enteros y operaciones lógicas con las variables correspondientes. • Bloque Math: permite realizar operaciones aritméticas como la suma, resta, multiplicación y división. Figura 3.23. Bloque Math y su panel de configuración • Bloque Logic: permite realizar operaciones lógicas. Figura 3.24. Bloque Logic y su panel de configuración • Bloque Compare: permite realizar comparaciones entre dos números (>, <, =). 87 Figura 3.25. Bloque Compare y su panel de configuración • Bloque Range: determina si un número se encuentra dentro o fuera de un rango de valores. Figura 3.26. Bloque Range y su panel de configuración • Bloque Random: genera números aleatorios que se encuentran entre dos valores previamente definidos. Figura 3.27. Bloque Random y su panel de configuración 3.2.11 BLOQUES ESPECIALES • Bloque Text: permite añadir pequeñas piezas de texto para crear otras más grandes. Figura 3.28. Bloque Text y su panel de configuración 88 • Bloque Number to Text: convierte un número a texto de tal manera que se lo puede mostrar en la pantalla del NXT. Figura 3.29. Bloque Number to Text y su panel de configuración • Bloque Keep Alive: evita que el NXT ingrese a un modo de “descanso”. Este bloque se usa cuando el NXT tiene que esperar por “largos” períodos de tiempo por la respuesta de algún sensor. Figura 3.30. Bloque Keep Alive • Bloque File Access: mediante este bloque se pueden almacenar datos recuperados por el robot en un archivo en el NXT. Después de usar uno de estos bloques para generar un archivo se requiere de otro para cerrarlo antes de poder leerlo o borrarlo. Figura 3.31. Bloque File Access y su panel de configuración 89 • Bloque Calibrate: permite calibrar los valores mínimos (0%) y máximos (100%) a ser detectados por los sensores de sonido y de luz. Figura 3.32. Bloque Calibrate y su panel de configuración • Bloque Reset Motor: apaga el mecanismo de corrección automática de error que controla precisamente cuánto gira cada servomotor. Figura 3.33. Bloque Reset Motor y su panel de configuración 3.2.12 “CABLES DE DATOS” Para pasar los datos entre diferentes bloques se utilizan “cables” de conexión, los mismos que se visualizan mediante líneas. Para ello, cada bloque puede desplegar una serie de opciones donde se muestran todos los posibles datos que pueden manejar. En el ejemplo de la figura se está pasando la información entre tres bloques: el primero de ellos, el bloque del sensor de luz, para la información de la intensidad luminosa medida a un bloque que convierte el número en texto y este último 90 resultado se pasa al bloque de pantalla para visualizar la información de la medida. Cada bloque en NXT-G tiene diferentes puntos de conexión (de entrada o de salida de datos) en dependencia del tipo de función que ejecuta. Figura 3.34. Conexiones para enviar datos de un bloque a otro 3.3 LENGUAJE DE PROGRAMACIÓN NXC [26][27][28][29][30][31] NXC son las siglas escogidas para el lenguaje de programación Not eXactly C (no exactamente C) y se trata de un lenguaje textual de características similares a las de C, que puede ser usado para programar exclusivamente el ladrillo NXT. El lenguaje NXC proporciona estructuras de programa como arreglos, funciones, tareas múltiples, sentencias de control de flujo, funciones de acceso a los sensores y actuadores y sistemas de comunicación. Los programas escritos en NXC son compilados para ser ejecutados por el firmware de Lego Mindstorms NXT. NXC resulta ser la última de las versiones de lenguajes de programación, realizado sobre la plataforma del lenguaje 91 ensamblador NBC (NeXT Byte Codes) y fue el primero en aparecer luego de que Lego Mindstorms NXT lanzara su lenguaje NXT-G. Este lenguaje le corresponde a John Hansen, quien a su vez es coautor, junto con David Baum, del lenguaje Not Quite C (NQC), que se usa para programar la versión anterior RCX de Lego Mindstorms. NXC es un lenguaje que se puede usar de forma libre y se lo puede descargar desde: http://bricxcc.sourceforge.net/nxc. Hansen ha actualizado el entorno de programación (IDE), llamado Bricx Command Center (BricxCC), para NQC y otros lenguajes de programación desarrollados con NBC, como el NXC. Este entorno de programación (IDE) se encuentra disponible bajo la dirección: http://sourceforge.net/projects/bricxcc. Es necesario tener en cuenta que, aunque el preprocesador y las estructuras de control de NXC son muy similares al lenguaje C, NXC no es completamente un lenguaje de programación de propósito general, ya que contiene muchas restricciones debido a las limitaciones del intérprete de código de máquina del NXT. A diferencia del NXT-G, el lenguaje NXC es apropiado para aplicaciones de control en tiempo real. 3.3.1 ENTORNO DE PROGRAMACIÓN PARA EL LENGUAJE NXC El Bricx Command Center (BricxCC), entorno desarrollado originalmente por Mark Overmars, se ejecuta únicamente bajo el ambiente de Microsoft Windows y ahora se lo encuentra en su versión 3.3. Esta utilidad permite escribir los programas, descargarlos en el ladrillo NXT, iniciar su ejecución y detenerlos, así como también permite indagar acerca del estado de la memoria flash del NXT, convertir archivos de sonido para ser usados por el ladrillo y mucho más. BricxCC actúa más como un procesador de texto, pero con algunas características adicionales. El entorno de programación incluye los tres clásicos componentes, tal y como se puede observar en la figura: 92 Figura 3.35. Entorno de programación (BricxCC) (1) Una barra de menú: incluye las típicas operaciones que se pueden realizar con los archivos, comandos de edición, compilación y de descarga de programas hacia el ladrillo NXT. Una opción muy importante es la denominada Preferences, donde se pueden escoger diferentes opciones de configuración. (2) Una barra de herramientas que incluye las utilidades de la barra de menú más frecuentemente usadas. (3) Un editor que está separado en dos partes: un árbol donde se muestra una lista de elementos del lenguaje y la sección de edición. El editor provee al usuario de un soporte de alto nivel para desarrollar programas NXC, con las características esperadas para un entorno de programación moderno. 3.3.2 PROGRAMACIÓN EN NXC Como en todo lenguaje de programación, existen reglas que deben cumplirse al momento de usarlo; esto incluye reglas para la escritura de las sentencias, estructura de los programas, sentencias y expresiones y las instrucciones para el preprocesador: 93 - Tal y como sucede con los lenguajes C y C++, NXC distingue entre el tipo de letra (minúscula y mayúscula) usada para escribir las sentencias. Esto significa que la variable “Xyz” es diferente a la variable “xYz”. - Para poder documentar de mejor manera el código fuente se suelen usar comentarios, los mismos que no son tomados en cuenta por el compilador. La forma de hacer comentarios es colocando el símbolo // al inicio del texto que sirve como tal. Cuando se necesita hacer comentarios más largos o que ocupan algunas líneas se procede de la siguiente manera: /* comentario */. - Los espacios dejados en blanco no suelen ser considerados por el compilador y permiten que la comprensión del programa sea mayor; sin embargo, existen operadores que constan de más de un carácter, donde los espacios en blanco no son aceptados, pues provocan un error de compilación. - Las constantes numéricas pueden ser escritas en forma decimal (x=10;) o en forma hexadecimal (x=0x10; // corresponde a 10 hexadecimal o 16 decimal). - Las palabras clave que NXC tiene reservadas para su uso son las siguientes: __RETURN__ __TMPBYTE__ abs asm char const false for long mutex short sign sub switch unsigned until 3.3.2.1 __RETVAL__ __TMPWORD__ bool break continue default goto if priority repeat start stop task true void while __STRRETVAL__ __TMPLONG__ byte case do else inline int return safecall string struct typedef Programas con NXC Los programas en NXC están constituidos por bloques de código y variables. Los dos posibles bloques de código son las tareas y las funciones. Ya que el NXT soporta la ejecución de tareas múltiples, cada tarea en NXC corresponde a una tarea en el NXT. Cada programa debe incluir por lo menos una tarea y esta debe llamarse main. Una tarea está conformada por una serie de sentencias, cada una 94 de las cuales termina con el símbolo punto y coma (;). Para indicar el inicio y el final de cada tarea se usan los símbolos de llaves ({ }). El número máximo de tareas en un programa NXC es de 256. task main() { sentencia1; sentencia2; … } Las tareas pueden ser iniciadas y detenidas usando las sentencias start y stop respectivamente, aunque también se pueden detener todas las tareas que están siendo ejecutadas mediante la sentencia StopAllTasks. En algunas aplicaciones es especialmente práctico el uso de las funciones, las mismas que pueden ser llamadas tantas vez cuantas sea necesario. Las funciones agrupan código de programación y pueden soportar argumentos y retornar valores. En NXC también es posible asignar una prioridad a una tarea de tal manera que así se pueda asegurar el cumplimiento de determinadas condiciones ante programas que plantean múltiples tareas. 3.3.2.2 Variables Los tipos de variables que puede manejar NXC son los siguientes: Tipo de variable Bool byte, unsigned char Char unsigned int short, int unsigned long Long Mutex Información 8 bits sin signo 8 bits sin signo 8 bits con signo 16 bits sin signo 16 bits con signo 32 bits sin signo 32 bits con signo Tipo especial usado en acceso a código exclusivo 95 String Struct Arrays Arreglo de bytes Tipos de estructuras definidas por el usuario Arreglos de cualquier tipo Tabla 3.6. Tipos de variables que maneja NXC, tomado de [27] Las variables usadas pueden ser de tipo global (declaradas al inicio del programa) o local (declaradas en el interior de las tareas y funciones). Para declarar una o más variables se usa la siguiente sintaxis: int auto; // declaración de la variable auto de tipo int int vector [n]; // declaración del arreglo vector de n elementos de tipo int 3.3.2.3 Conjuntos definidos por el usuario NXC soporta conjuntos definidos por el usuario, conocidos como structs. Ejemplo: struct auto { string tipo_auto; int fecha_fab; … } Posteriormente, en el programa, se puede hacer uso de estas estructuras para definir nuevas variables o para usarlas en declaraciones: fooBar.tipo_auto=”honda” 3.3.2.4 Arreglos Los arreglos que maneja NXC son declarados de la misma forma que las variables ordinarias, añadiendo únicamente corchetes luego del nombre. int mi_arreglo [ ]; // declara un arreglo con 0 elementos int mi_arreglo [10]; // declaración de un arreglo de 10 elementos int mi_arreglo [ ] [ ]; // declara un arreglo bidimensional int X [ ] [ ] = {1,2,3,4}; // elementos del arreglo mi_arreglo [0] = 123; // primer elemento de mi_arreglo es 123 3.3.2.5 Asignaciones Una vez declaradas las variables se puede asignar a ellas un determinado valor usando el operador correspondiente: 96 Operador = += -= *= /= %= &= _= ^= __= +-= >>= <<= Acción Asignar expresiones a variables Sumar una expresión a una variable Restar una expresión de una variable Multiplicar una expresión por una variable Dividir una variable entre una expresión Fijar en una variable el resto del resultado de una división Operación lógica AND Operación lógica OR Operación lógica OR exclusivo Fijar en una variable el valor absoluto de una expresión Fijar en una variable el signo de una expresión (-1, +1, 0) Desplazar hacia la derecha una variable mediante una expresión Desplazar hacia la izquierda una variable mediante una expresión Tabla 3.7. Tipos de operadores que maneja NXC, tomado de [27] 3.3.2.6 Estructuras Las estructuras más simples son aquellas que se ubican entre llaves ({ }): { x = 1; y = 2; } Las estructuras se pueden hacer más complejas, mediante el uso de otras sentencias. Otras estructuras son: - if: evalúa una condición y puede presentar una alternativa if … else - while: se usa para construir lazos condicionales - do-while: es una variante de la sentencia while. Se diferencia de while en que, mediante su uso, el cuerpo del lazo puede no ser ejecutado ni una sola vez, mientras que con do-while éste se ejecuta por lo menos una vez. - for: es equivalente a un lazo while con ligeras variaciones. - repeat: ejecuta un lazo un número específico de veces. - switch: se usa para ejecutar un determinado bloque de código en dependencia del valor de una expresión. 97 - goto: permite al programa saltar a una determinada locación en el mismo. 3.3.2.7 Expresiones El lenguaje NXC considera únicamente dos tipos de valores: constantes numéricas y variables. Las constantes numéricas son números enteros y su tipo depende del valor de la constante. Para la evaluación de expresiones con constantes, NXC usa internamente operaciones matemáticas de 32 bits con signo. Las constantes numéricas pueden ser escritas en forma decimal o hexadecimal. Existen dos valores especiales predefinidos: true y false (verdadero y falso); el valor de false es 0 (cero), mientras que el de true es 1. Los valores son combinados mediante operadores, algunos de los cuales solo sirven para evaluar expresiones constantes. Los operadores se listan a continuación: Operador abs() sign() ++, -~ ! *, /, % +, <<, >> <, >, <=, >= ==, != & ^ l && ll ?: Descripción Valor absoluto Signo del operando Pos-incremento, pos-decremento (válido solo con variables) Menos (sistema unitario) Negación (sistema unitario) Negación lógica Multiplicación, división, módulo Adición, sustracción Desplazamiento a la izquierda, derecha Operadores de orden Igual a, distinto de AND (a nivel de bits) XOR (o exclusivo a nivel de bits) OR (a nivel de bits) AND lógico OR lógico Valor condicional Tabla 3.8. Tipos de operadores para unir expresiones en NXC, tomado de [27] 98 3.3.2.8 Condiciones Una condición está formada por la comparación de dos expresiones. Los diferentes tipos de condiciones se listan a continuación: Condición True False Expr expr1 == expr2 expr1 != expr2 expr1 < expr2 expr1 <= expr2 expr1 > expr2 expr1 >= expr2 ! condition cond1 && cond2 cond1 ll cond2 Significado Siempre verdadero Siempre falso Verdadero si expr es distinto de cero Verdadero si expr1 y expr2 son iguales Verdadero si expr1 y expr2 no son iguales Verdadero si expr1 es menor que expr2 Verdadero si expr1 es menor o igual que expr2 Verdadero si expr1 es mayor que expr2 Verdadero si expr1 es mayor o igual que expr2 Negación lógica de una condición AND lógico entre dos condiciones OR lógico entre dos condiciones Tabla 3.9: Tipos de operadores para manejar condiciones en NXC, tomado de [27] 3.3.2.9 NXC API El interface para la programación de aplicaciones del NXT, API por sus siglas en inglés (Application Programming Interface), define una serie de constantes, funciones, valores y macros que proveen acceso a varios de los periféricos del NXT, como lo son los sensores, actuadores y medios de comunicaciones. A continuación se explicarán brevemente algunas de las funciones, que posiblemente serán las de mayor uso en el presente trabajo: 3.3.2.9.1 Funciones de temporización Wait(n): hace que una tarea espere en su ejecución n milisegundos. CurrentTick(): devuelve un valor sin signo de 32 bits, que corresponde a la temporización del sistema en milisegundos. FirstTick(): retorna un valor sin signo de 32 bits, que corresponde al tiempo transcurrido en milisegundos desde que el programa se inició. 99 SleepTime(): retorna el número de minutos que el NXT se mantendrá encendido antes de apagarse automáticamente. SleepTimer(): retorna el número de minutos que faltan en la cuenta regresiva del valor fijado en SleepTime. Cuando el valor del SleepTimer alcanza el valor de cero, el NXT se apagará. ResetSleepTimer(): resetea el temporizador del sistema y lo coloca en el valor del SleepTime. Esta acción impediría que el NXT se apague mientras el programa se está ejecutando. SetSleepTime(min): se setea el valor del temporizador del NXT a la cantidad de minutos indicada. SleepNow(): apaga inmediatamente el NXT. SetSleepTimer(min): se setea el valor del temporizador del sistema a la cantidad de minutos indicada. 3.3.2.9.2 Funciones de control del programa Stop(bvalue): detiene la ejecución del programa si bvalue es verdadero. StopAllTasks(): detiene todas las tareas que están ejecutándose. StartTask(task): inicia la ejecución de la tarea indicada. StopTask(task): detiene únicamente la tarea indicada. Acquire(mutex): adquiere la variable mutex especificada. Esta función se usa para asegurar que la tarea corriente tenga acceso único a recursos compartidos, como pueden serlo los motores o la pantalla LCD. Release(mutex): abandona el control de la variable mutex especificada para que otras tareas puedan acceder a ella. Precedes(task1, task2,…, taskN): programa o agenda la ejecución de diversas tareas una vez que ha terminado la ejecución de la actual. Follows(task1, task2,…, taskN): programa o agenda la ejecución de la tarea actual una vez que cualquiera de las mencionadas haya culminado. ExitTo(task): inmediatamente sale de la tarea actual e inicia la ejecución de la tarea mencionada. 100 3.3.2.9.3 Funciones de cadenas de caracteres StrToNum(str): retorna el valor numérico correspondiente a str. StrLen(str): retorna la longitud de la cadena de caracteres str. StrIndex(str, idx): retorna el valor numérico del caracter ubicado en la cadena según el índice especificado. NumToStr(value): retorna la representación en cadena de caracteres del valor numérico especificado. FormatNum(fmtstr, value): retorna una cadena de caracteres formateada usando el formato y el valor. StrCat(str1, str2, …, strN): retorna una cadena que resulta de concatenar todas las cadenas dadas juntas. SubStr(string, idx, len): retorna una sub-cadena de la cadena de caracteres ingresada, que inicia en idx y tiene la longitud len. StrReplace(string, idx, newStr): retorna una cadena con una parte de la misma reemplazada por newStr en la posición idx dada. 3.3.2.9.4 Funciones numéricas Random(n): retorna un número aleatorio sin signo de 16 bits que se encuentra entre 0 y n (no incluido). Random(): retorna un número aleatorio de 16 bits. 3.3.2.10 Módulo de entrada El módulo de entrada del NXT incluye todas las entradas para sensores, excepto aquellas para sensores digitales I2C (Inter-Integrated Circuit). Existen cuatro sensores que están internamente numerados como 0, 1, 2 y 3, aunque externamente se llamen 1, 2, 3 y 4. Para evitar esta confusión se han definido los nombres para los puertos S1 (IN_1), S2 (IN_2), S3 (IN_3) y S4 (IN_4), los mismos que podrán ser usados en cualquier momento que se los requiera como argumentos. En cualquier momento que se requiera los valores medidos 101 por los sensores se pueden también usar los nombres: SENSOR_1, SENSOR_2, SENSOR_3 y SENSOR_4. Se pueden mencionar las siguientes funciones que utilizan o activan el módulo de entrada del NXT: SetSensor(port, const configuration): setea el tipo y modo del sensor dado a la configuración especificada. SetSensorLight(port): configura el sensor ubicado en el puerto indicado como un sensor de luz. SetSensorSound(port): configura el sensor ubicado en el puerto indicado como un sensor de sonido. SetSensorTouch(port): configura el sensor ubicado en el puerto indicado como un sensor de contacto. SetSensorLowspeed(port): configura el sensor ubicado en el puerto indicado como un sensor digital I2C (alimentado con 9V). 3.3.2.11 Módulo de salida El módulo de salida del NXT incluye a todas las salidas que comandan motores. Las constantes OUT_A, OUT_B y OUT_C son usadas para identificar a cada una de las tres posibles salidas de forma individual, aunque también es posible realizar combinaciones que también se encuentran definidas: OUT_AB, OUT_AC, OUT_BC y OUT_ABC. Es posible manejar la potencia de cada una de las salidas, la misma que se definirá entre 0 (la menor potencia) y 100 (la mayor potencia). El ingreso de valores negativos indicará una rotación en sentido contrario. Entre las funciones que utiliza el módulo de salida se mencionan: Off(outputs): apaga las salidas detalladas mediante un frenado inmediato. Coast(outputs): apaga las salidas detalladas, haciendo un frenado paulatino. 102 OnFwd(outputs, pwr): hace que las salidas funcionen con marcha hacia adelante y las enciende a la potencia pwr indicada. OnRev(outputs, pwr): hace que las salidas funcionen con marcha en reversa y las enciende a la potencia pwr indicada. RotateMotor(outputs, pwr, angle): la salida indicada es activada con marcha hacia delante y para el número de grados especificado. RotateMotorPID(outputs, pwr, angle, p, i, d): la salida indicada es activada con marcha hacia delante y para el número de grados especificado. Es posible modificar las constantes proporcional, integral y derivativa del algoritmo de control PID incluido en el firmware del NXT. 3.3.2.12 Módulo de sonido El NXT permite la reproducción de tonos básicos, así como de dos diferentes tipos de archivos de sonido: archivos *.rso, que son similares a los archivos *.wav y archivos de melodías, que son similares a los archivos MIDI. Los archivos tipo melodía son generalmente de menor extensión que los archivos .rso. Para operar con el módulo de sonido se tienen las siguientes funciones: PlayFile(filename): reproduce el archivo especificado en formato *.rso o *.rmd. PlayFileEx(filename, volume, bLoop): reproduce el archivo especificado en formato *.rso o *.rmd. El volumen varía entre 0 (valor mínimo) y 4 (valor máximo) y bLoop es un valor booleano que indica si el archivo debe o no repetirse. PlayTone(frequency, duration): reproduce un simple tono a la frecuencia (Hz) y duración (ms) especificadas. PlayToneEx(frequency, duration, volumen, bLoop): reproduce un simple tono a la frecuencia (Hz), duración (ms) y volumen especificados. 3.3.2.13 Módulo de pantalla LCD El NXT permite dibujar puntos, líneas, rectángulos y círculos en la pantalla LCD, así como también permite escribir textos y números en la misma. Para entender 103 las diferentes funciones que incluye NXC hay que tomar en cuenta que el origen de coordenadas se encuentra en la parte inferior izquierda de la pantalla. Entre las funciones usadas para usar la pantalla LCD se destacan: ClearScreen(): limpia la pantalla LCD. NumOut(x, y, value, clear = false): dibuja un valor numérico en la pantalla en la ubicación (x,y). TextOut(x, y, msg, clear = false): dibuja un texto en la pantalla en la ubicación (x,y). GraphicOut(x, y, filename, clear = false): dibuja el ícono del archivo especificado (*.ric) en la pantalla en la ubicación (x,y). CircleOut(x, y, radius, clear = false): dibuja un círculo con centro (x,y) y radio especificado. LineOut(x1, y1, x2, y2, clear = false): dibuja una línea que va desde el punto de coordenadas (x1,y1) hasta el punto (x2,y2). PointOut(x, y, clear = false): dibuja un punto en las coordenadas (x,y). RectOut(x, y, width, height, clear = false): dibuja un rectángulo en las coordenadas (x,y) con ancho y altura dados. ResetScreen(): recupera la pantalla estándar del NXT en modo de ejecución. 3.3.2.14 Módulo de comunicaciones El módulo de comandos del NXT proporciona el soporte de protocolos necesarios para que el NXT responda a comunicaciones USB o bluetooth, requeridas por el PC o por algún otro ladrillo NXT. En el caso de la comunicación mediante bluetooth, es necesario considerar la comunicación de tipo maestro-esclavo. Las funciones que más aparecen para las comunicaciones mediante bluetooth son las siguientes: BluetoothStatus(connection): retorna el estado de la conexión bluetooth. SendRemoteString(connection, queue, out strval): este método envía una cadena de caracteres al dispositivo especificado en la conexión. 104 ReceiveRemoteString(queue, remove, out strval): este método es usado por el ladrillo maestro para recibir una cadena de caracteres de un dispositivo esclavo. SendRemoteNumber(connection, queue, value): este método envía un valor numérico al dispositivo especificado en la conexión. ReceiveRemoteNumber(queue, remove, out value): este método es usado por el ladrillo maestro para recibir un valor numérico de un dispositivo esclavo. SendResponseNumber(queue, value): este método envía un valor numérico como respuesta a un mensaje recibido. 3.3.2.15 Manejo de archivos El NXT puede escribir y leer sobre archivos que se encuentran almacenados en su memoria flash. El límite para el número de archivos a almacenar está dado por la capacidad o tamaño de la memoria flash. Mediante NXC se puede crear, renombrar, borrar o encontrar archivos, así como leer y escribir textos, cadenas de caracteres, números y bytes simples. Las funciones más usadas son las siguientes: CreateFile(filename, size, out handle): crea un nuevo archivo con el nombre y tamaño especificados y lo abre para escribir en él. OpenFileRead(filename, out size, out handle): abre el archivo especificado para lectura. CloseFile(handle): cierra el archivo asociado. RenameFile(oldfilename, newfilename): cambia el nombre de un archivo por otro nuevo. DeleteFile(filename): borra el archivo especificado. 105 3.4 PROGRAMACIÓN DE LOS MÓDULOS DESARROLLADOS 3.4.1 MEDIDOR DE VARIABLES MÚLTIPLES En esta aplicación se desea principalmente mostrar una forma de utilizar el NXT como un medidor de diferentes parámetros. Ya que se cuenta con diferentes sensores, se deberá conectar y configurar el sensor y puerto adecuado a la magnitud que se desea medir. 3.4.1.1 Medidor de longitudes La idea del presente proyecto es diseñar, construir y programar un dispositivo capaz de entregar la medida de una longitud. Para ello se ha acoplado una rueda a un motor NXT y se aprovecha la información otorgada por el sensor de rotación interno sobre el ángulo girado, para luego convertirlo en una medida de longitud, dado que se conoce el radio de la rueda. Cada rueda de la firma Lego tiene marcadas las dimensiones correspondientes en su parte lateral; así por ejemplo se tiene a disposición las siguientes ruedas: - 43,2x22: diámetro de 43,2mm y ancho de 22mm - 56x26: diámetro de 56mm y ancho de 26mm - 81,6x15: diámetro de 81,6mm y ancho de 15mm Lo que se desea es medir longitudes a través de la longitud recorrida por una rueda. La fórmula que permite calcular esta distancia es la siguiente: x= 2πR ⋅α 360 o Figura 3.36. Relación entre las variables α, R y x 106 donde: x: distancia recorrida por la rueda α: ángulo girado por el eje de la rueda R: radio de la rueda El ángulo α se determina a través de la medida entregada por el sensor de rotación. De esta manera, la fórmula que deberá ser ingresada en el programa queda de la siguiente manera para cada uno de las ruedas: - Rueda 43,2x22: x = x= - - 4,32π 2 2 ⋅ α [cm] ≈ ⋅ α [cm] ≈ ⋅ α [cm] o 53,05 53 360 Rueda 56x26: x = x= 5,6π ⋅ α [cm] ≈ 0,0488692191⋅ α [cm] 360 o 5,6π 2 2 ⋅ α [cm] ≈ ⋅ α [cm] ≈ ⋅ α [cm] o 40,93 41 360 Rueda 81,6x15: x = x= 4,32π ⋅ α [cm] ≈ 0,0376991118 ⋅ α [cm] 360 o 8,16π ⋅ α [cm] ≈ 0,0712094335 ⋅ α [cm] 360 o 8,16π 1 1 ⋅ α [cm] ≈ ⋅ α [cm] ≈ ⋅ α [cm] o 14 , 04 14 360 La distancia x se medirá en centímetros y se prefiere usar la segunda fórmula al programar con NXT-G, ya que en este lenguaje, en la versión utilizada, no se permite cálculos más que con números enteros. El error se puede cuantificar con la fórmula: error = Rueda 43,2x22 56x26 valor _ calculado − valor _ real ⋅ 100 valor _ real Valor real 4,32π ⋅α x= 360 o 5,6π x= ⋅α 360 o Valor calculado 2α x= 53 2α x= 41 Error 0,097% -0,182% 107 Rueda 81,6x15 Valor real 8,16π ⋅α x= 360 o Valor calculado 2α x= 28 Error 0,308% Tabla 3.10. Error producido por aproximaciones en el cálculo de la longitud recorrida 3.4.1.1.1 Diagrama de flujo del medidor de longitudes A continuación se presenta el diagrama de flujo del programa desarrollado en NXT-G: Figura 3.37. Diagrama de flujo del medidor de longitudes 108 3.4.1.1.2 Código NXT-G del medidor de longitudes Para generar y entender el código NXT-G del programa es necesario primero definir las variables que van a ser usadas: Variable Longitud Rueda Tipo Número Número Flag Tipo_rueda Lógica Texto Comentario Almacena la longitud calculada Almacena el factor dependiente del tipo de rueda usado Variable auxiliar Almacena la descripción de la rueda usada. Tabla 3.11. Variables usadas en el programa del medidor de longitudes Al inicio del programa se solicita que el usuario escoja, de entre tres opciones, la rueda con la que va a operar y que va a ser la que girará sobre la superficie cuya longitud va a ser medida. Una vez escogida la rueda, el programa ingresa en un lazo infinito que permite hacer infinitas mediciones y todos los cálculos que se hacen consideran este parámetro como una constante. El programa se detiene únicamente cuando se suspenda la ejecución del mismo. Como un elemento informativo, en la parte superior de la pantalla aparece la característica de la rueda usada. Si se desea cambiar de rueda, habrá que suspender la ejecución del programa y reiniciarlo. Una gran parte del código mostrado corresponde a la presentación de los resultados en la pantalla. Cabe anotar que en NXT-G, cada línea presentada en la pantalla corresponde a un nuevo ícono o bloque de pantalla (bloque display); por ello es que el programa ocupa una gran extensión en su desarrollo. Fig 3.38. Programa NXT-G del medidor de longitudes 109 110 3.4.1.2 Calculadora de área y volumen El principio usado para el desarrollo de este proyecto es el siguiente: al recorrer la rueda sobre una superficie se tiene una medida entregada por el sensor de rotación incluido en el motor NXT y ésta se puede convertir en una longitud considerando adicionalmente el radio de la rueda girada. Para tomar la otra medida se procede de la misma manera y al multiplicarlas se encuentra el valor del área. Para determinar el valor del volumen es necesario tener las tres mediciones: largo, ancho y profundidad. Se tiene la opción de escoger con qué llanta se desea hacer la medición correspondiente. 3.4.1.2.1 Diagrama de flujo de la calculadora de áreas y volúmenes El diagrama de flujo del programa de la calculadora de áreas y volúmenes muestra las posibilidades ofrecidas por el prototipo. El resultado final siempre será un volumen, pero se cuenta como resultado parcial con el valor del área de la primera superficie medida, luego se multiplica esta área por la tercera longitud para obtener el valor del volumen de la caja. A continuación se muestra el diagrama de flujo del programa desarrollado en lenguaje NXT-G para la calculadora de áreas y volúmenes: 111 Figura 3.39. Diagrama de flujo de la calculadora de áreas y volúmenes 112 3.4.1.2.2 Código NXT-G de la calculadora de área y volumen Las variables utilizadas en el programa desarrollado en NXT-G son las siguientes: Variable Longitud Ancho Profundidad Rueda Tipo Número Número Número Número Flag Tipo_rueda Lógica Texto Comentario Almacena la longitud calculada Almacena el ancho calculado Almacena la profundidad calculada Almacena el factor dependiente del tipo de rueda usado Variable auxiliar Almacena la descripción de la rueda usada. Tabla 3.12. Variables usadas en el programa de la calculadora de áreas y volúmenes Al inicio del proceso es posible escoger el tipo de rueda con el que se va a trabajar, selección que se mantendrá como válida hasta que se suspenda la ejecución del programa. En la parte superior de la pantalla se muestra, como un dato informativo, la característica de la rueda escogida. Una vez que se ha escogido la rueda, el programa ingresa en un lazo infinito, que permite calcular volúmenes de diferentes cajas. Hay que tomar en cuenta que los valores de longitudes medidas se encuentran en centímetros, por lo que las áreas estarán en centímetros cuadrados y los volúmenes en centímetros cúbicos. Estos últimos números crecen rápidamente ante longitudes relativamente grandes y, aunque internamente los valores estarán correctamente calculados, es posible que no se muestren adecuadamente en la pantalla, provocándose una lectura de resultados erróneos. El máximo número que se puede mostrar como resultado de un volumen calculado debe tener ocho dígitos (12345678 cm3) por lo que el volumen máximo a calcular será de 99 999 999cm3; es decir, aproximadamente 100m3. Este límite será suficiente para la gran mayoría de aplicaciones, pero es necesario tenerlo en cuenta. 113 Figura 3.40. Programa en NXT-G de la calculadora de áreas y volúmenes 114 115 3.4.1.3 Medidor de sonido Mediante esta aplicación se permite visualizar las medidas tomadas por el sensor de sonido en la pantalla del ladrillo NXT. La visualización se hará sobre la base de una señal muestreada durante un segundo. El sensor de sonido entrega mediciones que se encuentran entre 1 y 100. Para tener una visualización tal y como se presenta normalmente en los dispositivos para ello diseñados se procederá de la siguiente manera: - Ya que la señal medida tendrá 100 como máximo valor, se dividirá este valor entre 3 de tal manera que los resultados posibles se encontrarán ahora entre 0 y 33 (en NXT-G solo se trabaja con números enteros). - El eje horizontal o nivel cero será, en la pantalla, una línea que va exactamente por el medio de la misma; esto es, en la posición vertical 32 (la pantalla tiene un tamaño vertical de 64 pixeles). - Se realizará una lectura cada centésima de segundo, por lo que una pantalla completa corresponderá a 100 muestras o un segundo (la pantalla tiene un tamaño horizontal de 100 pixeles). - Para mostrar una lectura se realizará una línea vertical ubicada en la posición horizontal que corresponda al tiempo en que se realizó el medida _ sensor muestreo y de longitud igual a 2 ⋅ int , donde la función int 3 obtiene la parte entera del cociente mostrado. De esta manera se consigue una línea vertical centrada verticalmente en la pantalla y de una longitud proporcional a la medición realizada por el sensor. - Al cabo de un segundo se procederá a reinicializar la pantalla y se hará una nueva visualización. Si se presiona el botón naranja durante la ejecución de una pantalla, es posible congelar el contenido de la misma, cuando ésta ha sido completada. De esta manera se permite realizar un análisis cualitativo de la muestra tomada. Al presionar nuevamente el botón naranja se posibilita tomar más muestras, dentro de un lazo infinito. Solo el botón gris oscuro detiene la ejecución del programa. 116 3.4.1.3.1 Diagrama de flujo del medidor de sonido A continuación se presenta el diagrama de flujo del programa: Figura 3.41. Diagrama de flujo del visualizador de mediciones del sensor de sonido 117 3.4.1.3.2 Código NXT-G del medidor de sonido En el caso de este programa, no se ha requerido el uso de variables adicionales, por lo que no se presenta su definición como en los casos anteriores. Figura 3.42. Programa NXT-G del medidor de sonido 118 3.4.2 ESCORPIÓN En esta aplicación se ha desarrollado un prototipo de un “escorpión”. El modelo está dotado de sensores de ultrasonido, sonido y contacto para ejecutar diferentes acciones. El programa permite el ingreso de parámetros iniciales de acuerdo al deseo del usuario. La programación se desarrolló en el lenguaje NXC. A diferencia de NXT-G, en NXC no hace falta realizar una descripción separada de las variables utilizadas, ya que ésta se efectúa directamente en el código, en forma de comentario. 3.4.2.1 Diagrama de flujo del programa del “escorpión” El escorpión, cuando es activado, va a recorrer una habitación en línea recta, hasta que se encuentra con un obstáculo y la distancia a él llega a un valor límite (variable retroceder); entonces el escorpión se detiene y retrocede por un determinado tiempo para luego seguir su avance hacia delante. Si el obstáculo permanece a la distancia anterior, el escorpión va a estar retrocediendo y avanzando en un lazo infinito. Esta última situación se modifica si el obstáculo se mueve de tal forma que la distancia entre el escorpión y él llega a un segundo valor límite (distancia picar), a la que es necesario que el escorpión active su cola y pique. Las variables retroceder y picar pueden ser escogidas por el usuario al iniciar la ejecución del programa. El proceso que sigue puede iniciarse al presionar el botón naranja o el sensor de contacto que se encuentra en la punta de la cola o el nivel de ruido supera un cierto límite umbral. Durante la ejecución normal del programa, si el valor medido por el sensor de sonido supera un cierto límite, entonces el escorpión pica, sin importar si delante de él se encuentra o no un objeto. A continuación se presenta el diagrama de flujo del programa: 119 Figura 3.43. Diagrama de flujo del programa “ESCORPIÓN” 120 3.4.2.2 Código NXC del programa del “escorpión”: /* Programa ESCORPIÓN Para que la ejecución correcta de este programa sea posible, es necesario que en la memoria interna del NXT se encuentren almacenados los archivos gráficos accept 03.ric, decline 03.ric, backward.ric y forward.ric */ int PICAR = 6; int RETROCEDER = 30; int AUX = 0; mutex control; // // // // Distancia límite para la acción de picar (6 cm) Distancia límite para retroceder (30 cm) Variable auxiliar Variable que permite adquirir el control de los motores task pica_sonido(){ if (SENSOR_2 > 75){ Acquire(control); OnFwd(OUT_A,100); until (SENSOR_1 == Off(OUT_A); OnRev(OUT_A,100); Wait(500); Off(OUT_A); Release(control); } } // Tarea que hace picar cuando el sonido supera el 75% // Adquisición del control de los motores // El "aguijón" avanza hasta que el sensor de contacto 1); // es activado // Retroceso del "aguijón" durante 0,5s // Se devuelve el control de los motores task main(){ SetSensorLowspeed(IN_4); SetSensorTouch(IN_1); SetSensorSound(IN_2); // Sensor de ultrasonido ubicado en puerto 4 // Sensor de contacto ubicado en puerto 1 // Sensor de sonido en el puerto 2 /* Código que permite escoger entre trabajar con parámetros predefinidos o con valores personales */ ClearScreen(); TextOut(25,LCD_LINE1,"ESCORPION"); TextOut(10,LCD_LINE3,"DESEA INGRESAR"); TextOut(10,LCD_LINE4," PARAMETROS?"); GraphicOut(10,5,"accept 03.ric"); GraphicOut(75,5,"decline 03.ric"); /* Se espera la presión de uno de los botones laterales para aceptar o negar la posibilidad de ingresar parámetros. */ until (ButtonPressed(BTNLEFT,true)==1 || ButtonPressed(BTNRIGHT,true)==1); ClearScreen(); /* Código que permite el ingreso de parámetros personales. Mediante la flecha a la izquierda se disminuye el valor y con la flecha a la derecha se lo incrementa. La presión del botón central hace que quede asignado el valor actual al parámetro en cuestión.*/ if(ButtonPressed(BTNLEFT,true)==1){ TextOut(8,LCD_LINE1,"DISTANCIA PARA"); TextOut(35,LCD_LINE2,"PICAR"); NumOut(42,LCD_LINE4,PICAR); GraphicOut(10,10,"backward.ric"); GraphicOut(75,10,"forward.ric"); TextOut(21,LCD_LINE8,"Continuar"); Wait(500); until(ButtonPressed(BTNCENTER,true)==1){ while(ButtonPressed(BTNLEFT,false)==1 || ButtonPressed(BTNRIGHT,true)==1){ if (ButtonPressed(BTNLEFT,true)==1){ if (PICAR > 3){ PICAR --; // Disminuye el valor de la variable PICAR en 1 } 121 TextOut(42,LCD_LINE4," ");// Borra de la pantalla el valor anterior NumOut(42,LCD_LINE4,PICAR); // Muestra de la variable PICAR Wait(350); } else{ if (PICAR < 10){ PICAR ++; // Aumenta el valor de la variable PICAR en 1 } TextOut(42,LCD_LINE4," ");// Borra de la pantalla el valor anterior NumOut(42,LCD_LINE4,PICAR); // Muestra de la variable PICAR Wait(350); } } } NumOut(42,LCD_LINE4,PICAR); Wait(500); // Muestra el valor final de PICAR ClearScreen(); TextOut(21,LCD_LINE8,"Continuar"); TextOut(8,LCD_LINE1,"DISTANCIA PARA"); TextOut(20,LCD_LINE2,"RETROCEDER"); NumOut(42,LCD_LINE4,RETROCEDER); GraphicOut(10,10,"backward.ric"); GraphicOut(75,10,"forward.ric"); Wait(500); until(ButtonPressed(BTNCENTER,true)==1){ while(ButtonPressed(BTNLEFT,false)==1 || ButtonPressed(BTNRIGHT,true)==1){ if (ButtonPressed(BTNLEFT,true)==1){ if (RETROCEDER > 10){ RETROCEDER -= 5; // Disminuye en 5 el valor de la variable RETROCEDER } TextOut(42,LCD_LINE4," "); // Borra de la pantalla el valor anterior NumOut(42,LCD_LINE4,RETROCEDER);// Muestra de la variable RETROCEDER Wait(350); } else{ if (RETROCEDER < 255){ RETROCEDER += 5; // Aumenta en 5 el valor de la variable RETROCEDER } TextOut(42,LCD_LINE4," "); // Borra de la pantalla el valor anterior NumOut(42,LCD_LINE4,RETROCEDER);// Muestra de la variable RETROCEDER Wait(350); } } } TextOut(42,LCD_LINE4," "); // Borra de la pantalla el valor anterior NumOut(42,LCD_LINE4,RETROCEDER); // Muestra el valor final de RETROCEDER Wait(500); } // Pantalla que muestra los valores de los parámetros de trabajo ClearScreen(); TextOut(0,LCD_LINE1,"LOS VALORES SON:"); TextOut(0,LCD_LINE3,"PICA:"); NumOut(62,LCD_LINE3,PICAR); TextOut(83,LCD_LINE3,"cm"); TextOut(0,LCD_LINE5,"RETROCEDE:"); NumOut(62,LCD_LINE5,RETROCEDER); TextOut(83,LCD_LINE5,"cm"); TextOut(29,LCD_LINE8,"Iniciar"); Wait(1000); /* Se espera a que se presione el botón naranja o el sensor de contacto conectado en la entrada 1 o que el nivel de sonido supere el 75%. */ until(ButtonPressed(BTNCENTER,true) == 1 || SENSOR_1 == 1 || SENSOR_2 > 75); 122 ClearScreen(); GraphicOut(25,10,"faceclosed.ric"); Wait(500); /* Código que hace que el escorpión actúe como se ha deseado. */ while (true){ // Se inicia un lazo infinito // Inicio de la tarea que hace que el escorpión // "pique" cuando el nivel sonoro supera el 75%. if(SensorUS(IN_4) > RETROCEDER){ OnFwd(OUT_BC,75); // El escorpión avanza hacia adelante mientras } // la distancia sea mayor que RETROCEDER else { Off(OUT_BC); // Cuando la distancia es menor que RETROCEDER OnRev(OUT_BC,100); // el escorpión se detiene y retrocede por 0,5s. Wait(500); Off(OUT_BC); // Si la distancia en menor que PICAR: if(SensorUS(IN_4) < PICAR) { Acquire(control); // Adquisición del control de los motores OnFwd(OUT_A,100); // El "aguijón" avanza hasta que el sensor de contacto until (SENSOR_1 == 1); // es activado Off(OUT_A); OnRev(OUT_A,100); // Retroceso del "aguijón" durante 0,5s Wait(500); Off(OUT_A); Release(control); // Se devuelve el control de los motores } } StartTask(pica_sonido); } } 3.4.3 BRAZO MECÁNICO El brazo mecánico construido permite mover objetos desde un lugar donde éstos se almacenan hacia otros, previamente definidos, dependiendo del color de los objetos. Se han considerado dos colores de objetos y para su reconocimiento se utiliza el sensor de luz que viene con el kit de Lego Mindstorms. Hay que insistir en que no se trata de un reconocimiento real del color, pues para que así sea se requiere de un sensor de color que viene en versiones nuevas o que se lo puede adquirir por separado. El programa permite definir dos posiciones extremas: (1) depósito de objetos sin clasificar y (2) destino final de los objetos del “color 1”. Se calcula una posición intermedia entre las dos previamente definidas y se convierte ésta en el destino final de los objetos de “color 2”. 123 Para hacer más comprensible la lectura del programa y para ahorrar espacio en la memoria interna del NXT se han desarrollado algunas subrutinas para algunas partes de código que aparecen de forma reiterada: - sub garra: subrutina que ejecuta la apertura y el cierre de la garra. El signo de la variable pot determina la acción a realizarse. - sub naranja: subrutina que permite esperar la presión del botón naranja para continuar - sub subir: subrutina que permite subir el brazo hasta la posición más alta posible y que es fijada por programación - sub bajar: subrutina que permite bajar el brazo hasta la posición más baja posible y que es fijada por programación - sub retornar: subrutina que retorna horizontalmente el brazo a la posición original; esto es, el extremo horizontal derecho y que es fijado por programación - sub avanzar: subrutina que avanza el brazo hasta la posición final y que es fijada por programación. La variable posicion indica hasta qué punto horizontal debe llegar el brazo y depende del color del objeto que se va a mover y de la configuración deseada por el usuario. 3.4.3.1 Diagrama de flujo del programa del brazo mecánico El programa está desarrollado en NXC y su diagrama de flujo se muestra a continuación: 124 Figura 3.44. Diagrama de flujo del programa “BRAZO MECÁNICO” La primera parte del programa permite ingresar las denominadas “posiciones extremas”, esto es, los límites izquierdo, derecho, superior e inferior para el movimiento. Para cuantificar estas posiciones, se hace uso de los valores entregados por el sensor de rotación incluido en los motores NXT. Posteriormente es necesario que el programa conozca qué son “color 1” y “color 2“. Para ello hay que acercar los objetos a ser movidos al sensor de luz de tal forma que éste pueda realizar las medidas correspondientes y almacenarlos en 125 memoria en una variable. Cumplidos estos pasos de configuración, el brazo mecánico está listo para iniciar su trabajo: abre la garra, baja el brazo en su posición izquierda inicial, reconoce el color del objeto a trasladar, cierra la garra, sube el brazo, se desplaza horizontalmente hasta su posición final (depende del color observado), baja el brazo, abre la garra para soltar el objeto, sube el brazo, avanza horizontalmente hasta su límite izquierdo, etc. Para suspender la ejecución del programa es necesario presionar el botón gris oscuro. Cabe indicar que el reinicio del programa exige que nuevamente se ejecuten todas las acciones del inicio previamente indicadas. 3.4.3.2 Código NXC del programa del brazo mecánico /* Programa BRAZO MECÁNICO Para que la ejecución correcta de este programa sea posible, es necesario que en la memoria interna del NXT se encuentren almacenados los archivos gráficos Accept 03.ric, Backward.ric, Forward.ric, Point left.ric y Point right.ric */ /* En vista de que las mediciones del sensor de rotación incluido en los motores entrega datos relativos, es necesario indicarle inicialmente al robot cuáles son los límites para su movimiento tanto horizontal como vertical.*/ int int int int int int int int LIM_IZQ = 0; LIM_DER = 0; LIM_SUP = 0; LIM_INF = 0; POS_MEDIA = 0; COLOR1 = 0; COLOR2 = 0; AUX = 0; sub garra(int pot){ OnFwd(OUT_A,pot); Wait(250); Off(OUT_A);} // // // // // // // // Límite izquierdo (NXT de frente) Límite derecho (NXT de frente) Límite superior Límite inferior Posición media (bola de COLOR1) Medida del sensor de luz para el COLOR1 Medida del sensor de luz para el COLOR2 Variable auxiliar // Apertura de la "garra" sub naranja(){ // Subrutina que espera la presión del botón naranja until(ButtonPressed(BTNCENTER,true)==1); Wait(500);} sub subir(){ // Subrutina que permite subir el brazo until(MotorRotationCount(OUT_B)>=LIM_SUP) OnFwd(OUT_B,60); Off(OUT_B);} sub bajar(){ // Subrutina que permite bajar el brazo until(MotorRotationCount(OUT_B)<=LIM_INF) OnRev(OUT_B,45); Off(OUT_B);} sub retornar(){ // Subrutina que retorna el brazo a su posición original until(MotorRotationCount(OUT_C)<=LIM_IZQ) OnRev(OUT_C,100); Off(OUT_C);} 126 // Subrutina que avanza al brazo hasta la posición // final until(MotorRotationCount(OUT_C)>=posicion) OnFwd(OUT_C,100); Off(OUT_C);} sub avanzar(int posicion){ task main(){ // TAREA PRINCIPAL DEL PROGRAMA SetSensorTouch(IN_1); // Sensor de contacto en el puerto 1 ClearScreen(); TextOut(24,LCD_LINE3,"B R A Z O"); TextOut(6,LCD_LINE5,"M E C A N I C O"); TextOut(24,LCD_LINE8,"continuar"); naranja(); ClearScreen(); TextOut(13,LCD_LINE3,"DEFINICION DE"); TextOut(22,LCD_LINE4,"POSICIONES"); TextOut(29,LCD_LINE5,"EXTREMAS"); TextOut(24,LCD_LINE8,"continuar"); naranja(); // Seteo del límite izquierdo ClearScreen(); while(SENSOR_1==0) OnRev(OUT_C,100);// Mueve el brazo hasta el extremo Off(OUT_C); // izquierdo donde existe un sensor de contacto // que actúa como sensor de final de carrera TextOut(33,LCD_LINE1,"LIMITE"); TextOut(22,LCD_LINE2,"IZQUIERDO"); GraphicOut(10,15,"Point Left.ric"); GraphicOut(75,15,"Point Right.ric"); GraphicOut(42,0,"accept 03.ric"); ResetRotationCount(OUT_C); // Este código permite fijar el extremo de navegación izquierdo. until(ButtonPressed(BTNCENTER,true)==1){ while(ButtonPressed(BTNLEFT,false)==1 || ButtonPressed(BTNRIGHT,true)==1){ if(ButtonPressed(BTNLEFT,true)==1){ OnFwd(OUT_C,100); Wait(100);} else{ if(SENSOR_1==0){ OnRev(OUT_C,100); Wait(100);}} Off(OUT_C); LIM_IZQ = MotorRotationCount(OUT_C); TextOut(32,LCD_LINE4," "); NumOut(32,LCD_LINE4,LIM_IZQ);}} Wait(250); LIM_IZQ = MotorRotationCount(OUT_C); NumOut(0,LCD_LINE4,LIM_IZQ); Wait(500); TextOut(22,LCD_LINE2," DERECHO "); TextOut(32,LCD_LINE4," "); // Este código permite fijar el extremo de navegación derecho until(ButtonPressed(BTNCENTER,true)==1){ while(ButtonPressed(BTNLEFT,false)==1 || ButtonPressed(BTNRIGHT,true)==1){ if(ButtonPressed(BTNLEFT,true)==1){ OnFwd(OUT_C,100); Wait(100);} 127 else{ if(MotorRotationCount(OUT_C)>LIM_IZQ){ OnRev(OUT_C,100); Wait(100);}} Off(OUT_C); LIM_DER = MotorRotationCount(OUT_C); TextOut(32,LCD_LINE4," "); NumOut(32,LCD_LINE4,LIM_DER);}} Wait(250); LIM_DER = MotorRotationCount(OUT_C); TextOut(32,LCD_LINE4," "); NumOut(62,LCD_LINE4,LIM_DER); Wait(500); naranja(); garra(100); // apertura de la garra ClearScreen(); TextOut(33,LCD_LINE1,"LIMITE"); TextOut(25,LCD_LINE2,"SUPERIOR"); GraphicOut(10,15,"Forward.ric"); GraphicOut(75,15,"Backward.ric"); GraphicOut(42,0,"accept 03.ric"); Wait(500); // Este código permite fijar el extremo de navegación superior until(ButtonPressed(BTNCENTER,true)==1){ while(ButtonPressed(BTNLEFT,false)==1 || ButtonPressed(BTNRIGHT,true)==1){ if(ButtonPressed(BTNLEFT,true)==1){ OnFwd(OUT_B,45); Wait(100);} else{ OnRev(OUT_B,45); Wait(100);} Off(OUT_B); LIM_SUP = MotorRotationCount(OUT_B); TextOut(32,LCD_LINE4," "); NumOut(32,LCD_LINE4,LIM_SUP);}} Wait(250); LIM_SUP = MotorRotationCount(OUT_B); NumOut(5,LCD_LINE4,LIM_SUP); Wait(500); TextOut(25,LCD_LINE2,"INFERIOR "); TextOut(32,LCD_LINE4," "); // Este código permite fijar el extremo de navegación inferior until(ButtonPressed(BTNCENTER,true)==1){ while(ButtonPressed(BTNLEFT,false)==1 || ButtonPressed(BTNRIGHT,true)==1){ if(ButtonPressed(BTNLEFT,true)==1){ OnFwd(OUT_B,45); Wait(100);} else{ OnRev(OUT_B,45); Wait(100);} Off(OUT_B); LIM_INF = MotorRotationCount(OUT_B); TextOut(32,LCD_LINE4," "); NumOut(32,LCD_LINE4,LIM_INF);}} Wait(250); LIM_INF = MotorRotationCount(OUT_B); TextOut(32,LCD_LINE4," "); NumOut(60,LCD_LINE4,LIM_INF); Wait(500); 128 // Posición inicial: extremo derecho y extremo superior ClearScreen(); subir(); retornar(); // Lectura de la medida de la "bola COLOR1" SetSensorLight(IN_2); // Sensor de luz en el puerto 2 TextOut(28,LCD_LINE2,"MOSTRAR"); TextOut(22,LCD_LINE3,"BOLA COLOR1"); TextOut(10,LCD_LINE5,"SENSOR= "); TextOut(30,LCD_LINE8,"aceptar"); until(ButtonPressed(BTNCENTER,true)==1){ COLOR1 = SENSOR_2; NumOut(58,LCD_LINE5,COLOR1);} Wait(500); // Lectura de la medida de la "bola COLOR2" TextOut(22,LCD_LINE3,"BOLA COLOR2"); until(ButtonPressed(BTNCENTER,true)==1){ COLOR2 = SENSOR_2; NumOut(58,LCD_LINE5,COLOR2);} Wait(1000); bajar(); // INICIO DE LA OPERACIÓN DEL BRAZO ClearScreen(); POS_MEDIA = (LIM_IZQ+LIM_DER)/2; TextOut(24,LCD_LINE1,"B R A Z O"); TextOut(6,LCD_LINE3,"M E C A N I C O"); TextOut(0,LCD_LINE5,"B. COLOR1: centro"); TextOut(0,LCD_LINE6,"B. COLOR2: derecha"); TextOut(30,LCD_LINE8,"iniciar"); naranja(); Wait(1000); TextOut(30,LCD_LINE8," "); while(true){ Wait(1500); // La bola COLOR2 será identificada como tal si la medida está entre COLOR1-2 // y COLOR1+2 y para la bola COLOR2 entre COLOR2-2 y COLOR2+2. if(SENSOR_2 > COLOR1-2 && SENSOR_2 < COLOR1+2){AUX = 1;} if(SENSOR_2 > COLOR2-2 && SENSOR_2 < COLOR2+2){AUX = 2;} if(AUX!=0){ garra(-100); // cierra la garra subir(); // sube el brazo // avanza a la posición final if(AUX==1){ avanzar(POS_MEDIA);} else{ avanzar(LIM_DER);} bajar(); // baja el brazo Wait(500); // abre la garra (abandona la bola) garra(100); Wait(1500); subir(); // sube el brazo Wait(500); retornar(); // retorna a la posición inicial Wait(500); bajar(); AUX = 0; } } } 129 3.4.4 VEHÍCULO CONTROLADO MEDIANTE UN ALGORITMO PID[22] El objetivo del proyecto es el de programar el ladrillo NXT de tal manera que el automóvil mantenga una posición relativa a un objeto determinado en un valor constante y se lo puede conseguir a través de la implementación de un controlador tipo PID (proporcional, integral y derivativo). El error e(t) que se genera al comparar las señales de entrada u(t) (set point o referencia) y salida y(t) es el que se busca corregir y esto se logra, en mayor o menor manera, mediante una adecuada sintonización o ajuste de los parámetros que intervienen en el algoritmo de control. Figura 3.45. Diagrama de bloques de un controlador PID La suma de las tres acciones -proporcional, integral y derivativa- es usada para ajustar al proceso a través de un elemento de control. Cada una de estas tres acciones reacciona de forma diferente ante una señal de error: - Acción proporcional: este término es proporcional al error existente y de él depende el tiempo en que el sistema retorna a su nivel de referencia. 130 - Acción integral: esta acción produce una salida que depende de la suma de los errores anteriores. Esta acción sirve para acelerar la corrección proporcional, pero puede causar un exceso en la salida sobre el valor referencial. - Acción derivativa: el valor de la acción derivativa está determinado por la variación del error en el tiempo. Esta acción permite una corrección ante cambios súbitos de la señal de error y, por tanto, permite compensar en parte el efecto de la acción integral. Esta parte permite también predecir y por tanto adelantarse a una corrección del error. Un aspecto muy importante de un controlador PID corresponde a los valores de las ganancias de cada acción. La modificación de estas constantes puede alterar drásticamente el comportamiento del sistema y es por esto que el proceso de sintonización del controlador es, en la práctica, especialmente complicado. El programa ha sido desarrollado en NXC, ya que este lenguaje es más conveniente en el momento en que tenemos que realizar numerosas operaciones matemáticas, frente a NXT-G por supuesto. En el caso de este proyecto, se dejará abierta la posibilidad de modificar los parámetros o constantes del controlador PID, de tal manera que el usuario pueda probar distintas opciones, hasta dar con la más conveniente a sus intereses. En la tarea principal del programa (task main( )) se inicializa al sensor de ultrasonido de tal manera que se puedan captar las mediciones de distancia que éste produce. Al correr el programa, se pregunta inicialmente por los valores de las constantes proporcional, integral y derivativa. Los valores por defecto son 30, 0 y 0 respectivamente. El usuario tiene la posibilidad de aumentar o disminuir esos valores al nivel deseado. Cabe indicar que, ya que el NXT no tiene internamente la posibilidad de trabajar con números decimales, los valores ingresados deberán ser previamente multiplicados por 10 (factor de escalamiento). El programa deberá eliminar del resultado final el efecto del escalamiento de estas tres constantes. De la misma forma, el programa permite el 131 ingreso de un valor de “tolerancia”, constante que le posibilita al controlador no actuar si la distancia a la que se encuentra del objeto está en un margen de valor referencial (setPoint) ± tolerancia. Una vez que han sido ingresados estos valores y se ha indicado al NXT que inicie el algoritmo PID, éste va a realizar una medición inicial de la distancia al objeto y ésta es la que deberá mantenerse constante. En la pantalla del NXT podrán verse los valores de las mediciones del valor referencial a mantenerse y del resultado final provocado por la acción del controlador PID. Se ha incluido adicionalmente la posibilidad de observar gráficamente el desarrollo del proceso. La acción PID se efectúa, a nivel de programación, dentro de un lazo infinito, que se repite cada 190ms aproximadamente. Cada vez que el lazo mencionado se ejecuta, se hace una medición de la distancia y se calcula el error de posición. El término proporcional se calcula multiplicando el error por la constante correspondiente (P=Kpy10): pOut = error y P Para calcular el término integral se realiza una suma de los errores previos (sumError) -hasta alcanzar el valor referencial deseado- y se la multiplica por la constante integral ingresada (I=Kiy10); una vez alcanzado el valor referencial se resetea el valor de la suma para poder inicial una nueva corrección: iOut = sumError y I El término derivativo se calcula con la diferencia entre el error actual (error) y el del lazo anterior (prevError), la misma que es multiplicada por la constante correspondiente (D=Kdy10): 132 dOut = (error-prevError) y D En el programa desarrollado se suman los valores de las tres acciones y se divide el resultado entre la constante de escalamiento usada (10 en este caso). totalOut = (pOut+iOut+dOut):10 El resultado producido representará la potencia con la cual funciona el motor. Este valor podría ser positivo (avance hacia delante) o negativo (avance hacia atrás). Existe una subrutina que ubica el valor de salida entre 20% y 100%, esto es porque una potencia menor al 20% no es suficiente para que el automóvil se mueva y un valor sobre el 100% no es posible, pues no es entendido por el NXT. Los motores se encenderán con el valor de potencia indicada siempre y cuando el error supere el valor dado como tolerancia para el sistema. 3.4.4.1 Diagrama de flujo del programa del controlador PID A continuación se presenta un diagrama de flujo del programa desarrollado en NXC. Como se observa en el diagrama, la primera parte del programa permite ingresar los valores de los parámetros del controlador PID y a continuación se ingresa directamente en el código que permite la ejecución del algoritmo de control. La ejecución del programa puede ser suspendida únicamente mediante la presión del botón gris oscuro del ladrillo NXT. 133 INICIO INICIALIZACIÓN DE VARIABLES INICIALIZACIÓN DE SENSORES INGRESO DE PARÁMETROS: CONSTANTES P, I, D Y TOLERANCIA INICIO DEL CONTROL PID MEDICIÓN DEL VALOR REFERENCIAL A TRAVÉS DEL SENSOR DE ULTRASONIDO MEDICIÓN DE LA DISTANCIA CÁLCULO DEL ERROR (e) ¿ES e>tolerancia? NO SÍ CÁLCULO DE LAS ACCIONES P, I, D NORMALIZACIÓN DE LA SALIDA ACCIONAMIENTO DE LOS MOTORES RESETEO DEL ERROR ACUMULADO PRESENTACIÓN DE VALORES REFERENCIAL Y MEDIDO Figura 3.46. Diagrama de flujo del programa del controlador PID 3.4.4.2 Código NXC del programa del controlador PID: El programa desarrollado ofrece la posibilidad de mostrar gráficamente en la pantalla del ladrillo NXT la evolución del controlador. El valor referencial o set point se ve como una línea horizontal que cruza por el medio de la pantalla del ladrillo y luego se marcan puntos a una distancia de la línea que es proporcional al error medido. 134 /* Programa PID Para que la ejecución correcta de este programa sea posible, es necesario que en la memoria interna del NXT se encuentren almacenados los archivos gráficos accept 03.ric, backward.ric y forward.ric */ string nombre = "PROPORCIONAL"; // Variables globales para solicitar el ingreso string simbolo = "P ="; // de datos al controlador /* Código que corrige (normaliza) el valor de la potencia de salida de tal manera que su valor se encuentre entre el 20% y el 100% (positivos). Se usa como mínimo el 20% ya que potencias menores no permitirían el movimiento del dispositivo. */ int potNormal(int potencia){ // variable que almacena el mínimo valor de la potencia int min = 20; if(abs(potencia)>100) return 100; else if(abs(potencia)<min) return min; else return abs(potencia); } /* Función que enciende los motores A y C. El valor del error determina si los motores se mueven hacia adelante o hacia atrás. */ int move(int errorActual, int pot){ if(errorActual<0) // Activa sincronizadamente los motores A y C en dirección reversa. OnRevReg(OUT_AC, potNormal(pot), OUT_REGMODE_SYNC); else // Activa los motores A y C en dirección hacia adelante. OnFwdReg(OUT_AC, potNormal(pot), OUT_REGMODE_SYNC); } // Función que permite ingresar los parámetros del controlador void ingreso(int &bb){ // bb es el nombre de la variable a ingresar ClearScreen(); TextOut(0,LCD_LINE1,"Constante"); TextOut(0,LCD_LINE2,nombre); TextOut(30,LCD_LINE4,simbolo); NumOut(60,LCD_LINE4,bb); TextOut(29,LCD_LINE8,"Aceptar"); GraphicOut(10,10,"backward.ric"); GraphicOut(75,10,"forward.ric"); Wait(500); until(ButtonPressed(BTNCENTER,true)==1){ while(ButtonPressed(BTNLEFT,false)==1 || ButtonPressed(BTNRIGHT,true)==1){ if (ButtonPressed(BTNLEFT,true)==1){ if (bb > 0){ bb --; } TextOut(60,LCD_LINE4," ");// Borra de la pantalla el valor anterior NumOut(60,LCD_LINE4,bb); Wait(250); } else{ if (bb < 100){ bb ++; } TextOut(60,LCD_LINE4," ");// Borra de la pantalla el valor anterior NumOut(60,LCD_LINE4,bb); Wait(250); } } 135 } NumOut(60,LCD_LINE4,bb); Wait(500); } task main() { SetSensorLowspeed(IN_4); // INICIO DE LA TAREA PRINCIPAL // Sensor de ultrasonido en el puerto 4 // Valores predefinidos int int int int tolerancia = 3; P = 30; I = 0; D = 0; // // // // Toleracia Constante Constante Constante permitida para el proceso de ganancia proporcional integral derivativa /* Código que permite el ingreso de las constantes del lazo PID. Mediante la flecha a la izquierda se disminuye el valor y con la flecha a la derecha se lo incrementa. La presión del botón central hace que quede asignado el valor actual al parámetro en cuestión.*/ ClearScreen(); TextOut(5,LCD_LINE1,"CONTROLADOR PID"); LineOut(5,54,93,54); TextOut(0,LCD_LINE4,"Ingrese las"); TextOut(0,LCD_LINE5,"constantes P,I,D"); TextOut(0,LCD_LINE6,"(por 10)"); TextOut(29, LCD_LINE8, "Iniciar", false); until(ButtonPressed(BTN4,true));// Espera a que se presione el botón naranja ingreso (P); // Ingreso de la constante proporcional nombre = "INTEGRAL"; simbolo = "I ="; ingreso (I); // Ingreso de la constante integral nombre = "DERIVATIVA"; simbolo = "D ="; ingreso (D); // Ingreso de la constante derivativa nombre = "TOLERANCIA"; simbolo = "T ="; ingreso (tolerancia); // Ingreso de la constante tolerancia // Pantalla que muestra los valores de los parámetros de trabajo ClearScreen(); TextOut(0,LCD_LINE1,"Los valores son:"); TextOut(36,LCD_LINE3,"P ="); NumOut(60,LCD_LINE3,P); TextOut(36,LCD_LINE4,"I ="); NumOut(60,LCD_LINE4,I); TextOut(36,LCD_LINE5,"D ="); NumOut(60,LCD_LINE5,D); TextOut(36,LCD_LINE6,"T ="); NumOut(60,LCD_LINE6,tolerancia); TextOut(23, LCD_LINE8, "Continuar", false); until(ButtonPressed(BTN4,true));// Espera a que se presione el botón naranja Wait(500); // Factor de escalamiento por la ganancia de las constantes // debido a que no se pueden ingresar valores decimales int loopTime = 150;// Periodo del lazo de control (en ms) int setPoint = 0;// Inicializa la variable que indica la distancia a mantener. int scale = 10; 136 // Mensaje de inicio TextOut(0,LCD_LINE1,"Pulse el boton", true); // true: borra pantalla anterior TextOut(0,LCD_LINE2,"naranja para", false); TextOut(0,LCD_LINE3,"para iniciar!", false); TextOut(29,LCD_LINE8,"Iniciar", false); until(ButtonPressed(BTN4,true));// Espera a que se presione el botón naranja setPoint = SensorUS(IN_4); // Lectura de la distancia a mantener int distancia = setPoint; LineOut(0,32,100,32,true); // Muestra en pantalla el nivel de referencia, NumOut(0,LCD_LINE8,setPoint); // el valor de referencia y la medida actual NumOut(80,LCD_LINE8,distancia); // de la distancia // Variables a ser usadas en el lazo de control int error=0; int prevError=0; int sumError=0; // Error actual en la posición // Error del lazo anterior // Suma de errores usada en el término integral int pOut=0; int iOut=0; int dOut=0; // Potencia de salida para los términos proporcional, // integral y // derivativo int totalOut=0; // Suma de los tres términos individuales int contador=0; int altura=0; // variable auxiliar para generar el gráfico (eje X) // variable auxiliar para generar el gráfico (eje Y) // Código que realiza el cálculo de la potencia para conseguir una corrección // en la posición final del automóvil. while(true){ // INICIO DEL ALGORITMO DE CONTROL prevError = error; // Almacena el error previo (lazo anterior) distancia = SensorUS(IN_4); // Lee la distancia a través del sensor de US error = setPoint-distancia; // Calcula el error actual // Generación del gráfico en pantalla. if (contador == 101){ LineOut(0,32,100,32,true); // La separación horizontal entre dos // puntos es mayor que 150ms. contador = 0; NumOut(0,LCD_LINE8,setPoint); } else{ altura = 32-(32*error/setPoint); PointOut(contador,altura,false); contador += 1; TextOut(80,LCD_LINE8," "); NumOut(80,LCD_LINE8,distancia); } pOut = error*P; sumError += error; iOut = sumError*I; dOut = (error-prevError)*D; // // // // Genera la salida proporcional Añade el error actual a la suma Calcula la salida integral Calcula la salida derivativa /* Suma los tres términos juntos y divide el total entre el factor de escalamiento necesario por la falta de números flotantes. El total puede ser mayor que el 100% y/o negativo.*/ totalOut = (pOut+iOut+dOut)/scale; 137 // Chequea si la posición actual está fuera // del margen de tolerancia // Enciende los motores if(abs(error)>tolerancia) move(error, totalOut); else sumError=0; // Resetea la suma cuando se ha conseguido el // resultado deseado // Da un tiempo para el movimiento (150ms) Wait(loopTime); Float(OUT_AC); // Detiene los motores, pero no los frena de un golpe. } } 3.4.5 SEGUIDOR DE LÍNEA[32] Se trata de desarrollar un programa que permita que un vehículo dotado de un sensor de luz pueda seguir la trayectoria marcada a través de una línea de un color distinto al del piso en el que se encuentra. El algoritmo aplicado hace uso de una corrección de la posición mediante cálculos de tipo proporcional, integral y derivativo (PID). Vale la pena indicar que un controlador PID puede ser usado en un sinnúmero de aplicaciones de control: máquinas, vehículos, robots, cohetes, etc. El vehículo está dotado de un sensor de luz disponible en el kit 8527, por lo que son sus medidas las que permitirán al robot reconocer en qué lugar se encuentra. Un seguidor de línea puede contener más de un sensor de luz ya que, en términos generales, mientras más sensores existan, mejor será el seguimiento que se hace sobre la línea. Al contar únicamente con un sensor, se pierde la posibilidad de un recorrido más rápido sobre la línea. Para el seguidor de línea es importante definir los valores de iluminación con los que va a operar. Por ello es necesario correr una secuencia de calibración, en la que el robot reconoce los valores mínimo (min) y máximo (max) que van a ser medidos por el sensor de luz. Esta secuencia para la consecución de los valores mencionados se ejecuta en la práctica a través de un barrido automático que realiza el robot sobre la línea a seguir. Luego se debe calcular el valor referencial (mid) o set point, que será el promedio de los dos valores anteriores: mid = (min + max):2 138 Al iniciar el código del controlador PID, el vehículo se encuentra en movimiento hacia delante y el algoritmo exige la toma de una medida por parte del sensor de luz. Esta medida (intensidad) es comparada con el valor referencial (mid) y se genera un error, valor que permite calcular las salidas proporcional, integral y derivativa: error = mid – intensidad pOut = error y P iOut = sumError y I dOut = (error-prevError) y D correccion = (pOut+iOut+dOut):10 El resultado del controlador es el valor de la variable correccion. Esta variable es la que deberá ser aplicada a los motores como una potencia para que éstos se muevan hasta corregir el rumbo del seguidor de línea. Ya que no es posible operar con aritmética de punto flotante, es necesario que las constantes sean amplificadas inicialmente (factor de 10), pero este efecto debe ser eliminado al final; es por esta razón que se divide el resultado de la suma de las salidas proporcional, integral y derivativa entre 10. Ya que lo que se desea es que se realicen las curvas necesarias para corregir la trayectoria del robot, cada uno de los motores podrá funcionar con una potencia distinta dada por las siguientes expresiones: Motor A: potencia + correccion Motor B: potencia – correccion La variable potencia es un valor ingresado al controlador que representa la velocidad a la que tendría que ir el seguidor de línea cuando sigue una trayectoria rectilínea. Mientras mayor es este valor, más rápido se mueve el robot sobre la línea y mayor es el riesgo de que se salga de ella y pierda su rumbo. 139 El programa se encuentra dentro de un lazo infinito, por lo que solo se detendrá si se presiona el botón gris oscuro. 3.4.5.1 Diagrama de flujo del seguidor de línea A continuación se muestra el diagrama de flujo del programa implementado en NXC para el seguidor de línea: Figura 3.47. Diagrama de flujo del programa del seguidor de línea 3.4.5.2 Código NXC del programa del seguidor de línea /* Programa SL_ControlPID Se trata de un programa que permite a un vehículo previamente diseñado y que cuenta con un sensor de luz, "seguir" una línea de color marcada en el piso. Para ello hace uso de un algoritmo tipo PID.*/ int int int int int mid=0; min=1000; max=0; scale=10; potencia=50; // // // // // Variable que determina la medida media a mantener Mínimo valor medido por el sensor de luz Máximo valor medido por el sensor de luz Factor de escalamiento de las constantes P, I y D Potencia media que actúa sobre los motores 140 int intensidad=0; int correccion=0; // Intensidad de luz medida en todo momento por el sensor // Valor calculado por el algoritmo de control PID task main(){ // INICIO DE LA TAREA PRINCIPAL SetSensorLight(IN_1); // Sensor de luz en el puerto 1 ResetRotationCount(OUT_C); // Sensor de rotación en el puerto C (motor) OnRev(OUT_C,15); OnFwd(OUT_B,15); // Se inicia un barrido en el mismo lugar para captar las // medidas máxima y mínima por parte del sensor de luz while (abs(MotorRotationCount(OUT_C))<90){ intensidad=SENSOR_1; if (intensidad < min){ min = intensidad; // Fijación de la mínima intensidad captada } if (intensidad > max){ max = intensidad; // Fijación de la máxima intensidad captada } } Off(OUT_BC); mid = (min+max)/2; // Cálculo del valor medio entre max y min(referencia) until (intensidad < mid){ // Ubicación inicial del vehículo, justo en aquel intensidad = SENSOR_1; // punto en que intensidad = valor medio OnFwd(OUT_C,15); OnRev(OUT_B,15); } Off(OUT_BC); PlayTone(440,300); // Ejecución de un sonido que indica el inicio Wait(1000); // Espera de un segundo // Definición de variables para el controlador int error=0; int prevError=0; int sumError=0; // Error actual en la intensidad // Error del lazo anterior // Suma de errores usada en el término integral int P=50; int D=15; int I=0; // Constante proporcional // Constante derivativa // Constante integral int pOut=0; int iOut=0; int dOut=0; // Potencia de salida para los términos proporcional, // integral y // derivativo // Tarea principal que calcula la corrección while(true){ prevError = error; intensidad = SENSOR_1; error = mid-intensidad; pOut = error*P; sumError += error; iOut = sumError*I; dOut = (error-prevError)*D; // Almacena el error previo (lazo anterior) // Lee la distancia a través del sensor de US // // // // // Calcula el error actual Genera la salida proporcional Añade el error actual a la suma Calcula la salida integral Calcula la salida derivativa correccion = (pOut+iOut+dOut)/scale;// // // // if (correccion>50) correccion=50; if (correccion<-50)correccion=-50; // OnRev(OUT_C,potencia-correccion); OnRev(OUT_B,potencia+correccion); Suma los tres términos juntos y divide el total entre el valor del factor de escalamiento utilizado. Valores extremos de la corrección Valores extremos de la corrección // Aplicación de la corrección a la // potencia de salida de los motores 141 Wait(50); } } 3.4.6 APLICACIONES REMOTAS En esta aplicación se desean probar las características de la comunicación bluetooth entre dos ladrillos NXT diferentes. Uno de ellos tendrá un dial que permitirá definir la velocidad con la que se desplaza el auto controlado, así como también se podrá definir el sentido de movimiento deseado a través de una combinación adecuada de presiones en los botones de control. Se han desarrollado dos programas: el primero que será para el controlador y el segundo para el auto controlado. 3.4.6.1 Programa del controlador (mando) El programa desarrollado en NXT-G se encuentra dentro de un lazo que se ejecutará continuamente hasta que el programa se detenga mediante la presión del botón gris oscuro. En la primera parte del programa se determina qué botón ha sido presionado, pues según ello el auto se moverá en determinada dirección: Botón presionado Botón izquierdo Botón naranja Botón derecho Ningún botón Acción El auto gira a la izquierda El auto se detiene completamente y reproduce un tono musical El auto gira a la derecha El auto se mueve en línea recta Tabla 3.13. Acciones a tomar por el auto controlado en función del botón presionado en el control La velocidad estará determinada por la velocidad de giro del dial, estando su valor entre los límites -100 (máxima potencia hacia atrás) y +100 (máxima potencia hacia delante). Las variables que se utilizan en el programa son las siguientes: 142 Variable BotPres Tipo Número Boton Velocidad Número Número Comentario Variable auxiliar que almacena temporalmente el valor que corresponde al botón presionado. Almacena un valor de acuerdo al botón presionado. Almacena la velocidad deseada (-100 ≤ v ≤ +100) Tabla 3.14. Variables usadas en el programa del controlador Botón presionado Botón izquierdo Botón naranja Botón derecho Ningún botón Valor de la variable “Boton” 1 2 3 0 Tabla 3.15. Valores de la variable “Boton” en función del botón presionado en el control La velocidad indicada por giro del dial se podrá visualizar en la pantalla del NXT en forma de una barra horizontal que tiene su inicio en el centro horizontal de la misma y una longitud proporcional a su valor. También se podrá ver el valor correspondiente en números. Ya que el ancho de la pantalla es de 100 pixeles, la longitud en pixeles de la línea que se muestra y que corresponde a la velocidad es: Longitud _ barra = velocidad 2 y su posición horizontal va desde el píxel 50 hasta el píxel que se puede calcular mediante la fórmula: pixel _ final = 50 + 3.4.6.1.1 velocidad . 2 Diagrama de flujo del mando a distancia El diagrama de flujo que corresponde a este programa desarrollado en NXT-G se muestra a continuación: 143 Figura 3.48. Diagrama de flujo del programa del controlador (mando remoto) 3.4.6.1.2 Código NXT-G del controlador (mando) Figura 3.49. Programa NXT-G del controlador remoto (mando) 144 145 3.4.6.2 Programa del vehículo controlado El auto a ser controlado debe ser programado de tal manera que pueda recibir los comandos que vienen desde el control o mando remoto, luego debe entenderlos y ejecutarlos. El programa del auto controlado consta de tres tareas que deben ejecutarse simultáneamente: - Tarea 1: procesa los comandos que vienen desde el controlador y los ejecuta. - Tarea 2: recibe vía bluetooth la información relacionada con el botón presionado por el controlador y por tanto del tipo de movimiento a realizar. - Tarea 3: recibe vía bluetooth la información relacionada con la velocidad a la que debe moverse el auto. Las variables que se utilizan en el programa son las siguientes: Variable Boton Velocidad Potencia Tipo Número Número Número Direccion Lógica Comentario Almacena un valor de acuerdo al botón presionado. Almacena la velocidad deseada (-100 ≤ v ≤ +100) Almacena la potencia que se imprimirá a los motores y se encuentra entre 0 y 100. Almacena un valor lógico (true o false) que determina el sentido de giro de los motores. Tabla 3.16. Variables usadas en el programa del auto controlado 3.4.6.2.1 Diagrama de flujo del programa del vehículo controlado El diagrama de flujo del programa desarrollado en NXT-G del vehículo a ser controlado remotamente se muestra a continuación: 146 Figura 3.50. Diagrama de flujo del programa del auto controlado 3.4.6.2.2 Código NXT-G del vehículo controlado Figura 3.51. Programa NXT-G del auto controlado remotamente 147 148 En la gráfica anterior, arriba a la derecha, se muestra el código de una estructura “switch”, donde el código a ejecutarse depende del valor de la variable de entrada. Únicamente se puede ver la parte relacionada con el valor de la variable “Boton” igual a 0. A continuación se muestran las otras partes de código, para los otros valores posibles de la variable “Boton”: “Boton” = 1 Figura 3.52. Código correspondiente a “Boton”=1 “Boton” = 2 Figura 3.53. Código correspondiente a “Boton”=2 “Boton” = 3 Figura 3.54. Código correspondiente a “Boton”=3 149 CAPÍTULO 4 PRUEBAS Y RESULTADOS En este capítulo se presentan algunos resultados de las pruebas realizadas con los diferentes prototipos diseñados, construidos y programados. También se hace una breve descripción de los cambios que fueron necesarios hacer durante la construcción y/o programación de algunos de los proyectos, para que cumplan con las funciones que se les asignaron inicialmente. El tema relacionado con el nivel de carga de las baterías resultó extremadamente importante en cada uno de los prototipos probados, ya que en algunos de los casos su comportamiento varió mucho cuando las pilas se encuentran al borde de cumplir su tiempo de vida útil. 4.1 MEDIDORES DE VARIABLES MÚLTIPLES 4.1.1 MEDIDOR DE LONGITUDES En la parte de la programación ya se hizo una reflexión acerca del error en el que se está incurriendo en este prototipo a causa de la inexistencia de aritmética de punto flotante en el lenguaje de programación utilizado. Otra posible fuente de error existente en el proceso de medir longitudes es el hecho de que la rueda “resbale” sobre la superficie a medir, provocando que el sensor de rotación no gire adecuadamente y por tanto se produzca una lectura errónea. Como es habitual en los casos en que se debe medir algo, el operador también es una fuente de error. Este error se evidenciará en el momento en que el operador no visualice correctamente el punto en que la rueda debe iniciar su recorrido o cuando ha llegado al extremo final del objeto a medir. 150 En la tabla siguiente se exponen algunos resultados de longitudes medidas con las diferentes ruedas y se las compara con las realizadas con un elemento de medición de longitudes común y corriente (flexómetro). Rueda 43,2x22 56x26 81,6x15 43,2x22 56x26 81,6x15 43,2x22 56x26 81,6x15 43,2x22 56x26 81,6x15 Valor “real” 115cm 115cm 115cm 200cm 200cm 200cm 37,5cm 37,5cm 37,5cm 2,6cm 2,6cm 2,6cm Valor medido 109cm 117cm 113cm 198cm 207cm 197cm 37cm 38cm 36cm 2cm 3cm 2cm Error relativo -5,22% 1,74% -1,74% -1,00% 3,50% -1,50% -1,33% 1,33% -4,00% -23,08% 15,38% -23,08% Tabla 4.1. Comparación entre valores “reales” y medidos haciendo uso de diferentes tipos de ruedas en el medidor de longitudes Conclusión: por los resultados que se pueden observar, la rueda de dimensiones 56x26 (mm) es la que, en términos relativos, mejores resultados ofrece. Adicionalmente, dado que solo se pueden tener valores enteros en centímetros para las mediciones realizadas, el error relativo será mucho mayor cuando se trata de medir longitudes pequeñas; para longitudes consideradas grandes y en dependencia de la aplicación desarrollada, el medidor de longitudes ofrece resultados aceptables. El nivel de carga de las baterías parece no afectar significativamente al funcionamiento de este prototipo, pues el sensor de rotación interno en los motores NXT entrega buenas mediciones aún estando al borde de la vida útil de las baterías. 4.1.2 CALCULADORA DE ÁREAS Y VOLÚMENES El caso de una calculadora de áreas y volúmenes no es muy diferente al explicado anteriormente del medidor de longitudes, ya que los resultados entregados dependen de cada una de las longitudes medidas. 151 Las causas de error son las mismas explicadas y ahora se añade el hecho de que el error total resulta de multiplicar los errores anteriores, ya que el área consiste en multiplicar dos de las medidas realizadas y para el volumen se debe operar con tres de ellas. A continuación se presentan algunos resultados. Valores de áreas: Rueda 43,2x22 56x26 81,6x15 43,2x22 56x26 81,6x15 Valor “real” Valor medido 115cmyFP 109cmyFP FP FP 115cmyFP 116cmyFP FP FP 115cmyFP 113cmyFP FP FP 12cmyFP 11cmyFP FP FP 12cmyFP 12cmyFP FP FP 12cmyFP 12cmyFP FP FP Error -7,11% 2,38% -3,21% -16,67% -1,52% -1,52% Tabla 4.2. Comparación entre valores “reales” y medidos de diferentes áreas, haciendo uso de distintos tipos de ruedas en la calculadora de áreas y volúmenes Valores de volúmenes: Rueda 43,2x22 56x26 81,6x15 43,2x22 Valor “real” Valor medido 115cmyFPyFP 109cmyFPyFP FP FP 115cmyFPyFP 116cmyFPyFP FP FP 115cmyFPyFP 113cmyFPyFP FP FP 12cmyFPyFP 11cmyFPyFP FP FP Error -25,69% 2,38% -3,21% -21,62% 152 Rueda Valor “real” Valor medido 12cmyFPyFP 12cmyFPyFP 56x26 FP 81,6x15 FP 12cmyFPyFP 12cmyFPyFP FP FP Error -7,37% -7,37% Tabla 4.3. Comparación entre valores “reales” y medidos de diferentes volúmenes, haciendo uso de distintos tipos de ruedas en la calculadora de áreas y volúmenes Conclusión: ya que el medidor de longitudes es la base de la calculadora de áreas y volúmenes, las observaciones realizadas anteriormente son válidas también para este proyecto. Cabe mencionar nuevamente que los márgenes de error actuales son de orden mayor, ya que ahora estos se ven multiplicados entre sí. Se mantiene el hecho de que la rueda de 56x26 (mm) es la que mejores resultados finales ofrece. El prototipo funciona adecuadamente aún cuando las baterías se encuentran cerca de finalizar su tiempo de vida útil, ya que el sensor de rotación entrega medidas aceptables. 4.1.3 MEDIDOR DE SONIDO No se cuenta exactamente con un medidor de sonido; lo que hace el prototipo diseñando es entregar una medida relativa de la intensidad de sonido existente. Sin embargo, es interesante realizar pruebas por ejemplo con diferentes fonemas, cuya pronunciación exige variar la intensidad del sonido y verificar en la pantalla cómo se produce esta variación. Se presenta a continuación algunas imágenes de las pruebas realizadas. 153 Fonema Imagen hola corpúsculo robot Tabla 4.4. Imágenes obtenidas en la pantalla del NXT al hacer actuar al medidor de sonido 154 En las imágenes se puede también observar la señal que produce el ruido de fondo. Conclusión: los resultados obtenidos demuestran que la pronunciación de distintos fonemas genera diferentes resultados, los mismos que podrían ser posteriormente utilizados para su mejor análisis, por ejemplo si se trata de comparar niveles sonoros en diferentes ambientes y bajo condiciones similares en el momento de hacer las mediciones. No se puede olvidar que solo se tiene una señal de amplitudes, de intensidad sonora. De todas maneras se muestra otra posibilidad de ocupar el NXT y, entre ellas, las características gráficas de su pantalla de LCD. En este proyecto, el nivel de carga de las baterías sí tiene un efecto sobre los resultados finales. Se observó que la intensidad registrada por el sensor de sonido es menor cuando las baterías se encuentran cerca de cumplir su tiempo de vida útil. 4.2 ESCORPIÓN Este prototipo tiene gran complejidad en el aspecto mecánico. En la parte de la programación se ha intentado darle una cierta versatilidad a su funcionamiento, haciendo que el usuario final pueda definir, mediante el uso de las teclas existentes, la forma de operación deseada. Se han detectado algunos problemas en la operación de este prototipo. Uno de ellos tiene que ver con las mediciones realizadas por el sensor de ultrasonido. Debido a su principio de funcionamiento, este sensor depende de la superficie del cuerpo que se encuentra frente a él para poder entregar mediciones que puedan considerarse válidas. Así, una superficie rugosa, por ejemplo, representa una dificultad para realizar mediciones adecuadas, ya que el reflejo de la señal de ultrasonido no siempre está dirigido de tal forma que pueda ser captada por el sensor. 155 Otro problema representó la ubicación del sensor de sonido. Cuando se realizaban las pruebas sobre una superficie suave (una alfombra por ejemplo) este sensor actuaba sin mayores dificultades. Sin embargo, al realizar las mismas pruebas sobre una superficie “dura”, el ruido generado por el contacto de las patas con el piso generaba una señal de ruido tal que activaba la parte de software destinada a otras circunstancias. Por tal razón se colocó a este sensor en el extremo de un brazo que le permita “alejarse” un poco de las fuentes de ruido propias del equipo diseñado. Conclusión: los resultados obtenidos fueron satisfactorios en la medida que se consiguió una operación del prototipo similar a la esperada. Las fuentes de error anteriormente mencionadas tienen un efecto negativo en el funcionamiento del equipo. El nivel de carga de las baterías es también determinante para un correcto funcionamiento del sensor de ultrasonido, pues parece que éste fue el más afectado al momento de realizar mediciones con baterías descargadas. Obviamente, los motores se ven afectados notablemente por un nivel bajo de carga de las baterías. 4.3 BRAZO MECÁNICO El prototipo del brazo mecánico presenta complicaciones principalmente de tipo mecánico, algunas de cuales se resolvieron mediante software. El prototipo diseñado permite definir externamente las posiciones extremas que va a ocupar el brazo físicamente. Además cuenta con un único sensor de fin de carrera (sensor de contacto) en uno de sus extremos, de tal manera que se pueda evitar el rebasarlo. Aunque por su estructura mecánica este brazo podría girar 360° sobre su eje, el mayor problema existente es q ue eso provocaría un enredo de los cables que van a los sensores y a los motores, con la consecuente sobretensión mecánica sobre ellos, que podría inclusive dañarlos. Sería óptimo 156 colocar otro sensor de fin de carrera en el otro extremo, pero lamentablemente cada kit de los empleados cuenta únicamente con uno de estos elementos. Mecánicamente se ha colocado un sistema reductor de velocidad en el complejo que permite el movimiento horizontal del brazo, pero un sistema similar no fue posible colocar en el bloque que permite el movimiento vertical. Esto provoca que la subida y bajada del brazo sea un tanto brusca. Para hacerla más suave se probó usando velocidades (potencias) menores, pero también hay que tomar en cuenta que una velocidad (potencia) muy baja, no permitirá vencer la inercia del brazo, sobretodo en el momento de tener que subirlo. Para facilitar el movimiento horizontal, éste se hace únicamente con el brazo en la posición superior, ya que allí la inercia a vencer es menor. Una dificultad encontrada en el brazo se tiene en el momento de reconocer los colores de los elementos (bolas) que van a ser desplazados. Ya que no contamos realmente con un sensor de color sino de luz, la iluminación ambiental afecta notoriamente en el momento de “reconocer” los colores. El nivel de carga de las baterías usadas afecta notablemente a este prototipo, pues le impiden su funcionamiento adecuado, principalmente en el momento de tener que subir el brazo y del reconocimiento del color por parte del sensor de luz. Conclusión: el funcionamiento del brazo mecánico diseñado puede considerarse como adecuado. Se podría pensar en un nuevo diseño mecánico que le permita una operación mucho más suave en su operación, sobretodo en el eje vertical. 4.4 VEHÍCULO CONTROLADO MEDIANTE ALGORITMO PID El programa desarrollado permite definir manualmente los valores de los parámetros que intervienen en el algoritmo controlador tipo PID. De la sintonización adecuada de estos valores depende el éxito del controlador; sin embargo, existen factores adicionales que son causa de error en el proceso, como por ejemplo el hecho de no contar con aritmética de punto flotante para la 157 realización de los cálculos, lo que obliga a amplificar los valores de las constantes del controlador, o la imprecisión de las medidas realizadas por el sensor de ultrasonido en dependencia del tipo de superficie en el que refleja su señal. El programa desarrollado permite averiguar cuál es el efecto de cada una de las constantes que intervienen en el controlador PID: Control tipo P: las constantes I y D son iguales a cero. En este caso, al mover el objeto que sirve como referencia para el vehículo, este último intenta corregir su posición para regresar al valor inicial de distancia (referencia). Finalmente lo consigue, pero el tiempo total que le toma es grande, tanto en el caso de errores grandes como cuando se trata de errores pequeños. Para la sintonización de un controlador tipo P se recomienda iniciar con un cierto valor de la constante P y modificarlo en función de la respuesta obtenida hasta que esta sea más o menos satisfactoria. El tiempo de respuesta depende directamente del valor de la constante: si se quiere una respuesta más rápida habría que aumentar el valor de P y viceversa. Un valor muy grande de P puede llevar a desestabilizar al sistema. Control tipo PI: la constante D es igual a cero. Al mover el objeto que sirve como referencia para el vehículo, este intenta corregir su posición para regresar al valor inicial (referencia) y la inserción de la constante I acelera este proceso. El término proporcional intenta corregir el error, mientras que el término integral crece con el error y suma su efecto al primero. Mientras más tiempo persiste el error, mayor es el valor con el que actúa el término integral, acelerando de esta forma el proceso de corrección. Uno de los problemas de este tipo de control es que un aumento grande del error puede llevar a desestabilizar al sistema sin posibilidad de retorno o asimismo puede generar grandes oscilaciones en él. La sintonización del término integral debe permitir mantenernos en un nivel intermedio entre la aceleración deseada para la corrección y el valor máximo aceptable para una oscilación del sistema. 158 Control tipo PID: ahora aparecen las tres constantes, añadiéndose así el término derivativo. El término integral produce una aceleración de la corrección alrededor del nivel de referencia deseado, mientras que el término derivativo actúa frente a un cambio brusco en el error haciendo que la señal total de salida se reduzca. De esta forma se pretende llegar más rápido a la señal de referencia. Normalmente, un incremento en la constante derivativa exige otro en la constante integral. La sintonización debe realizarse con cuidado, de tal manera que no se caiga en un sistema inestable. Una visualización del proceso de corrección de la posición final mediante el algoritmo PID, podría permitir escoger adecuadamente los valores requeridos para un mejor funcionamiento del prototipo. A continuación se presentan algunos resultados de la operación de este prototipo con diferentes valores de las constantes P, I y D, así como de la tolerancia ingresada. En todos los casos se realizó la siguiente experiencia: - Ubicación inicial: valor referencial = 100cm - Acercamiento del objeto a una distancia d = 50cm - Alejamiento del objeto a una distancia d = 150cm Se operó sobre un piso de cerámica, el mismo que ofrece buena adherencia con las ruedas utilizadas. 159 Constantes (amplificadas por 10) Respuesta (tiempo de pantalla = 19s) Comentarios P = 50 I =0 D=0 Tolerancia = 10 Existe una oscilación grande antes de llegar a un resultado dentro del margen de tolerancia. P = 50 I =0 D=0 Tolerancia = 0 Existe una oscilación grande antes de llegar a un resultado dentro del margen de tolerancia, el mismo que no es cumplido y el vehículo intenta todo el tiempo llegar a él, pero la potencia es muy baja para vencer la inercia. P = 50 I = 10 D=0 Tolerancia = 10 La oscilación es menor que la que se veía anteriormente y se llega más rápidamente al punto de referencia, dentro del margen de tolerancia ingresado. P = 50 I = 10 D=0 Tolerancia = 0 A diferencia del caso anterior (tolerancia=0), el controlador permite acercarse más fácilmente al nivel de referencia. 160 Constantes (amplificadas por 10) Respuesta Comentarios (tiempo de pantalla = 19s) P = 50 I = 15 D = 10 Tolerancia = 10 La respuesta esperada, con el margen de tolerancia indicado, se consigue mucho más rápidamente. P = 50 I = 15 D = 10 Tolerancia = 0 Se llega prácticamente a conseguir el nivel de referencia de forma rápida. Tabla 4.5. Respuesta del controlador PID con diferentes valores de los parámetros del algoritmo Conclusión: el éxito de la aplicación de un algoritmo de control PID está, por supuesto, en su correcta implantación y en una buena sintonización del mismo. El nivel de carga de las baterías afecta a este prototipo en la medida en que, ante un valor bajo de su carga, el sensor de ultrasonido no entrega mediciones aceptables y los motores no funcionan a la potencia deseada. 4.5 SEGUIDOR DE LÍNEA Para llegar al resultado mostrado se pasó por diferentes pruebas con distintos tipos de algoritmos, desde los más simples hasta los más elaborados y en cada uno de ellos se encuentran ventajas y desventajas. Ya que cada kit 8527 cuenta únicamente con un sensor de luz, se probaron los algoritmos que cumplían con esta limitación. 161 Finalmente se llegó a probar la opción de un controlador tipo PID para conseguir el resultado buscado, el mismo que fue aceptable aunque no por ello perfecto. Igual que en el caso anterior, parte del éxito de este prototipo depende de la correcta sintonización del controlador PID. A diferencia del proyecto anterior, no se ofrece la posibilidad de cambiar los valores de las constantes sino únicamente a través de la modificación del software. El nivel de iluminación variable del medio en el que se desenvuelva el prototipo también puede afectar su funcionamiento. Ya se indicó anteriormente que el dispositivo diseñado no es exactamente un seguidor de línea, sino un seguidor del borde de la línea, puesto que lo que hace inicialmente es ejecutar un barrido para determinar valores máximo y mínimo de intensidad luminosa al recorrer la línea y su alrededor y luego mantiene como referencia aquel valor que resulta de promediar los anteriores. Una correcta o incorrecta sintonización del controlador PID hará que el vehículo tenga un recorrido suave o accidentado respectivamente, sobre el borde de la línea a seguir. A continuación presento algunos de los resultados obtenidos en el seguidor de línea al aplicar un controlador tipo PID. La trayectoria de prueba se muestra en la siguiente figura: Figura 4.1. Plantilla para probar el seguidor de línea 162 Constantes Respuesta Comentarios P = 30 I =0 D=0 El vehículo sigue la línea negra, sobre su borde, mayoritariamente sobre la región clara de la lámina. P = 40 I =0 D=0 El vehículo sigue la línea negra, sobre su borde, mayoritariamente sobre la región clara de la lámina aunque la corrección del error es más rápida que antes. P = 50 I =1 D=0 El vehículo sigue de forma más aproximada la línea negra, oscilando alrededor de ella. P = 80 I =1 D = 10 Con estos valores de parámetros, el vehículo completó sin mayor problema tres vueltas en la zona de pruebas. Tabla 4.6. Respuesta del seguidor de línea ante la aplicación de un controlador PID La siguiente prueba consistió en recorrer las trayectorias mostradas en la siguiente figura. Todas ellas tienen una forma similar, pero difieren en el color. Lo que se observó es que hubo éxito únicamente en el caso de la línea negra. Con la 163 línea celeste, el vehículo pronto perdió su ruta y con la línea roja, ni siquiera la reconoció sobre el piso cerámico de color crema. Figura 4.2. Trayectorias de prueba para el seguidor de línea El resultado obtenido con el seguidor de línea sobre la línea negra, de las tres mostradas en la figura anterior es el siguiente. Los parámetros de trabajo fueron: P=80, I=0 y D=2. Figura 4.3. Resultado al seguir la línea negra de la Fig. 4.2 Conclusión: los parámetros ingresados para el controlador PID tienen gran influencia en el comportamiento del seguidor de línea y su éxito depende de la correcta sintonización del mismo. Para mejorar el funcionamiento de este prototipo habría que modificar su estructura mecánica colocando, por ejemplo, un mayor número de sensores de luz, pero estos no están disponibles. 164 Por los resultados observados, un controlador tipo P sería suficiente para conseguir un resultado aceptable para el seguidor de línea, aunque la inclusión de un control integral y/o derivativo permite seguir de mejor manera la línea descrita. Para mejorar los resultados, sin embargo, se podría probar, entre otras opciones, con la inclusión de un segundo sensor luminoso, con lo que seguro se obtendrían mejores resultados, pero esto iría en contra de la idea inicial de este trabajo, que consistía en desarrollar prototipos haciendo uso de las piezas disponibles en un solo kit de trabajo. El nivel de carga de las pilas usadas interfiere sobre el correcto funcionamiento del sensor de luz y de los motores, por lo que es necesario tener en cuenta este particular al momento de probar el diseño. 4.6 APLICACIONES REMOTAS El programa desarrollado para que los prototipos anteriormente diseñados funcionen adecuadamente, según lo que requiere este proyecto, es bueno y no muestra mayores dificultades en su ejecución. El factor que mayores problemas genera en este proyecto es la distancia de operación, ya que se trabaja de forma remota inalámbrica mediante bluetooth. Las pruebas que se hicieron consistían en verificar que los dispositivos funcionan adecuadamente desde diferentes distancias y ante la presencia de obstáculos. Los resultados se muestran a continuación. Se hicieron pruebas a diferentes distancias de mando y el equipo funcionó satisfactoriamente hasta una distancia de aproximadamente 20m y con obstáculos incluidos en el camino (ventanas y paredes), a pesar de que entre las características mencionadas por el fabricante se habla de una distancia de operación máxima de 10m. De la misma manera se hicieron pruebas con la comunicación bluetooth entre dos ladrillos NXT, manteniendo encendidos y en operación otros dispositivos que 165 tienen esta posibilidad de comunicación y no hubo o no se notó ningún tipo de interferencia en su funcionamiento. Lamentablemente, un factor cuyo efecto es difícil de cuantificar es el que corresponde al nivel de las baterías, pero cualitativamente se puede mencionar que la distancia máxima de operación disminuye ante un valor de carga bajo de las pilas. Conclusión: el programa diseñado muestra la versatilidad que tiene el ladrillo programable NXT en el momento de comunicarse con otro de las mismas características. La barrera de la distancia no debería representar una gran limitación para la gran mayoría de aplicaciones a desarrollar. 166 CAPÍTULO 5 CONCLUSIONES Y RECOMENDACIONES 5.1. CONCLUSIONES - El objetivo de este trabajo, que consistía en construir y programar un conjunto de robots móviles sobre la base del producto Lego Mindstorms en su versión NXT, se ha cumplido en su totalidad y se ha demostrado la facilidad y versatilidad que ofrece el producto mencionado para el desarrollo de aplicaciones robóticas. - El trabajo desarrollado permite tener una visión suficientemente profunda sobre el tema e invita a seguir conociéndolo e investigándolo. Es necesario mencionar que también existen limitaciones, las mismas que serán decisivas en dependencia de la aplicación que se encuentra en desarrollo. - La plataforma sobre la que está desarrollado el producto Lego Mindstorms NXT ofrece básicamente dos ventajas: un relativo bajo precio y grandes prestaciones. Si se lo considera como un juguete, puede tratarse de uno costoso, pero si se lo compara con otras plataformas para diseño de robots, resulta que ésta ofrece un infinito espectro de opciones que van desde las más simples hasta las más complejas y variadas. - El trabajo con plataformas como la de Lego Mindstorms NXT permite promover el trabajo en equipo, la programación de equipos reales, la construcción e integración de sistemas, la información de carácter multidisciplinario, etc. - El entorno de Lego Mindstorms es muy flexible, así como fácil de usar y muy potente, y permite desarrollar una gran variedad de actividades de programación y control de robots con la implementación de diferentes 167 controladores para cumplir con las tareas deseadas. En el trabajo, por ejemplo, se han probado dos distintos controladores de tipo PID sobre diferentes magnitudes y en ambos casos ha sido posible ver la variación de los resultados ante un cambio de las constantes o parámetros que intervienen. - En cuanto a los lenguajes de programación, NXT-G es una muy buena opción como una solución gráfica, mientras que NXC es una opción de código abierto orientada a la escritura de código. Cada una de las opciones mostradas tiene ventajas y desventajas y el usuario final puede escoger de entre ellas o de entre las muchas otras opciones existentes, dependiendo de la aplicación que se encuentra en desarrollo. - La versión de Lego utilizada es la 1.0. Actualmente existe en el mercado la versión 2.0 que adicionalmente cuenta con un elemento nuevo de hardware como lo es un sensor de color y su software incluye mejoras siendo, dentro de ellas, la más notable la posibilidad de trabajar con aritmética de punto flotante. 5.2. RECOMENDACIONES - Es importante, antes de iniciar un proyecto con Lego Mindstorms, el trazarse las metas y plantearse bien los objetivos que desean ser cumplidos. Aunque esta recomendación es válida en cualquier situación que debe ser resuelta, se considera que aquí es especialmente válida, pues es fácil “perderse” en el camino ya que se cuenta con un juguete que, con seguridad, ha fascinado a muchos desde la época de la infancia. - Existe una gran comunidad de desarrolladores o simplemente fanáticos del producto, que ofrecen consejos sobre diferentes tópicos y frente a las típicas dificultades que suelen presentarse al trabajar con Lego Mindstorms. La recomendación es acudir a estos grupos y buscar, junto a ellos, las mejores soluciones a los problemas planteados. De la misma 168 manera, las investigaciones de este gran grupo de personas se constituyen en una gran fuente de información y de nuevos recursos para aprovechar de mejor manera todas las opciones del producto. - El kit 8527 puede ser limitado en muchas de las aplicaciones que se quiere desarrollar. Conviene por ello abastecerse de kits adicionales, con piezas especiales, que permitirán realizar aplicaciones de mayor complejidad y tamaño. En el mercado hay muchas opciones y es necesario ver qué tipo de recursos son los más necesitados, dependiendo de las aplicaciones que se van a desarrollar. De la misma manera, existen empresas dedicadas a la construcción de sensores especiales para este producto, así como también hay muchos documentos donde se mencionan las características eléctricas y protocolos de comunicación usados, para que sensores de diseño personal puedan acoplarse con éxito a la unidad central de proceso del NXT. - Un gran problema con el uso del producto en mención es el consumo de pilas. Por ello conviene abastecerse del paquete de baterías recargables de la marca o, a su vez, diseñar un equipo que cumpla con las características eléctricas exigidas por el producto. Con esto se promueve también un cuidado del medio ambiente. 169 REFERENCIAS BIBLIOGRÁFICAS [1] Blogger.com; “Historia del arte de la Robótica: tipos de robots”; 2009; http://robotik-jjlg.blogspot.com/2009/03/tipos-de-robots-2.html [2] MIT Media Lab; “Seymour A. Papert | MIT Media Lab”; http://www.media.mit.edu/people/papert [3] MIT Media Lab; “ Mitchel Resnick | MIT Media Lab”; http://www.media.mit.edu/people/mres [4] KENNETH, Berry; “Teaching with Robots”; 2008 [5] MIGLINO, Orazio y otros; “La robótica como herramienta para la educación”; 2000. [6] Mellbin, Franz, “Mindstorms in Education”; http://www.crynwr.com/lego-robotics/education.html [7] Wikipedia; “LEGO”; http://es.wikipedia.org/wiki/LEGO [8] Universidad de Colorado; “Motors”; 2002; http://csel.cs.colorado.edu/~bauerk/legorobots/motors.html [9] Tufts University; “Welcome to LEGO Engineering”; www.legoengineering.com [10] CEA Comité Español de Automática; Valera, A., Vallés, M y otros; “Desarrollo y Control de Robots Móviles de Bajo Coste”; http://www.ceaifac.es/actividades/jornadas/XXVIII/documentos/1461-legov4.pdf [11] RWTH Aachen University; “Projects-RWTH-Mindstorms NXT Toolbox”; http://www.mindstorms.rwth-aachen.de/trac/wiki/Projects [12] LEGO; “LEGO.com MINDSTORMS”; http://mindstorms.lego.com/en-us/Default.aspx [13] LEGO DACTA; “Welcome to Dacta”; http://www.dacta.eu.com/ [14] LEGO; “LEGO MINDSTORMS NXT Hardware Developer Kit.pdf”; http://mindstorms.lego.com/en-us/Default.aspx [15] LEGO; “9797_LME_UserGuide_US_low.pdf”; http://mindstorms.lego.com/en-us/Default.aspx [16] LEGO; “LEGO Education”; www.legoeducation.us/ [17] HURBAIN, Philippe; “NXT motor internals”; http://www.philohome.com/nxtmotor/nxtmotor.htm 170 [18] Peeron; HURBAIN, Philippe; “Peeron: Mindstorms NXT (#8527-1)”; http://www.peeron.com/inv/sets/8527-1 [19] BrickLink; “BrickLink Reference Catalog: Inventory of Set 8527-1”; http://www.bricklink.com/catalogItemInv.asp?S=8527-1&v=1&b=0 [20] Active Robots; “Active Robots-Programmable Robots, Hobby Robotics Kits, Educational Robots & Robotic Arms, Legs & Grippers - UK” http://www.active-robots.com/products/robots/ [21] nxtprograms.com; Parker, Dave; “NXT Programs – Fun Projects for your LEGO Mindstorms NXT”; http://www.nxtprograms.com/ [22] University of British Columbia; Mc Call, Kevin; “A PID Robot implemented with LEGO”; 2007; http://www.physics.ubc.ca/~kevinmcl/projects/lego/APRIL/ [23] Lrobotikas; “Programación NXT–Wiki sobre robótica con Lego Mindstorms”; http://lrobotikas.net/mediawiki/index.php?title=Programaci%C3%B3n_NXT [24] ROBOT Magazine; Swan, Dick; “Programming Solutions for the LEGO Mindstorms NXT: Which approach is best for you?”; 2007; http://www.botmag.com/articles/10-31-07_NXT.shtml [25] KELLY, James Floyd; “LEGO Mindstorms NXT-G Programming Guide”; Apress; USA; 2007 [26] BENEDETTELLI, Daniele; “Programming LEGO NXT Robots using NXC v. 2.2.”; Junio de 2007. Disponible en: http://bricxcc.sourceforge.net/nbc/nxcdoc/NXC_tutorial.pdf [27] HANSEN, John; “Not eXactly C (NXC) Programmer's Guide v. 1.0.1 b33”; Octubre de 2007. [28] GASPERI, Michael y otros, Extreme NXT – Extending the Lego Mindstorms NXT to the next level. Apress. USA. 2007 Disponible en: http://bricxcc.sourceforge.net/nbc/nxcdoc/NXC_Guide.pdf [29] CRySoL Ciudad Real y Software Libre; “Lego Mindstorms NXT: programar con NXC”; 2007; http://crysol.org/node/777 [30] Hansen, John; “NBC/NXC NeXT Byte Codes and Not eXactly C”; http://bricxcc.sourceforge.net/nbc/ [31] Wikipedia; “NXC”; http://en.wikipedia.org/wiki/NXC 171 [32] Sluka, Jim; “PID Controller For Lego Mindstorms Robots”; http://www.inpharmix.com/jps/PID_Controller_For_Lego_Mindstorms_Robo ts.html Otras referencias bibliográficas y electrónicas - AGULLÓ, Miguel y otros; “LEGO Mindstorms Masterpieces”; Ed. Syngress; USA; 2003 - BAUM, David y otros; “Extreme Mindstorms – An Advanced Guide to LEGO Mindstorms”; Apress; USA; 2000 - BENEDETTELLI, Daniele; “Creating Cool Mindstorms NXT Robots”; Apress; USA; 2008. - Blogger.com; “Manual de ROBÓTICA LEGO MINDSTORMS NXT”; http://manualderobotica.blogspot.com/ - BRATZEL, Barbara; “Physics by Design”; 2da edición; College House Entreprises; Knoxville, Tenessee, USA; 2007 - FERRARI, Mario y otros; “Building Robots with LEGO Mindstorms”; Ed. Syngress; USA; 2002. - FERRARI, Giulio y otros; “Programming LEGO Mindstorms with Java”; Ed. Syngress; USA; 2002. - JADUD, Matt; “TeamStorms as a Theory of Instruction”; 1999. - KELLY, James Floyd; “LEGO Mindstorms NXT – The Mayan Adventure”; Apress; USA; 2006 - KNUDSEN, Jonathan y NOGA, Markus; „Das Inoffizielle Handbuch für LEGO MINDSTORMS Roboter“; Ed. O´Reilly; Colonia, Alemania; 2000. - MARTIN, Fred; “The Art of LEGO Design”; 1995. - NAGATA, John; “LEGO Mindstorms Idea Book”; No Starch Press; San Francisco, California; USA; 2001. - SCHOLZ, Matthias Paul; “Advanced NXT – The Da Vinci Inventions Book”; Apress; USA; 2007 - VILLA, Luis; “LEGO Mindstorms with Linux”; Mini-HOWTO; 2000 - WILCHER, Don; “LEGO Mindstorms Interfacing”; McGraw-Hill; New York, USA; 2003 172 - WIRED Magazine; “The 50 Best Robots Ever”; enero de 2006; http://www.wired.com/wired/archive/14.01/robots.html Comunidades de desarrolladores - Mindboards: Blogs de desarrolladores de aplicaciones con Lego Mindstorms. http://sourceforge.net/apps/phpbb/mindboards/ - Techbricks.nl: Proyectos y tips para el desarrollo de aplicaciones con Lego y Lego Mindstorms. http://www.techbricks.nl/ - Brickshelf: Comunidad de desarrolladores de aplicaciones con Lego Mindstorms. http://www.brickshelf.com/ - The NXT STEP – LEGO MINDSTORMS NXT Blog: Blog de una comunidad de desarrolladores de aplicaciones con Lego Mindstorms NXT. http://thenxtstep.blogspot.com/ - LEGO Projects: Página de Sivan Toledo, desarrollador de aplicaciones con Lego Mindstorms. http://www.tau.ac.il/~stoledo/lego/ - Danny´s Mindstorms: Página de Daniele Benedettelli, desarrollador de aplicaciones con Lego Mindstorms. http://robotics.benedettelli.com/ - Lego Mindstorms Sensor Input Page: Página de Michael Gasperi, desarrollador de aplicaciones con Lego Mindstosms. http://www.extremenxt.com/lego.htm - The Unofficial LEGO Mindstorms NXT Inventor´s Guide: Página de David J. Perdue, desarrollador de aplicaciones con Lego Mindstorms NXT. http://nxtblog.davidjperdue.com/ - Lego: Página de Fisher Mellbin con ejemplos de diseños con Mindstorms. http://www.fischer-mellbin.com/Marcus/Lego/lego.html 173 ANEXOS A.1 ANEXO A: SISTEMA DE BOLA Y VIGA DESARROLLADO SOBRE LA BASE DEL PRODUCTO LEGO MINDSTORMS NXT RESUMEN Un sistema de control para balancear una bola en una viga utilizando LEGO MINDSTORMS es diseñado con la finalidad de implementar una planta para prácticas del Laboratorio de Control Automático, de tal manera que el estudiante pueda elaborar prácticas experimentales-teóricas y de esta manera complementar los conocimientos teóricos adquiridos en la asignatura de Control Automático y Control Discreto. El sistema está constituido físicamente por una barra construida con piezas de Lego y un cuerpo de libre rodamiento. El sensor de ultrasonido permite determinar la posición de la bola sobre la barra. Un servomotor, conectado al final de la barra, controla la posición de la misma y del cuerpo que se encuentra sobre ella recogiendo o soltando un hilo que se encuentra atado al eje del motor y a un extremo de la barra. INTRODUCCIÓN El sistema de viga y bola es un sistema utilizado en laboratorio con el fin de estudiar los métodos clásicos y modernos de control. Posee una propiedad muy interesante que llama la atención de los ingenieros en control: es inestable en lazo abierto, por lo que se debe realimentar el sistema y de esta manera variar la respuesta del mismo ante diversos tipos de control. Es un sistema compuesto por una bola rodando sobre un balancín largo que puede ser inclinado aplicando una señal de control sobre un actuador que mueve la barra. Su estructura física es diversa. A continuación se presentan modelos comerciales de viga y bola y el armado como parte de este proyecto. A.2 Sistema de control de bola y viga de Googol Technology (HK) Limited (fuente: http://www.googoltech.com/uploads/catalog/999/Ballbeam%20Eng%20080906.pdf) “Ball-on-beam balancer” (fuente: http://www.personal.psu.edu/users/a/x/axa943/ball_on_beam_balancer.htm) A Robotic Ball Balancing Beam - Jeff Lieberman (fuente: http://bea.st/sight/rbbb/) A.3 El prototipo armado con piezas de Lego es el siguiente: Prototipo de un sistema de bola y viga sobre la base del producto Lego Mindstorms OBJETIVO El objetivo del control es regular automáticamente la posición de la bola sobre la barra cambiando el ángulo de la misma con respecto a un eje horizontal. Es un problema de control difícil, porque la bola, ante una inclinación de la barra, no se queda solamente en un lugar, ya que se mueve con una aceleración proporcional al ángulo de la barra. En la mayoría de problemas de control, si una entrada constante es aplicada a un sistema, la salida permanece más o menos constante. En este, sin embargo, la salida del sistema, es decir la posición de la pelota, no es estable por lo que el sistema se vuelve inestable en lazo abierto y la posición de la pelota puede incrementarse sin límite como respuesta a una entrada constante. Es por esto que se necesita un control realimentado para mantener la posición deseada. A.4 APLICACIONES DEL SISTEMA En las industrias con procesos químicos: en el control de reacciones químicas exotérmicas. Si una reacción química genera calor y la reacción es más rápida conforme se incrementa la temperatura, entonces alguna forma de control deberá ser usada para estabilizar la temperatura de la reacción química y evitar una reacción de escape rápido. Las reacciones exotérmicas son utilizadas para producir muchos de los productos químicos que usamos cotidianamente. Por lo tanto, sin control realimentado estos productos no existirían. En generación de energía: en el control de posición de plasma en el generador toroide europeo (JET = Joint European Torus). El objetivo de este sistema es controlar la posición vertical del anillo de plasma dentro del hueco en el contenedor metálico con forma de dona. El control se realiza por medio de campos magnéticos aplicados a toda la dona mientras el plasma se mueve verticalmente de una manera inestable en respuesta a dichos campos de control. Para entender el problema se puede imaginar una bola de jabón que será expulsada a mayor velocidad conforme se varía el ángulo relativo de las manos. En aplicaciones aeroespaciales: en el control de un cohete o una nave durante el despegue vertical. El ángulo de los cohetes de propulsión a chorro o las aletas de desviación deben ser continuamente controlados para prevenir que el cohete caiga o la nave vuelque. Sin el control de realimentación para estabilizar los movimientos, no serían posibles los vuelos espaciales. Estos son algunos ejemplos de sistemas inestables de importancia y cuyo control debe ser estudiado en laboratorio ya que normalmente los sistemas inestables reales son peligrosos y por tanto no se pueden reproducir en condiciones reales en el laboratorio. Es por ello que fue desarrollado el sistema de viga y bola, cuyo fin es tener un mecanismo seguro y simple que tiene las características de un sistema inestable para ser usado en el laboratorio y realizar las más diversas pruebas sin riesgos. A.5 ANÁLISIS DEL SISTEMA La figura que se muestra a continuación representa un esquema simplificado del sistema de “viga y bola”: Una bola B se encuentra sobre una viga, la misma que forma un ángulo α con la horizontal. La distancia x entre el sensor S y la bola B es determinada por el primero. El ángulo de inclinación de la barra es variado a través de la variación de longitud de la cuerda que se encuentra acoplada al eje de un motor a través de una polea. Un diagrama simplificado de las fuerzas que actúan sobre la bola es el siguiente: Diagrama de fuerzas del sistema “bola y viga” A.6 En el diagrama anterior se representan las siguientes fuerzas: - mg: peso de la bola - mg·sinα: componente del peso paralela al plano del movimiento - mg·cosα: componente del peso perpendicular al plano del movimiento - Fr: fuerza de rozamiento (se opone al movimiento) En este diagrama se está despreciando la inercia propia del cuerpo que se encuentra sobre la viga, la misma que debe ser considerada en el caso real. Un primer análisis dinámico básico nos dice lo siguiente. Por la segunda ley de Newton: F = m·a En el sentido del movimiento: F = mg·sinα – Fr Pero la fuerza de rozamiento es igual a: Fr = µ ·mg·cosα Por lo que: m·a = mg·sinα - µ ·mg·cosα Es decir: a = g·sinα - µ ·g·cosα La bola debe oponer mínima resistencia al movimiento, por lo que se espera que el coeficiente de rozamiento dinámico (µ) sea aproximadamente igual a 0. También se conoce que, para valores muy pequeños del ángulo α: sen α ≈ α La última ecuación nos demuestra que la aceleración del sistema resulta ser proporcional al ángulo que forma la viga con la horizontal: a = k·α Por lo tanto, ante un valor constante de la entrada (α) se provoca que la bola sea acelerada llevando al sistema total a la inestabilidad. Esto demuestra que se hace necesaria una realimentación en el sistema para conseguir estabilidad en el mismo. Obviamente, se podría realizar un análisis matemático y dinámico mucho más profundo de este sistema para luego de conseguir un modelo matemático realizar la simulación correspondiente que nos conduzca a obtener el mejor controlador posible, pero ese análisis escapa al objetivo del presente trabajo; además esas ecuaciones tampoco serían utilizadas en el controlador implementado. A.7 PROTOTIPO IMPLEMENTADO El sistema desarrollado se muestra en la siguiente figura: Vista frontal del sistema de “viga y bola” desarrollado El prototipo tiene una longitud máxima de 51cm, de los cuales 37cm corresponden a la longitud usable de la barra sobre la cual se mueve el pequeño vehículo. El nivel horizontal de la barra se encuentra a 7cm de altura y el ángulo máximo que se puede variar en su inclinación es de aproximadamente ±5° con respecto al nivel horizontal. Vista superior del prototipo diseñado Para determinar la distancia a la que se encuentra el objeto que se desea equilibrar sobre la barra a una distancia predefinida, se usa el sensor de A.8 ultrasonido que es parte del kit de Lego Mindstorms. Este sensor puede realizar mediciones de distancias en un rango que va desde los 3cm hasta los 250cm, por lo que resulta adecuado para este diseño: Detalle del sensor de ultrasonidos. Para facilitar la tarea del sensor de ultrasonido, al momento de realizar sus mediciones, se ha diseñado un pequeño vehículo que puede rodar libremente sobre la barra y al que se ha adherido una lámina de cartón y que sustituirá a la bola del experimento original. La señal de ultrasonido podrá reflejarse más fácilmente en esta lámina, por lo que las mediciones serán también más confiables. Vehículo que sustituye a la “bola” del experimento original A.9 El sensor de ultrasonido se encuentra en uno de los extremos de la barra y en el otro se encuentra el servomotor que hace las veces del actuador que permite cambiar el ángulo de inclinación de la barra. Al eje del motor se encuentra acoplado un engranaje de 40 dientes, el mismo que acciona a otro de 10 dientes y que se encuentra montado sobre el eje que se encarga de soltar o recoger el hilo nilón que permite a la barra variar su inclinación. Detalles del sistema de engranajes acoplados al motor y de la cuerda que sostiene a la “viga” y que le permite variar su ángulo de inclinación. Se usó este sistema de engranajes para poder tener una mayor velocidad de reacción frente a cambios en la posición de la “bola” sobre la barra. En las siguientes figuras se puede ver cómo se ubica la “bola” sobre la barra en el experimento diseñado. Detalle de la “bola” sobre la “viga” en el prototipo diseñado con Lego Mindstorms. A.10 PROGRAMA DESARROLLADO El programa que permite cumplir con el objetivo planteado fue desarrollado en el lenguaje NXC. Diagrama de flujo del programa “Viga y Bola”: A.11 Código NXC del programa “Viga y Bola”: // Programa BEAM AND BALL (PID) task main() { SetSensorLowspeed(IN_4); // INICIO DE LA TAREA PRINCIPAL // Sensor de ultrasonido en el puerto 4 // Valores predefinidos int int int int tolerancia = 4; P = 10; I = 90; D = 400; // // // // Tolerancia permitida para el proceso Constante de ganancia proporcional Constante integral Constante derivativa int scale = 10; // Factor de escalamiento por la ganancia de las constantes // debido a que no se pueden ingresar valores decimales int setPoint=20;// Inicializa la variable que indica la distancia a mantener. // Mensaje de inicio TextOut(0,LCD_LINE1,"Pulse el boton", true); // true: borra pantalla anterior TextOut(0,LCD_LINE2,"naranja para", false); TextOut(0,LCD_LINE3,"para iniciar!", false); TextOut(29,LCD_LINE8,"Iniciar", false); until(ButtonPressed(BTN4,true));// Espera a que se presione el botón naranja ClearScreen(); TextOut(0,LCD_LINE4,"... ... ..."); int distancia = SensorUS(IN_4); // Lectura de la distancia inicial // Variables a ser usadas en el lazo de control int error=0; int prevError=0; int sumError=0; // Error actual en la posición // Error del lazo anterior // Suma de errores usada en el término integral int pOut=0; int iOut=0; int dOut=0; // Potencia de salida para los términos proporcional, // integral y // derivativo int totalOut=0; // Suma de los tres términos individuales long to, dt; // Variables que permiten determinar tiempo de lazo // Código que realiza el cálculo de la corrección en ángulo del motor para // conseguir una corrección en la posición final del automóvil. to = CurrentTick(); while(true){ // INICIO DEL ALGORITMO DE CONTROL prevError = error; distancia = SensorUS(IN_4); // Almacena el error previo (lazo anterior) // Lee la distancia a través del sensor de US error = distancia-setPoint; // Calcula el error actual dt = CurrentTick()-to; to = CurrentTick(); // Cálculo del tiempo del último lazo pOut = error*P; // Genera la salida proporcional sumError += error*dt; // Añade el error actual a la suma A.12 iOut = sumError*I; dOut = D*(error-prevError)/dt; // Calcula la salida integral // Calcula la salida derivativa totalOut = (pOut+iOut/(scale*scale)+dOut)/scale; // Salida total if(totalOut > 250) totalOut=250; else if(totalOut < -250) totalOut=-250; // Chequea si la posición actual está fuera // del margen de tolerancia RotateMotor(OUT_A,100,totalOut); else // Resetea la suma cuando se ha conseguido el sumError=0; // resultado deseado if(abs(error)>tolerancia) } } El programa utiliza un algoritmo PID para controlar la posición final de la “bola”. El algoritmo requiere de una señal de referencia, la misma que es ingresada directamente en el programa a través de la constante setPoint. Luego, el programa hace que el sensor de ultrasonido entregue mediciones de la distancia, las mismas que son comparadas con la señal referencial para generar un error. Esta señal de error es tratada por el algoritmo PID: - Salida proporcional: pOut = error ⋅ P , donde P representa a la constante proporcional del controlador. - Salida integral: iOut = sumError ⋅ I , donde I representa a la constante integral del controlador y sumError es la suma de los errores de los lazos anteriores, antes de la última estabilización del sistema, multiplicados cada uno por el tiempo del lazo de control (dt). - Salida derivativa: dOut = D ⋅ (error − prevError ) ⋅ dt , donde D representa a la constante derivativa del controlador, prevError es el error del lazo anterior y dt el tiempo del último lazo de control. La suma de las tres salidas genera la salida total totalOut, la misma que es mandada al motor y representa el valor del ángulo que debe girar el servomotor. El signo de esta salida indicará si la barra debe subir o bajar para lograr el equilibrio deseado de la “bola”. A.13 Ya que solo se permite el uso de números enteros para los cálculos aritméticos, se han escalado las constantes con un factor de 10 (scale), factor que debe ser eliminado del resultado final mediante una simple división entre 10. RESULTADOS OBTENIDOS Para la calibración del controlador PID diseñado se han seguido los siguientes pasos: - Primero se ajusta la constante proporcional hasta que el sistema se comporte de una manera aceptable, aunque no se logra estabilidad en ningún caso. Lo que se ha buscado con esta calibración es que la constante no sea tan grande como para que provoque un ángulo de giro sobre la barra muy grande. Una revolución del eje del motor equivale a 5 revoluciones del eje al que se encuentra atada la cuerda, cuyo diámetro es de aproximadamente 7,5mm; esto se debe al uso del sistema de engranajes. Por lo tanto, una revolución completa del eje del motor equivale a una extensión de 117,8mm de la cuerda, tal y como se puede observar en la siguiente tabla: Giro del eje Giro del eje al que Longitud de la cuerda del motor está sujeta la cuerda (eje de 7,5mm de diámetro) 360° 360°·5 = 1800° 1800 o ⋅ 2 ⋅ π ⋅ 3,75mm = 117 ,8mm 360 o Usando los resultados de la tabla anterior, se tiene que, para provocar una extensión máxima de la cuerda de 40mm desde su posición horizontal (corresponde a los 5° de inclinación que se mencion aron en un inicio), el ángulo que debe girar el eje del motor y, por lo tanto la salida del controlador PID), debe ser de aproximadamente 122°. 360o ⋅ 40mm = 122,2 o 117,8mm A.14 En el programa se han considerado valores extremos para totalOut de ±250, tomando en cuenta que en algún momento la barra puede ubicarse en el punto más alto o más bajo de su recorrido. Por lo tanto, ante un error máximo de 30cm, la constante proporcional (si se trata de un control exclusivamente proporcional) no debe generar un valor muy elevado. Pensando en los aproximadamente 122° d e desviación máxima sobre la horizontal, el valor de P máximo debería ser de 4. - El siguiente paso es encontrar un valor adecuado para la constante derivativa, la misma que otorga al sistema de velocidad de respuesta frente al error existente. Esta calibración se realiza mediante el proceso de “prueba y error”. - Una vez que el sistema tiene una respuesta aceptable, se procede a darle un valor a la constante integral. Esta constante permite básicamente que el sistema alcance más “suavemente” el equilibrio, aunque un valor muy alto puede llevarlo fácilmente a la inestabilidad. - Algo que hace falta mencionar es la dificultad que representa la alta inercia del vehículo que está rodando sobre la barra y que hace difícil el que se llegue fácilmente a alcanzar el equilibrio en el punto deseado. Para disminuir esta dificultad se puede usar en la realidad una bola de material más liviano, pero en este caso hubo dificultades por cuanto el sensor de ultrasonido no siempre determina la posición del objeto. Finalmente, las constantes probadas en el sistema son las siguientes: P=4; I=0,1 y D=500. Con estos valores se hicieron pruebas para que el sistema alcance el equilibrio alrededor de un valor referencial predefinido (d=20cm) y se lo consiguió. Por supuesto, estas constantes deberán variarse si la estructura es diferente a la diseñada. A.15 CONCLUSIONES - Se puede concluir que se consiguió lo esperado, por cuanto la respuesta del controlador es buena. Este proyecto servirá para demostrar a los estudiantes, algunas de las capacidades de los sistemas de control. Los estudiantes podrán cambiar los parámetros de los controladores y observar cómo afectan estos cambios a la repuesta del sistema. - Se pueden así mismo experimentar otros tipos de control, como por ejemplo mediante lógica difusa utilizando la misma planta. En este caso lo que se debería probar es otro lenguaje de programación que ofrezca mayores y mejores opciones. - Se diseñó un controlador PID para estabilizar al sistema total en lazo cerrado, pero el sistema muestra error de estado estacionario, debido a la diferencia que existe entre la fricción estática y dinámica de la “bola”. - El uso de equipos de fácil adquisición y manejo similares a Lego, facilita los estudios y cálculos necesarios para la implementación de sistemas de control y logra reemplazar dispositivos convencionales, demostrando que es posible, mediante equipos considerados inicialmente “juguetes”, mejorar sistemas tradicionales, alcanzar alta confiabilidad y eficiencia y entretenerse en el intento. REFERENCIAS BIBLIOGRÁFICAS Y ELECTRÓNICAS - Ataei-Esfahani, Armin; “Ball-on-Beam Balancer”; 2006; http://www.personal.psu.edu/users/a/x/axa943/ball_on_beam_balancer.htm - Carnegie Mellon University; “CTMS Example: Ball & Beam Modeling in Simulink” http://www.library.cmu.edu/ctms/ctms/simulink/examples/ball/ballsim.htm A.16 - CINVESTAV-IPN; Yu, Wen; “Nonlinear PD regulation for ball and beam system”; México; http://www.ctrl.cinvestav.mx/~yuw/pdf/ijeee.pdf - Connexions; Luther, Erik; “Interactive Ball and Beam Experiment”; 2009 http://cnx.org/content/m14028/latest/ - Dorf, Robert, Bishop, H.; “Modern Control Systems’ - Liebermann, Jeff; “A Robotic Ball Balancing Beam”; 2004 http://web.media.mit.edu/~xercyn/sight/rbbb/rbbb.pdf - Ogata, K.; “Ingeniería de Control Moderna”; Prentice Hall - Smith, Carlos A., Corripio Armando B.; “Control Automático de Procesos” - Swarthmore College; Wanjohi, William; “Ball and Beam Control Theory Demonstrator”; 2005; http://www.engin.swarthmore.edu/academics/courses/e90/2004_5/ww/ww_fin al_e90.pdf - The University of Michigan; “CTM Example: Ball & Beam Modeling”; 1997; http://www.engin.umich.edu/group/ctm/examples/ball/ball.html - Wellstead, Peter; “Ball and Beam 1: Basics”; http://www.control-systems-principles.co.uk/whitepapers/ball-and-beam1.pdf - Wellstead, Peter; “Ball and Beam 2: Robust Control”; http://www.control-systems-principles.co.uk/whitepapers/ball-and-beam2a.pdf B.1 ANEXO B: MENÚ PRINCIPAL DEL NXT Fuente: 9797_LME_UserGuide_US_low.pdf en www.mindstorms.com B.2 C.1 ANEXO C: DIAGRAMAS ELÉCTRICOS DEL HARDWARE UTILIZADO EN EL PRODUCTO LEGO MINDSTORMS NXT Fuente: LEGO MINDSTORMS NXT Hardware Developer Kit en www.mindstorms.com Documentos adjuntos: 1. LEGO MINDSTORMS NXT hardware schematic.pdf 2. LEGO MINDSTORMS NXT Keypad schematic.pdf 3. LEGO MINDSTORMS NXT Light Sensor hardware schematic.pdf 4. LEGO MINDSTORMS NXT Sound Sensor hardware schematic.pdf 5. LEGO MINDSTORMS NXT Touch Sensor hardware schematic.pdf 6. LEGO MINDSTORMS NXT Ultrasonic Sensor hardware schematic.pdf A B C D TST ADC_BATT ADC_I P_EN BATT_PULS DIGID1 DIGID0 I_OND ADC_D0 DIGIC1 DIGIC0 I_ONC ADC_C0 DIGIB1 DIGIB0 I_ONB ADC_B0 DIGIA1 DIGIA0 I_ONA ADC_A0 MCPWM MCIN0 MCIN1 DIRC INTC0 MBPWM MBIN0 MBIN1 MAPWM MAIN0 MAIN1 DIRB INTB0 DIRA INTA0 DIA DEA TST ADC_BATT ADC_I P_EN BATT_PULS DIGID1 DIGID0 I_OND ADC_D0 DIGIC1 DIGIC0 I_ONC ADC_C0 DIGIB1 DIGIB0 I_ONB ADC_B0 DIGIA1 DIGIA0 I_ONA ADC_A0 MCPWM MCIN0 MCIN1 DIRC INTC0 MBPWM MBIN0 MBIN1 MAPWM MAIN0 MAIN1 DIRB INTB0 DIRA INTA0 DIA DEA REA 5 2.2uF 4.7uF 100nF RTS@BT TP62 100nF C49 6 5 7 10 2 Pad 2 1 CLR 2 4 6 8 10 12 1 2 3 4 9 8 GND CSBT TXBT RXBT SCKBT VMBT_REQ VCC_SND CTS@ARM 100nF C52 100nF C45 15K VCC1.8V 4 1uF ADVREF GND AD4 AD5 AD6 AD7 VCC_IN VCC_OUT PA17/PGMD5/AD0 PA18/PGMD6/AD1 PA21/PGMD9 VCC_CORE PA19/PGMD7/AD2 PA22/PGMS10 PA23/PGMD11 PA20/PGMD8/AD3 U7 3.3nF C53 TP60 10K R31 2 2 4 6 8 10 12 14 16 18 20 10K R98 1 1 3 5 7 9 11 13 15 17 19 2.2nF C54 TP59 MISOBT NRST N.C. N.C. 10K R99 10K R30 VCC3V 10k PULL UP TDI TMS TCK TCK TDO ARM JTAG interface VCC3V USB_DP INTA0 SCKBT SIBT RTSBT VCC1.8V AT91SAM7S256 VCC3V GND GND GND GND GND GND GND GND GND C51 VMBT_STATE SPY0030A SPN VCC 8 BATT_PULS SPP CE 7 R97 GND VREF 6 INN ACIN 5 U9 74HC73 Q Q 0R NM VCC3V R17 CLK J K U4B Speaker J20 VCC_SND 1 3 5 7 9 11 13 15 J19 16 Pad Blue Tooth PCB to PCB connector RSTBT MISOBT RTS@BT RTSBT SIBT VMBT_STATE GND VCC3V TP71 TP69 TP70 100nF C44 VCC1.8V BUTTON0 BUTT_ADC SIBT SCKBT CSDIS 10 pin Connector to LCD and button PCB 1 3 5 7 9 J15 100nF 100nF 100nF VCC5V VCC3V GND GND SOBT C43 C42 2 4 6 8 10 VCC3V C41 VCC3V TP61 1 2 3 4 5 6 7 VCC1.8V 8 SOUND_ARMA 9 DIGIA1 10 RXBT 11 VCC1.8V 12 DIGIB1 13 TXBT 14 DIGIA0 15 DIGIC1 16 USB_ADC ADC_I VMBT_STATE DIGID1 1nF C29 R79 1.5K 470pF C39 VCC3V 10nF C32 4.7 and 2.2 must be X7R 100 nF and 470 pF must be NP0 C38 C37 22pF C31 C36 22pF VCC3V TXBT X1 18.432MHz C30 TP85 R90 10K 1MEG R25 SOUND_ARMA 1MEG R42 VCC3V SOBT TP86 R89 10K VCC3V 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 DEA REA DIRC DIRB CSDIS RSTBT SOBT INTB0 CTS@ARM PA0/PGMEN0 PA1/PGMEN1 GND VCC_IO PA2 PA3 PA30 PA29 TST NRST PA28 PA27/PGMD15 PA4/PGMNCMD PA5/PGMRDY PA6/PGMNOE TDI VCC1.8V TCK CSBT TMS JTAGSEL TDO GND VCC_IO PA16/PGMD4 PA15/PGM3 PA14/PGMD2 PA13/PGMD1 PA24/PGMD12 VCC_CORE PA25/PGMD13 PA26/PGMD14 PA12/PGMD0 PA11/PGMM3 PA10/PGMM2 PA9/PGMM1 PA8/PGMM0 PA7/PGMNVALID REA 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 VCC_PLL PLLRC XIN/PGMCK XOUT GND VCC_FLASH VCC_IO DDP DDM ERASE VCC_CORE TCK PA31 TMS JTAGSEL TDO XIN VCC3V DIGID1 AVRSDA DIGID0 DIGIC0 TST NRST DIGIB0 VMBT_REQ AVRSCL DOA DIA TDI INTC0 DIRA 10K R94 TXBT RTS@BT 10K R109 6 5 7 10 3 TP58 TP83 RA4C 10K TP84 RA4B 10K CLR CLK J K U4A 1 3 5 7 9 2 4 6 8 10 12 13 9 8 10 pin 1 2 3 4 5 6 7 8 9 10 J17 100nF C58 2 1 14 3 MCIN1 MCIN0 VCC_AVR5V BUTTON0 P_EN CTS@ARM GND VCC_AVR5V AVRSCK AVRSO AVRSI AVRRESET 8 pin 1 2 3 4 5 6 7 8 J16 2 1 2 3 4 5 6 7 8 2 AVRRESET I_ONB I_ONA BATT_PULS 74HC73 Q Q Version I MCPWM MBIN0 MBIN1 MAIN0 MBPWM PD3 (PCINT19/OC2B/INT1) PD4 (PCINT20/XCK/T0) GND VCC GND VCC PB6 (PCINT6/XTAL1/TOSC1) PB7 (PCINT7/XTAL2/TOSC2) U8 CLR CLK J K 12 13 USB_DP R84 10K 10K R85 TP81 VCC3V 1 of Project Number Sheet 24 23 22 21 20 19 18 17 R93 2.2K 47pF C69 4 47pF 47pF C72 ADC_A0 ADC_B0 ADC_C0 ADC_D0 100nF 1 Hardware A3 Date (YYYY/MM/DD) Page Size Schematic Name LEGO Drafter LEGO Engineer/constructer Date (YYYY/MM/DD) 47pF C70 ADC_D0 VCC_AVR5V AVRSCK I_OND C71 100nF 100nF C77 C55 C48 ADC_C0 ADC_B0 ADC_A0 VCC_AVR5V USB 1 2 3 4 J12 VCC9V VCC_AVR5V VCC5V NM=NOT MOUNTED AVRSO I_ONC AVRSI MAIN1 MAPWM NM SM4002 D23 1 TP64 PC1 (ADC1/PCINT9) PC0 (ADC0/PCINT8) ADC7 GND AREF ADC6 AVCC PB5 (SCK/PCINT5) LEGO MINDSTORMS NXT Title 1.5K R83 33pF C33 100nF C28 ATmega48/V R92 2.2K 3 Q15 BC857B AVRSCL AVRSDA BUTT_ADC ADC_BATT 2 15pF 15pF 27R R82 27R R81 15K C35 22K R80 R78 C34 DDP DDM TP67 TP68 USB_ADC TP66 VCC3V U15A Small connector single row, 1,27 pitch 74HC73 Q Q VCC3V GND VCC_AVR5V AVRRESET N.C. GND 74HC73 Q Q AVR JTAG interface 2 1 14 3 RA4A 10K TCK TMS TDO NRST TDI GND PU10K VCC3V Small connector single row, 1,27 pitch VCC3V AVRSCK AVRSO N.C. N.C. AVRSI TP82 RA4D 10K CLR CLK J K U15B VCC3V 1 Pad J10 TP65 R91 10K Must be one pack or single, Not mounted on the final version 5 4 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 3 6 3 VCC3V DDP DDM 7 2 DOA 4 8 1 4 VCC GND 11 4 VCC GND 11 4 11 VCC GND 11 4 VCC 1 DOA 5 9 10 11 12 13 14 15 16 GND 32 31 30 29 28 27 26 25 PD2 (INT0/PCINT18) PD1 (TXD/PCINT17) PD0 (RXD/PCINT16) PC6 (RESET/PCINT14) PC5 (ADC5/SCL/PCINT13) PC4 (ADC4/SDA/PCINT12) PC3 (ADC3/PCINT11) PC2 (ADC2/PCINT10) PD5 (PCINT21/OC0B/T1) PD6 (PCINT22/OC0A/AIN0) PD7 (PCINT23/AIN1) PB0 (PCINT0/CLKO/ICP1) PB1 (PCINT1/OC1A) PB2 (PCINT2/SS/OC1B) PB3 (PCINT3/OC2A/MOSI) PB4 (PCINT4/MISO) A B C D A B C D 0.43R 1 Pad Batteri minus R20 R13 R29 TP76 BATT_PULS NM 6 5 120K RA2C 3 TP75 TP 120K RA2A VCC9V_MOTOR 10K R24 NM 0.43R R64 NM 0.43R 1 1 C50 100pF 120K BAS85 D7 Tactile SW1 4 390K R96 TP63 R100 6.8K SAMBA Q16B PUMT1 VCC5V NM C15 470nF RA2D ADC_BATT 470nF TP53 C60 10nF 470R R67 C74 NM NM 220K R21 TP2 C59 10uF 10K R27 VCC_AVR5V TP52 220K R95 TP73 NM 330K R28 NM U6A LM358 ON/OFF SW2 TP72 NM - + + TP87 R13, R20, R29 N.M. MUST BE SHORTED WITH SOLDER VCC_RS485 0R 0R 0R 1000uF + C8 VCC9V Rechargeble Battery detect Q17 BC848B 120K 2 3 1nF TP74 TP RA2B Q16A PUMT1 NM 10K R19 TP51 C56 1000uF + C7 RSX301L-30 D29 6 5 3 1 - + 6 8 7 5 47k RA3C DIRA 47k RA3A INTC0 47k RA3B TST 47k RA3D NM U6B LM358 7 DIGID1 3 1 2 4 XC9302 EXT/ VOUT VCC GND CE U5 VCC_RS485 3 2 1 5 4 Q22 2 XP162A12A6PR Q20B PUMT1 VCC3V Q21B PUMT1 VCC3V Q21A PUMT1 VCC3V Q20A PUMT1 VCC3V 4.7K R41 NM 3 1 10K R23 J13 DRILL 4.7 mm TP38 10K R14 Q18B PUMH4 5 Vin TP36 P_EN 4.7R R111 Vin U13 Q18A PUMH4 10K R65 VCC_SW TP77 150uF Screwholes 2 2 + C76 XC6202P50 Vout 1 100nF C10 2 TP90 TP42 VCC5V 3 U14 10nF C75 J40 DRILL 4.6 mm J37 DRILL 4.6 mm J38 DRILL 4.6 mm J39 DRILL 4.6 mm Q1A IRF5810 6 VCC9V_MOTOR C62 47uF VCC_AVR5V J23 DRILL 4.7 mm NM 10pF C46 TP37 Q23 XP161A1265PR + VCC_SW RSX301L-30 D28 Steering for display PCB ADC_I RSX301L-30 D31 15uH L1 3 2 3 VCC9V_MOTOR Shorted beneath components R43 NM 0.43R R16 NM R15 D27 BZG03 15V NM RUE185 J5 Batteri plus 1 Pad 1 8 2 4 8 4 4 1 R69 7 2 3 2 1 3 8 4 GND 2 NM TP41 Vin C57 100nF 3 U10 VCC_RS485 Sheet 2 of Project Number 4 LEGO MINDSTORMS NXT Title XC6202P33 Vout 1 R40 1K ADC_I ADC_BATT BATT_PULS P_EN TST INTC0 DIRA DIGID1 1 Hardware A3 Date (YYYY/MM/DD) Page Size Schematic Name LEGO Drafter LEGO Engineer/constructer Date (YYYY/MM/DD) Bleeder resistor 100nF C12 VCC3V ADC_I ADC_BATT BATT_PULS P_EN TST INTC0 DIRA DIGID1 1 220uF + C11 TP40 100nF C14 TP39 TP50 NM=NOT MOUNTED 4 Version I TP78 2 Q1B IRF5810 220uF + C64 VCC_SND 560uF + C13 VCC_AVR5V XC6202P50 Vout 1 GND 3 J4 1 2 3 5 5 4 GND 2 A B C D A B C D 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 D20 1PS226 VCC3V D15 1PS226 10pF 1MEG 4.7K C25 R66 DIGIA1 R75 10pF TP23 C20 4.7K R60 1MEG DIGIA0 47pF C65 1K R53 Q5B PUMT1 5 DIGIAI0 82K NM DIGIAI1 82K R112 VCC_RS485 NM 4.7K R45 2 ADC_A0 R105 1K D8 LL4148 1 RSX301L-30 D30 + C61 220uF TP20 I_ONA IPOWERD IPOWERC IPOWERB IPOWERA POWERMC POWERMB POWERMA D12 1PS226 VCC_AVR5V TP88 R106 1.8R MA0 MA1 MC0 MCIN0 MCIN1 MC1 Q10 SS8550 10 9 8 7 6 14 13 12 11 10 9 8 Q6A PUMH4 LB1930M GND IN3 OUT3 Vs2 OUT4 IN4 Vcont LB1836M Vcc NC NC OUT1 IN1 NC IN2 OUT2 S-GND P-GND U2 VCC IN1 OUT1 Vs1 OUT2 IN2 GND U1 R116 VCC_RS485 1K R56 TP56 10K 39R Q5A PUMT1 R37 R33 VCC9V TP89 1 2 3 4 5 1 2 3 4 5 6 7 VCC_RS485 Q8 BC857B MAIN1 MAIN0 MB1 MBIN1 MBIN0 MB0 VCC9V_MOTOR R18 TP22 GND GND IPOWERA DIGIAI0 DIGIAI1 10K R49 VCC5V MC0 MC1 GND POWERMC TACHOC0 TACHOC1 MotorC MB0 MB1 GND POWERMB TACHOB0 TACHOB1 MotorB MA0 MA1 GND POWERMA TACHOA0 TACHOA1 MotorA VCC3V Modular J7 Modular J3 Modular J2 Modular J1 2 3 TP21 TP80 TP79 1 2 3 4 5 6 D21 1PS226 VCC3V D16 1PS226 47pF 1MEG 4 MAPWM 4.7K 10pF C26 R76 10pF 4.7K R61 1K R59 TP55 10K R38 TP19 TP14 TP11 DIGIBI0 82K NM DIGIBI1 82K R113 VCC_RS485 NM 4.7K TP24 Q6B PUMH4 10K R86 8 VCC3V D13 1PS226 VCC_AVR5V I_ONB 10 VCC3V MotorA INTA0 100nF C40 VCC3V TP5 D IRA ADC_B0 TP6 R46 R117 VCC_RS485 Q7A PUMT1 VCC9V MCPWM MBPWM C21 1K R54 Q7B PUMT1 C66 DIGIB1 R72 TP27 1MEG R68 7 8 5 6 R34 39R DIGIB0 4.7K R26 4.7K R22 4.7k RA1B 4.7k RA1A 4.7k RA1D 4.7k TP26 GND GND IPOWERB DIGIBI0 DIGIBI1 10K R50 VCC3V Modular J8 MCIN1 TP17 VCC5V MCIN0 2 1 MBIN0 MBIN1 4 3 MAIN1 MAIN0 TP18 TP12 TP13 TP9 TP10 RA1C 4 TP25 11 U12E 74HC14 9 U12D 74HC14 1 2 3 4 5 6 D22 1PS226 3 VCC3V D18 1PS226 1MEG R102 DIGIC1 1MEG TP31 47pF C67 4.7K 4.7K 10pF C27 R77 10K 1K R58 DIGICI0 82K NM DIGICI1 82K R114 VCC_RS485 NM R118 4.7K R47 D IRB R39 TP54 2 VCC3V ADC_C0 12 13 U12F 74HC14 1 U12A 74HC14 TP28 Q4B PUMH4 VCC3V MotorB INTB0 VCC_RS485 Q9A PUMT1 R63 10pF C23 1K R55 Q9B PUMT1 39R R35 TP8 TP7 VCC9V D4 1PS226 VCC3V D1 1PS226 VCC3V DIGIC0 R73 TP30 GND GND IPOWERC DIGICI0 DIGICI1 10K R51 VCC5V 100pF C4 TP44 VCC3V Modular J9 1MEG R7 10K R10 100pF C1 TP43 TACHOA1 1MEG R4 10K R1 TACHOA0 3 14 5 1 3 14 7 14 7 100pF C2 D14 1PS226 TP29 100pF C5 TP46 VCC_AVR5V I_ONC 1MEG R8 10K R11 TACHOB1 1MEG R5 10K TP45 TACHOB0 R2 2 TP1 1 2 3 4 5 6 D19 BAT54S VCC3V 1MEG R104 DIGID1 1MEG TP35 47pF C68 D IA 4.7K R62 4.7K 10pF C24 R74 10pF 4 1K DIGIDI0 82K NM 8 7 6 5 100pF C3 D11 1PS226 VCC_AVR5V I_OND Sheet 3 of Project Number 4 1 INTA0 DIGID1 DIGID0 I_OND ADC_D0 DIGIC1 DIGIC0 I_ONC ADC_C0 DIGIB1 DIGIB0 I_ONB ADC_B0 DIGIA1 DIGIA0 I_ONA ADC_A0 P_EN D IA DEA REA DOA MCPWM MCIN0 MCIN1 D IRC INTC0 MBPWM MBIN0 MBIN1 D IRB INTB0 MAPWM MAIN0 MAIN1 D IRA INTA0 DIGID1 DIGID0 I_OND ADC_D0 DIGIC1 DIGIC0 I_ONC ADC_C0 DIGIB1 DIGIB0 I_ONB ADC_B0 DIGIA1 DIGIA0 I_ONA ADC_A0 P_EN DIA DEA REA DOA MCPWM MCIN0 MCIN1 DIRC INTC0 MBPWM MBIN0 MBIN1 DIRB INTB0 MAPWM MAIN0 MAIN1 DIRA Hardware A2 Date (YYYY/MM/DD) Page Size Schematic Name LEGO Drafter LEGO Engineer/constructer Date (YYYY/MM/DD) NM=NOT MOUNTED TP33 D6 1PS226 VCC3V D3 1PS226 VCC3V 1 LEGO MINDSTORMS NXT Title TP32 Q4A PUMH4 DIGIDI0 DIGIDI1 100pF C6 TP48 VCC_RS485 1MEG R9 10K R12 TACHOC1 1MEG R6 10K TP47 TACHOC0 R3 ADC_D0 VCC B A GND ST485 Version I DIGIDI1 82K R115 VCC_RS485 NM R119 4.7K R44 RO RE DE DI 10K R57 3 U12B 74HC14 U3 R36 TP57 TP49 1 2 3 4 VCC3V U12C 74HC14 5 VCC_RS485 Q3A PUMT1 VCC9V C22 1K R52 6 VCC3V MotorC REA DEA D IRC Q3B PUMT1 39R DIGID0 R103 TP34 TP4 R32 R110 10K TP3 10K R87 TP16 BAS85 D24 GND GND IPOWERD DIGIDI0 DIGIDI1 10K R48 VCC3V D17 BAT54S INTC0 VCC3V VCC5V DOA TP15 Modular J6 D5 1PS226 VCC3V D2 1PS226 VCC3V 2 14 7 14 7 14 7 LB1930M 7 LB1836M A B C D A B C D ARM BLOCK VCC9V_MOTOR 5 VCC5V_SW AT91SAM7S 5V LDO SOUND VOLTAGE VCC_AVR5V STEP-DOWN 5V 9V SENSOR MOTORDRIVER BATTERY SUPPLY 9V VCC9V 5 SENSOR PULL-UP SAMBA 4 3 BATT_PULS SOUND 2 BUTTOM 1 - 3 ADC BUTTOM 0 BATT_ADC/SAMBA MCIN1 ADC_I DIGID1_ADC MCIN0 USB_ADC MBIN0 MBPWM MAIN1 MAIN0 MAPWM ION_D ION_C ION_B ION_A ADC_D0 ADC_C0 ADC_B0 ADC_A0 SPI DIR_C ATMEGA48 ATMEGA48 I2C AT91SAM7S MBIN1 AVR BLOCK BLUE TOOTH BTRST VMBT_STATE VMBT_REQ MCPWM AT91SAM7S ARM DISPLAY BT FULL UART 4 WIRE INPUT OUTPUT Version I SPI DEA DISPLAY Sheet 4 of Project Number 4 1 Hardware A2 Date (YYYY/MM/DD) Page Size Schematic Name LEGO Drafter LEGO Engineer/constructer Date (YYYY/MM/DD) RS 485 HS PORT PC_USB 1 LEGO MINDSTORMS NXT Title DOA DIA REA DDP, DDM USB_DP_PULL_UP RXD0 TXD0 DEA REA COMMUNICATION BLOCK 2 DIR_B OUTPUT INPUT ADC_BATT VCC3V 3 DIR_A INTC INTB INTA DIGID1 DIGID0 DIGIC1 DIGIC0 DIGIB1 DIGIB0 DIGIA1 DIGIA0 ATMEGA48 BUTTOM 0 - 3 ON/OFF POWER_EN FROM ATMEGA48(PB7) VCC9V VCC5V CURRENT GENERATOR SENSER VOLTAGE RS485 LDO 3.3V VCC_RS485 POWER BLOCK 4 A B C D A B C D 5 5 VCC5V 0R R6 TP3 TP2 R3 1K R2 2.2K R1 4.7K TP11 SW3 ON/OFF 1 2 SW4 ON/OFF 1 2 SW2 ON/OFF 1 2 SW1 ON/OFF 1 2 4 4 BUTTON0 R4 100K BUTT_ADC TP1 TP4 1 3 5 7 9 J1 2 4 6 8 10 3 10 pin Connector to main PCB VCC5V VCC3V GND GND SOBT 3 TP8 J2 DRILL J3 DRILL J4 DRILL J5 DRILL 2.0 mm 2.0 mm 2.0 mm 2.0 mm TP7 Version A 1uF TP9 C2 1uF TP6 TP5 C1 BUTTON0 BUTT_ADC SIBT SCKBT CSDIS 2 TP10 2 CSDIS RSTDIS SOBT SCKBT SIBT VCC3V 33nF C4 1 2 3 4 5 6 7 8 9 10 11 12 LCD Sheet 1 of Project Number 1 100nF C3 VCC3V Keypad 1 A4 Date (YYYY/MM/DD) Page Size Schematic Name LEGO Drafter LEGO Engineer/constructer Date (YYYY/MM/DD) CS0 RST CD SCK SDA VCC GND VB1+ VB1VB0VB0+ VLCD LCD1 LEGO MINDSTORMS NXT Title 10MEG R5 VCC3V 1 A B C D A B C D R7 10K R9 10K 5 1 3 2 Q4 BC847 D1 Red R1 180R R8 1.8K Q1A PUMT1 4 Q3 SFH309-4 R3 330R 470nF C2 Q2A PUMX1 R5 6.8k Q1B PUMT1 R2 4.7K 3 J2 DRILL 2.3 mm J3 DRILL 2.3 mm R6 560R Q2B PUMX1 Drills for LED fix R4 330k Version F 2 Sheet 1 of Project Number 1 LEGO MINDSTORMS NXT Title 1 2 3 4 5 6 J1 Modular Light sensor A4 Date (YYYY/MM/DD) Page Size Schematic Name LEGO Drafter LEGO Engineer/constructer Date (YYYY/MM/DD) 1 A B C D A B C Rect. in 220K R2 220K R1 5 TP4 4.7K R14 4.7uF C7 C1 220nF VCC/2 2 1 4 - + VCC - + 8.2pF TP5 U1A LM324 1 U2B LM358 7 U2A LM358 220K R20 220K R17 C8 470nF 3 6 5 10K R22 VCC 68nF 1 - + R6 560K C12 2 3 82k TP1 TP2 C4 R16 470K 470K 6 5 2 3 VCC/2 VCC 3 R5 VCC 82K 220nF C3 10uF + C2 R19 4.7K R4 R3 1K R18 100K R15 2 Pad J2 VCC 4 4 11 D VCC 5 8 4 8 4 - + 4 11 U1B LM324 7 10K R10 1 2.2nF C5 560R R21 Q1 BC848B TP3 DIGIAI0 D1 BAV99 3 2 Version C 56K R11 VCC 2 68pF 1 2 3 4 5 6 C6 U1D LM324 14 Sheet 1 of Project Number 1 LEGO MINDSTORMS NXT Title DIGIAI0 DIGIAI1 - + 8 U1C LM324 J1 Modular 560K R12 13 12 100K 18K - + VCC R8 9 10 VCC R7 VCC/2 VCC/2 2 4 11 4 11 100nF U2 cap 100nF U1 cap Sound sensor 1 A4 Date (YYYY/MM/DD) Page Size Schematic Name LEGO Drafter LEGO Engineer/constructer Date (YYYY/MM/DD) C10 VCC DIGIAI1 10nF C11 Rect. in C9 4.7K R13 4.7K R9 1 A B C D A B C D 5 5 BN 1: 2: 3: 4: 5: 6: Cable: White Black Red Green Yellow Blue 1 2 3 4 5 6 4 J1 Modular 4 R1 2.2K 1 SW1 D3C 3 2 3 3 Version A 2 2 Sheet 1 of Project Number 1 LEGO MINDSTORMS NXT Title Touch sensor 1 A4 Date (YYYY/MM/DD) Page Size Schematic Name LEGO Drafter LEGO Engineer/constructer Date (YYYY/MM/DD) 1 A B C D A B C D TP8 100nF C12 VCC 2 1 TP14 5 + P2.1 C16 10uF VCC GND GND VCC_5V DIGIAI0 DIGIAI1 TCT40-12S2 PZ1 1nF C1 5 1 2 3 4 5 6 Q3B PUMH4 R23 10K VCC J1 Modular 4.7K R1 9 7 5 R3 220R C9 U1F 15 CD4049 CD4049 U1E 12 CD4049 U1A 2 C7 10pF PUMH4 Q6B 220R R5 Q1B PUMX1 10K RA1A R24 10K VCC Q3A PUMH4 14 11 3 1 8 C19 100nF R10 100K 4.3V_Power PUMH4 Q6A 10nF U1D 10 4 R4 1MEG CD4049 TCT40-12F2 2 1 U1C 6 CD4049 PZ2 TP13 330K TP12 R11 1.8MEG 100pF C2 TP9 R22 LL4148 D4 3.3MEG R21 CD4049 U1B 4 10K Q1A PUMX1 4.3V_Power C5 220pF R8 47K C6 100pF R2 1MEG 2 7 RA1B 4 P2.0 100pF C3 TP10 R6 TP7 1MEG 3 P3.0/SDA TP12 VCC_5V 10pF C8 3 3 10K RA1C 26 23 24 14 11 22K R9 ESC015 P2.2 P3.1 P3.0 VCC GND U2 220R R7 Q2A PUMX1 6 GND OSCO OSCI RESETB P1.0 P1.1 P1.2 P1.3 VCC P2.0 P2.1 1nF C4 38 37 36 34 33 32 31 30 29 28 27 TP11 C13 10uF P2.0 P2.1 P1.3/SCL RESET P1.0 10K R19 + 4.3V_Power 100R R16 2 2 22pF C15 TP3 Q2B PUMX1 P1.0 RA1D 10K VCC_5V C14 100nF VCC_5V 3.58MHz X1 2 R17 100K R18 1.5MEG 3 1 4 5 Version G TP2 BAV99 D2 VCC_5V Sheet 1 of Project Number 1 LEGO MINDSTORMS NXT Title P3.0/SDA BAV99 D3 82K 82K 47pF C11 4.7K TP6 TP5 1 A3 Date (YYYY/MM/DD) Page Size Ultrasonic sensor Schematic Name LEGO Drafter LEGO Engineer/constructer Date (YYYY/MM/DD) 47pF C10 4.7K R14 R12 R13 R15 VCC_5V VCC_5V P1.3/SCL DIGIAI0 DIGIAI1 VCC_5V 1 A B C D