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 MINDSTORMS NXT

PROYECTO PREVIO A LA OBTENCIÓN DEL TÍTULO DE INGENIERO EN ELECTRÓNICA Y CONTROL

MEDARDO ÁNGEL SILVA AMORES [email protected]

DIRECTORA: Ing. ANA RODAS [email protected]

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 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

CA PÍ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 Calculadora de área y volumen 110 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 Medidor de sonido 115 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 Escorpión 118 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 Programa del vehículo controlado 145 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 Conclusiones 166 xii

Página 5.2 Recomendaciones 167

Refer encias 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 .

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); (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 I 2C (Inter- Integrated 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 I 2C.

- 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 I 2C de Philips Semiconductors.

Nombre Función Color • Pin 1, ANA Entrada analógica y posible blanco señal de salida de corriente • Pin 2, GND Señal de tierra negro • Pin 3, GND Señal de tierra rojo • Pin 4, Fuente de 4,3V verde IPOWERA • Pin 5, Pin de E/S digital conectado amarillo DIGIAI0 al procesador ARM7 (reloj I2C (SCL), RS-485 A) • Pin 6, Pin de E/S digital conectado azul DIGIAI1 al procesador ARM7 (datos I2C (SDA), RS-485 B)

Figura 2.4. Distribución de los pines de los puertos NXT, tomado de [14]

Los puertos equipados con el protocolo I 2C 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 Corriente Consumo (V = 9V) alimentación batería 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) Corrie nte (mA) Potencia (mW) 440 102 169 4000 78 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  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 Descripción 4% - 5% Habitación en silencio 5% - 10% Personas hablando 10% - 30% Conversación normal o música que se reproduce a un volumen “normal” 30% - 100% 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 Figura

1 Disco compacto NXT

3 Cono 1 x 1 32

Cantidad Descripción Figura

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 33

Cantidad Descripción Figura

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

Junta para ejes perpendiculares 3L con 4 13 clavijas

6 Junta para ejes perpendiculares doble 34

Cantidad Descripción Figura Junta para ejes perpendiculares con doble 6 abertura Junta para ejes perpendiculares con dos 6 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

Viga Technic 3 x 3,8 x 7 con doble 6 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 35

Cantidad Descripción Figura

11 Viga Technic 15

Diente Technic Bionicle 1 x 3 con agujero 8 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 Seguro Technic 8 Seguro liso Technic 1/2 4 Conector Technic con agujero para eje 6 Engranaje Technic de 8 dientes Engranaje Technic de 12 dientes, doble 4 bisel

2 Engranaje Technic de 16 dientes

Engranaje Technic de 20 dientes, doble 2 bisel

Engranaje Technic de 36 dientes, doble 1 bisel

1 Engranaje Technic de 40 dientes

4 Rueda de perillasTechnic

10 Brazo Technic en forma de L 2 x 4

Instrucciones para construcciones de 1 Mindstorms NXT 36

Cantidad Descripción Figura

1 Manual rápido de Mindstoms NXT

1 Almohadilla de prueba para Mindstorms

3 Clavija Technic

3 Clavija doble Technic 3L

Junta Technic para clavijas 4 perpendiculares

Junta Technic para clavijas 1 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

Plato Technic con agujero en la base y 1 cubierta negra

2 Rueda Technic

2 Tornillo sinfín Technic 37

Cantidad Descripción Figura

4 Rueda 56 x 26

4 Llanta 30.4 x 20

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 Utilidad Permite tomar Se utiliza el puerto de medidas del ángulo salida C para conectar un Sensor de rotación girado y del sentido de motor. giro

Tabla 2.5. Puertos usados en el medidor de longitudes

Las siguientes imágenes muestran al prototipo armado: 39

Tipo de vista Imagen

Vista frontal

Vista posterior

Vista superior (salidas)

Vista inferior (entradas) 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 Utilidad Permite tomar Puerto de entrada 2 Sensor de sonido 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 Utilidad Permite iniciar el funcionamiento del escorpión y, cuando ha iniciado su Puerto de entrada 1 Sensor de contacto operación, permite saber si el escorpión alcanzó su objetivo al “picar”. Permite iniciar el funcionamiento del escorpión y, cuando Puerto de entrada 2 Sensor de sonido ha iniciado su operación, mide el nivel de sonido existente en el medio. Mide constantemente la distancia a la que Puerto de entrada 4 Sensor de ultrasonido se encuentran los objetos que se encuentran frente a él. Motor que hace que la Puerto de salida A Motor NXT “cola” se mueva para “picar”. Motor izquierdo (con Puerto de salida B Motor NXT el sensor de ultrasonido de frente) Motor derecho (con el Puerto de salida C Motor NXT 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 Imagen

Vista frontal

Vista posterior

Vista superior (pantalla del NXT) 47

Tipo de vista Imagen

Vista inferior

Vista desde la derecha

Vista desde la izquierda

Detalle de las “patas” (1) 48

Tipo de vista Imagen

Detalle de las “patas” (2)

Detalle de las “patas” (3)

Detalle de las “patas” (4)

Detalle de la “cola” (extendida y vista desde arriba) 49

Tipo de vista Imagen

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 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 Utilidad Actúa como un sensor de final de carrera en Puerto de entrada 1 Sensor de contacto uno de los extremos del recorrido posible. Permite reconocer el Puerto de entrada 2 Sensor de luz “color” del objeto a ser movido por el brazo. Motor que abre y Puerto de salida A Motor NXT cierra la “garra” del brazo. Motor que permite Motor NXT y su sensor de Puerto de salida B que el brazo pueda rotación interno subir o bajar. Motor que permite Motor NXT y su sensor de que el brazo pueda Puerto de salida C rotación interno 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 Imagen

Vista frontal (entradas)

Vista posterior (salidas) 54

Tipo de vista Imagen

Vista superior (pantalla del NXT)

Vista desde la derecha

Vista desde la izquierda

Detalle del arreglo que permite el movimiento horizontal (1) 55

Tipo de vista Imagen

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) 56

Tipo de vista Imagen

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) 57

Tipo de vista Imagen

Detalle del sensor de luz (1)

Detalle del sensor de luz (2)

Detalle del “brazo” (1)

Detalle del “brazo” (2) 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 Utilidad Mide de forma permanente la Puerto de entrada 4 Sensor de ultrasonido distancia a la que se encuentra el objeto que está frente a él. Motor que se encuentra a la Puerto de salida A Motor NXT izquierda (sensor de ultrasonido de frente) Motor que se encuentra a la Puerto de salida C Motor NXT derecha (sensor de ultrasonido de frent e)

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 Imagen

Vista frontal (entradas)

Vista posterior (salidas)

Vista superior (pantalla del NXT) 61

Tipo de vista Imagen

Vista inferior

Vista desde la derecha

Vista desde la izquierda

Detalle del sensor de ultrasonido 62

Tipo de vista Imagen

Detalle de la conexión motor- rueda (1)

Detalle de la conexión motor- rueda (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 Utilidad Mide la cantidad de luz que se refleja en el Puerto de entrada 1 Sensor de luz piso dependiendo del camino por el que circula. Motor que se encuentra a la Puerto de salida B Motor NXT izquierda (pantalla de frente) Motor que se encuentra a la Puerto de salida C Motor NXT 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 Imagen

Vista frontal (entradas)

Vista posterior (salidas)

Vista superior (pantalla del NXT) 66

Tipo de vista Imagen

Vista inferior

Vista desde la derecha

Vista desde la izquierda

Detalle del sensor de luz (1) 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 NXT-G ROBOLAB ROBOTC NXC pbLua NXJ Característica Tipo de lenguaje Gráfico Gráfico C Similar a C Lua JAVA $0 (version comercial) $30 vía web Open Open Open Precio $50 $50 $50 – CD Source Source Source (educación) Windows, Windows, Windows, Windows, Plataforma necesaria Windows MAC OSX, Windows MAC OSX MAC OSX MAC OSX Novato a Novato a Novato a Intermedio Intermedio Intermedio Usuario final intermedio intermedio avanzado a avanzado o más o más Instalación con un solo botón Sí Sí Sí Sí No Parcial Facilidad de uso (en escala de 1 a 10 7 8 6 4 4 10, 10 es lo mejor) 130X (la No Velocidad relativa de ejecución 1X 70X 25X 35X más rápida) disponible 72

Lenguaje NXT-G ROBOLAB ROBOTC NXC pbLua NXJ Característica Parcial IDE Sí Sí Sí Sí Vía Eclipse (vía Eclipse) Full Desarrollador en tiempo real No No Parcial No No Featured Capacidad de reproducción de Tonos + Tonos + Tonos + Tonos + Tonos + Tonos sonidos WAV WAV WAV WAV WAV Text o Bá sic o Mejorado ++ Mejorado ++ Bá sic o Mejorado Mejorado Capacidades Gráficos Básico Mejorado Mejorado Básico No Mejorado LCD Ícon os Sí Sí Sí Sí No No Variables Hard Hard Sí Sí Sí Sí Punto flotante No Sí Sí No Sí Sí Funciones Características No Sí Sí No Sí? Sí? trigonométricas del lenguaje Estructura Sí No Sí No No Sí ‘switch’ Arreglos No No Sí Sí Sí Sí Conectividad PC, NXT, PC, NXT, con otros PC, NXT Ninguna PC, NXT NXT, otros GPS, otros GPS, otros dispositivos Conectividad Soporta Bluetooth protocolo Sí No Sí Sí No No Fantom Duplex No Half Full Half Full Full (velocidad) disponible Sistema de manejo de archivos en Sí Sí Sí Sí No No el ladrillo Sistema de programación en el Sí Sí Sí Sí No No ladrillo DATA LOGGING integrado No Sí Sí No No No Compatibilidad con Lego RCX No Sí Sí Parcial 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 velocid ad 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 DESCRIPCIÓN - Ubica un texto en la pantalla LCD en Básico coordenadas específicas. - Controles de formato “Print” para caracteres Mejorado alfanuméricos. - Opcione s múltiples de fuentes de texto. ROBOTC TEXTO y ROBOLAB manejan el tamaño 6x8, como otros sistemas, además del tamaño de fuente 12x16. Mejorado++ - 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 Básico simples en la pantalla LCD. - Funciones para borrar y rellenar rectángulos y GRÁFICOS círculos para dar una capacidad de dibujo Mejorado expandida. - Dibuja óvalos y círculos. - Habilidad de dibujar archivos de íconos en la ÍCONOS pantalla. Tabla 3.3. Capacidades de la pantalla LCD, tomado de [24]

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 NXT- G. 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 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. OTROS Incluye el uso del protocolo de mensajes de Lego “Fantom” para realizar DISPOSITIVOS 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. DUPLEX Esto resulta en un uso ineficiente del enlace BT y en una gran latencia (VELOCIDAD) 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 NXT- G 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 e Xactly 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 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__ __RETVAL__ __STRRETVAL__ __TMPBYTE__ __TMPWORD__ __TMPLONG__ abs asm bool break byte case char const continue default do else false for goto if inline int long mutex priority repeat return safecall short sign start stop string struct sub switch task true typedef unsigned until void while

3.3.2.1 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 Información Bool 8 bits sin signo byte, unsigned char 8 bit s sin signo Char 8 bit s con signo unsigned int 16 bits sin signo short, int 16 bits con signo unsigned long 32 bits sin signo Long 32 bits con signo Mutex Tipo especial usado en acceso a código exclusivo 95

String Arreglo de bytes Struct Tipos de estructuras definidas por el usuario Arrays 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 Descripción abs() Valor absoluto sign() 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) l OR (a nivel de b its) && AND lógico ll 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 Significado Tru e Siempre verdadero False Siempre falso Expr Verdadero si expr es distinto de cero expr1 == expr2 Verdadero si expr1 y expr2 son iguales expr1 != expr2 Verdadero si expr1 y expr2 no son iguales expr1 < ex pr2 Verdadero si expr1 es menor que expr2 expr1 <= expr2 Verdadero si expr1 es menor o igual que expr2 expr1 > expr2 Verdadero si expr1 es mayor que expr2 expr1 >= expr2 Verdadero si expr1 es mayor o igual que expr2 ! condition Negación lógica de una c ondición cond1 && cond2 AND lógico entre dos condiciones cond1 ll cond2 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 I 2C ( 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 I 2C (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: 2πR x = ⋅α 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: 32,4 π - Rueda 43,2x22 : x = ⋅α[]cm ≈ ,0 0376991118 ⋅α []cm 360 o 32,4 π 2 2 x = ⋅α [cm ] ≈ ⋅α [cm ] ≈ ⋅α [cm ] 360 o 05,53 53 6,5 π - Rueda 56x26 : x = ⋅α[]cm ≈ ,0 0488692191 ⋅α []cm 360 o 6,5 π 2 2 x = ⋅α [cm ] ≈ ⋅α [cm ] ≈ ⋅α [cm ] 360 o 93,40 41 16,8 π - Rueda 81,6x15 : x = ⋅α[]cm ≈ ,0 0712094335 ⋅α []cm 360 o 16,8 π 1 1 x = ⋅α [cm ] ≈ ⋅α [cm ] ≈ ⋅α [cm ] 360 o 04,14 14 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:

valor _ calculado − valor _ real error = ⋅100 valor _ real

Rueda Valor real Valor calculado Error 32,4 π 2α 43,2x22 x = ⋅α x = 0,097% 360 o 53 6,5 π 2α 56x26 x = ⋅α x = -0,182% 360 o 41 107

Rueda Valor real Valor calculado Error 16,8 π 2α 81,6x15 x = ⋅α x = 0,308% 360 o 28 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 Tipo Comentario Longitud Número Almacena la longitud calculada Rueda Número Almacena el factor dependiente del tipo de rueda usado Flag Lógica Variable auxiliar Tipo_rueda Texto 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. 109

Fig 3.38. Programa NXT-G del medidor de longitudes 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 Tipo Comentario Longitud Número Almacena la longitud calcu lada Ancho Número Almacena el ancho calculado Profundidad Número Almacena la profundidad calculada Rueda Número Almacena el factor dependiente del tipo de rueda usado Flag Lógica Variable auxiliar Tipo_rueda Texto 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 cm 3) por lo que el volumen máximo a calcular será de 99 999 999cm 3; es decir, aproximadamente 100m 3. Este límite será suficiente para la gran mayoría de aplicaciones, pero es necesario tenerlo en cuenta. 113

114

Figura 3.40. Programa en NXT-G de la calculadora de áreas y volúmenes 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; // Distancia límite para la acción de picar (6 cm) int RETROCEDER = 30 ; // Distancia límite para retroceder (30 cm) int AUX = 0; // Variable auxiliar mutex control; // Variable que permite adquirir el control de los motores task pica_sonido(){ // Tarea que hace picar cuando el sonido supera el 75% if (SENSOR_2 > 75 ){ 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 } } task main(){ SetSensorLowspeed (IN_4 ); // Sensor de ultrasonido ubicado en puerto 4 SetSensorTouch (IN_1 ); // Sensor de contacto ubicado en puerto 1 SetSensorSound (IN_2 ); // 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); // Muestra el valor final de PICAR Wait (500 );

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

StartTask(pica_sonido); // 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 ); if (SensorUS (IN_4 ) < PICAR) // Si la distancia en menor que 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 } } } }

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 LIM_IZQ = 0; // Límite izquierdo (NXT de frente) int LIM_DER = 0; // Límite derecho (NXT de frente) int LIM_SUP = 0; // Límite superior int LIM_INF = 0; // Límite inferior int POS_MEDIA = 0; // Posición media (bola de COLOR1) int COLOR1 = 0; // Medida del sensor de luz para el COLOR1 int COLOR2 = 0; // Medida del sensor de luz para el COLOR2 int AUX = 0; // Variable auxiliar sub garra( int pot){ OnFwd (OUT_A ,pot); // Apertura de la "garra" Wait (250 ); Off (OUT_A );} 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

sub avanzar( int posicion){ // Subrutina que avanza al brazo hasta la posición // final until (MotorRotationCount (OUT_C )>=posicion) OnFwd (OUT_C ,100 ); Off (OUT_C );}

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 if (AUX== 1){ // avanza a la posición final avanzar(POS_MEDIA);} else { avanzar(LIM_DER);} bajar(); // baja el brazo Wait (500 ); garra( 100 ); // abre la garra (abandona la bola) 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=K p10 ):

pOut = error  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=K i10 ); una vez alcanzado el valor referencial se resetea el valor de la suma para poder inicial una nueva corrección:

iOut = sumError  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=K d10 ): 132

dOut = (error-prevError)  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

CÁLCULO DE LAS ACCIONES P, I, D RESETEO DEL ERROR NORMALIZACIÓN DE LA SALIDA ACUMULADO ACCIONAMIENTO DE LOS MOTORES

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){ int min = 20 ; // variable que almacena el mínimo valor de la potencia if (abs (potencia)> 100 ) return 100 ; else if (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() // INICIO DE LA TAREA PRINCIPAL { SetSensorLowspeed (IN_4 ); // Sensor de ultrasonido en el puerto 4

// Valores predefinidos

int tolerancia = 3; // Toleracia permitida para el proceso int P = 30 ; // Constante de ganancia proporcional int I = 0; // Constante integral int D = 0; // Constante 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 );

int scale = 10 ; // 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.

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; // Error actual en la posición int prevError= 0; // Error del lazo anterior int sumError= 0; // Suma de errores usada en el término integral

int pOut= 0; // Potencia de salida para los términos proporcional, int iOut= 0; // integral y int dOut= 0; // derivativo

int totalOut= 0; // Suma de los tres términos individuales

int contador= 0; // variable auxiliar para generar el gráfico (eje X) int altura= 0; // 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

if (contador == 101 ){ // Generación del gráfico en pantalla. LineOut (0,32 ,100 ,32 ,true ); // La separación horizontal entre dos contador = 0; // puntos es mayor que 150ms. 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; // Genera la salida proporcional sumError += error; // Añade el error actual a la suma iOut = sumError*I; // Calcula la salida integral dOut = (error-prevError)*D; // 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

if (abs (error)>tolerancia) // Chequea si la posición actual está fuera // del margen de tolerancia move(error, totalOut); // Enciende los motores else sumError= 0; // Resetea la suma cuando se ha conseguido el // resultado deseado

Wait (loopTime); // Da un tiempo para el movimiento (150ms)

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  P

iOut = sumError  I

dOut = (error-prevError)  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 mid= 0; // Variable que determina la medida media a mantener int min= 1000 ; // Mínimo valor medido por el sensor de luz int max= 0; // Máximo valor medido por el sensor de luz int scale= 10 ; // Factor de escalamiento de las constantes P, I y D int potencia= 50 ; // Potencia media que actúa sobre los motores 140

int intensidad= 0; // Intensidad de luz medida en todo momento por el sensor int correccion= 0; // 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 ); // Se inicia un barrido en el mismo lugar para captar las OnFwd (OUT_B ,15 ); // 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; // Error actual en la intensidad int prevError= 0; // Error del lazo anterior int sumError= 0; // Suma de errores usada en el término integral

int P= 50 ; // Constante proporcional int D= 15 ; // Constante derivativa int I= 0; // Constante integral

int pOut= 0; // Potencia de salida para los términos proporcional, int iOut= 0; // integral y int dOut= 0; // derivativo

// Tarea principal que calcula la corrección

while (true ){ prevError = error; // Almacena el error previo (lazo anterior) intensidad = SENSOR_1 ; // Lee la distancia a través del sensor de US

error = mid-intensidad; // Calcula el error actual pOut = error*P; // Genera la salida proporcional sumError += error; // Añade el error actual a la suma iOut = sumError*I; // Calcula la salida integral dOut = (error-prevError)*D; // Calcula la salida derivativa

correccion = (pOut+iOut+dOut)/scale; // Suma los tres términos juntos y // divide el total entre el valor del // factor de escalamiento utilizado. if (correccion> 50 ) correccion= 50 ; // Valores extremos de la corrección if (correccion<- 50 )correccion=- 50 ; // Valores extremos de la corrección

OnRev (OUT_C ,potencia-correccion); // Aplicación de la corrección a la OnRev (OUT_B ,potencia+correccion); // 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 Acc ión Botón izquierdo El auto gira a la izquierda Botón naranja El auto se detiene completamente y reproduce un tono musical Botón derecho El auto gira a la derecha Ningún botón 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 Tipo Comentario BotPres Número Variable auxiliar que almacena temporalmente el valor que corresponde al botón presionado. Boton Número Almacena un valor de acuerdo al botón presionado. Velocidad Número Almacena la velocidad deseada (-100 ≤ v ≤ +100)

Tabla 3.14. Variables usadas en el programa del controlador

Botón presionado Valor de la variable “Boton” Botón izquierdo 1 Botón naranja 2 Botón derecho 3 Ningún botón 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: velocidad Longitud _ barra = 2 y su posición horizontal va desde el píxel 50 hasta el píxel que se puede calcular mediante la fórmula: velocidad pixel _ final = 50 + . 2

3.4.6.1.1 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 ) 144

3.4.6.1.2 Código NXT-G del controlador (mando)

Figura 3.49. Programa NXT-G del controlador remoto (mando) 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 Tipo Comentario Boton Número Almacena un valor de acuerdo al botón presiona do. Velocidad Número Almacena la velocidad deseada (-100 ≤ v ≤ +100) Potencia Número Almacena la potencia que se imprimirá a los motores y se encuentra entre 0 y 100. Direccion Lógica 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 147

3.4.6.2.2 Código NXT-G del vehículo controlado

Figura 3.51. Programa NXT-G del auto controlado remotamente 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 Valor “real” Valor medido Error relativo 43,2x22 115cm 109cm -5,22% 56x26 115cm 117c m 1,74% 81,6x15 115cm 113cm -1,74% 43,2x22 200cm 198cm -1,00% 56x26 200cm 207cm 3,50% 81,6x15 200cm 197cm -1,50% 43,2x22 37,5cm 37cm -1,33% 56x26 37,5cm 38cm 1,33% 81,6x15 37,5cm 36cm -4,00% 43,2x22 2,6cm 2cm -23,08% 56x26 2,6cm 3cm 15,38% 81,6x15 2,6cm 2cm -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 Valor “real” Valor medido Error 115cm  109cm   43,2x22 -7,11%       115cm  116cm  56x26 2,38%      115cm  113cm   81,6x15 -3,21%      12cm  11cm  43,2x22 -16,67%       12cm  12cm  56x26 -1,52%        12cm  12cm  81,6x15 -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 Valor “real” Valor medido Error 115cm   109cm    43,2x22 -25,69%      115cm   116cm   56x26 2,38%      115cm   113cm    81,6x15 -3,21%      12cm  11cm  43,2x22 -21,62%        152

Rueda Valor “real” Valor medido Error 12cm  12cm   56x26 -7,37%       12cm  12cm  81,6x15 -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 Respuest a Comentarios (amplificadas por 10) (tiempo de pantalla = 19s)

P = 50 Existe una oscilación I = 0 grande antes de llegar a D = 0 un resultado dentro del Tolerancia = 10 margen de tolerancia.

Existe una oscilación grande antes de llegar a un resultado dentro del P = 50 margen de tolerancia, el I = 0 mismo que no es D = 0 cumplido y el vehículo Tolerancia = 0 intenta todo el tiempo llegar a él, pero la potencia es muy baja para vencer la inercia.

La oscilación es menor que la que se veía P = 50 anteriormente y se llega I = 10 más rápidamente al punto D = 0 de referencia, dentro del Tolerancia = 10 margen de tolerancia ingresado.

A diferencia del caso P = 50 anterior (tolerancia=0), el I = 10 controlador permite D = 0 acercarse más fácilmente Tolerancia = 0 al nivel de referencia. 160

Constantes Respuest a Comentarios (amplificadas por 10) (tiempo de pantalla = 19s)

La respuesta esperada, P = 50 con el margen de I = 15 tolerancia indicado, se D = 10 consigue mucho más Tolerancia = 10 rápidamente.

P = 50 Se llega prácticamente a I = 15 conseguir el nivel de D = 10 referencia de forma Tolerancia = 0 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

El vehículo sigue la línea P = 30 negra, sobre su borde, I = 0 mayoritariamente sobre la D = 0 región clara de la lámina.

El vehículo sigue la línea negra, sobre su borde, P = 40 mayoritariamente sobre la I = 0 región clara de la lámina D = 0 aunque la corrección del error es más rápida que antes.

El vehículo sigue de forma P = 50 más aproximada la línea I = 1 negra, oscilando alrededor de D = 0 ella.

Con estos valores de P = 80 parámetros, el vehículo I = 1 completó sin mayor problema D = 10 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.cea- ifac.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() // INICIO DE LA TAREA PRINCIPAL { SetSensorLowspeed (IN_4 ); // Sensor de ultrasonido en el puerto 4

// Valores predefinidos

int tolerancia = 4; // Tolerancia permitida para el proceso int P = 10 ; // Constante de ganancia proporcional int I = 90 ; // Constante integral int D = 400 ; // 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; // Error actual en la posición int prevError= 0; // Error del lazo anterior int sumError= 0; // Suma de errores usada en el término integral

int pOut= 0; // Potencia de salida para los términos proporcional, int iOut= 0; // integral y int dOut= 0; // 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; // Almacena el error previo (lazo anterior) distancia = SensorUS (IN_4 ); // Lee la distancia a través del sensor de US

error = distancia-setPoint; // Calcula el error actual

dt = CurrentTick ()-to; // Cálculo del tiempo del último lazo to = CurrentTick ();

pOut = error*P; // Genera la salida proporcional

sumError += error*dt; // Añade el error actual a la suma A.12

iOut = sumError*I; // Calcula la salida integral

dOut = D*(error-prevError)/dt; // Calcula la salida derivativa

totalOut = (pOut+iOut/(scale*scale)+dOut)/scale; // Salida total

if (totalOut > 250 ) totalOut= 250 ; else if (totalOut < - 250 ) totalOut=- 250 ;

if (abs (error)>tolerancia) // Chequea si la posición actual está fuera // del margen de tolerancia RotateMotor (OUT_A ,100 ,totalOut); else sumError= 0; // Resetea la suma cuando se ha conseguido el // resultado deseado } }

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)

o 2 ⋅π ⋅ 75,3 mm 360° 360°·5 = 1800° 1800 ⋅ = 117 8, mm 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°.

o 360 o ⋅ 40 mm = 2,122 117 8, mm 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 5 4 3 2 1

VCC3V VCC9V DDP DOA DOA XIN DDM J10 R78 D23 X1 TP66 USB_ADC REA C32 R79 VCC1.8V REA TCK 1 Pad 15K SM4002 DEA 18.432MHz CSBT DEA R94 NM C30 C31 10nF 1.5K TMS R91 R80 DIA JTAGSEL 10K C28 DIA 22pF 22pF VCC1.8V TDO 22K C29 100nF 10K 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 INTA0 INTA0 U7 D 1nF J12 D DIRA R81

DIRA TCK DDP TMS TDO GND

DDM 1 VCC3V PA31 TP67 DDM XOUT PLLRC

ERASE 2 VCC_IO JTAGSEL VCC_PLL 3 INTB0 INTB0 27R VCC_CORE

XIN/PGMCK 4

VCC_FLASH INTC0 C33 1 ADVREF PA0/PGMEN0 48 DIRB DIRB 2 47 DIRA USB USB_ADC GND PA1/PGMEN1 33pF 3 AD4 GND 46 ADC_I 4 45 VCC3V R82 VMBT_STATE AD5 VCC_IO DIGID1 TP68 DDP 5 AD6 PA2 44 DIGID1 6 43 AVRSDA MAIN1 AD7 PA3 DIGID0 27R MAIN1 7 VCC_IN PA30 42 VCC1.8V 8 41 DIGIC0 C34 C35 MAIN0 SOUND_ARMA VCC_OUT PA29 TST TP65 R83 MAIN0 9 PA17/PGMD5/AD0 TST 40 DIGIA1 10 39 NRST 15pF 15pF MAPWM C36 C37 C38 C39 RXBT PA18/PGMD6/AD1 NRST DIGIB0 1.5K MAPWM 11 PA21/PGMD9 PA28 38 VCC1.8V 12 37 VMBT_REQ VCC3V 100nF 4.7uF 2.2uF 470pF DIGIB1 VCC_CORE PA27/PGMD15 AVRSCL R109 13 PA19/PGMD7/AD2 PA4/PGMNCMD 36 TXBT 14 35 DOA MBIN1 DIGIA0 PA22/PGMS10 PA5/PGMRDY DIA 10K TP64 MBIN1 15 PA23/PGMD11 PA6/PGMNOE 34 2 3 DIGIC1 16 33 TDI Q15 MBIN0 4.7 and 2.2 must be X7R PA20/PGMD8/AD3 TDI BC857B MBIN0 100 nF and 470 pF must be NP0 R84 MBPWM 1 MBPWM TP61 VCC3V VCC3V 10K 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 R85 INTC0 INTC0 VCC3V VCC3V VCC3V AT91SAM7S256 USB_DP VCC5V

VCC1.8V 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 4 4 C DIRC DIRC DEA REA U15B U15A 10K C VCC3V DIRC RTS@BT CTS@ARM 7 J Q 9 14 J Q 12 MCIN1 C41 C42 C43 C44 C45 USB_DP DIRB 10 8 3 13

MCIN1 VCC VCC INTA0 CSDIS K Q K Q MCIN0 100nF 100nF 100nF 100nF 100nF SCKBT RSTBT TXBT MCIN0 5 1 SIBT SOBT CLK CLK R92 R93 MCPWM RTSBT INTB0 6 2 TP81 2.2K 2.2K

MCPWM GND GND VCC1.8V CTS@ARM CLR CLR 74HC73 74HC73 11 11 ADC_A0 ADC_A0 J15 AVRRESET AVRSCL VCC5V BUTTON0 I_ONB AVRSDA 1 2 TP69 I_ONA I_ONA VCC3V BUTT_ADC TP70 VCC3V I_ONA BUTT_ADC GND 3 4 SIBT Must be one pack or single, BATT_PULS ADC_BATT 5 6 Not mounted on the final version DIGIA0 DIGIA0 GND SCKBT SOBT 7 8 CSDIS

TP62 TP71 32 31 30 29 28 27 26 25 DIGIA1 9 10 U8 ATmega48/V VCC_AVR5V VCC_AVR5V 8 DIGIA1 5 6 7 10 pin ARM JTAG interface Connector to LCD and button PCB R89 R90 RA4D RA4C RA4B RA4A VCC3V2 1 VCC3V 10K 10K 10K 10K 10K 10K GND 10k PULL UP ADC_B0 ADC_B0 J19 4 3 C48 C55 RSTBT GND GND 6 5 TDI 1 1 2 GND TMS 4 3 2 I_ONB I_ONB MISOBT CSBT 8 7 TCK TP84 J17 100nF 100nF RTS@BT 3 4 TXBT GND 10 9 TP83 TCK 5 6 GND 12 11 TCK 1 DIGIB0 DIGIB0 RTSBT RXBT TP82 TMS 7 8 GND 14 13 TDO 2 SIBT SCKBT TDO (TXD/PCINT17) PD1 TP85 (RXD/PCINT16) PD0 PD2 (INT0/PCINT18) PD2 DIGIB1 VMBT_STATE 9 10 VMBT_REQ GND 16 15 TP86 NRST 3 (ADC3/PCINT11) PC3 (ADC2/PCINT10) PC2 DIGIB1 (RESET/PCINT14) PC6 GND 11 12 GND 18 17 N.C. TDI 4

13 20 19 5 (ADC5/SCL/PCINT13) PC5 VCC3V GND N.C. GND BUTTON0 1 (ADC4/SDA/PCINT12) PC4 24 ADC_C0 B 15 PU10K 6 P_EN PD3 (PCINT19/OC2B/INT1) PC1 (ADC1/PCINT9) ADC_B0 B 7 2 PD4 (PCINT20/XCK/T0) PC0 (ADC0/PCINT8) 23 ADC_C0 ADC_C0 16 Pad VCC3V 3 22 ADC_A0 Blue Tooth PCB to PCB connector 8 VCC_AVR5V GND ADC7 9 4 VCC GND 21 I_ONC I_ONC 5 20 10 GND AREF ADC_D0 6 VCC ADC6 19 DIGIC0 R17 2 1 NRST Small connector 10 pin MCIN1 VCC_AVR5V DIGIC0 7 PB6 (PCINT6/XTAL1/TOSC1) AVCC 18 single row, 1,27 pitch MCIN0 8 17 AVRSCK C77 DIGIC1 VCC3V PB7 (PCINT7/XTAL2/TOSC2) PB5 (SCK/PCINT5) I_OND DIGIC1 0R NM 100nF VCC3V VMBT_STATE VCC3V 4 ADC_D0 ADC_D0 R30 U4A MISOBT SOBT 14 12 4 J Q I_OND I_OND U4B 3 13 RTS@BT CTS@ARM R31 10K K VCC Q C58 7 J Q 9 DIGID0 DIGID0 10 8 1 K VCC Q 10K CLK 100nF ADC_A0 DIGID1 TXBT 5 2 ADC_B0

DIGID1 GND (PCINT21/OC0B/T1) PD5 (PCINT22/OC0A/AIN0) PD6 (PCINT23/AIN1) PD7 (PCINT0/CLKO/ICP1) PB0 (PCINT1/OC1A) PB1 (PCINT2/SS/OC1B) PB2 (PCINT3/OC2A/MOSI) PB3 (PCINT4/MISO) PB4 CLK VCC3V CLR ADC_C0 6 74HC73 ADC_D0 9

CLR GND 11 10 11 12 13 14 15 16 74HC73 MCPWM AVRSO

11 VCC_SND MBIN0 I_ONC C69 C70 C71 C72 BATT_PULS Speaker R42 MBIN1 AVRSI BATT_PULS J20 U9 SPY0030A TP60 TP59 MAIN0 MAIN1 47pF 47pF 47pF 47pF P_EN 1MEG MBPWM MAPWM P_EN 2 1 SPN VCC 8 2 7 BATT_PULS 1 SPP CE R97 C51 R98 R99 Small connector 3 6 AVR JTAG interface ADC_I 2 Pad GND VREF SOUND_ARMA TP58 single row, 1,27 pitch A ADC_I 4 5 A INN ACIN NM=NOT MOUNTED ADC_BATT VCC_SND 15K 1uF 10K 10K AVRSCK 1 2 GND J16 ADC_BATT AVRSO VCC_AVR5V 3 4 GND Title Engineer/constructer Date (YYYY/MM/DD) C52 C53 C54 R25 N.C. AVRRESET VCC_AVR5V 1 LEGO N.C. 5 6 N.C. 2 LEGO 7 8 AVRSCK GND MINDSTORMS NXT TST C49 100nF 3.3nF 2.2nF 1MEG AVRSI 9 10 AVRSO 3 Drafter Date (YYYY/MM/DD) TST 4 AVRSI LEGO 100nF AVRRESET 5 Project Number 6 Schematic Name 7 8 Hardware

8 pin Version Sheet Page Size I 1 o f 4 A3 5 4 3 2 1 5 4 3 2 1

TP39 VCC9V_MOTOR VCC9V TP87 VCC_SW TP90 VCC_AVR5V R69 J4 D29 Q22 L1 D28 R111 3 2 XP162A12A6PR 15uH 1 Pad RSX301L-30 RSX301L-30 4.7R RUE185 2

1 NM R67 Q23 1 XP161A1265PR U13 XC6202P50 470R 2 1 U5 3 Vin Vout D 3 4 D

EXT/ VOUT GND 2 VCC 1 5 NM 3 Batteri GND CE plus D27 + C7 + C8 + C59 C74 C60 XC9302 D31 + C62 C75 + C76 + C13 C14 BZG03 15V 10uF 47uF 1000uF 1000uF 10nF 470nF RSX301L-30 10nF 150uF 560uF 100nF

J5 R15 R29 0R 1 Pad 0.43R R13 0R R13, R20, R29 N.M. Batteri NM VCC9V_MOTOR TP77 VCC_SND TP50 minus R20 0R MUST BE SHORTED R16 WITH SOLDER U14 XC6202P50 3 Vin Vout 1 0.43R NM GND + C64

Shorted beneathR43 components VCC_RS485 2 220uF TP51 VCC_RS485 DIGID1 DIGID1 0.43R TP52 TP53 NM DIRA DIRA

R64 R19 8 INTC0

8 INTC0 R21 3 + NM R41 TST 1 5 + TST C 0.43R 10K 2 - 7 ADC_I TP37 C NM NM U6A 220K 6 - LM358 U6B 4.7K

4 NM R27 C15 LM358 P_EN NM 4 P_EN NM R23 C46 10K 470nF BATT_PULS BATT_PULS NM NM 10K 10pF R24 R28 ADC_BATT NM ADC_BATT

ADC_I ADC_I 10K NM 330K C56 NM

1nF NM

VCC3V

VCC_AVR5V TP41 VCC_AVR5V VCC5V VCC_SW Q1B VCC_RS485 VCC3V RA3D TP40 IRF5810 5 4 Q20A U10 XC6202P33 TP73 PUMT1 5 6 TP42 2 4 3 1 B VCC9V_MOTOR Vin Vout B

2 1 47k

Q16A TST Q1A C10 GND PUMT1 SW1 R14 1 IRF5810 R65 3 + C11 C12 R40 100nF C57 2 1K Tactile VCC3V 10K 10K 100nF 220uF 100nF 1 RA2A R95 VCC5V 4 3 TP2 RA3B 120K 220K 7 2 Q21A 8 Bleeder D7 PUMT1 TP74 TP72 ADC_BATT Q16B Q18B P_EN Q18A resistor 47k TP38 PUMH4 PUMH4 TP PUMT1 TP78 BAS85 INTC0 7 RA2B VCC3V TP36

120K 2 RA3A TP75 TP63 TP SAMBA 8 1 Q21B PUMT1 SW2 1 5 47k RA2C 3 RA2D C50 R96 R100 DIRA TP76 BATT_PULS 6 3 1 Q17 6.8K A BC848B 120K 100pF 390K NM=NOT MOUNTED A 120K ON/OFF VCC3V 2 2 4 J23 J40 DRILL 4.7 mm DRILL 4.6 mm Title LEGO Engineer/constructer Date (YYYY/MM/DD) J37 RA3C MINDSTORMS NXT LEGO Rechargeble DRILL 4.6 mm Drafter Date (YYYY/MM/DD) Battery 6 3 Q20B J38 PUMT1 DRILL 4.6 mm LEGO detect J13 J39 Project Number 47k DRILL 4.7 mm DRILL 4.6 mm Schematic Name DIGID1 Hardware

Page Size Steering for display PCB Screwholes Version Sheet I 2 o f 4 A3 5 4 3 2 1 5 4 3 2 1

MotorA TACHOA0 TACHOB0 TACHOC0 INTA0 INTA0 J1 VCC3V VCC3V VCC3V VCC9V_MOTOR MA0 VCC3V VCC3V DIRA DIRA 1 MA1 VCC3V 2 GND RA1C R1 R2 R3 MAIN1 3 MAIN1 POWERMA TP10 MAIN0 3 6 MAPWM TP11 TP43 TP45 TP47 4 TACHOA0 U12D 10K U12A 10K U12C 10K MAIN0

14 14 14 MAIN0 5 TACHOA1 U1 LB1836M 4.7k 74HC14 74HC14 74HC14 6 1 14 R87 MAPWM LB1836M MAPWM Modular MBIN0 VCC GND MCIN1 TP5 INTA0 D1 TP7 INTB0 D2 TP15 INTC0 D3 2 IN1 IN3 13 8 9 2 1 6 5 MotorB MB0 3 12 MC1 RA1D 1PS226 1PS226 1PS226 OUT1 OUT3 TP9 MAIN1 10K 4 Vs1 Vs2 11 4 5 J2 MB1 5 10 MC0 INTB0 7 7 7 INTB0 MB0 MBIN1 OUT2 OUT4 MCIN0 4.7k R4 C1 R5 C2 R6 C3 1 6 IN2 IN4 9 MB1 7 8 DIRB DIRB 2 GND GND Vcont 1MEG 100pF 1MEG 100pF 1MEG 100pF 3 POWERMB RA1A MBIN1 D 4 MBIN1 D TACHOB0 TP13 MBIN0 1 8 MBPWM TP14 5 TACHOB1 MBIN0 MBIN0 6 U2 LB1930M 4.7k

Modular MotorC LB1930M VCC3V MBPWM MBPWM 1 Vcc NC 10 2 9 MA1 RA1B J3 MAIN1 NC OUT1 TP12 MBIN1 MotorA 3 IN1 NC 8 2 7 MotorB MotorC MC0 MAIN0 4 7 MA0 C40 INTC0 INTC0 1 MC1 IN2 OUT2 4.7k 2 5 S-GND P-GND 6 GND 100nF TACHOA1 TACHOB1 TACHOC1 D IRC DIRC 3 POWERMC R22 VCC3V 4 TACHOC0 TP18 MCIN0 MCPWM TP19 VCC3V VCC3V VCC3V VCC3V VCC3V MCIN1 MCIN1 5 TACHOC1 6 4.7K R10 R11 R12 MCIN0 MCIN0 Modular TP44 TP46 TP48 U12E 10K U12F 10K U12B 10K MCPWM

14 14 14 MCPWM VCC_RS485 R26 74HC14 74HC14 74HC14 TP17 MCIN1 R86 D30 TP6 DIRA 10 11 D4 TP8 DIRB 12 13 D5 TP16 D IRC 4 3 D6 4.7K 1PS226 1PS226 1PS226 10K RSX301L-30 7 R7 C4 7 R8 C5 7 R9 C6 R106 1.8R 1MEG 100pF 1MEG 100pF 1MEG 100pF 2

Q8 1 TP88 BC857B 3

D8 LL4148 VCC3V 1

TP89 2 Q10 C SS8550 C 3 D24 DOA DOA POWERMA TP79 TP49 BAS85 VCC_RS485 REA REA POWERMB R105 R110 U3 ST485 DEA DEA 1K + C61 POWERMC TP1 DOA 1 8 220uF REA RO VCC DIGIDI0 DIA 2 7 DIA IPOWERA 10K TP3 DEA RE B DIGIDI1 3 DE A 6 4 5 IPOWERB TP4 DIA DI GND

IPOWERC

IPOWERD TP80

VCC9V VCC9V VCC9V VCC9V

P_EN P_EN R33 R37 R34 R38 R35 R39 R32 R36 39R 39R 10K 10K 39R 10K 39R 10K

Q6A I_ONA TP21 Q6B I_ONB TP25 Q4B I_ONC TP29 VCC5V Q4A I_OND TP33 VCC5V Q5A PUMH4 VCC5V Q7A PUMH4 VCC5V Q9A PUMH4 Q3A PUMH4 PUMT1 PUMT1 PUMT1 PUMT1 R45 VCC_AVR5V R46 VCC_AVR5V R47 VCC_AVR5V R44 VCC_AVR5V Q5B Q7B Q9B R48 Q3B R49 PUMT1 R50 PUMT1 R51 PUMT1 PUMT1 4.7K 4.7K 4.7K 10K 4.7K 10K 10K 10K R52 J7 R53 TP56 J8 R54 TP55 J9 R55 TP54 J6 TP57 D12 D13 D14 D11 1 GND 1PS226 1 GND 1PS226 1 GND 1PS226 1 GND 1PS226 B 2 GND 1K 2 GND 1K 2 GND 1K 2 GND B 3 IPOWERA R56 3 IPOWERB R59 3 IPOWERC R58 3 IPOWERD 1K R57 4 4 4 4 DIGIAI0 ADC_A0 TP20 DIGIBI0 ADC_B0 TP24 DIGICI0 ADC_C0 TP28 DIGIDI0 ADC_D0 TP32 ADC_A0 ADC_A0 5 DIGIAI1 5 DIGIBI1 5 DIGICI1 5 DIGIDI1 6 6 6 6 1K 1K 1K 1K I_ONA I_ONA Modular C65 Modular C66 Modular C67 Modular C68 DIGIA0 DIGIA0 47pF 47pF 47pF 47pF DIGIA1 DIGIA1

VCC_RS485 VCC_RS485 VCC_RS485 VCC_RS485 ADC_B0 ADC_B0

VCC3V VCC3V VCC3V VCC3V I_ONB I_ONB

R116 R117 R118 R119 DIGIB0 DIGIB0 TP22 NM TP26 NM TP30 NM TP34 NM 82K 82K 82K 82K DIGIB1 DIGIB1 R60 R61 R63 R62 D15 DIGIA0 DIGIAI0 D16 DIGIB0 DIGIBI0 D18 DIGIC0 DIGICI0 D17 DIGID0 DIGIDI0 1PS226 1PS226 1PS226 BAT54S 4.7K 4.7K 4.7K 4.7K ADC_C0 ADC_C0

R18 C20 R68 C21 R73 C23 R103 C22 I_ONC I_ONC

1MEG 10pF 1MEG 10pF 1MEG 10pF 1MEG 10pF DIGIC0 DIGIC0 DIGIC1 DIGIC1

VCC_RS485 VCC_RS485 VCC_RS485 VCC_RS485 ADC_D0 ADC_D0

VCC3V VCC3V VCC3V VCC3V I_OND I_OND

R112 R113 R114 R115 DIGID0 DIGID0 TP23 NM TP27 NM TP31 NM TP35 NM A 82K 82K 82K 82K DIGID1 A DIGID1 R75 R76 R77 R74 D20 DIGIA1 DIGIAI1 D21 DIGIB1 DIGIBI1 D22 DIGIC1 DIGICI1 D19 DIGID1 DIGIDI1 1PS226 1PS226 1PS226 BAT54S 4.7K 4.7K 4.7K 4.7K NM=NOT MOUNTED R66 C25 R72 C26 R102 C27 R104 C24 Engineer/constructer Date (YYYY/MM/DD) 1MEG 10pF 1MEG 10pF 1MEG 10pF 1MEG 10pF Title LEGO MINDSTORMS NXT LEGO Drafter Date (YYYY/MM/DD) LEGO Project Number Schematic Name Hardware

Version Sheet Page Size I 3 o f 4 A2 5 4 3 2 1 5 4 3 2 1

POWER BLOCK COMMUNICATION BLOCK

VCC5V_SW VCC_RS485 VCC9V CURRENT GENERATOR 9V STEP-DOWN 5V SENSER VOLTAGE VCC3V 9V SENSOR RS485 DDP, DDM LDO 3.3V USB_DP_PULL_UP FULL UART 4 WIRE D PC_USB D AT91SAM7S ARM RXD0 AT91SAM7S DISPLAY VMBT_REQ TXD0 BT DEA REA VMBT_STATE BATTERY SUPPLY VCC5V BTRST SENSOR PULL-UP SAMBA I2C

VCC9V_MOTOR DOA RS 485 DIA SPI HS PORT BLUE TOOTH DEA REA VCC_AVR5V POWER_EN FROM ATMEGA48(PB7) MOTORDRIVER VCC9V

ADC_BATT SPI ATMEGA48 BUTTOM 0 - 3 ON/OFF C C

5V LDO ATMEGA48 DISPLAY SOUND VOLTAGE

AVR BLOCK ARM BLOCK ADC_A0 DIGIA0 ADC_B0 DIGIA1 AT91SAM7S OUTPUT ADC_C0 DIGIB0 INPUT ATMEGA48 ADC_D0 INPUT DIGIB1 OUTPUT ION_A DIGIC0 ION_B B DIGIC1 B ION_C DIGID0 ION_D DIGID1 MAPWM MAIN0 INTA MAIN1 INTB MBPWM INTC MBIN0 DIR_A MBIN1 DIR_B MCPWM DIR_C MCIN0 USB_ADC MCIN1 ADC_I BATT_PULS DIGID1_ADC BATT_ADC/SAMBA

A BUTTOM 0 A SOUND BUTTOM 1 - 3 ADC

Engineer/constructer Date (YYYY/MM/DD) Title LEGO MINDSTORMS NXT LEGO Drafter Date (YYYY/MM/DD) LEGO Project Number Schematic Name Hardware

Version Sheet Page Size I 4 o f 4 A2 5 4 3 2 1 5 4 3 2 1

D D

J1 VCC5V BUTTON0 TP5 TP1 VCC3V 1 2 BUTT_ADC TP4 GND 3 4 SIBT GND 5 6 SCKBT SOBT 7 8 CSDIS 9 10 10 pin Connector to main PCB VCC3V VCC5V TP11 LCD1 SW1 CSDIS R6 1 CS0 ON/OFF RSTDIS 2 VCC3V SOBT RST 1 2 3 CD SCKBT 4 SIBT SCK 0R 5 SDA VCC3V 6 C3 R1 VCC 7 GND C 4.7K 100nF C 8 VB1+ 9 SW2 VB1- 10 VB0- ON/OFF 11 TP2 VB0+ 1 2 12 VLCD TP6 TP7 TP10 LCD

R2 R5 C4 2.2K C1 C2 10MEG 33nF SW4 1uF 1uF ON/OFF TP3 1 2 BUTT_ADC

R3 R4 1K 100K TP8 TP9

B B

SW3 ON/OFF 1 2 BUTTON0

Title LEGO Engineer/constructer Date (YYYY/MM/DD) A J2 LEGO A DRILL 2.0 mm MINDSTORMS NXT J3 Drafter Date (YYYY/MM/DD) DRILL 2.0 mm LEGO J4 Project Number DRILL 2.0 mm Schematic Name J5 Keypad DRILL 2.0 mm Version Sheet Page Size A 1 o f 1 A4 5 4 3 2 1 5 4 3 2 1

D D

R1 R8 R2 R4 180R 1.8K 4.7K 330k

Q1A PUMT1 C C Q1B PUMT1 J1 Modular D1 R3 330R 1 Red 2 3 Q2A Q2B 4 PUMX1 PUMX1 5 6 3

1 Q4 BC847

2 Q3 R7 R9 SFH309-4 C2 R5 R6 10K 10K 6.8k 560R 470nF B B

J2 DRILL 2.3 mm Engineer/constructer Date (YYYY/MM/DD) J3 Title LEGO A DRILL 2.3 mm MINDSTORMS NXT LEGO A Drafter Date (YYYY/MM/DD) LEGO Drills for Project Number LED fix Schematic Name Light sensor

Version Sheet Page Size F 1 o f 1 A4 5 4 3 2 1

VCC VCC VCC 4 VCC/2 10 + R1 8 D R3 VCC 9 - D 220K 1K U1C LM324

TP2 11 VCC/2 4 VCC/2 R7 R8 R9 3 + 1 2 - R2 U1A 18K 100K 4.7K C1 + C2 LM324

220K 220nF 11 VCC 10uF Rect. in R4 DIGIAI0 D1 BAV99 4.7K C12 8.2pF 4 VCC/2 R13 12 + J2 C3 R5 C4 C5 R11 14 13 - 2 U1D 4.7K 1 220nF 82k R6 560K 68nF 2.2nF 56K LM324 C11

C 2 Pad 11 C TP1 R22 R10 TP3 10nF R12 10K 10K DIGIAI1

560K C6

68pF

VCC VCC VCC J1 Modular TP4

C7 8 TP5 1

4 2 Rect. in 3 R17 + 3 R15 3 VCC 1 5 + Q1 DIGIAI0 4 4.7uF 2 - 7 1 5 B U2A 220K 6 - BC848B DIGIAI1 B 100K LM358 U1B 6 2 4 LM324 11 C9 C10

100nF 100nF R16 470K U1 cap U2 cap

VCC R21

560R R14 8 R20 5 + 4.7K 7 6 - U2B 220K LM358 C8 4 Title LEGO Engineer/constructer Date (YYYY/MM/DD) 470nF A MINDSTORMS NXT LEGO A R18 R19 Drafter Date (YYYY/MM/DD) LEGO 82K 470K Project Number Schematic Name Sound sensor

Version Sheet Page Size C 1 o f 1 A4 5 4 3 2 1 5 4 3 2 1

D D

C C

J1 R1 SW1 BN Cable: Modular 2.2K D3C 1: White 2: Black 1 1 2 3: Red 2

4: Green 3 3 5: Yellow 6: Blue 4 5 6

B B

Title LEGO Engineer/constructer Date (YYYY/MM/DD) A MINDSTORMS NXT LEGO A Drafter Date (YYYY/MM/DD) LEGO Project Number Schematic Name Touch sensor

Version Sheet Page Size A 1 o f 1 A4 5 4 3 2 1 5 4 3 2 1

4.3V_Power VCC_5V R16 4 2 1 3 100R RA1B RA1A RA1C + C13 RA1D 10uF 10K D 10K 10K 10K D 6 5 7 8

TP9 TP10 TP11

R2 C6 R4 C7 R6 C8 R18 1.5MEG P1.0 TP2 1MEG 100pF 1MEG 10pF 1MEG 10pF R19 C1 R1 C2 C3 C4 TP14 Q1A Q1B Q2A Q2B PUMX1 PUMX1 PUMX1 PUMX1 1nF 4.7K 100pF 100pF 1nF 10K 1 PZ1 R3 R5 R7 R17 TCT40-12S2 100K 220R 220R 220R 2

TP3

R8 C5 R9

C 47K 220pF 22K C C9

10nF 4.3V_Power 4.3V_Power

J1 Modular R21 R10 VCC 100K GND 1 3.3MEG GND 2 VCC_5V 3 D4 DIGIAI0 4 DIGIAI1 5 6 LL4148 Q6A R22 R11 VCC_5V VCC_5V VCC_5V VCC_5V 1.8MEG 330K PUMH4 Q6B

C19 100nF PUMH4 R13 R12

82K 82K

B B DIGIAI0 U2 DIGIAI1 VCC_5V 3 X1 C15 11 GND VCC VCC 38 2 GND 22pF OSCO 37 14 36 3.58MHz R15 R14 VCC OSCI RESET 1 RESETB 34 33 P1.0 4.7K 4.7K R23 R24 TP12 P1.0 VCC_5V P1.1 32 VCC 10K 10K 31 D2 P1.2 P1.3/SCL P1.3/SCL TP5 23 P3.1 P1.3 30 P3.0/SDA 24 29 U1B U1A P3.0 VCC P2.0 BAV99 P2.0 28 5 4 TP12 TP13 2 3 26 27 P2.1 P2.2 P2.1 D3 CD4049 CD4049 ESC015 C14 P3.0/SDA TP6 C12 + C16 100nF 10uF PZ2 BAV99 100nF U1C U1E C10 C11 7 6 1 2 12 11 47pF 47pF CD4049 TCT40-12F2 CD4049

U1D U1F 9 10 15 14

A CD4049 CD4049 A TP8 P2.1 Q3B Q3A P2.0 TP7 PUMH4 PUMH4 Title LEGO Engineer/constructer Date (YYYY/MM/DD) MINDSTORMS NXT LEGO Drafter Date (YYYY/MM/DD) LEGO Project Number Schematic Name Ultrasonic sensor

Version Sheet Page Size G 1 o f 1 A3 5 4 3 2 1