FACULTAD DE INGENIERÍA ELÉCTRICA Y …bibdigital.epn.edu.ec/bitstream/15000/3951/1/CD-3719.pdf ·...
Transcript of FACULTAD DE INGENIERÍA ELÉCTRICA Y …bibdigital.epn.edu.ec/bitstream/15000/3951/1/CD-3719.pdf ·...
ESCUELA POLITÉCNICA NACIONAL
FACULTAD DE INGENIERÍA ELÉCTRICA Y
ELECTRÓNICA
CONSTRUCCIÓN Y PROGRAMACIÓN DE UN GRUPO DE
ROBOTS MÓVILES SOBRE LA BASE DEL PRODUCTO
LEGO MINDSTORMS NXT
PROYECTO PREVIO A LA OBTENCIÓN DEL TÍTULO DE INGENIERO EN
ELECTRÓNICA Y CONTROL
MEDARDO ÁNGEL SILVA AMORES
DIRECTORA: Ing. ANA RODAS
Quito, julio de 2011
i
DECLARACIÓN
Yo, Medardo Ángel Silva Amores, declaro bajo juramento que el trabajo aquí
descrito es de mi autoría; que no ha sido previamente presentado para ningún
grado o calificación profesional; y, que he consultado las referencias bibliográficas
que se incluyen en este documento.
A través de la presente declaración cedo mis derechos de propiedad intelectual
correspondientes a este trabajo, a la Escuela Politécnica Nacional, según lo
establecido por la Ley de Propiedad Intelectual, por su Reglamento y por la
normatividad institucional vigente.
_______________________
Medardo Ángel Silva Amores
ii
CERTIFICACIÓN
Certifico que el presente trabajo fue desarrollado por Medardo Ángel Silva
Amores, bajo mi supervisión.
_________________________
Ing. Ana Rodas B.
DIRECTORA DEL PROYECTO
iii
AGRADECIMIENTO
Mi profundo agradecimiento a la Ing. Ana Rodas,
cuya ayuda y estímulo ha sido determinante para
facilitar la terminación de este tan esperado proyecto.
iv
DEDICATORIA
Mucho tiempo tomó el llegar a este momento y
posiblemente la persona que más se alegrará
porque finalmente se produjo es mi madre, a
quien va dedicado este trabajo.
v
RESUMEN
El presente trabajo tiene como principal objetivo el construir y programar un
conjunto de robots móviles sobre la base del producto Lego Mindstorms en su
versión NXT 1.0. Para ello se ha propuesto la construcción y programación de
algunos prototipos que pretenden principalmente mostrar las diferentes opciones
que ofrece el producto mencionado.
Los prototipos diseñados usan, en conjunto, todos los sensores con los que viene
equipado el kit 8527: de contacto, de luz, de sonido, de ultrasonido y de rotación.
Los programas desarrollados intentan aprovechar las principales características
con las que puede ser programado el ladrillo programable NXT: manejo de
entradas y salidas, contadores, temporizadores, subrutinas, estructuras de lazo,
funciones que permiten tomar decisiones, almacenamiento de datos, generación
de tonos, comunicación entre ladrillos mediante bluetooth, etc. Como lenguajes de
programación se utilizan, de entre las múltiples opciones existentes en el mercado
y en el ciberespacio, el lenguaje propio del fabricante, NXT-G, y otro que se
encuentra dentro de la categoría de software libre y que es conocido como NXC.
El lenguaje de programación NXT-G está desarrollado sobre la plataforma de
Labview y tiene características gráficas que lo hacen simple de manipular, pero
que resulta engorroso cuando se trata de hacer programas un poco largos o
cuando se requiere de una mayor capacidad de procesamiento numérico. El
segundo lenguaje presentado, el NXC (Not eXactly C), tiene mejores
características frente al anterior ante los dos criterios mencionados y está
desarrollado sobre una plataforma de lenguaje C.
Se han desarrollado las siguientes aplicaciones: un medidor de longitud, una
calculadora de área y volumen a partir de la medición de longitudes, un escorpión
que reacciona ante estímulos externos, un brazo mecánico que incluye la
posibilidad de reconocer colores, un auto controlado con un algoritmo PID para
mantener una posición relativa hacia un objeto, un seguidor de línea y una
aplicación de control remoto mediante bluetooth.
vi
PRESENTACIÓN
El trabajo desarrollado ha sido estructurado de tal manera que se puede estudiar,
de forma separada, la construcción del hardware y el diseño del software. Aún
cuando los dos aspectos están siempre íntimamente relacionados, esta forma de
presentación permite descubrir fácilmente las dificultades que muestra cada
aspecto del diseño.
En el capítulo 1 se presentan algunos conceptos básicos sobre la robótica y sus
aplicaciones, colocando mayor énfasis en la parte educativa y en la investigación.
Se hace una presentación del producto Lego Mindstorms y de su evolución a
través del tiempo y se ofrecen también algunos ejemplos de universidades que
trabajan en proyectos de investigación y lo usan como recurso principal, dada su
gran versatilidad.
En el capítulo 2 se realiza una descripción detallada del hardware contenido en un
kit de Lego Mindstorms 8527. Se mencionan lo principios físicos y eléctricos con
los que funcionan los sensores incluidos en el equipo, así como los de los
servomotores existentes. Una gran parte de este capítulo está destinada a la
descripción física de los prototipos diseñados en todo el trabajo.
En el capítulo 3 se presentan los lenguajes de programación que van a ser
utilizados durante el desarrollo de este proyecto, no sin antes mencionar las
diferentes opciones que existen en el mercado y de forma libre en el ciberespacio.
Los programas desarrollados para los prototipos diseñados son también
detallados en este capítulo.
En el capítulo 4 se muestran los resultados de algunas de las pruebas realizadas
sobre los prototipos armados y se mencionan adicionalmente las dificultades
mostradas por los diseños propuestos en su funcionamiento y, por tanto, sus
limitaciones.
vii
Finalmente se presentan conclusiones válidas sobre el trabajo desarrollado y
algunas recomendaciones que podrían ser tomadas en cuenta por futuros
usuarios del producto y de este documento.
viii
CONTENIDO
Página
CAPÍTULO 1: Estudio de sistemas y aplicaciones robóticas 1
1.1 Robótica 1
1.2 Robótica didáctica 3
1.2.1 Campo de aplicación 5
1.3 Fabricantes de kits para la educación 6
1.4 Historia de Lego 7
1.5 Lego Mindstorms en la universidad 10
1.6 Aplicaciones a desarrollar 13
1.6.1 Medidores de varias magnitudes 13
1.6.2 Escorpión 13
1.6.3 Brazo mecánico 14
1.6.4 Vehículo con control de posición PID 14
1.6.5 Seguidor de línea 14
1.6.6 Control remoto mediante bluetooth 14
CAPÍTULO 2: Diseño e implementación de los módulos 16
2.1 Características de Lego Mindstorms NXT 16
2.1.1 Hardware (CPU) 16
2.1.1.1 Estructura interna del ladrillo NXT 19
2.1.1.2 Puertos del ladrillo NXT 20
2.1.1.3 Manejo de energía 21
2.1.1.4 Comunicaciones 22
2.1.1.4.1 Comunicación entre ladrillos mediante bluetooth 23
2.1.1.5 Sonido 24
2.1.1.6 Botones 24
2.1.2 Sensores 25
2.1.2.1 Sensor de contacto 25
2.1.2.2 Sensor de luz 26
ix
Página
2.1.2.3 Sensor de ultrasonido 27
2.1.2.4 Sensor de sonido 28
2.1.3 Los motores de Lego NXT 29
2.1.4 Conjunto de piezas 31
2.2 Desarrollo de los módulos 37
2.2.1 Medidor de variables múltiples 37
2.2.1.1 Medidor de longitudes 37
2.2.1.2 Calculadora de área y volumen 41
2.2.1.3 Medidor de sonido 42
2.2.2 Escorpión 44
2.2.3 Brazo mecánico 50
2.2.4 Vehículo controlado mediante algoritmo PID 58
2.2.5 Seguidor de línea 63
2.2.6 Aplicaciones remotas 68
CAPÍTULO 3: Desarrollo de la programación 69
3.1 Lenguajes de programación 69
3.2 Lenguaje de programación NXT-G 74
3.2.1 Entorno de programación del lenguaje NXT-G 75
3.2.2 Bloques 76
3.2.3 Controles de salida 77
3.2.4 Controles de entrada 79
3.2.5 Las comunicaciones 81
3.2.6 Flujo del programa 82
3.2.7 Otros bloques 83
3.2.8 Bloques definidos por el usuario 84
3.2.9 Variables 85
3.2.10 Operaciones matemáticas 86
3.2.11 Bloques especiales 87
3.2.12 Cables de datos 89
3.3 Lenguaje de programación NXC 90
3.3.1 Entorno de programación para el lenguaje NXC 91
x
Página
3.3.2 Programación en NXC 92
3.3.2.1 Programas con NXC 93
3.3.2.2 Variables 94
3.3.2.3 Conjuntos definidos por el usuario 95
3.3.2.4 Arreglos 95
3.3.2.5 Asignaciones 95
3.3.2.6 Estructuras 96
3.3.2.7 Expresiones 97
3.3.2.8 Condiciones 98
3.3.2.9 NXC API 98
3.3.2.9.1 Funciones de temporización 98
3.3.2.9.2 Funciones de control del programa 99
3.3.2.9.3 Funciones de cadenas de caracteres 100
3.3.2.9.4 Funciones numéricas 100
3.3.2.10 Módulo de entrada 100
3.3.2.11 Módulo de salida 101
3.3.2.12 Módulo de sonido 102
3.3.2.13 Módulo de pantalla LCD 102
3.3.2.14 Módulo de comunicaciones 103
3.3.2.15 Manejo de archivos 104
3.4 Programación de los módulos desarrollados 105
3.4.1 Medidor de variables múltiples 105
3.4.1.1 Medidor de longitudes 105
3.4.1.1.1 Diagrama de flujo del medidor de longitudes 107
3.4.1.1.2 Código NXT-G del medidor de longitudes 108
3.4.1.2 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
Referencias bibliográficas 169
Anexos 173
Anexo A: Sistema de bola y viga desarrollado sobre la base del producto
Lego Mindstorms NXT
Anexo B: Menú principal del NXT
Anexo C: Diagramas eléctricos del hardware utilizado en el producto
Lego Mindstorms NXT
1
CAPÍTULO 1
ESTUDIO DE SISTEMAS Y APLICACIONES ROBÓTICAS
1.1 ROBÓTICA
El término robot fue introducido por el escritor checoslovaco Karen Čapeck,
fallecido en 1938, quien incluyó en una de sus obras la palabra robota, que
significa trabajo. La obra se llamaba “R.U.R.” (Rossum´s Universal Robots) y en
ella se presenta al obrero moderno como un esclavo mecánico. Los robots y el
término robótica se volvieron populares en los años cuarenta gracias al autor de
ciencia ficción Isaac Asimov, quien asimismo planteó las leyes de la robótica
(Runabout, 1942).
En general se entiende como robot a una máquina que tiene forma humana y
realiza tareas humanas. Otra definición dice que robot es un manipulador
multifuncional y reprogramable, diseñado para mover materiales, piezas,
herramientas o dispositivos especiales, mediante movimientos programables y
variables que permitan llevar a cabo diversas tareas. En el inicio del desarrollo de
los robots se perseguía que estos realicen las tareas que son peligrosas o que
traen riesgos para el hombre; actualmente se busca además que puedan ejecutar
procesos cognitivos y no necesariamente seguirán la inconveniente forma
humana -para algunos procesos- en su diseño.
Entre las principales características de un robot se encuentran su gran
versatilidad al poder ejecutar diversas tareas o una misma tarea de diversas
maneras y su autoadaptabilidad al entorno, lo que exige que el mismo cuente con
sentidos artificiales que le permitan "darse cuenta" de la forma en la que debe
cumplir su tarea.
Los robots son, por lo tanto, dispositivos compuestos de sensores que reciben
datos de entrada, un sistema central de control que al recibir tal información
2
ordena al robot que efectúe una determinada acción y, finalmente, los dispositivos
que ejecutan las acciones en el medio externo.
En resumen, un robot consiste básicamente de cinco componentes:
1. Un cerebro que ordena la ejecución de acciones y que reacciona frente a la
información proveniente de los sensores. El cerebro es normalmente un
sistema microprocesado.
2. El cuerpo del robot o simplemente el chasis, que mantiene unidas a sus
diferentes partes.
3. Los actuadores que permiten el movimiento del robot. Se tratan
normalmente de motores eléctricos, pero también pueden haber otras
posibilidades como pistones hidráulicos o neumáticos, etc.
4. Los sensores que dan al robot la información sobre su entorno.
5. Una fuente de energía que permite el funcionamiento del cerebro,
actuadores y sensores. Este componente no siempre es parte del robot en
sí mismo.
Para clasificar los robots se pueden establecer diversos criterios: funcionalidad,
geometría, inteligencia, etc. Las características con las que se clasifican los robots
son:
- propósito o función,
- sistema de coordenadas empleado,
- número de grados de libertad,
- generación del sistema de control.
A continuación se presenta una posible forma de clasificar los robots [1]:
- Industriales o manipuladores: suelen tener la forma de un brazo articulado
en cuyo extremo se incorporan elementos de sujeción o herramientas.
Estas máquinas realizan tareas repetitivas en industrias de automoción y
se usan para montar piezas, moverlas, ajustarlas, soldarlas, pintarlas, etc.
3
- Móviles o vehículos robot: se desplazan usando ruedas, orugas o patas
articuladas y se utilizan para suministrar herramientas o materiales a los
manipuladores, para transportar materiales peligrosos, para colocar cables
submarinos, explorar el fondo del mar o para hacer exploraciones
espaciales.
- Prótesis para uso humano: son dispositivos electromecánicos que realizan
el trabajo de las manos, los dedos o las piernas de los seres humanos.
- Didácticos o experimentales: se utilizan en la enseñanza y el aprendizaje
de la robótica. Dentro de este tipo de robots se incluyen los juguetes que
imitan algunas funciones de los robots experimentales.
- Manos teledirigidas (telchirs): dedicadas a manipular productos
radioactivos o peligrosos y a colaborar en operaciones quirúrgicas
controladas de forma remota por cirujanos expertos (telecirugía).
- Instalaciones inteligentes: sirven para controlar de manera automatizada
las mercancías de almacenes o los libros de bibliotecas, entre otras
aplicaciones.
- Microrobots o nanorobots: constituyen la última tendencia en las
investigaciones en el campo de la robótica. Se trata de dispositivos de
tamaños de centímetros y milímetros con los que se actúa, por ejemplo, en
el cuerpo humano para realizar intervenciones en vasos sanguíneos
dañados o en el interior de máquinas para diagnosticar posibles averías.
1.2 ROBÓTICA DIDÁCTICA [2][3][4][5]
Durante las últimas décadas investigadores e industrias han propuesto y
desarrollado kits que permiten la construcción de robots, diseñados para estimular
el aprendizaje de conceptos y métodos relativos a la educación de estudiantes en
contenidos científicos tales como informática, mecánica, matemática y física. Los
kits incluyen pequeños motores, sensores, ruedas, engranajes, poleas y relés, es
decir, todo aquello que el estudiante necesita para construir robots. Existen
productos que incluyen cables y/o equipamientos de radio que posibilitan conectar
al robot con un computador personal, lo que a su vez permite al usuario
programar y controlar el invento.
4
Algunos de estos kits han sido desarrollados de acuerdo a los principios
educativos derivados de las teorías del desarrollo cognitivo de Jean Piaget (1966)
y revisados por Seymour Papert (1980-1986), profesor del Media Lab del Instituto
Tecnológico de Massachusetts. Su enfoque indica que, en el centro de todo
proceso de aprendizaje, es el papel activo de quien aprende el que amplía su
conocimiento a través de la manipulación y construcción de objetos. Esta filosofía
sugiere que la tradicional construcción a partir de kits concebidos para ello, es
muy adecuada como herramienta de aprendizaje. Sin embargo, dar vida a un
objeto por medio de la interacción con un computador personal hace posible
desarrollar aplicaciones que van más allá de la idea original de los que
propusieron esta metodología.
En los cursos tradicionales de informática pocas veces se enseña a los alumnos
sobre las indeterminaciones de la interacción en el mundo real; de hecho, a
menudo intentan abstraerse del mundo real y construyen sistemas
completamente deterministas. Esto puede generar problemas a los ingenieros que
posteriormente deben diseñar y/o programar sistemas de control para el mundo
real. Los problemas son, a menudo, debidos a que los estudiantes yerran al ver al
robot desde su propio punto de vista, ya que confían en abstracciones poco
realistas en las que han sido adiestrados a lo largo de su educación. Por medio de
la experimentación con sensores, motores y su control, los estudiantes modifican
gradualmente su percepción de la interacción entre el robot y el mundo real,
modificando continuamente sus diseños hasta convertirlos en realistas y
funcionales.
El éxito de este tipo de experimento educativo es parcialmente debido a la
facilidad del ensamblaje de los kits de construcción disponibles en el mercado, los
mismos que permiten a los estudiantes encontrar soluciones sencillas a
problemas físicos no siempre sencillos. Los estudiantes adquieren una
comprensión profunda de las discrepancias entre los resultados pronosticados en
la fase de diseño y los realmente producidos por sus máquinas, aprendiendo a
5
reducir tal diferencia entre diseño y construcción, lo que es fundamental para la
innovación tecnológica.
1.2.1 CAMPO DE APLICACIÓN
Se han construido, por ejemplo, pequeñas máquinas que simulan el
comportamiento de animales en sus entornos, ambos construidos artificialmente y
que consideran condiciones reales. Tales prototipos son esencialmente robots
móviles que, como los animales reales, tienen un aparato sensorial (por ejemplo,
sensores sensibles a la luz o el calor), un sistema motriz (por ejemplo, brazos
mecánicos o ruedas controladas por motores) y un cerebro (programa de
computador que reacciona ante las señales captadas por los sensores). Estas
máquinas pueden ser consideradas como organismos artificiales y ser usadas con
propósitos educativos y en investigación básica, como en la psicología
(investigación del comportamiento), etología (ciencia de las costumbres) y
robótica.
Los experimentos que se desarrollan ayudan a los estudiantes a asimilar
conceptos que de otra manera serían abstractos y confusos. Se asimilan nociones
complejas a través de la construcción de sistemas compuestos por varios
componentes de hardware y software y se aprende a estudiar la realidad desde
diferentes puntos de vista, es decir, desde diferentes niveles de análisis,
observando el comportamiento de robots individuales y el comportamiento global
que surge de la interacción entre estos individuos.
Es importante indicar que no se trata de introducir nuevas nociones o conceptos,
sino nuevos modos de observación y razonamiento que puedan ayudar a las
personas a evaluar con más atención la realidad en la que viven.
El posible campo de aplicación de la creación de organismos artificiales es
realmente ilimitado: se ha demostrado la pertinencia de su uso tanto a nivel
escolar como a nivel superior.
6
La experiencia demuestra que muchos ingenieros tienen a menudo un excelente
conocimiento de los conceptos teóricos fundamentales en su disciplina, pero
insuficiente experiencia en el diseño y construcción de prototipos industriales.
1.3 FABRICANTES DE KITS PARA LA EDUCACIÓN[6]
Hay varias propuestas de hardware para usar la robótica en aplicaciones
educativas. En general, se puede agrupar estas sugerencias de la siguiente
manera: 1) adquisición de un robot con una morfología predefinida, y 2)
construcción de un robot a partir de pequeñas piezas. En cuanto a la primera
opción, existen en el mercado muchas ofertas de robots de uso adecuado para el
aula. Estos robots se venden en una configuración básica y es posible adquirir
módulos adicionales de acuerdo a la necesidad específica. Este tipo de robots
suele ser adecuado para su uso por parte de estudiantes universitarios y de
postgrado.
En muchos otros casos, un robot con una morfología predefinida es inapropiado.
Por ejemplo, si la idea es aprender sobre engranajes, motores y sensores, es
mejor tener la posibilidad de experimentar prácticamente al construir su propio
robot físico. La segunda opción antes indicada es en este caso la más adecuada.
En el mercado existen también algunas posibilidades, de entre las cuales se
mencionan las marcas y/o productos: National Instruments y MobileRobots Inc.,
Handy Board y Super Cricket del MIT, LEGO, Fischertechnik, Meccano, Parallax
Inc., NeoRobotic, etc. Los productos mencionados no proporcionan la misma
precisión de los robots industriales, pero son usados en procesos didácticos y de
investigación.
En la situación que ocupa el presente trabajo, se tratará únicamente con el
producto Lego Mindstorms en su versión NXT, la misma que se encontró
disponible a partir de agosto de 2006 en su versión inicial.
7
1.4 HISTORIA DE LEGO [7]
LEGO es el nombre de una empresa de juguetes de origen danés reconocida
principalmente por sus bloques de plástico interconectables. La compañía fue
fundada en 1932 y el nombre LEGO fue adoptado por la misma en 1934, formado
por la frase del danés "leg godt", que significa "jugar bien". Los orígenes de este
juguete corresponden a un pobre carpintero de Billund, Dinamarca, llamado Ole
Kirk Christiansen.
El concepto de “jugar bien” sigue siendo la filosofía de los productos Lego,
alentando a los niños a ser abiertos y curiosos, a estimular su creatividad,
imaginación y aprendizaje mientras se divierten.
Los juguetes producidos por Lego fueron construidos hasta 1949 casi
exclusivamente de madera. En este año se desarrollaron juguetes de plástico con
bloques interconectables, los mismos que llevaron a la marca a la fama. El
material que se usó en ese entonces fue acetato de celulosa y el éxito residía en
que los bloques no solo podían apilarse unos sobre otros, sino también en que
podían trabarse entre ellos, aunque fue recién en 1958 en que el diseño
actualmente conocido fue desarrollado. Fue también en este año en que, ante el
fallecimiento de Ole Kirk, su hijo Godtfred heredó el liderazgo de la compañía.
En los años 1961 y 1962 se agregaron las primeras ruedas Lego, lo que permitió
a la empresa emprender la construcción de camiones, automóviles, autobuses y
otros vehículos. De la misma manera, Lego hizo convenios con empresas que le
permitieron introducirse en el mercado pre-escolar.
En 1963 se abandonó el acetato de celulosa como material para fabricar las
piezas de Lego y se pasó a usar acrilonitrilo butadieno estireno, o plástico ABS,
material que dio mayor estabilidad a los ladrillos de Lego. El ABS es más
resistente al calor, a ácidos, a sales y a otros químicos y no es tóxico. Una gran
ventaja de los ladillos Lego fabricados con ABS es que las piezas construidas en
8
1963 son perfectamente interconectables con piezas producidas en el año 2004,
por ejemplo.
Lego ha incursionado en algunas líneas con sus productos y ha fabricado
modelos para armar trenes, los mismos que incluían motores de 4,5V y que luego
fueron reemplazados por otros de 12V. De la misma manera, pensando en una
mayor seguridad para los usuarios más pequeños, abrió la línea Duplo, la misma
que incluye ladrillos de tamaño mayor que las piezas anteriores. La conectividad
entre estos productos se mantiene. En 1974 fueron creadas las figuras humanas
con brazos articulados y se convirtieron en producto estrella. Más adelante, entre
los años 1975 y 1977 se crearon los juegos “serie experto” y luego “constructor
experto”, los mismos que incorporaban engranajes, ruedas dentadas, palancas,
ejes y coyunturas universales y así se permitió el ensamblaje de vehículos mucho
más cercanos a los reales.
De la misma manera se han producido expansiones significativas de la línea Lego
incluyendo cada vez nuevos productos: FABULAND (orientada a niños
pequeños); SCALA (elementos de joyería destinados a niñas pequeñas); LEGO
DACTA (productos para uso educativo); Technic (incluye también elementos
neumáticos); Bionicle (reemplazó al diseño de las clásicas figuras Lego);
Pneumatic (elementos neumáticos); series de piratas, Star Wars, Harry Potter,
basketball, transporte, etc.
Existe una gran cantidad de ingeniería en el diseño y fabricación de cada pieza de
Lego. Para que piezas de series antiguas puedan ser fácilmente combinadas con
piezas de modelos nuevos se requiere de altos estándares de calidad. El grado
de tolerancia máximo permitido está en 2 milésimas de milímetro (0,002mm) y se
asegura que máximo 18 de cada un millón de piezas no cumplen con esta
característica. Esto asegura el agarre que debe existir entre piezas Lego de
diferentes colecciones y el hecho de que muchos aficionados de Lego acoplen
fácilmente sus colecciones de la niñez a los nuevos modelos.
9
Uno de los productos que ha generado gran atractivo y expectativa en los últimos
años es el que corresponde a la serie denominada Lego Mindstorms. En 1998
Lego proporciona el primer conjunto Mindstorms: Robotics Invention System (RIS
1.0). Este producto aparece como un juguete destinado a los mayores de 12
años, aunque tuvo su mayor aceptación en los usuarios adultos. Además de las
típicas piezas de Lego, se incluyen motores de corriente continua, sensores y una
pieza muy importante, el RCX. El RCX era un ladrillo programable que le permitía
interactuar con el entorno. Está basado en el microprocesador H8 de Hitachi y
proporciona convertidores A/D, comunicación serial y temporizadores.
Internamente tiene 16 KB de memoria ROM y 33 KB de RAM, tiene una interfaz
para tres actuadores y tres sensores y un puerto de comunicaciones de
infrarrojos, así como una pantalla de cristal líquido, cuatro botones y un pequeño
altavoz. El RCX fue elaborado en cooperación entre Lego y el Instituto
Tecnológico de Massachusetts y existe un gran número de entusiastas que han
publicado soluciones basadas en estos dispositivos en revistas como IEEE
Robotics and Automation Magazine e IEEE Control Systems Magazine, entre
otras.
La versión NXT corresponde a la última existente del producto Mindstorms y fue
lanzada al mercado en agosto de 2006. Esta versión incluye el nuevo ladrillo
programable NXT, así como otros cambios menores en las piezas de construcción
-la mayoría proveniente de la serie Technics- y en los sensores electrónicos. Una
gran diferencia con el RCX es que permite las comunicaciones mediante USB y
bluetooth, eliminándose así las limitaciones de los infrarrojos, propios de RCX, y
permitiendo distancias de control mucho más grandes y sobre algunos
obstáculos, sin exigir una determinada orientación entre emisor y receptor.
La versión inicial de NXT, lanzada en el año 2006, traía 577 piezas, entre las que
se incluían 3 servomotores, 4 sensores (ultrasónico, de contacto, de sonido y de
luz), 7 cables de conexión, un cable de interfase USB y el ladrillo programable. El
kit incluía NXT-G, un ambiente de programación que posibilita la creación y
descarga de programas hacia el ladrillo NXT.
10
La nueva versión del NXT (2.0) fue lanzada en agosto de 2009 y contiene 619
piezas entre las que se incluyen motores y sensores (el nuevo sensor de color,
dos sensores de contacto y el sensor ultrasónico). El NXT 2.0 permite la ejecución
de operaciones aritméticas de punto flotante, mientras que las versiones
anteriores solo permitían operaciones con números enteros.
1.5 LEGO MINDSTORMS EN LA UNIVERSIDAD
Los productos Lego fueron inicialmente creados como juguetes para niños y
lograron finalmente convertirse en equipos que atraen tanto a niños como adultos
y que pueden ser fácilmente incorporados en medios educativos como
herramienta para la investigación y aprendizaje en todos los niveles. En la
actualidad, prácticamente todas las universidades a nivel mundial poseen kits de
Lego que incluyen “ladrillos inteligentes” y se usan en áreas relacionadas con la
robótica y la mecatrónica.
En el Instituto Tecnológico de Massachusetts (MIT por sus siglas en inglés), por
ejemplo, se han organizado cursos de "Diseño y Construcción de Robots Lego"
con el objeto básico de estimular las capacidades de diseño y desarrollo en
jóvenes estudiantes de ingeniería. Luego de dividir al total de estudiantes en
grupos de trabajo, cada grupo se dedica a buscar la solución a un mismo
problema. Al final, se presentan todas las soluciones y se escoge un ganador, que
será quien presente la alternativa más eficiente.
A continuación se mencionan algunas de las tantas universidades que hacen uso
del producto Lego Mindstorms en sus versiones RCX y NXT tanto para el estudio
de ingeniería como para la investigación en diferentes ámbitos de la ciencia:
- En el Laboratorio de Computación de Ciencias de la Educación de la
Universidad de Colorado Boulder se ofrecen cursos de Introducción al
diseño en Ingeniería mediante productos Mindstorms[8]. El laboratorio de
inteligencia artificial de la Universidad de Zurich, en Suiza, colabora
11
también con este proyecto como una de las entidades que aportan con
investigaciones.
- En el Centro de Enseñanza de la Ingeniería y la Divulgación (CEEO) de la
Universidad Tufts (Massachusetts) y en asociación con la división
educativa de Lego se ofrecen resultados de investigaciones y desarrollos
en cuanto a aplicaciones, así como también se presenta una amplia oferta
de recursos para educadores.[9]
- En el Departamento de Ingeniería de Sistemas y Automática de la
Universidad Politécnica de Valencia se han desarrollado estudios sobre
“Desarrollo y Control de Robots Móviles de Bajo Coste”, apuntando al
producto Lego Mindstorms como una de las principales soluciones en ese
sentido. [10]
- Un grupo de investigadores de la Universidad de Málaga (UMA) en España
ha desarrollado un prototipo basado en Lego Mindstorms NXT que permite
reconocer y sugerir temas musicales, esto dentro del campo de la
inteligencia artificial.
- En la Universidad Técnica Particular de Loja (UTPL) se han desarrollado
proyectos dentro del campo de los videojuegos mediante el uso de la
tecnología del NXT y LabView.
- En la ESPOL, en el desarrollo de sistemas de adquisición de datos
mediante la construcción de sensores compatibles con el ladrillo NXT.
- En la Universidad RWTH de Aachen, Alemania, se ofrece a sus
estudiantes de ingeniería cursos de programación de Lego Mindstorms con
Matlab y se desarrollan aplicaciones en el campo del procesamiento digital
de señales. En esta universidad se ha desarrollado un kit de herramientas
para programar robots Lego mediante Matlab.[11]
- En la Universidad de Cambridge, Reino Unido, se hace que los estudiantes
de ingeniería planteen soluciones a problemas relacionados con el diseño
de sistemas de ingeniería, desde su parte estructural hasta los sistemas de
control, haciendo uso de herramientas como Matlab.
- En la Universidad de Ciencia y Tecnología de New Jersey (NJIT) se
realizan proyectos de construcción de robots capaces de realizar tareas de
cirugía.
12
- En la Universidad de Magdeburg Otto-von-Guericke en Alemania se hace
uso de Lego Mindstorms en los cursos de cibernética.
- En la Universidad Friedrich Schiller de Jena, Alemania, se utiliza Lego
Mindstorms en el desarrollo de proyectos de biomecánica.
- En la Universidad de Lund, Suecia, en el desarrollo de proyectos de control
y automatización.
- En la Universidad de Ottawa, Canadá, en los cursos introductorios de
Sistemas de Control.
- En la Escuela de Ingeniería Eléctrica y Electrónica de la Universidad
Tecnológica de Nanyang, Singapur, como posibilidad para el desarrollo de
aplicaciones robóticas y de control.
Como se observa, el número de universidades y centros de estudios superiores
que aprovechan del producto es realmente interminable y esto se debe
principalmente a sus notables ventajas, entre las cuales destacan:
- Permitir una fácil validación experimental de la efectividad y robustez de los
algoritmos con los que son programados robots móviles.
- Hardware de costo relativamente bajo.
- Permitir el crecimiento de alternativas abiertas de programación, ya que
Lego abrió la arquitectura de su producto Mindstorms en la versión NXT.
- Versatilidad para ser usados en un sinnúmero de experimentos, los
mismos que van desde un único robot hasta un sistema de robots
múltiples, desde un esquema de control centralizado hasta uno
descentralizado,
- En el tema educativo es importante el hecho de incentivar el trabajo en
equipo, así como la programación de equipos reales, la construcción e
integración de sistemas e informaciones multidisciplinarias.
Entre las principales desventajas cabe mencionar que estos equipos no
proporcionan la misma precisión que los robots industriales.
13
1.6 APLICACIONES A DESARROLLAR
Para el desarrollo del proyecto se cuenta con tres módulos (número de producto:
8527), cada uno con un ladrillo programable NXT. La versión del producto es la
1.0, lo que quiere decir que no se cuenta por ejemplo con el sensor de color,
propio de la versión NXT 2.0, ni tampoco se tiene la opción de programar con
aritmética de punto flotante.
En dependencia de la tarea que se vaya a resolver se utilizarán uno o más de los
sensores disponibles: de contacto, de luz, de ruido y de ultrasonido, así como los
motores existentes, en un número máximo de tres.
De entre el gran abanico posible de aplicaciones para el producto Lego
Mindstorms se ha escogido desarrollar algunas que permitirán reconocer sus
características y mostrar la versatilidad del producto:
1.6.1 MEDIDORES DE VARIAS MAGNITUDES
Mediante el uso de los sensores con los que cuenta el kit de Lego Mindstorms
NXT se diseñará un medidor de distancia y, a partir de él, una calculadora de
áreas y volúmenes, así como también se realizará un medidor de sonido que
permite visualizar su nivel en la pantalla del NXT.
Los prototipos usarán los sensores de rotación incluidos en los servomotores y el
sensor de sonido.
1.6.2 ESCORPIÓN
Se intenta simular el comportamiento de un escorpión ante la presencia de un
“intruso”. El prototipo hace uso del sensor de ultrasonido para detectar la distancia
a la que se encuentra el “intruso” y para saber cuándo “picar” con su aguijón y del
sensor de sonido para actuar ante la existencia de un nivel de ruido que supera
un cierto valor umbral.
14
1.6.3 BRAZO MECÁNICO
Se diseñará un brazo mecánico que permitirá detectar la presencia de objetos de
cierto color y moverlos de un lugar a otro. Previamente se tiene que definir los
límites entre los cuales se va a desplazar su parte móvil.
El prototipo hace uso de los sensores de rotación incluidos en los servomotores,
del sensor de luz que permite “distinguir colores” de los objetos y del sensor de
contacto, que en este caso actúa como un sensor de final de carrera.
1.6.4 VEHÍCULO CON CONTROL DE POSICIÓN PID
Un vehículo de estructura mecánica sencilla debe mantener una distancia fija en
relación a un objeto, la misma que ha sido previamente definida. Si el objeto de
referencia cambia de ubicación, el vehículo tiene que seguirlo y al final ubicarse
de tal forma que se consiga el objetivo inicial. El software, basado en un algoritmo
PID, debe permitir cambiar los valores de las constantes que intervienen para
poder probar algunas opciones de control.
El prototipo utiliza principalmente el sensor ultrasónico para determinar en todo
momento la distancia a la que se encuentra el objeto de referencia.
1.6.5 SEGUIDOR DE LÍNEA
Un vehículo con una configuración mecánica que le permita realizar giros, se
convertirá en un “robot seguidor de línea”. El robot utilizará principalmente un
sensor de luz para determinar la trayectoria o línea a seguir.
1.6.6 CONTROL REMOTO MEDIANTE BLUETOOTH
Un NXT controlará a otro de forma inalámbrica, haciendo uso de su módulo de
comunicaciones mediante bluetooth. El robot controlado será un vehículo con
características mecánicas que le permitan girar. El “comando” del control remoto
15
será un ladrillo NXT al que está conectado un motor, del cual se aprovechará el
sensor de rotación.
16
CAPÍTULO 2
DISEÑO E IMPLEMENTACIÓN DE LOS MÓDULOS
2.1 CARACTERÍSTICAS DE LEGO MINDSTORMS NXT
El sistema Lego Mindstorms se define como una plataforma completa de
desarrollo de robots móviles, basada en la unión de bloques interconectables
que contiene sensores y actuadores que se conectan mediante presión. El
producto Lego Mindstorms viene en dos versiones: RCX y NXT, donde la última
corresponde a la versión actualizada y mejorada de la anterior.
El uso de Lego Mindstorms se ha extendido principalmente porque es un
sistema fácil de montar y desmontar, es muy conocido en todo el mundo,
permite una gran variedad de aplicaciones, es susceptible de ser programado
mediante múltiples lenguajes y además es muy indicado para su aplicación en
entornos educativos y de investigación.
2.1.1 HARDWARE (CPU)[12][13]
La unidad de control, definida como ladrillo inteligente NXT, cuenta con los
siguientes elementos:
Figura 2.1. Ladrillo programable NXT
- Procesador principal: ARM-7 de 32 bits (AT91SAM7S256 de Atmel)
• Arquitectura Risc
• reloj de 48 MHz
• memoria flash de 256 kB (no volátil)
• memoria RAM de 64 kB (volátil)
17
- Procesador secundario AVR de 8 bits (ATmega48 de Atmel) para
gestionar entradas/salidas
• reloj de 8 MHz
• memoria flash de 4 kB
• memoria RAM de 512 Bytes
El coprocesador Atmel AVR está encargado de manejar los siguientes
componentes: la creación de las señales de salida PWM para los
motores, la fuente de poder principal de la tarjeta, los botones debajo de
la pantalla y el sensor de carga de la batería. Se comunica con el
procesador principal a través del bus de comunicaciones I2C (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 I2C.
- 3 puertos de salida con interfaz de 6 hilos y soporte para lectura desde
los codificadores.
- Pantalla:
• 1 pantalla LCD monocromo (blanco y negro) con resolución de
100x64 pixeles (26x40,6mm)
• controlador de LCD UltraChip 1601 (UC1601)
El chip se conecta al ARM7 a través del bus SPI (Serial Peripheral
Interface) de 2MHz de velocidad y le permite calibrar la pantalla y otras
acciones mediante un simple conjunto de comandos.
- Altavoz de salida:
• canal de sonido de salida con resolución de 8 bits y 8kHz de
calidad de sonido
• soporta tasas de muestreo de 2 a 16kHz
• la señal de salida es tipo PWM controlada por el ARM7, que se
filtra y pasa por un amplificador diferencial (SPY0030A de
SunPlus) con ganancia máxima de 20
• bocina de impedancia característica de 16Ω y 21mm de diámetro
- 4 botones de goma que permiten la interacción con el usuario. Mediante
estos botones también se pueden crear pequeños programas para el
ladrillo NXT sin necesidad de utilizar el computador.
19
- Fuente de poder: alimentación con 6 pilas AA (preferiblemente alcalinas)
o batería de ión de litio de 1400 mAh.
- Conectores de 6 hilos industriales estándar tipo RJ12 con mecanismo de
ajuste a la derecha.
- Capacidad para almacenar una cantidad de programas de usuario
limitada únicamente por el tamaño de la memoria interna.
Un esquema básico de la forma en que interactúa el ladrillo NXT se ve
aproximadamente de la siguiente manera:
Figura 2.2. Diagrama de bloques del hardware del NXT, tomado de [14]
2.1.1.1 Estructura interna del ladrillo NXT
El NXT puede ser dividido en tres planos.
20
Figura 2.3. Estructura del NXT
El primer plano corresponde al microcontrolador. Este se encarga de seguir las
instrucciones dadas por la programación.
El segundo plano está conformado por la memoria flash. En esta memoria se
encuentra el programa entregado por el fabricante (firmware), el mismo que es
comparable con el sistema operativo del PC y ejecuta el programa
desarrollado.
El tercer plano está constituido por la memoria RAM. Los programas realizados
por el usuario que han sido previamente compilados se almacenan aquí.
Junto al procesador principal, el NXT posee un coprocesador con una memoria
flash y memoria RAM propias. Estos, en conjunto, están encargados de
manejar los circuitos de entrada y salida al ladrillo NXT.
2.1.1.2 Puertos del ladrillo NXT
Los puertos del ladrillo NXT disponen de terminales de seis hilos cada uno. Los
sensores pueden ser analógicos o digitales y se mantiene la compatibilidad con
los sensores del RCX:
- El pin de entrada 1 está directamente conectado a un conversor A/D de
10 bits. A fin de mantener compatibilidad con sistemas anteriores de 2
21
hilos, existe en este pin suministro de tensión durante 3ms, en el que se
incluye un intervalo de lectura de la señal de 0,1ms.
- Los pines 5 y 6 son responsables de la comunicación digital. El protocolo
establecido para la interfaz digital es I2C de Philips Semiconductors.
Nombre Función Color
• Pin 1, ANA Entrada analógica y posible señal de salida de corriente
blanco
• Pin 2, GND Señal de tierra negro • Pin 3, GND Señal de tierra rojo • Pin 4,
IPOWERA Fuente de 4,3V verde
• Pin 5, DIGIAI0
Pin de E/S digital conectado al procesador ARM7 (reloj I2C (SCL), RS-485 A)
amarillo
• Pin 6, DIGIAI1
Pin de E/S digital conectado al procesador ARM7 (datos I2C (SDA), RS-485 B)
azul
Figura 2.4. Distribución de los pines de los puertos NXT, tomado de [14]
Los puertos equipados con el protocolo I2C permiten el control no solamente de
sensores sino también de actuadores. Existen dispositivos comerciales que
permiten la conexión de hasta 7 motores o 7 sensores en un mismo puerto.
2.1.1.3 Manejo de energía
La energía para controlar al NXT proviene de 6 pilas AA o de una batería
recargable de ión litio y es una fuente de alimentación conmutable, que genera
una señal de 5V y otra de 3,3V para el ARM7 y para el chip BlueCore. Para
proteger a la fuente existe a su entrada un interruptor de protección que tiene
una corriente de mantenimiento de 1,85A y que se dispara aproximadamente a
los 3,3A.
En la siguiente tabla se muestran algunos valores de consumos en el NXT bajo
determinadas condiciones:
22
Voltaje de alimentación
Corriente Consumo (Vbatería = 9V)
max (mA) normal (mA) max (mW) normal (mW)Sin carga en los motores
9V 339 114 5184 14225V 271 112 1744 448
3,3V 72 38 410 216Con 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) Corriente (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ón4% - 5% Habitación en silencio5% - 10% Personas hablando lejos 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
13 Junta para ejes perpendiculares 3L con 4 clavijas
6 Junta para ejes perpendiculares doble
34
Cantidad Descripción Figura
6 Junta para ejes perpendiculares con doble abertura
6 Junta para ejes perpendiculares con dos agujeros
4 Clavija con eje Technic
42 Clavija con eje Technic con fricción
2 Eje con gancho Technic
1 Bola Technic roja de 52 mm
1 Bola Technic azul de 52 mm
16 Viga Technic 3
8 Viga Technic 3 x 3 con clavijas
6 Viga Technic 3 x 3,8 x 7 con doble inclinación de 45
8 Viga Technic 3 x 5 con inclinación de 90
16 Viga Technic 4 x 4 con inclinación 53,5
5 Viga Technic 5
6 Viga Technic 7
7 Viga Technic 11
4 Viga Technic 13
35
Cantidad Descripción Figura
11 Viga Technic 15
8 Diente Technic Bionicle 1 x 3 con agujero para eje
4 Arma Technic Bionicle (Pincer Suukorak)
4 Ladrillo Technic 1 x 4 con agujeros
2 Ladrillo Technic 1 x 6 con agujeros
18 Seguro Technic
8 Seguro liso Technic 1/2
4 Conector Technic con agujero para eje
6 Engranaje Technic de 8 dientes
4 Engranaje Technic de 12 dientes, doble bisel
2 Engranaje Technic de 16 dientes
2 Engranaje Technic de 20 dientes, doble bisel
1 Engranaje Technic de 36 dientes, doble bisel
1 Engranaje Technic de 40 dientes
4 Rueda de perillasTechnic
10 Brazo Technic en forma de L 2 x 4
1 Instrucciones para construcciones de Mindstorms NXT
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
4 Junta Technic para clavijas perpendiculares
1 Junta Technic para clavijas perpendiculares en curva
4 Junta Technic para clavijas redonda
13 Junta Technic larga
34 Junta Technic larga con fricción
8 Clavija Technic larga con tope
82 Clavija Technic con fricción y ranuras
8 Clavija Technic con fricción y gancho
1 Brazo Technic de polo invertido
5 Dirección Technic 9L
4 Triángulo Technic
1 Plato Technic con agujero en la base y cubierta negra
2 Rueda Technic
2 Tornillo sinfín Technic
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
Se utiliza el puerto de salida C para conectar un motor.
Sensor de rotación
Permite tomar medidas del ángulo girado y del sentido de giro
Tabla 2.5. Puertos usados en el medidor de longitudes
Las siguientes imágenes muestran al prototipo armado:
39
Tipo de vista 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
Puerto de entrada 2 Sensor de sonido Permite tomar medidas del nivel de sonido ambiental
Tabla 2.8. Puertos usados en el medidor de sonido
La programación tiene especial importancia en este proyecto. Para probar su
funcionamiento hace falta iniciar la ejecución del programa y acercar el sensor
de sonido a la fuente que lo origina. Las imágenes que se presentan a
continuación son suficientes para entender su configuración física. La
programación permite, adicionalmente, congelar una muestra tomada y
continuar con el proceso cuando se desee.
Tipo de vista Imagen
Vista frontal 1
Vista frontal 2
Tabla 2.9. Imágenes del medidor de sonido
44
2.2.2 ESCORPIÓN [12]
El diseño mecánico del prototipo del escorpión tiene gran complejidad. Se
utilizan los tres motores disponibles en el kit, dos de ellos para provocar el
movimiento horizontal –sobre el piso- del escorpión y el tercero para producir el
movimiento de la cola.
Cada uno de los motores que provocan el movimiento horizontal activa a tres
patas del escorpión. Esto se consigue mediante una configuración mecánica
como la que se indica en la figura, donde se ha distinguido con un color distinto
a cada una de las piezas que intervienen y se han marcado además los puntos
fijos de la estructura. Los ejes de los motores se han pintado en azul.
Figura 2.21. Esquema simplificado del escorpión
Adicionalmente se colocó sobre esta estructura básica un sensor de sonido, de
tal manera que el escorpión tenga la posibilidad de “oír” y reaccionar ante
estímulos sonoros.
Se ha previsto el siguiente funcionamiento para el escorpión: al iniciar el
programa, el escorpión deberá avanzar hacia delante hasta que se encuentre
con un obstáculo que está ubicado a una distancia “r”; entonces el escorpión
deberá retroceder por un cierto tiempo y luego inicia nuevamente su proceso
45
de marcha hacia delante. Si existe de pronto un objeto que se encuentra a una
distancia “p”, entonces, aparte de retroceder, el escorpión activará su cola y
“picará”. El escorpión sabrá que alcanzó su objetivo y que debe retroceder su
cola, si el sensor de contacto ubicado en su punta fue activado. La
incorporación del sensor de sonido permite la activación inicial del escorpión y,
cuando ya se encuentra en acción, hace que éste “pique” cada vez que el nivel
sonoro rebase un cierto límite, independientemente de que se encuentre o no
con un obstáculo delante de él. Las distancias “p” y “r” antes mencionadas,
deben ser modificables por programación.
Los elementos de hardware principales que han sido utilizados en este
prototipo son los siguientes:
Puerto Tipo de hardware Utilidad
Puerto de entrada 1 Sensor de contacto
Permite iniciar el funcionamiento del escorpión y, cuando ha iniciado su operación, permite saber si el escorpión alcanzó su objetivo al “picar”.
Puerto de entrada 2 Sensor de sonido
Permite iniciar el funcionamiento del escorpión y, cuando ha iniciado su operación, mide el nivel de sonido existente en el medio.
Puerto de entrada 4 Sensor de ultrasonido
Mide constantemente la distancia a la que se encuentran los objetos que se encuentran frente a él.
Puerto de salida A Motor NXT Motor que hace que la “cola” se mueva para “picar”.
Puerto de salida B Motor NXT Motor izquierdo (con el sensor de ultrasonido de frente)
Puerto de salida C Motor NXT Motor derecho (con el sensor de ultrasonido de frente)
Tabla 2.10. Puertos usados en el “escorpión”
46
Las siguientes imágenes pretenden mostrar las principales partes que
constituyen este proyecto. Las imágenes mostradas no pueden entenderse
como una descripción detallada del proceso de construcción, pero sí como una
posibilidad de entender la forma en que está construido el prototipo en
cuestión.
Tipo de vista 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
Puerto de entrada 1 Sensor de contacto
Actúa como un sensor de final de carrera en uno de los extremos del recorrido posible.
Puerto de entrada 2 Sensor de luz Permite reconocer el “color” del objeto a ser movido por el brazo.
Puerto de salida A Motor NXT Motor que abre y cierra la “garra” del brazo.
Puerto de salida B Motor NXT y su sensor de rotación interno
Motor que permite que el brazo pueda subir o bajar.
Puerto de salida C Motor NXT y su sensor de rotación interno
Motor que permite que el brazo pueda moverse horizontalmente.
Tabla 2.12. Puertos usados en el brazo mecánico
El funcionamiento previsto para el brazo mecánico es el siguiente: al iniciar el
programa existirá la posibilidad de indicar al brazo cuáles son las posiciones
extremas a las que debe llegar, tanto horizontal como verticalmente y las
almacene en su memoria RAM, así como también deberá guardar los valores
de las lecturas del sensor de luz ante dos objetos de distintos colores. Para la
obtención de los valores extremos se hace uso de los sensores de rotación
internos de los motores NXT. Cuando este proceso inicial ha terminado, el
53
brazo entrará en operación y comenzará a trasladar los objetos que se
encuentran en la posición inicial hacia su destino final, el mismo que dependerá
del color del objeto. Los objetos a ser trasladados son las bolas con las que
viene provisto el kit 8527.
Se ha pensado en una configuración fácil de desmontar, de tal forma que el
cambio de baterías –cuando sea necesario- no sea un problema.
Tipo de vista 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
Puerto de entrada 4 Sensor de ultrasonido
Mide de forma permanente la distancia a la que se encuentra el objeto que está frente a él.
Puerto de salida A Motor NXT
Motor que se encuentra a la izquierda (sensor de ultrasonido de frente)
Puerto de salida C Motor NXT
Motor que se encuentra a la derecha (sensor de ultrasonido de frente)
Tabla 2.14. Puertos usados en el auto controlado mediante algoritmo PID
60
A continuación se presentan algunas fotografías que muestran la configuración
física del automóvil diseñado.
Tipo de vista 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
Puerto de entrada 1 Sensor de luz
Mide la cantidad de luz que se refleja en el piso dependiendo del camino por el que circula.
Puerto de salida B Motor NXT
Motor que se encuentra a la izquierda (pantalla de frente)
Puerto de salida C Motor NXT
Motor que se encuentra a la derecha (pantalla de frente)
Tabla 2.16. Puertos usados en el seguidor de línea
El vehículo consta básicamente de un chasis compuesto por dos motores,
elementos de sujeción y el NXT. Dos ruedas que se encuentran conectadas a
los motores permiten un fácil movimiento del vehículo. La bola ubicada en la
parte posterior da estabilidad al diseño y permite que el vehículo pueda girar
fácilmente y avanzar hacia delante sin problema.
64
Figura 2.24. Esquema simplificado del seguidor de línea
Cuando se inicia el programa almacenado en la memoria RAM no volátil del
ladrillo NXT, el vehículo inicia automáticamente una secuencia de barrido y
reconocimiento de valores máximos y mínimos por medio de su sensor de luz.
Con estos valores se calcula internamente un valor intermedio y será ésta la
referencia o set point que el algoritmo PID incorporado intentará mantener.
Consecuentemente el vehículo programado no será exactamente un seguidor
de línea, sino un seguidor de borde de línea.
Figura 2.25. Recorrido del seguidor de línea que en realidad es un seguidor de borde de línea
Para que el seguidor de línea funcione adecuadamente es necesario que exista
una marcada diferencia entre los colores de la línea y de la superficie donde
ésta se encuentra, así como también deben mantenerse relativamente
constantes las condiciones de iluminación ambiental. Para verificar estos datos
se puede acudir al mismo sensor de luz conectado al ladrillo NXT y realizar
algunas mediciones de prueba antes de iniciar con el trazado de la trayectoria.
65
Finalmente, la configuración no debe ofrecer mayores dificultades para
desmontar al ladrillo NXT, por lo que el cambio de baterías no representa
ningún problema.
Las fotografías que se incorporan a continuación permiten tener una clara idea
de la forma del dispositivo armado, para ello se han realizado tomas desde
diferentes ángulos y puntos de vista:
Tipo de vista 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 Característica
NXT-G ROBOLAB ROBOTC NXC pbLua NXJ
Tipo de lenguaje Gráfico Gráfico C Similar a C Lua JAVA
Precio
$0 (version comercial) $50 (educación)
$50 $30 vía web$50 – CD
Open Source
Open Source
Open Source
Plataforma necesaria Windows, MAC OSX
Windows, MAC OSX
Windows Windows, MAC OSX,LINUX
Windows, MAC OSX
Windows
Usuario final Novato a intermedio
Novato a intermedio
Novato a avanzado
Intermedio a avanzado
Intermedio o más
Intermedio 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, 10 es lo mejor)
10 7 8 6 4 4
Velocidad relativa de ejecución 1X 70X 130X (la más rápida)
25X 35X No disponible
72
Lenguaje Característica NXT-G ROBOLAB ROBOTC NXC pbLua NXJ
IDE Sí Sí Sí Sí Vía Eclipse Parcial (vía Eclipse)
Desarrollador en tiempo real No No Full Featured
Parcial No No
Capacidad de reproducción de sonidos
Tonos + WAV
Tonos + WAV
Tonos + WAV
Tonos + WAV
Tonos Tonos + WAV
Capacidades LCD
Texto Básico Mejorado++ Mejorado++ Básico Mejorado MejoradoGráficos Básico Mejorado Mejorado Básico No Mejorado Íconos Sí Sí Sí Sí No No
Características del lenguaje
Variables Hard Hard Sí Sí Sí Sí Punto flotante No Sí Sí No Sí SíFunciones trigonométricas
No Sí Sí No Sí? Sí?
Estructura ‘switch’ Sí No Sí No No Sí
Arreglos No No Sí Sí Sí Sí
Conectividad Bluetooth
Conectividad con otros dispositivos
PC, NXT Ninguna PC, NXT, GPS, otros
PC, NXT PC, NXT, GPS, otros
NXT, otros
Soporta protocolo Fantom
Sí No Sí Sí No No
Duplex (velocidad)
Half No disponible
Full Half Full Full
Sistema de manejo de archivos en el ladrillo
Sí Sí Sí Sí No No
Sistema de programación en el ladrillo
Sí Sí Sí Sí No No
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
TONOSReproduce un tono simple a la velocidad del NXT, a una frecuencia y una duración determinadas.
TONOS + WAVReproduce archivos “WAV” guardados en el NXT. Los archivos de sonido 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
TEXTO
Básico - Ubica un texto en la pantalla LCD en coordenadas específicas.
Mejorado - Controles de formato “Print” para caracteres alfanuméricos.
Mejorado++
- Opciones múltiples de fuentes de texto. ROBOTC y ROBOLAB manejan el tamaño 6x8, como otros sistemas, además del tamaño de fuente 12x16. - Se pueden eliminar, opcionalmente, líneas de texto antes de hacer nuevos gráficos. - Las rutinas para graficar son optimizadas para minimizar el tiempo real.
73
GRÁFICOS
Básico - Dibuja líneas, rectángulos, círculos y puntos simples en la pantalla LCD.
Mejorado
- Funciones para borrar y rellenar rectángulos y círculos para dar una capacidad de dibujo expandida. - Dibuja óvalos y círculos.
ÍCONOS - Habilidad de dibujar archivos de íconos en la pantalla.
Tabla 3.3. Capacidades de la pantalla LCD, tomado de [24]
Características del lenguaje
ATRIBUTO CARACTERÍSTICAS
VARIABLES
- Todas las soluciones soportan variables definidas por el usuario. - Existe un mecanismo especial para definir variables en el lenguaje NXT-G. - 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.
PUNTO FLOTANTE
- Todas las soluciones soportan cálculos con números enteros (“integer”). Las expresiones resultantes se redondean siempre al entero. - Algunos lenguajes textuales soportan fracciones o números en punto flotante.
FUNCIONES TRIGONOMÉTRICAS
- El soporte de funciones trigonométricas es útil en aplicaciones basadas en un “cálculo al ojo” de los resultados entregados por el codificador del motor.
ESTRUCTURA "SWITCH"
- Una declaración “switch” permite verificar múltiples condiciones a la vez. - Para muchos compiladores, el código para una declaración “switch” es 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
OTROS DISPOSITIVOS
- El firmware estándar del NXT-G soporta comunicaciones mediante bluetooth (BT) entre el PC y el NXT, así como entre diferentes NXTs. Incluye el uso del protocolo de mensajes de Lego “Fantom” para realizar las comunicaciones. - Existen requisitos que se deben cumplir para conectar un dispositivo BT que no soporta el protocolo “Fantom”.
DUPLEX (VELOCIDAD)
- El protocolo Fantom usa el enlace BT en la forma half-duplex. • El dispositivo máster del enlace BT puede enviar mensajes al
esclavo en cualquier momento. • El dispositivo esclavo solo envía mensajes al dispositivo máster en
respuesta a su requerimiento. Esto resulta en un uso ineficiente del enlace BT y en una gran latencia en el envío de mensajes del dispositivo esclavo al maestro.
- Algunas soluciones utilizan el enlace BT en la forma full-duplex. El dispositivo esclavo puede enviar mensajes al dispositivo máster independientemente de la existencia de un requerimiento de su parte, esto reduce significativamente la “latencia” de la transmisión. Tabla 3.5. Conectividad bluetooth, tomado de [24]
74
En el presente trabajo, se van a utilizar los lenguajes de programación NXT-G
(lenguaje con características gráficas) y NXC (lenguaje con código escrito).
Mediante NXT-G se programarán los siguientes prototipos:
- Medidor de longitud
- Calculadora de áreas y volúmenes
- Medidor de sonido
- Aplicaciones remotas
Los prototipos que se programarán con NXC son los siguientes:
- Escorpión
- Brazo mecánico
- Auto controlado mediante algoritmo PID
- Seguidor de línea
3.2 LENGUAJE DE PROGRAMACIÓN NXT-G [25]
NXT-G es un lenguaje que se muestra similar a un diagrama de flujo. Este
lenguaje viene incluido en el paquete Lego Mindstorms NXT y es desarrollado
sobre la plataforma Labview 7.1 del fabricante National Instruments. El lenguaje
es compatible con los sistemas operativos Mac OS X y Windows XP. Los
programas desarrollados en NXT-G usan una notación gráfica donde los bloques
que aparecen representan operaciones matemáticas, lógicas y otras y donde es
fácil notar la secuencia en que se deben realizar éstas y las demás acciones
relacionadas con los bloques.
A diferencia de otros lenguajes de programación como BASIC, C y Java, en 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 eXactly C (no
exactamente C) y se trata de un lenguaje textual de características similares a las
de C, que puede ser usado para programar exclusivamente el ladrillo NXT. El
lenguaje NXC proporciona estructuras de programa como arreglos, funciones,
tareas múltiples, sentencias de control de flujo, funciones de acceso a los
sensores y actuadores y sistemas de comunicación.
Los programas escritos en NXC son compilados para ser ejecutados por el
firmware de Lego Mindstorms NXT. NXC resulta ser la última de las versiones de
lenguajes de programación, realizado sobre la plataforma del lenguaje
91
ensamblador NBC (NeXT Byte Codes) y fue el primero en aparecer luego de que
Lego Mindstorms NXT lanzara su lenguaje NXT-G. Este lenguaje le corresponde
a John Hansen, quien a su vez es coautor, junto con David Baum, del lenguaje
Not Quite C (NQC), que se usa para programar la versión anterior RCX de Lego
Mindstorms. NXC es un lenguaje que se puede usar de forma libre y se lo puede
descargar desde: http://bricxcc.sourceforge.net/nxc. Hansen ha actualizado el
entorno de programación (IDE), llamado Bricx Command Center (BricxCC), para
NQC y otros lenguajes de programación desarrollados con NBC, como el NXC.
Este entorno de programación (IDE) se encuentra disponible bajo la dirección:
http://sourceforge.net/projects/bricxcc.
Es necesario tener en cuenta que, aunque el preprocesador y las estructuras de
control de NXC son muy similares al lenguaje C, NXC no es completamente un
lenguaje de programación de propósito general, ya que contiene muchas
restricciones debido a las limitaciones del intérprete de código de máquina del
NXT.
A diferencia del NXT-G, el lenguaje NXC es apropiado para aplicaciones de
control en tiempo real.
3.3.1 ENTORNO DE PROGRAMACIÓN PARA EL LENGUAJE NXC
El Bricx Command Center (BricxCC), entorno desarrollado originalmente por Mark
Overmars, se ejecuta únicamente bajo el ambiente de Microsoft Windows y ahora
se lo encuentra en su versión 3.3. Esta utilidad permite escribir los programas,
descargarlos en el ladrillo NXT, iniciar su ejecución y detenerlos, así como
también permite indagar acerca del estado de la memoria flash del NXT, convertir
archivos de sonido para ser usados por el ladrillo y mucho más. BricxCC actúa
más como un procesador de texto, pero con algunas características adicionales.
El entorno de programación incluye los tres clásicos componentes, tal y como se
puede observar en la figura:
92
Figura 3.35. Entorno de programación (BricxCC)
(1) Una barra de menú: incluye las típicas operaciones que se pueden realizar con
los archivos, comandos de edición, compilación y de descarga de programas
hacia el ladrillo NXT. Una opción muy importante es la denominada Preferences,
donde se pueden escoger diferentes opciones de configuración.
(2) Una barra de herramientas que incluye las utilidades de la barra de menú más
frecuentemente usadas.
(3) Un editor que está separado en dos partes: un árbol donde se muestra una
lista de elementos del lenguaje y la sección de edición. El editor provee al usuario
de un soporte de alto nivel para desarrollar programas NXC, con las
características esperadas para un entorno de programación moderno.
3.3.2 PROGRAMACIÓN EN NXC
Como en todo lenguaje de programación, existen reglas que deben cumplirse al
momento de usarlo; esto incluye reglas para la escritura de las sentencias,
estructura de los programas, sentencias y expresiones y las instrucciones para el
preprocesador:
93
- Tal y como sucede con los lenguajes C y C++, NXC distingue entre el tipo
de letra (minúscula y mayúscula) usada para escribir las sentencias. Esto
significa que la variable “Xyz” es diferente a la variable “xYz”.
- Para poder documentar de mejor manera el código fuente se suelen usar
comentarios, los mismos que no son tomados en cuenta por el compilador.
La forma de hacer comentarios es colocando el símbolo // al inicio del texto
que sirve como tal. Cuando se necesita hacer comentarios más largos o
que ocupan algunas líneas se procede de la siguiente manera: /*
comentario */.
- Los espacios dejados en blanco no suelen ser considerados por el
compilador y permiten que la comprensión del programa sea mayor; sin
embargo, existen operadores que constan de más de un carácter, donde
los espacios en blanco no son aceptados, pues provocan un error de
compilación.
- Las constantes numéricas pueden ser escritas en forma decimal (x=10;) o
en forma hexadecimal (x=0x10; // corresponde a 10 hexadecimal o 16
decimal).
- Las palabras clave que NXC tiene reservadas para su uso son las
siguientes:
__RETURN__ __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ónBool 8 bits sin signo byte, unsigned char 8 bits sin signoChar 8 bits con signounsigned 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 intint 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 arreglomi_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ónabs() sign()
Valor absoluto Signo del operando
++, -- Pos-incremento, pos-decremento (válido solo con variables)- ~ !
Menos (sistema unitario) Negación (sistema unitario) Negación lógica
*, /, % Multiplicación, división, módulo+, - Adición, sustracción <<, >> Desplazamiento a la izquierda, derecha <, >, <=, >= Operadores de orden==, != Igual a, distinto de & AND (a nivel de bits)^ XOR (o exclusivo a nivel de bits) l OR (a nivel de bits)&& 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 SignificadoTrue Siempre verdaderoFalse 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 < expr2 Verdadero si expr1 es menor que expr2expr1 <= expr2 Verdadero si expr1 es menor o igual que expr2expr1 > expr2 Verdadero si expr1 es mayor que expr2expr1 >= expr2 Verdadero si expr1 es mayor o igual que expr2! condition Negación lógica de una condicióncond1 && 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 I2C (Inter-Integrated Circuit).
Existen cuatro sensores que están internamente numerados como 0, 1, 2 y 3,
aunque externamente se llamen 1, 2, 3 y 4. Para evitar esta confusión se han
definido los nombres para los puertos S1 (IN_1), S2 (IN_2), S3 (IN_3) y S4 (IN_4),
los mismos que podrán ser usados en cualquier momento que se los requiera
como argumentos. En cualquier momento que se requiera los valores medidos
101
por los sensores se pueden también usar los nombres: SENSOR_1, SENSOR_2,
SENSOR_3 y SENSOR_4.
Se pueden mencionar las siguientes funciones que utilizan o activan el módulo de
entrada del NXT:
SetSensor(port, const configuration): setea el tipo y modo del sensor dado a la
configuración especificada.
SetSensorLight(port): configura el sensor ubicado en el puerto indicado como un
sensor de luz.
SetSensorSound(port): configura el sensor ubicado en el puerto indicado como
un sensor de sonido.
SetSensorTouch(port): configura el sensor ubicado en el puerto indicado como
un sensor de contacto.
SetSensorLowspeed(port): configura el sensor ubicado en el puerto indicado
como un sensor digital I2C (alimentado con 9V).
3.3.2.11 Módulo de salida
El módulo de salida del NXT incluye a todas las salidas que comandan motores.
Las constantes OUT_A, OUT_B y OUT_C son usadas para identificar a cada una
de las tres posibles salidas de forma individual, aunque también es posible
realizar combinaciones que también se encuentran definidas: OUT_AB, OUT_AC,
OUT_BC y OUT_ABC.
Es posible manejar la potencia de cada una de las salidas, la misma que se
definirá entre 0 (la menor potencia) y 100 (la mayor potencia). El ingreso de
valores negativos indicará una rotación en sentido contrario.
Entre las funciones que utiliza el módulo de salida se mencionan:
Off(outputs): apaga las salidas detalladas mediante un frenado inmediato.
Coast(outputs): apaga las salidas detalladas, haciendo un frenado paulatino.
102
OnFwd(outputs, pwr): hace que las salidas funcionen con marcha hacia
adelante y las enciende a la potencia pwr indicada.
OnRev(outputs, pwr): hace que las salidas funcionen con marcha en reversa y
las enciende a la potencia pwr indicada.
RotateMotor(outputs, pwr, angle): la salida indicada es activada con marcha
hacia delante y para el número de grados especificado.
RotateMotorPID(outputs, pwr, angle, p, i, d): la salida indicada es activada con
marcha hacia delante y para el número de grados especificado. Es posible
modificar las constantes proporcional, integral y derivativa del algoritmo de control
PID incluido en el firmware del NXT.
3.3.2.12 Módulo de sonido
El NXT permite la reproducción de tonos básicos, así como de dos diferentes
tipos de archivos de sonido: archivos *.rso, que son similares a los archivos *.wav
y archivos de melodías, que son similares a los archivos MIDI. Los archivos tipo
melodía son generalmente de menor extensión que los archivos .rso.
Para operar con el módulo de sonido se tienen las siguientes funciones:
PlayFile(filename): reproduce el archivo especificado en formato *.rso o *.rmd.
PlayFileEx(filename, volume, bLoop): reproduce el archivo especificado en
formato *.rso o *.rmd. El volumen varía entre 0 (valor mínimo) y 4 (valor máximo) y
bLoop es un valor booleano que indica si el archivo debe o no repetirse.
PlayTone(frequency, duration): reproduce un simple tono a la frecuencia (Hz) y
duración (ms) especificadas.
PlayToneEx(frequency, duration, volumen, bLoop): reproduce un simple tono
a la frecuencia (Hz), duración (ms) y volumen especificados.
3.3.2.13 Módulo de pantalla LCD
El NXT permite dibujar puntos, líneas, rectángulos y círculos en la pantalla LCD,
así como también permite escribir textos y números en la misma. Para entender
103
las diferentes funciones que incluye NXC hay que tomar en cuenta que el origen
de coordenadas se encuentra en la parte inferior izquierda de la pantalla.
Entre las funciones usadas para usar la pantalla LCD se destacan:
ClearScreen(): limpia la pantalla LCD.
NumOut(x, y, value, clear = false): dibuja un valor numérico en la pantalla en la
ubicación (x,y).
TextOut(x, y, msg, clear = false): dibuja un texto en la pantalla en la ubicación
(x,y).
GraphicOut(x, y, filename, clear = false): dibuja el ícono del archivo
especificado (*.ric) en la pantalla en la ubicación (x,y).
CircleOut(x, y, radius, clear = false): dibuja un círculo con centro (x,y) y radio
especificado.
LineOut(x1, y1, x2, y2, clear = false): dibuja una línea que va desde el punto de
coordenadas (x1,y1) hasta el punto (x2,y2).
PointOut(x, y, clear = false): dibuja un punto en las coordenadas (x,y).
RectOut(x, y, width, height, clear = false): dibuja un rectángulo en las
coordenadas (x,y) con ancho y altura dados.
ResetScreen(): recupera la pantalla estándar del NXT en modo de ejecución.
3.3.2.14 Módulo de comunicaciones
El módulo de comandos del NXT proporciona el soporte de protocolos necesarios
para que el NXT responda a comunicaciones USB o bluetooth, requeridas por el
PC o por algún otro ladrillo NXT. En el caso de la comunicación mediante
bluetooth, es necesario considerar la comunicación de tipo maestro-esclavo. Las
funciones que más aparecen para las comunicaciones mediante bluetooth son las
siguientes:
BluetoothStatus(connection): retorna el estado de la conexión bluetooth.
SendRemoteString(connection, queue, out strval): este método envía una
cadena de caracteres al dispositivo especificado en la conexión.
104
ReceiveRemoteString(queue, remove, out strval): este método es usado por el
ladrillo maestro para recibir una cadena de caracteres de un dispositivo esclavo.
SendRemoteNumber(connection, queue, value): este método envía un valor
numérico al dispositivo especificado en la conexión.
ReceiveRemoteNumber(queue, remove, out value): este método es usado por
el ladrillo maestro para recibir un valor numérico de un dispositivo esclavo.
SendResponseNumber(queue, value): este método envía un valor numérico
como respuesta a un mensaje recibido.
3.3.2.15 Manejo de archivos
El NXT puede escribir y leer sobre archivos que se encuentran almacenados en
su memoria flash. El límite para el número de archivos a almacenar está dado por
la capacidad o tamaño de la memoria flash. Mediante NXC se puede crear,
renombrar, borrar o encontrar archivos, así como leer y escribir textos, cadenas
de caracteres, números y bytes simples.
Las funciones más usadas son las siguientes:
CreateFile(filename, size, out handle): crea un nuevo archivo con el nombre y
tamaño especificados y lo abre para escribir en él.
OpenFileRead(filename, out size, out handle): abre el archivo especificado
para lectura.
CloseFile(handle): cierra el archivo asociado.
RenameFile(oldfilename, newfilename): cambia el nombre de un archivo por
otro nuevo.
DeleteFile(filename): borra el archivo especificado.
105
3.4 PROGRAMACIÓN DE LOS MÓDULOS DESARROLLADOS
3.4.1 MEDIDOR DE VARIABLES MÚLTIPLES
En esta aplicación se desea principalmente mostrar una forma de utilizar el NXT
como un medidor de diferentes parámetros. Ya que se cuenta con diferentes
sensores, se deberá conectar y configurar el sensor y puerto adecuado a la
magnitud que se desea medir.
3.4.1.1 Medidor de longitudes
La idea del presente proyecto es diseñar, construir y programar un dispositivo
capaz de entregar la medida de una longitud. Para ello se ha acoplado una rueda
a un motor NXT y se aprovecha la información otorgada por el sensor de rotación
interno sobre el ángulo girado, para luego convertirlo en una medida de longitud,
dado que se conoce el radio de la rueda.
Cada rueda de la firma Lego tiene marcadas las dimensiones correspondientes
en su parte lateral; así por ejemplo se tiene a disposición las siguientes ruedas:
- 43,2x22: diámetro de 43,2mm y ancho de 22mm
- 56x26: diámetro de 56mm y ancho de 26mm
- 81,6x15: diámetro de 81,6mm y ancho de 15mm
Lo que se desea es medir longitudes a través de la longitud recorrida por una
rueda. La fórmula que permite calcular esta distancia es la siguiente:
α
π
⋅=o360
2 Rx
Figura 3.36. Relación entre las variables α, R y x
106
donde:
x: distancia recorrida por la rueda
α: ángulo girado por el eje de la rueda
R: radio de la rueda
El ángulo α se determina a través de la medida entregada por el sensor de
rotación. De esta manera, la fórmula que deberá ser ingresada en el programa
queda de la siguiente manera para cada uno de las ruedas:
- Rueda 43,2x22: [ ] [ ]cmcmx αα
π
⋅≈⋅= 0376991118,0360
32,4o
[ ] [ ] [ ]cmcmcmx ααα
π
⋅≈⋅≈⋅=
53
2
05,53
2
360
32,4o
- Rueda 56x26: [ ] [ ]cmcmx αα
π
⋅≈⋅= 0488692191,0360
6,5o
[ ] [ ] [ ]cmcmcmx ααα
π
⋅≈⋅≈⋅=
41
2
93,40
2
360
6,5o
- Rueda 81,6x15: [ ] [ ]cmcmx αα
π
⋅≈⋅= 0712094335,0360
16,8o
[ ] [ ] [ ]cmcmcmx ααα
π
⋅≈⋅≈⋅=
14
1
04,14
1
360
16,8o
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:
100_
__⋅
−
=
realvalor
realvalorcalculadovalorerror
Rueda Valor real Valor calculado Error
43,2x22 α
π
⋅=o
360
32,4x
53
2α=x 0,097%
56x26 α
π
⋅=o
360
6,5x
41
2α=x -0,182%
107
Rueda Valor real Valor calculado Error
81,6x15 α
π
⋅=o
360
16,8x
28
2α=x 0,308%
Tabla 3.10. Error producido por aproximaciones en el cálculo de la longitud recorrida
3.4.1.1.1 Diagrama de flujo del medidor de longitudes
A continuación se presenta el diagrama de flujo del programa desarrollado en
NXT-G:
Figura 3.37. Diagrama de flujo del medidor de longitudes
108
3.4.1.1.2 Código NXT-G del medidor de longitudes
Para generar y entender el código NXT-G del programa es necesario primero
definir las variables que van a ser usadas:
Variable Tipo ComentarioLongitud Número Almacena la longitud calculada Rueda Número Almacena el factor dependiente del tipo de rueda
usado Flag Lógica Variable auxiliarTipo_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.
10
9
F
ig 3
.38. P
rogr
ama
NX
T-G
del
med
idor
de
long
itude
s
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 ComentarioLongitud Número Almacena la longitud calculadaAncho Número Almacena el ancho calculado Profundidad Número Almacena la profundidad calculadaRueda Número Almacena el factor dependiente del tipo de rueda
usadoFlag Lógica Variable auxiliarTipo_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 cm3) por lo que el
volumen máximo a calcular será de 99 999 999cm3; es decir, aproximadamente
100m3. Este límite será suficiente para la gran mayoría de aplicaciones, pero es
necesario tenerlo en cuenta.
11
3
11
4
Fig
ura
3.4
0. P
rogr
ama
en N
XT
-G d
e la
cal
cula
dora
de
área
s y
volú
men
es
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
muestreo y de longitud igual a
⋅
3
_int2
sensormedida, donde la función int
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=Kp10):
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=Ki10); 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=Kd10):
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
INICIALIZACIÓN DE VARIABLESINICIALIZACIÓN DE SENSORES
INGRESO DE PARÁMETROS: CONSTANTES P, I, D Y TOLERANCIA
INICIO
INICIO DEL CONTROL PID
MEDICIÓN DEL VALOR REFERENCIAL A TRAVÉS DEL SENSOR DE ULTRASONIDO
MEDICIÓN DE LA DISTANCIACÁLCULO DEL ERROR (e)
¿ES e>tolerancia?
CÁLCULO DE LAS ACCIONES P, I, DNORMALIZACIÓN DE LA SALIDA
ACCIONAMIENTO DE LOS MOTORES
RESETEO DEL ERROR ACUMULADO
NO
SÍ
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)<min) return min; else return abs(potencia);
/* Función que enciende los motores A y C. El valor del error determina si los motores se mueven hacia adelante o hacia atrás. */ int move(int errorActual, int pot) if(errorActual<0) // Activa sincronizadamente los motores A y C en dirección reversa. OnRevReg(OUT_AC, potNormal(pot), OUT_REGMODE_SYNC); else // Activa los motores A y C en dirección hacia adelante. OnFwdReg(OUT_AC, potNormal(pot), OUT_REGMODE_SYNC);
// Función que permite ingresar los parámetros del controlador
void ingreso(int &bb) // bb es el nombre de la variable a ingresar ClearScreen(); TextOut(0,LCD_LINE1,"Constante"); TextOut(0,LCD_LINE2,nombre); TextOut(30,LCD_LINE4,simbolo); NumOut(60,LCD_LINE4,bb); TextOut(29,LCD_LINE8,"Aceptar"); GraphicOut(10,10,"backward.ric"); GraphicOut(75,10,"forward.ric"); Wait(500);
until(ButtonPressed(BTNCENTER,true)==1) while(ButtonPressed(BTNLEFT,false)==1 || ButtonPressed(BTNRIGHT,true)==1) if (ButtonPressed(BTNLEFT,true)==1) if (bb > 0) bb --; TextOut(60,LCD_LINE4," ");// Borra de la pantalla el valor anterior NumOut(60,LCD_LINE4,bb); Wait(250); else if (bb < 100) bb ++; TextOut(60,LCD_LINE4," ");// Borra de la pantalla el valor anterior NumOut(60,LCD_LINE4,bb); Wait(250);
135
NumOut(60,LCD_LINE4,bb); Wait(500);
task main() // 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 AcciónBotón izquierdo El auto gira a la izquierdaBotón naranja El auto se detiene completamente y reproduce un
tono musicalBotón derecho El auto gira a la derecha Ningún botón El auto se mueve en línea rectaTabla 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 ComentarioBotPres 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 2Botó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:
2_
velocidadbarraLongitud =
y su posición horizontal va desde el píxel 50 hasta el píxel que se puede calcular
mediante la fórmula:
250_
velocidadfinalpixel += .
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)
14
4
3.4.
6.1.
2 C
ódig
o N
XT
-G d
el c
ontr
ola
dor
(mando)
Fig
ura
3.4
9. P
rogr
ama
NX
T-G
del
con
trol
ador
rem
oto
(man
do)
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 ComentarioBoton Número Almacena un valor de acuerdo al botón presionado.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
14
7
3.4.
6.2.
2 C
ódig
o N
XT
-G d
el v
ehíc
ulo
contr
ola
do
Fig
ura
3.5
1. P
rogr
ama
NX
T-G
del
aut
o co
ntro
lado
rem
otam
ente
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 relativo43,2x22 115cm 109cm -5,22% 56x26 115cm 117cm 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
43,2x22 115cm
109cm
-7,11%
56x26 115cm
116cm
2,38%
81,6x15 115cm
113cm
-3,21%
43,2x22 12cm
11cm
-16,67%
56x26 12cm
12cm
-1,52%
81,6x15 12cm
12cm
-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
43,2x22 115cm
109cm
-25,69%
56x26 115cm
116cm
2,38%
81,6x15 115cm
113cm
-3,21%
43,2x22 12cm
11cm
-21,62%
152
Rueda Valor “real” Valor medido Error
56x26 12cm
12cm
-7,37%
81,6x15 12cm
12cm
-7,37%
Tabla 4.3. Comparación entre valores “reales” y medidos de diferentes volúmenes, haciendo uso de distintos tipos de ruedas en la calculadora de áreas y volúmenes
Conclusión: ya que el medidor de longitudes es la base de la calculadora de
áreas y volúmenes, las observaciones realizadas anteriormente son válidas
también para este proyecto. Cabe mencionar nuevamente que los márgenes de
error actuales son de orden mayor, ya que ahora estos se ven multiplicados entre
sí. Se mantiene el hecho de que la rueda de 56x26 (mm) es la que mejores
resultados finales ofrece.
El prototipo funciona adecuadamente aún cuando las baterías se encuentran
cerca de finalizar su tiempo de vida útil, ya que el sensor de rotación entrega
medidas aceptables.
4.1.3 MEDIDOR DE SONIDO
No se cuenta exactamente con un medidor de sonido; lo que hace el prototipo
diseñando es entregar una medida relativa de la intensidad de sonido existente.
Sin embargo, es interesante realizar pruebas por ejemplo con diferentes fonemas,
cuya pronunciación exige variar la intensidad del sonido y verificar en la pantalla
cómo se produce esta variación.
Se presenta a continuación algunas imágenes de las pruebas realizadas.
153
Fonema Imagen
hola
corpúsculo
robot
Tabla 4.4. Imágenes obtenidas en la pantalla del NXT al hacer actuar al medidor de sonido
154
En las imágenes se puede también observar la señal que produce el ruido de
fondo.
Conclusión: los resultados obtenidos demuestran que la pronunciación de
distintos fonemas genera diferentes resultados, los mismos que podrían ser
posteriormente utilizados para su mejor análisis, por ejemplo si se trata de
comparar niveles sonoros en diferentes ambientes y bajo condiciones similares en
el momento de hacer las mediciones. No se puede olvidar que solo se tiene una
señal de amplitudes, de intensidad sonora. De todas maneras se muestra otra
posibilidad de ocupar el NXT y, entre ellas, las características gráficas de su
pantalla de LCD.
En este proyecto, el nivel de carga de las baterías sí tiene un efecto sobre los
resultados finales. Se observó que la intensidad registrada por el sensor de
sonido es menor cuando las baterías se encuentran cerca de cumplir su tiempo
de vida útil.
4.2 ESCORPIÓN
Este prototipo tiene gran complejidad en el aspecto mecánico. En la parte de la
programación se ha intentado darle una cierta versatilidad a su funcionamiento,
haciendo que el usuario final pueda definir, mediante el uso de las teclas
existentes, la forma de operación deseada.
Se han detectado algunos problemas en la operación de este prototipo. Uno de
ellos tiene que ver con las mediciones realizadas por el sensor de ultrasonido.
Debido a su principio de funcionamiento, este sensor depende de la superficie del
cuerpo que se encuentra frente a él para poder entregar mediciones que puedan
considerarse válidas. Así, una superficie rugosa, por ejemplo, representa una
dificultad para realizar mediciones adecuadas, ya que el reflejo de la señal de
ultrasonido no siempre está dirigido de tal forma que pueda ser captada por el
sensor.
155
Otro problema representó la ubicación del sensor de sonido. Cuando se
realizaban las pruebas sobre una superficie suave (una alfombra por ejemplo)
este sensor actuaba sin mayores dificultades. Sin embargo, al realizar las mismas
pruebas sobre una superficie “dura”, el ruido generado por el contacto de las
patas con el piso generaba una señal de ruido tal que activaba la parte de
software destinada a otras circunstancias. Por tal razón se colocó a este sensor
en el extremo de un brazo que le permita “alejarse” un poco de las fuentes de
ruido propias del equipo diseñado.
Conclusión: los resultados obtenidos fueron satisfactorios en la medida que se
consiguió una operación del prototipo similar a la esperada. Las fuentes de error
anteriormente mencionadas tienen un efecto negativo en el funcionamiento del
equipo.
El nivel de carga de las baterías es también determinante para un correcto
funcionamiento del sensor de ultrasonido, pues parece que éste fue el más
afectado al momento de realizar mediciones con baterías descargadas.
Obviamente, los motores se ven afectados notablemente por un nivel bajo de
carga de las baterías.
4.3 BRAZO MECÁNICO
El prototipo del brazo mecánico presenta complicaciones principalmente de tipo
mecánico, algunas de cuales se resolvieron mediante software.
El prototipo diseñado permite definir externamente las posiciones extremas que
va a ocupar el brazo físicamente. Además cuenta con un único sensor de fin de
carrera (sensor de contacto) en uno de sus extremos, de tal manera que se pueda
evitar el rebasarlo. Aunque por su estructura mecánica este brazo podría girar
360° sobre su eje, el mayor problema existente es q ue eso provocaría un enredo
de los cables que van a los sensores y a los motores, con la consecuente
sobretensión mecánica sobre ellos, que podría inclusive dañarlos. Sería óptimo
156
colocar otro sensor de fin de carrera en el otro extremo, pero lamentablemente
cada kit de los empleados cuenta únicamente con uno de estos elementos.
Mecánicamente se ha colocado un sistema reductor de velocidad en el complejo
que permite el movimiento horizontal del brazo, pero un sistema similar no fue
posible colocar en el bloque que permite el movimiento vertical. Esto provoca que
la subida y bajada del brazo sea un tanto brusca. Para hacerla más suave se
probó usando velocidades (potencias) menores, pero también hay que tomar en
cuenta que una velocidad (potencia) muy baja, no permitirá vencer la inercia del
brazo, sobretodo en el momento de tener que subirlo. Para facilitar el movimiento
horizontal, éste se hace únicamente con el brazo en la posición superior, ya que
allí la inercia a vencer es menor.
Una dificultad encontrada en el brazo se tiene en el momento de reconocer los
colores de los elementos (bolas) que van a ser desplazados. Ya que no contamos
realmente con un sensor de color sino de luz, la iluminación ambiental afecta
notoriamente en el momento de “reconocer” los colores.
El nivel de carga de las baterías usadas afecta notablemente a este prototipo,
pues le impiden su funcionamiento adecuado, principalmente en el momento de
tener que subir el brazo y del reconocimiento del color por parte del sensor de luz.
Conclusión: el funcionamiento del brazo mecánico diseñado puede considerarse
como adecuado. Se podría pensar en un nuevo diseño mecánico que le permita
una operación mucho más suave en su operación, sobretodo en el eje vertical.
4.4 VEHÍCULO CONTROLADO MEDIANTE ALGORITMO PID
El programa desarrollado permite definir manualmente los valores de los
parámetros que intervienen en el algoritmo controlador tipo PID. De la
sintonización adecuada de estos valores depende el éxito del controlador; sin
embargo, existen factores adicionales que son causa de error en el proceso,
como por ejemplo el hecho de no contar con aritmética de punto flotante para la
157
realización de los cálculos, lo que obliga a amplificar los valores de las constantes
del controlador, o la imprecisión de las medidas realizadas por el sensor de
ultrasonido en dependencia del tipo de superficie en el que refleja su señal.
El programa desarrollado permite averiguar cuál es el efecto de cada una de las
constantes que intervienen en el controlador PID:
Control tipo P: las constantes I y D son iguales a cero. En este caso, al mover el
objeto que sirve como referencia para el vehículo, este último intenta corregir su
posición para regresar al valor inicial de distancia (referencia). Finalmente lo
consigue, pero el tiempo total que le toma es grande, tanto en el caso de errores
grandes como cuando se trata de errores pequeños.
Para la sintonización de un controlador tipo P se recomienda iniciar con un cierto
valor de la constante P y modificarlo en función de la respuesta obtenida hasta
que esta sea más o menos satisfactoria. El tiempo de respuesta depende
directamente del valor de la constante: si se quiere una respuesta más rápida
habría que aumentar el valor de P y viceversa. Un valor muy grande de P puede
llevar a desestabilizar al sistema.
Control tipo PI: la constante D es igual a cero. Al mover el objeto que sirve como
referencia para el vehículo, este intenta corregir su posición para regresar al valor
inicial (referencia) y la inserción de la constante I acelera este proceso. El término
proporcional intenta corregir el error, mientras que el término integral crece con el
error y suma su efecto al primero. Mientras más tiempo persiste el error, mayor es
el valor con el que actúa el término integral, acelerando de esta forma el proceso
de corrección. Uno de los problemas de este tipo de control es que un aumento
grande del error puede llevar a desestabilizar al sistema sin posibilidad de retorno
o asimismo puede generar grandes oscilaciones en él.
La sintonización del término integral debe permitir mantenernos en un nivel
intermedio entre la aceleración deseada para la corrección y el valor máximo
aceptable para una oscilación del sistema.
158
Control tipo PID: ahora aparecen las tres constantes, añadiéndose así el término
derivativo. El término integral produce una aceleración de la corrección alrededor
del nivel de referencia deseado, mientras que el término derivativo actúa frente a
un cambio brusco en el error haciendo que la señal total de salida se reduzca. De
esta forma se pretende llegar más rápido a la señal de referencia.
Normalmente, un incremento en la constante derivativa exige otro en la constante
integral. La sintonización debe realizarse con cuidado, de tal manera que no se
caiga en un sistema inestable.
Una visualización del proceso de corrección de la posición final mediante el
algoritmo PID, podría permitir escoger adecuadamente los valores requeridos
para un mejor funcionamiento del prototipo.
A continuación se presentan algunos resultados de la operación de este prototipo
con diferentes valores de las constantes P, I y D, así como de la tolerancia
ingresada.
En todos los casos se realizó la siguiente experiencia:
- Ubicación inicial: valor referencial = 100cm
- Acercamiento del objeto a una distancia d = 50cm
- Alejamiento del objeto a una distancia d = 150cm
Se operó sobre un piso de cerámica, el mismo que ofrece buena adherencia con
las ruedas utilizadas.
159
Constantes(amplificadas por 10)
Respuesta(tiempo de pantalla = 19s)
Comentarios
P = 50 I = 0 D = 0 Tolerancia = 10
Existe una oscilación grande antes de llegar a un resultado dentro del margen de tolerancia.
P = 50 I = 0 D = 0 Tolerancia = 0
Existe una oscilación grande antes de llegar a un resultado dentro del margen de tolerancia, el mismo que no es cumplido y el vehículo intenta todo el tiempo llegar a él, pero la potencia es muy baja para vencer la inercia.
P = 50 I = 10 D = 0 Tolerancia = 10
La oscilación es menor que la que se veía anteriormente y se llega más rápidamente al punto de referencia, dentro del margen de tolerancia ingresado.
P = 50 I = 10 D = 0 Tolerancia = 0
A diferencia del caso anterior (tolerancia=0), el controlador permite acercarse más fácilmente al nivel de referencia.
160
Constantes(amplificadas por 10)
Respuesta(tiempo de pantalla = 19s)
Comentarios
P = 50 I = 15 D = 10 Tolerancia = 10
La respuesta esperada, con el margen de tolerancia indicado, se consigue mucho más rápidamente.
P = 50 I = 15 D = 10 Tolerancia = 0
Se llega prácticamente a conseguir el nivel de referencia de forma rápida.
Tabla 4.5. Respuesta del controlador PID con diferentes valores de los parámetros del algoritmo
Conclusión: el éxito de la aplicación de un algoritmo de control PID está, por
supuesto, en su correcta implantación y en una buena sintonización del mismo.
El nivel de carga de las baterías afecta a este prototipo en la medida en que, ante
un valor bajo de su carga, el sensor de ultrasonido no entrega mediciones
aceptables y los motores no funcionan a la potencia deseada.
4.5 SEGUIDOR DE LÍNEA
Para llegar al resultado mostrado se pasó por diferentes pruebas con distintos
tipos de algoritmos, desde los más simples hasta los más elaborados y en cada
uno de ellos se encuentran ventajas y desventajas. Ya que cada kit 8527 cuenta
únicamente con un sensor de luz, se probaron los algoritmos que cumplían con
esta limitación.
161
Finalmente se llegó a probar la opción de un controlador tipo PID para conseguir
el resultado buscado, el mismo que fue aceptable aunque no por ello perfecto.
Igual que en el caso anterior, parte del éxito de este prototipo depende de la
correcta sintonización del controlador PID. A diferencia del proyecto anterior, no
se ofrece la posibilidad de cambiar los valores de las constantes sino únicamente
a través de la modificación del software. El nivel de iluminación variable del medio
en el que se desenvuelva el prototipo también puede afectar su funcionamiento.
Ya se indicó anteriormente que el dispositivo diseñado no es exactamente un
seguidor de línea, sino un seguidor del borde de la línea, puesto que lo que hace
inicialmente es ejecutar un barrido para determinar valores máximo y mínimo de
intensidad luminosa al recorrer la línea y su alrededor y luego mantiene como
referencia aquel valor que resulta de promediar los anteriores.
Una correcta o incorrecta sintonización del controlador PID hará que el vehículo
tenga un recorrido suave o accidentado respectivamente, sobre el borde de la
línea a seguir.
A continuación presento algunos de los resultados obtenidos en el seguidor de
línea al aplicar un controlador tipo PID. La trayectoria de prueba se muestra en la
siguiente figura:
Figura 4.1. Plantilla para probar el seguidor de línea
162
Constantes Respuesta Comentarios
P = 30 I = 0 D = 0
El vehículo sigue la línea negra, sobre su borde, mayoritariamente sobre la región clara de la lámina.
P = 40 I = 0 D = 0
El vehículo sigue la línea negra, sobre su borde, mayoritariamente sobre la región clara de la lámina aunque la corrección del error es más rápida que antes.
P = 50 I = 1 D = 0
El vehículo sigue de forma más aproximada la línea negra, oscilando alrededor de ella.
P = 80 I = 1 D = 10
Con estos valores de parámetros, el vehículo completó sin mayor problema tres vueltas en la zona de pruebas.
Tabla 4.6. Respuesta del seguidor de línea ante la aplicación de un controlador PID
La siguiente prueba consistió en recorrer las trayectorias mostradas en la
siguiente figura. Todas ellas tienen una forma similar, pero difieren en el color. Lo
que se observó es que hubo éxito únicamente en el caso de la línea negra. Con la
163
línea celeste, el vehículo pronto perdió su ruta y con la línea roja, ni siquiera la
reconoció sobre el piso cerámico de color crema.
Figura 4.2. Trayectorias de prueba para el seguidor de línea
El resultado obtenido con el seguidor de línea sobre la línea negra, de las tres
mostradas en la figura anterior es el siguiente. Los parámetros de trabajo fueron:
P=80, I=0 y D=2.
Figura 4.3. Resultado al seguir la línea negra de la Fig. 4.2
Conclusión: los parámetros ingresados para el controlador PID tienen gran
influencia en el comportamiento del seguidor de línea y su éxito depende de la
correcta sintonización del mismo. Para mejorar el funcionamiento de este
prototipo habría que modificar su estructura mecánica colocando, por ejemplo, un
mayor número de sensores de luz, pero estos no están disponibles.
164
Por los resultados observados, un controlador tipo P sería suficiente para
conseguir un resultado aceptable para el seguidor de línea, aunque la inclusión de
un control integral y/o derivativo permite seguir de mejor manera la línea descrita.
Para mejorar los resultados, sin embargo, se podría probar, entre otras opciones,
con la inclusión de un segundo sensor luminoso, con lo que seguro se obtendrían
mejores resultados, pero esto iría en contra de la idea inicial de este trabajo, que
consistía en desarrollar prototipos haciendo uso de las piezas disponibles en un
solo kit de trabajo.
El nivel de carga de las pilas usadas interfiere sobre el correcto funcionamiento
del sensor de luz y de los motores, por lo que es necesario tener en cuenta este
particular al momento de probar el diseño.
4.6 APLICACIONES REMOTAS
El programa desarrollado para que los prototipos anteriormente diseñados
funcionen adecuadamente, según lo que requiere este proyecto, es bueno y no
muestra mayores dificultades en su ejecución. El factor que mayores problemas
genera en este proyecto es la distancia de operación, ya que se trabaja de forma
remota inalámbrica mediante bluetooth. Las pruebas que se hicieron consistían en
verificar que los dispositivos funcionan adecuadamente desde diferentes
distancias y ante la presencia de obstáculos. Los resultados se muestran a
continuación.
Se hicieron pruebas a diferentes distancias de mando y el equipo funcionó
satisfactoriamente hasta una distancia de aproximadamente 20m y con
obstáculos incluidos en el camino (ventanas y paredes), a pesar de que entre las
características mencionadas por el fabricante se habla de una distancia de
operación máxima de 10m.
De la misma manera se hicieron pruebas con la comunicación bluetooth entre dos
ladrillos NXT, manteniendo encendidos y en operación otros dispositivos que
165
tienen esta posibilidad de comunicación y no hubo o no se notó ningún tipo de
interferencia en su funcionamiento.
Lamentablemente, un factor cuyo efecto es difícil de cuantificar es el que
corresponde al nivel de las baterías, pero cualitativamente se puede mencionar
que la distancia máxima de operación disminuye ante un valor de carga bajo de
las pilas.
Conclusión: el programa diseñado muestra la versatilidad que tiene el ladrillo
programable NXT en el momento de comunicarse con otro de las mismas
características. La barrera de la distancia no debería representar una gran
limitación para la gran mayoría de aplicaciones a desarrollar.
166
CAPÍTULO 5
CONCLUSIONES Y RECOMENDACIONES
5.1. CONCLUSIONES
- El objetivo de este trabajo, que consistía en construir y programar un
conjunto de robots móviles sobre la base del producto Lego Mindstorms en
su versión NXT, se ha cumplido en su totalidad y se ha demostrado la
facilidad y versatilidad que ofrece el producto mencionado para el
desarrollo de aplicaciones robóticas.
- El trabajo desarrollado permite tener una visión suficientemente profunda
sobre el tema e invita a seguir conociéndolo e investigándolo. Es necesario
mencionar que también existen limitaciones, las mismas que serán
decisivas en dependencia de la aplicación que se encuentra en desarrollo.
- La plataforma sobre la que está desarrollado el producto Lego Mindstorms
NXT ofrece básicamente dos ventajas: un relativo bajo precio y grandes
prestaciones. Si se lo considera como un juguete, puede tratarse de uno
costoso, pero si se lo compara con otras plataformas para diseño de
robots, resulta que ésta ofrece un infinito espectro de opciones que van
desde las más simples hasta las más complejas y variadas.
- El trabajo con plataformas como la de Lego Mindstorms NXT permite
promover el trabajo en equipo, la programación de equipos reales, la
construcción e integración de sistemas, la información de carácter
multidisciplinario, etc.
- El entorno de Lego Mindstorms es muy flexible, así como fácil de usar y
muy potente, y permite desarrollar una gran variedad de actividades de
programación y control de robots con la implementación de diferentes
167
controladores para cumplir con las tareas deseadas. En el trabajo, por
ejemplo, se han probado dos distintos controladores de tipo PID sobre
diferentes magnitudes y en ambos casos ha sido posible ver la variación de
los resultados ante un cambio de las constantes o parámetros que
intervienen.
- En cuanto a los lenguajes de programación, NXT-G es una muy buena
opción como una solución gráfica, mientras que NXC es una opción de
código abierto orientada a la escritura de código. Cada una de las opciones
mostradas tiene ventajas y desventajas y el usuario final puede escoger de
entre ellas o de entre las muchas otras opciones existentes, dependiendo
de la aplicación que se encuentra en desarrollo.
- La versión de Lego utilizada es la 1.0. Actualmente existe en el mercado la
versión 2.0 que adicionalmente cuenta con un elemento nuevo de
hardware como lo es un sensor de color y su software incluye mejoras
siendo, dentro de ellas, la más notable la posibilidad de trabajar con
aritmética de punto flotante.
5.2. RECOMENDACIONES
- Es importante, antes de iniciar un proyecto con Lego Mindstorms, el
trazarse las metas y plantearse bien los objetivos que desean ser
cumplidos. Aunque esta recomendación es válida en cualquier situación
que debe ser resuelta, se considera que aquí es especialmente válida,
pues es fácil “perderse” en el camino ya que se cuenta con un juguete que,
con seguridad, ha fascinado a muchos desde la época de la infancia.
- Existe una gran comunidad de desarrolladores o simplemente fanáticos del
producto, que ofrecen consejos sobre diferentes tópicos y frente a las
típicas dificultades que suelen presentarse al trabajar con Lego
Mindstorms. La recomendación es acudir a estos grupos y buscar, junto a
ellos, las mejores soluciones a los problemas planteados. De la misma
168
manera, las investigaciones de este gran grupo de personas se constituyen
en una gran fuente de información y de nuevos recursos para aprovechar
de mejor manera todas las opciones del producto.
- El kit 8527 puede ser limitado en muchas de las aplicaciones que se quiere
desarrollar. Conviene por ello abastecerse de kits adicionales, con piezas
especiales, que permitirán realizar aplicaciones de mayor complejidad y
tamaño. En el mercado hay muchas opciones y es necesario ver qué tipo
de recursos son los más necesitados, dependiendo de las aplicaciones que
se van a desarrollar. De la misma manera, existen empresas dedicadas a
la construcción de sensores especiales para este producto, así como
también hay muchos documentos donde se mencionan las características
eléctricas y protocolos de comunicación usados, para que sensores de
diseño personal puedan acoplarse con éxito a la unidad central de proceso
del NXT.
- Un gran problema con el uso del producto en mención es el consumo de
pilas. Por ello conviene abastecerse del paquete de baterías recargables
de la marca o, a su vez, diseñar un equipo que cumpla con las
características eléctricas exigidas por el producto. Con esto se promueve
también un cuidado del medio ambiente.
169
REFERENCIAS BIBLIOGRÁFICAS
[1] Blogger.com; “Historia del arte de la Robótica: tipos de robots”; 2009;
http://robotik-jjlg.blogspot.com/2009/03/tipos-de-robots-2.html
[2] MIT Media Lab; “Seymour A. Papert | MIT Media Lab”;
http://www.media.mit.edu/people/papert
[3] MIT Media Lab; “ Mitchel Resnick | MIT Media Lab”;
http://www.media.mit.edu/people/mres
[4] KENNETH, Berry; “Teaching with Robots”; 2008
[5] MIGLINO, Orazio y otros; “La robótica como herramienta para la
educación”; 2000.
[6] Mellbin, Franz, “Mindstorms in Education”;
http://www.crynwr.com/lego-robotics/education.html
[7] Wikipedia; “LEGO”; http://es.wikipedia.org/wiki/LEGO
[8] Universidad de Colorado; “Motors”; 2002;
http://csel.cs.colorado.edu/~bauerk/legorobots/motors.html
[9] Tufts University; “Welcome to LEGO Engineering”;
www.legoengineering.com
[10] CEA Comité Español de Automática; Valera, A., Vallés, M y otros;
“Desarrollo y Control de Robots Móviles de Bajo Coste”; http://www.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: PerrorpOut ⋅= , donde P representa a la constante
proporcional del controlador.
- Salida integral: IsumErroriOut ⋅= , 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: dtprevErrorerrorDdOut ⋅−⋅= )( , 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
del motor
Giro del eje al que
está sujeta la cuerda
Longitud de la cuerda
(eje de 7,5mm de diámetro)
360° 360°·5 = 1800° mmmm
8,117360
75,321800 =
⋅⋅
⋅o
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
o
2,122408,117
360=⋅ mm
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 5
4 4
3 3
2 2
1 1
DD
CC
BB
AA
INT
A0
DIR
A
INT
B0
DIR
B
INT
C0
DIR
C
MC
IN0
MC
PW
M
AD
C_
A0
I_O
NA
DIG
IA1
DIG
IA0
P_
EN
AD
C_
B0
I_O
NB
DIG
IB1
DIG
IB0
AD
C_
C0
I_O
NC
DIG
IC1
DIG
IC0
DO
A
RE
A
DE
A
DIA
AD
C_
D0
I_O
ND
DIG
ID1
DIG
ID0
INT
B0
DIG
IB0
VM
BT
_R
EQ
RX
BT
VC
C1
.8V
VC
C1
.8V
VC
C1
.8V
TC
KC
SB
T
TD
I
VC
C1
.8V
XIN
TS
T
DIR
AIN
TC
0
DIG
ID0
AV
RS
CL
DO
AD
IA
DE
AR
EA
DIR
C
RS
TB
T
CT
S@
AR
M
INT
A0
RT
SB
T
DIG
IC1
DIG
IA0
DIG
IB1
DIG
IA1
SO
UN
D_
AR
MA
TXB
T
MIS
OB
T
SC
KB
T
VC
C1
.8V
SO
UN
D_
AR
MA
RT
SB
TR
TS
@B
T
MC
IN1
AV
RS
DA
DIG
ID1
VC
C3
V
NR
ST
DD
P
DD
M
DD
PD
DM
US
B_
AD
C
US
B_
AD
C
CS
BT
MA
IN0
MA
PW
M
MA
IN1
MB
IN0
MB
PW
M
MB
IN1
MA
IN1
I_O
NB
MC
IN1
P_
EN
MB
IN0
I_O
NA
MC
PW
M
MC
IN0
AV
RS
I
AV
RS
CK
BU
TT
ON
0
VC
C_
AV
R5
V
MB
PW
M
AD
C_
C0
AD
C_
D0
MB
IN1
AD
C_B
AT
T
AD
C_
A0
MA
IN0
AV
RS
O
AD
C_
B0
VM
BT_S
TA
TE
AD
C_
I
BA
TT
_P
ULS
VC
C1
.8V
DIR
B
DIG
IC0
VC
C3
V
RS
TB
T
I_O
ND
JT
AG
SE
L
BA
TT
_P
ULS
SC
KB
T
BU
TT
ON
0
SIB
T
SO
BT
SC
KB
TC
SD
IS
GN
DB
UT
T_
AD
C
SO
BT
VC
C3
V
MA
PW
M
I_O
NC
GN
D
RX
BT
TXB
T
SO
BT
MIS
OB
T
VM
BT_S
TA
TE
VM
BT
_R
EQ
AD
C_
I
BU
TT
_A
DC
GN
DV
CC
_A
VR
5V
AV
RS
IA
VR
SO
AV
RS
CK
VM
BT_S
TA
TE
SIB
T
SIB
T
DIG
ID1
AV
RS
CL
AV
RS
DA
CS
DIS
AV
RR
ES
ET
AV
RR
ES
ET
BA
TT
_P
ULS
AD
C_B
AT
T
VC
C_
AV
R5
V
US
B_
DP
VC
C3
V
US
B_
DP
TS
T
PU
10
K
TD
I
TM
S
GN
D
VC
C3
V
NR
ST
GN
D
TM
ST
CK VC
C3
V
VC
C5
V
GN
D
TXB
T
CT
S@
AR
MR
TS
@B
T
TD
O
TD
O
AD
C_
A0
AD
C_
B0
AD
C_
C0
AD
C_
D0
RT
S@
BT
CT
S@
AR
M
TXB
T
VC
C5
V
VC
C3
V
VC
C_
AV
R5
VV
CC
_A
VR
5V
VC
C3
V
VC
C9
V
VC
C_
SN
D
VC
C3
VV
CC
3V
VC
C3
V
VC
C3
V
VC
C_
SN
D
VC
C3
V
VC
C3
V
VC
C3
V
VC
C3
V
VC
C3
VV
CC
3V
RE
A
DE
A
DIA
DO
A
DIR
B
INT
A0
DIR
A
MC
IN1
MC
IN0
MC
PW
M
INT
B0
INT
C0
DIR
C
AD
C_
A0
I_O
NA
DIG
IA0
DIG
IA1
DIG
ID1
DIG
IC1
DIG
IB1
AD
C_
B0
I_O
NB
DIG
IB0
AD
C_
C0
I_O
NC
DIG
IC0
AD
C_
D0
I_O
ND
DIG
ID0
MA
IN1
MA
IN0
MA
PW
M
MB
IN1
MB
IN0
MB
PW
M
AD
C_
I
P_
EN
BA
TT
_P
ULS
AD
C_B
AT
T
TS
T
of
Title
Pro
ject
Nu
mb
er
En
gin
ee
r/co
nstr
ucte
r
Sch
em
ati
c N
am
e
Da
te (
YY
YY
/MM
/DD
)
Dra
fte
rD
ate
(Y
YY
Y/M
M/D
D)
Sh
ee
tP
age S
ize
Ve
rsio
n
14
A3
LE
GO
Ha
rdw
are
LE
GO
I
4.7 and 2.2 must be X7R
100 nF and 470 pF must be NP0
Blue Tooth PCB to PCB connector
GND
GND
N.C.
N.C.
ARM JTAG interface
2 1
4 3
6 5
8 7
10 9
12 11
14 13
16 15
18 17
20 19
GND
GND
GND
GND
GND
GND
GND
VCC3V
VCC3V
TDI
TMS
TCK
TDO
10k PULL UP
TCK
1 2
3 4
5 6
7 8
9 10
GND
AVRRESET
VCC_AVR5V
GND
N.C.
AVRSCK
AVRSO
AVRSI
N.C.
N.C.
AVR JTAG interface
2 1
NRST
Small connector
single row, 1,27 pitch
Small connector
single row, 1,27 pitch
Must be one pack or single,
Not mounted on the final version
Speaker
Connector to LCD and button PCB
TP69
TP70
TP62
TP71
NM
NM=NOT MOUNTED
NM
L
EG
O
MIN
DS
TO
RM
S N
XT
R7
8
15K
U8
AT
me
ga
48
/V
PD
3 (
PC
INT
19
/OC
2B
/IN
T1
)1
PD
4 (
PC
INT
20
/XC
K/T
0)
2
GN
D3
VC
C4
GN
D5
VC
C6
PB
6 (
PC
INT
6/X
TA
L1
/TO
SC
1)
7
PB
7 (
PC
INT
7/X
TA
L2
/TO
SC
2)
8
PD5 (PCINT21/OC0B/T1) 9
PD6 (PCINT22/OC0A/AIN0) 10
PD7 (PCINT23/AIN1) 11
PB0 (PCINT0/CLKO/ICP1) 12
PB1 (PCINT1/OC1A) 13
PB2 (PCINT2/SS/OC1B) 14
PB3 (PCINT3/OC2A/MOSI) 15
PB4 (PCINT4/MISO) 16
PC
1 (
AD
C1
/PC
INT
9)
24
PC
0 (
AD
C0
/PC
INT
8)
23
AD
C7
22
GN
D2
1
AR
EF
20
AD
C6
19
AV
CC
18
PB
5 (
SC
K/P
CIN
T5
)1
7
PD2 (INT0/PCINT18)32
PD1 (TXD/PCINT17)31
PD0 (RXD/PCINT16)30
PC6 (RESET/PCINT14)29
PC5 (ADC5/SCL/PCINT13)28
PC4 (ADC4/SDA/PCINT12)27
PC3 (ADC3/PCINT11)26
PC2 (ADC2/PCINT10)25
J1
0
1 P
ad
R1
09
10K
C5
2
10
0n
F
R9
22
.2K
C5
4
2.2
nF
TP
66
J1
5
10
pin
12
34
56
78
91
0
R8
2
27
R
C2
9
1n
F
R8
910K
C3
9
47
0p
F
R9
9
10K
C4
2
10
0n
F
C7
0
47
pF
TP
68
C4
9
10
0n
F
U1
5A
74
HC
73
J1
4
CL
K1
K3
Q1
2
Q1
3
VCC4 GND 11
CL
R2
R8
4
10K
C5
5
10
0n
FJ1
7
10
pin
1 2 3 4 5 6 7 8 9 10
R2
5
1M
EG
R3
1
10K
U7
AT
91S
AM
7S
256
AD
VR
EF
1
GN
D2
AD
43
AD
54
AD
65
AD
76
VC
C_
IN7
VC
C_
OU
T8
PA
17
/PG
MD
5/A
D0
9
PA
18
/PG
MD
6/A
D1
10
PA
21
/PG
MD
91
1
VC
C_
CO
RE
12
PA
19
/PG
MD
7/A
D2
13
PA
22
/PG
MS
10
14
PA
23
/PG
MD
11
15
PA
20
/PG
MD
8/A
D3
16
GND 17
VCC_IO 18
PA16/PGMD4 19
PA15/PGM3 20
PA14/PGMD2 21
PA13/PGMD1 22
PA24/PGMD12 23
VCC_CORE 24
PA25/PGMD13 25
PA26/PGMD14 26
PA12/PGMD0 27
PA11/PGMM3 28
PA10/PGMM2 29
PA9/PGMM1 30
PA8/PGMM0 31
PA7/PGMNVALID 32
VCC_PLL64
PLLRC63
XIN/PGMCK62
XOUT61
GND60
VCC_FLASH59
VCC_IO58
DDP57
DDM56
ERASE55
VCC_CORE54
TCK53
PA3152
TMS51
JTAGSEL50
TDO49 PA
0/P
GM
EN
04
8
PA
1/P
GM
EN
14
7
GN
D4
6
VC
C_
IO4
5
PA
24
4
PA
34
3
PA
30
42
PA
29
41
TS
T4
0
NR
ST
39
PA
28
38
PA
27
/PG
MD
15
37
PA
4/P
GM
NC
MD
36
PA
5/P
GM
RD
Y3
5
PA
6/P
GM
NO
E3
4
TD
I3
3
C3
0
22
pF
R1
7
0R
R8
1
27
R
R4
2
1M
EG
R8
0
22K
R9
7
15K
TP
61 C
45
10
0n
F
R7
9
1.5
K
X1
18.4
32M
Hz
C5
1
1u
F
C7
1
47
pF
U9
SP
Y0
03
0A
SP
N1
SP
P2
GN
D3
INN
4
VC
C8
CE
7
VR
EF
6
AC
IN5
J2
0
2 P
ad
12
C5
8
10
0n
F
C3
4
15
pF
C3
8
2.2
uF
R8
5
10K
RA
4B
10K
7 2
TP
64
TP
86
C3
3
33
pF
C4
8
10
0n
F
J1
6
8 p
in
1 2 3 4 5 6 7 8
C3
1
22
pF
C3
5
15
pF
C2
8
10
0n
F
U4
A
74
HC
73
J1
4
CL
K1
K3
Q1
2
Q1
3
VCC4 GND 11
CL
R2
TP
82
R9
4
10K
C4
4
10
0n
F
Q15
BC
85
7B
1
23
C3
7
4.7
uF
TP
59
C7
2
47
pF
C4
3
10
0n
F
TP
85
TP
65
RA
4C
10K
6 3
C5
3
3.3
nF
RA
4A
10K
8 1
R8
3
1.5
K
U1
5B
74
HC
73
J7
CL
K5
K1
0Q
9
Q8
VCC4 GND 11
CL
R6
C3
2
10
nF
TP
67
TP
83
TP
60
R9
8
10K
R3
0
10K
D2
3
SM
4002
R9
32
.2K
U4
B
74
HC
73
J7
CL
K5
K1
0Q
9
Q8
VCC4 GND 11
CL
R6
R9
110K
TP
81
RA
4D
10K
5 4
C7
7
10
0n
F
TP
58
C4
1
10
0n
F
R9
010K
J1
9
16
Pa
d
12
34
56
78
91
01
11
21
31
5
C6
9
47
pF
C3
6
10
0n
F
TP
84
J1
2
US
B
1 2 3 4
5 5
4 4
3 3
2 2
1 1
DD
CC
BB
AA
BA
TT
_P
ULS
P_
EN
AD
C_B
AT
T
AD
C_
I
TS
T
INT
C0
DIR
A
DIG
ID1
P_
EN
AD
C_
I
BA
TT
_P
ULS
AD
C_B
AT
T
SA
MB
A
TS
T
INT
C0
DIR
A
DIG
ID1
VC
C9
V
VC
C9
V_
MO
TO
R
VC
C_
SW
VC
C_
AV
R5
V
VC
C_
SW
VC
C5
VV
CC
3V
VC
C_
AV
R5
V
VC
C_
RS
48
5
VC
C9
V_
MO
TO
R
VC
C_
AV
R5
V
VC
C3
V
VC
C3
V
VC
C3
V
VC
C3
V
VC
C_
SN
D
VC
C9
V_
MO
TO
R
VC
C5
V
VC
C_
RS
48
5
VC
C_
RS
48
5
BA
TT
_P
ULS
P_
EN
AD
C_B
AT
T
AD
C_
I
TS
T
INT
C0
DIR
A
DIG
ID1
of
Title
Pro
ject
Nu
mb
er
En
gin
ee
r/co
nstr
ucte
r
Sch
em
ati
c N
am
e
Da
te (
YY
YY
/MM
/DD
)
Dra
fte
rD
ate
(Y
YY
Y/M
M/D
D)
Sh
ee
tP
age S
ize
Ve
rsio
n
24
A3
LE
GO
Hard
ware
LE
GO
I
Batteri
minus
R13, R20, R29 N.M.
MUST BE SHORTED
WITH SOLDER
Batteri
plus
Steering for display PCB
NM
NM=NOT MOUNTED
TP50
TP40
Bleeder
resistor
TP42
TP51
Screwholes
Rechargeble
Battery
detect
TP87
NM
NM
NM
NM
NM
NM
NM
NM
NM
NM
NM
NM
NM
NM
NM
NM
Shorted beneath components
TP77
TP90
L
EG
O
MIN
DS
TO
RM
S N
XT
Q18A
PU
MH
4
Q22
XP
162A
12A
6P
R
1
23
TP
52
J3
9D
RIL
L 4
.6 m
m
R9
5
220K
R6
4
0.4
3R
C1
4
10
0n
F
U1
4X
C6202P
50
Vo
ut
1V
in3
GND 2
Q18B
PU
MH
4
SW
2
ON
/OF
F
1 2
R2
4
10K
Q20A
PU
MT
1
+C
8
10
00
uF
C5
6
1n
F
Q20B
PU
MT
1
C6
0
47
0n
F
+ -U
6A
LM
358
3 21
8 4
R2
00
R
R9
6
390K
RA
3A
47
k
81
TP
39
D3
1
RS
X301L-3
0
R4
01
KC
12
10
0n
F
+C
7
10
00
uF
TP
37
J1
3D
RIL
L 4
.7 m
m
Q1B
IRF
58
10
3
42
Q17
BC
84
8B
1
3 2
TP
36
RA
2B
120K
7 2
R2
8
330K
R1
4
10K
R4
1
4.7
K
D2
9
RS
X301L-3
0
R1
6
0.4
3R
RA
3B
47
k
72
TP
73
J4
1 P
ad
+C
13
56
0u
F
D2
7B
ZG
03
1
5V
D7
BA
S85
U5
XC
9302
CE
5
VO
UT
4E
XT
/3
VC
C2
GN
D1
R1
30
R
+C
64
22
0u
F
C7
4
10
nF
R2
3
10K
+ -U
6B
LM
358
5 67
8 4
C7
5
10
nF
RA
2A
120K
81
J2
3D
RIL
L 4
.7 m
m
TP
74
TP
TP
2
C5
71
00
nF
R1
00
6.8
K
R6
5
10K
RA
2C
120K
63
Q21A
PU
MT
1
TP
78
Q1A
IRF
58
10
1
65
J5
1 P
ad
C1
5
47
0n
F
+C
59
10
uF
D2
8
RS
X301L-3
0
RA
3C
47
k
63
C1
0
10
0n
F
J3
7D
RIL
L 4
.6 m
m
C5
0
10
0p
F
U1
0X
C6202P
33
Vo
ut
1V
in3
GND 2
R2
90
R
TP
72
C4
6
10
pF
R2
7
10K
TP
41
TP
63
R6
7
47
0R
Q23
XP
161A
1265P
R1
2 3
J4
0D
RIL
L 4
.6 m
m
+C
62
47
uF
TP
75
TP
RA
2D
120K
5 4
Q16A
PU
MT
1
R1
11
4.7
R
Q16B
PU
MT
1
J3
8D
RIL
L 4
.6 m
m
R4
3
0.4
3R
R2
1
220K
Q21B
PU
MT
1
U1
3X
C6202P
50
Vo
ut
1V
in2
GND 3
R1
9
10K
RA
3D
47
k
54
TP
53
TP
38
+C
11
22
0u
F
R1
5
0.4
3R
R6
9
RU
E1
85
+C
76
15
0u
F
TP
76
L1
15
uH
SW
1
Ta
ctile
1
2
3
4
5 5
4 4
3 3
2 2
1 1
DD
CC
BB
AA
MC
0
MA
0
MB
1
TA
CH
OA
0T
AC
HO
A1
TA
CH
OB
0T
AC
HO
B1
TA
CH
OC
0T
AC
HO
C1
GN
D
GN
D
GN
D
PO
WE
RM
B
PO
WE
RM
C
PO
WE
RM
A
MC
IN1
IPO
WE
RD
IPO
WE
RC
DIG
ICI1
DIG
IDI1
IPO
WE
RB
MC
IN0
MC
PW
M
MC
1
MA
1
MB
0
INT
A0
DIR
A
INT
B0
DIR
B
INT
C0
DIR
C
MC
IN0
MC
PW
M
AD
C_
A0
I_O
NA
DIG
IA1
DIG
IA0
AD
C_
B0
I_O
NB
DIG
IB1
DIG
IB0
AD
C_
C0
I_O
NC
DIG
IC1
DIG
IC0
DO
A
RE
A
DE
A
DIA
AD
C_
D0
I_O
ND
DIG
ID1
DIG
ID0
MC
IN1
MA
0M
AIN
1M
A1
DIG
IAI1
MB
IN0
MB
PW
M
MB
IN1
MA
IN0
MA
IN1
MA
PW
M
MB
IN0
MB
IN1
MB
PW
M
MA
IN0
INT
B0
DIR
B
RE
AD
IGID
I0D
IGID
I1
DO
A
MA
PW
M
MA
IN0
MA
IN1
DE
A
DIG
IA1
DIG
IA0
DIG
IC0
DIG
IC1
DIG
ID1
DIG
IB0
DIG
IBI1
DIG
IB1
DIG
ID0
GN
DG
ND
DIG
IAI1
GN
D
IPO
WE
RB
IPO
WE
RA
GN
DG
ND
AD
C_
B0
GN
D
DIG
ICI0
IPO
WE
RC
GN
DIP
OW
ER
DD
IGIA
I0
I_O
NB
IPO
WE
RA
PO
WE
RM
A
I_O
NA
DIG
ICI1
AD
C_
A0
I_O
ND
DIG
IBI1
DIG
IBI0
I_O
NC
PO
WE
RM
B
DIG
IDI0
GN
D
PO
WE
RM
C
DIG
IDI1
TA
CH
OA
1
TA
CH
OA
0T
AC
HO
B0
TA
CH
OB
1T
AC
HO
C1
DIR
C
TA
CH
OC
0
AD
C_
D0
AD
C_
C0
DIA
INT
A0
DIR
A
INT
C0
P_
EN
MB
0
MB
IN1
MB
1
MB
IN0
MC
0M
CIN
0
MC
1
MC
IN1
DIG
IAI0
DIG
IBI0
DIG
ICI0
DIG
IDI0
VC
C3V
VC
C3V
VC
C3V
VC
C3V
VC
C3V
VC
C3V
VC
C3V
VC
C3V
VC
C3V
VC
C_
RS
48
5
VC
C9
V_
MO
TO
R
VC
C3V
VC
C3V
VC
C3V
VC
C3V
VC
C3V
VC
C3V
VC
C3V
VC
C5V
VC
C_
AV
R5
V
VC
C9V
VC
C9V
VC
C5V
VC
C5V
VC
C9V
VC
C5V
VC
C_
AV
R5
VV
CC
_A
VR
5V
VC
C9V
VC
C_
AV
R5
V
VC
C_
RS
48
5
VC
C3V
VC
C3V
VC
C3V
VC
C3V
VC
C3V
VC
C3V
VC
C_
RS
48
5V
CC
_R
S4
85
VC
C_
RS
48
5V
CC
_R
S4
85
VC
C_
RS
48
5V
CC
_R
S4
85
VC
C_
RS
48
5V
CC
_R
S4
85
RE
A
DE
A
DIA
DO
A
DIR
B
INT
A0
DIR
A
MC
IN1
MC
IN0
MC
PW
M
INT
B0
INT
C0
DIR
C
AD
C_
A0
I_O
NA
DIG
IA0
DIG
IA1
DIG
ID1
DIG
IC1
DIG
IB1
AD
C_
B0
I_O
NB
DIG
IB0
AD
C_C
0
I_O
NC
DIG
IC0
AD
C_D
0
I_O
ND
DIG
ID0
MB
IN1
MB
IN0
MB
PW
M
MA
IN0
MA
PW
M
MA
IN1
P_
EN
of
Title
Pro
ject
Nu
mb
er
En
gin
ee
r/co
nstr
ucte
r
Sch
em
atic N
am
e
Da
te (
YY
YY
/MM
/DD
)
Dra
fte
rD
ate
(Y
YY
Y/M
M/D
D)
Sh
ee
tP
age S
ize
Ve
rsio
n
34
A2
LE
GO
Hard
ware
LE
GO
I
MotorA
MotorB
MotorC
MotorA
MotorB
MotorC
NM=NOT MOUNTED
TP88
NM
NM
NM
NM
NM
NM
NM
NM
L
EG
O
MIN
DS
TO
RM
S N
XT
C68
47
pF
C23
10
pF
R1
02
1M
EG
Q6A
PU
MH
4
C21
10
pF
TP
7
Q7B
PU
MT
1
U12F
74
HC
14
13
12
14 7
TP
15
R5
1M
EG
R36
10K
R38
10K
RA
1B
4.7
k
72
D20
1P
S226
C5
10
0p
F
R66
1M
EG
TP
29
TP
57
Q5B
PU
MT
1
R18
1M
EG
R49
10K
R39
10K
J7
Modula
r
1 2 3 4 5 6
R61
4.7
K
TP
23
TP
31
Q6B
PU
MH
4
C3
10
0p
F
R22
4.7
K
R57
1K
C25
10
pF
D6
1P
S226
TP
55
TP
8
TP
3
TP
45
R55
1K
TP
16
R1
05
1K
R1
03
1M
EG
R74
4.7
K
D11
1P
S226
R11
10K
D19
BA
T54S
TP
30
Q10
SS
8550
2
1 3
U12C
74
HC
14
56
14 7
RA
1A
4.7
k
81
TP
24
R3
10K
TP
32
C4
10
0p
F
Q3A
PU
MT
1
R8
1M
EG
U1
2E
74
HC
14
11
10
14 7C
65
47
pF
J3
Modula
r
1 2 3 4 5 6
TP
47
TP
17
R75
4.7
K
R26
4.7
K
R87
10K
C6
10
0p
F
D16
1P
S226
TP
4
TP
25
R73
1M
EG
TP
33
LB1836M
U1
LB
1836M
VC
C1
IN1
2
OU
T1
3
Vs1
4
OU
T2
5
IN2
6
GN
D7
GN
D14
IN3
13
OU
T3
12
Vs2
11
OU
T4
10
IN4
9
Vcont
8
D5
1P
S226
R44
4.7
K
D2
1P
S226
R1
19
82K
RA
1D
4.7
k
54
TP
79
R52
1K
R47
4.7
K
J8
Modula
r
1 2 3 4 5 6
C24
10
pF
TP
56
U1
2A
74
HC
14
12
14 7
R1
16
82K
TP
46
Q9A
PU
MT
1
TP
18
J9
Modula
r
1 2 3 4 5 6
R37
10K
R12
10K
D1
1P
S226
D17
BA
T54S
TP
43
D14
1P
S226
R1
04
1M
EG
TP
11
R1
12
82K
R10
10K
R48
10K
J1
Modula
r
1 2 3 4 5 6
TP
26
TP
34
Q7A
PU
MT
1
C66
47
pF
R51
10K
R72
1M
EG
R2
10K
D24
BA
S85
D30
RS
X301L-3
0
R86
10K
R33
39R
Q5A
PU
MT
1
TP
48
R46
4.7
K
TP
1
TP
10
TP
54
R7
1M
EG
TP
44
R1
10K
TP
12
C1 1
00
pF
Q4B
PU
MH
4
R32
39R
R63
4.7
K
TP
27
R59
1K
R68
1M
EG
D18
1P
S226
TP
35
R62
4.7
K
C27
10
pF
LB1930M
U2
LB
1930M
Vcc
1
NC
2
IN1
3
IN2
4
S-G
ND
5
NC
10
OU
T1
9
NC
8
OU
T2
7
P-G
ND
6
R35
39R
R1
17
82K
R53 1K
R1
14
82K
R58
1K
RA
1C
4.7
k
63
R50
10K
R60
4.7
K
R76
4.7
K
D21
1P
S226
C20
10
pF
TP
19
R6
1M
EG
R45
4.7
K
TP
9
TP
5D
31P
S226
R77
4.7
K
TP
49
R4
1M
EG
D13
1P
S226
D22
1P
S226
TP
13
C67
47
pF
Q3B
PU
MT
1
TP
28
R1
15
82K
R1
10
10K
D4
1P
S226
U3
ST
485
RO
1
RE
2
DE
3
DI
4
VC
C8
B7
A6
GN
D5
R9
1M
EG
TP
21
R56
1K
C22
10
pF
R34
39R
Q8
BC
85
7B
1
2 3
TP
80
C2
10
0p
F
TP
6
Q4A
PU
MH
4
R1
13
82K
R1
06
1.8
R
C26
10
pF
J2
Modula
r
1 2 3 4 5 6
TP
14
TP
89
U1
2B
74
HC
14
34
14 7
J6
Modula
r
1 2 3 4 5 6
R1
18
82K
TP
20
D12
1P
S226
R54
1K
C40
10
0n
F
TP
22
D8
LL4148
Q9B
PU
MT
1
U12D
74
HC
14
98
14 7
+C
61
22
0u
F
D15
1P
S226
5 5
4 4
3 3
2 2
1 1
DD
CC
BB
AA
of
Title
Pro
ject
Nu
mb
er
En
gin
ee
r/co
nstr
ucte
r
Sch
em
atic N
am
e
Da
te (
YY
YY
/MM
/DD
)
Dra
fte
rD
ate
(Y
YY
Y/M
M/D
D)
Sh
ee
tP
age S
ize
Ve
rsio
n
44
A2
LE
GO
Hard
ware
LE
GO
I
POWER BLOCK
BATTERY SUPPLY
VCC9V
VCC_AVR5V
VCC3V
STEP-DOWN 5V
9V SENSOR
CURRENT GENERATOR
SENSER VOLTAGE
RS485
LDO 3.3V
AT91SAM7S ARM
DISPLAY
BT
ATMEGA48
BUTTOM 0 - 3
ON/OFF
POWER_EN FROM ATMEGA48(PB7)
COMMUNICATION BLOCK
AT91SAM7S
BLUE TOOTH
FULL UART 4 WIRE
VMBT_STATE
VMBT_REQ
I2C
ATMEGA48
DISPLAY
RXD0
TXD0
RS 485
HS PORT
DEA REA
SPI
ARM BLOCK
OUTPUT
INPUT
AT91SAM7S
MAPWM
MAIN1
MBPWM
MCPWM
MCIN0
MCIN1
INTA
INTB
INTC
DIR_A
DIR_B
DIR_C
ADC_A0
ION_A
DIGIA0
ATMEGA48
INPUT
OUTPUT
AVR BLOCK
ADC_B0
ADC_C0
ADC_D0
ION_B
ION_C
ION_D
DIGIA1
DIGIB0
DIGIB1
DIGIC0
DIGIC1
DIGID0
DIGID1
DOA
DIA
BUTTOM 1 - 3 ADC
MBIN1
SPI
MOTORDRIVER
MBIN0
MAIN0
SOUND
VCC9V ADC_BATT
PC_USB
BUTTOM 0
BTRST
BATT_ADC/SAMBA
BATT_PULS
USB_DP_PULL_UP
DDP, DDM
9V
DEA REA
ADC_I
USB_ADC
DIGID1_ADC
VCC9V_MOTOR
VCC5V_SW
SENSOR PULL-UP
SAMBA
VCC_RS485
VCC5V
5V LDO
SOUND VOLTAGE
L
EG
O
MIN
DS
TO
RM
S N
XT
5 5
4 4
3 3
2 2
1 1
DD
CC
BB
AA
RS
TD
IS
BU
TT
ON
0
BU
TT
_A
DC
GN
DS
OB
T
SIB
TS
CK
BT
CS
DIS
BU
TT
_A
DC
VC
C5
V
GN
DV
CC
3V
VC
C3
V
SO
BT
CS
DIS
SC
KB
TS
IBT
BU
TT
ON
0
VC
C3
V
VC
C3
VV
CC
5V
of
Title
Pro
ject
Nu
mb
er
En
gin
ee
r/co
nstr
ucte
r
Sch
em
ati
c N
am
e
Da
te (
YY
YY
/MM
/DD
)
Dra
fte
rD
ate
(Y
YY
Y/M
M/D
D)
Sh
ee
tP
ag
e S
ize
Ve
rsio
n
11
A4
LE
GO
Ke
yp
ad
LE
GO
A
Connector to main PCB
TP1
TP4
TP5
L
EG
O
MIN
DS
TO
RM
S N
XT
J1
10
pin
12
34
56
78
910
C2
1u
F
J5
DR
ILL
2.0
mm
J2
DR
ILL
2.0
mm
R5
10
ME
G
TP
7
SW
2O
N/O
FF
12
TP
2
R6
0R
R3
1K
J3
DR
ILL
2.0
mm
TP
8
TP
3
TP
9
TP
11
J4
DR
ILL
2.0
mm
LC
D1
LC
D
CS
01
RS
T2
CD
3
SC
K4
SD
A5
VC
C6
GN
D7
VB
1+
8
VB
1-
9
VB
0-
10
VB
0+
11
VLC
D12
C3
10
0n
FR
14
.7K
TP
10
R4
10
0K
SW
4O
N/O
FF
12
C1
1u
F
C4
33
nF
SW
3O
N/O
FF
12
R2
2.2
K
SW
1O
N/O
FF
12
TP
6
54
32
1
DD
CC
BB
AA
of
Title
Pro
ject
Nu
mb
er
En
gin
ee
r/co
nstr
ucte
r
Sch
em
ati
c N
am
e
Da
te (
YY
YY
/MM
/DD
)
Dra
fte
rD
ate
(Y
YY
Y/M
M/D
D)
Sh
ee
tP
age S
ize
Ve
rsio
n
11
A4
LE
GO
Lig
ht se
nso
r
LE
GO
F
Drills for
LED fix
L
EG
O
MIN
DS
TO
RM
S N
XT
J2
DR
ILL
2.3
mm
R2
4.7
K
R6
56
0R
Q2B
PU
MX
1
J3
DR
ILL
2.3
mm
Q1A
PU
MT
1
Q1B
PU
MT
1
R9
10K
D1
Re
d
R1
18
0R
R4
33
0k
Q3
SF
H3
09
-4
Q4
BC
84
71
3 2
Q2A
PU
MX
1
R3
33
0R
J1
Modula
r
1 2 3 4 5 6
R7
10K
R8
1.8
K
R5
6.8
kC
2
47
0n
F
5 5
4 4
3 3
2 2
1 1
DD
CC
BB
AA
VC
C/2
DIG
IAI0
VC
C/2
DIG
IAI0
DIG
IAI1
VC
C/2
Re
ct.
in
VC
C/2
Re
ct.
in
DIG
IAI1
VC
C
VC
C
VC
CV
CC
VC
C
VC
C
VC
C
VC
C
VC
C
VC
C
of
Title
Pro
ject
Nu
mb
er
En
gin
ee
r/co
nstr
ucte
r
Sch
em
ati
c N
am
e
Da
te (
YY
YY
/MM
/DD
)
Dra
fte
rD
ate
(Y
YY
Y/M
M/D
D)
Sh
ee
tP
ag
e S
ize
Ve
rsio
n
11
A4
LE
GO
So
un
d s
en
so
r
LE
GO
C
U1 cap
U2 cap
L
EG
O
MIN
DS
TO
RM
S N
XT
R1
2
56
0K
TP
5
TP
1
J1
Mo
du
lar
1 2 3 4 5 6
+C
2
10
uF
C1
28
.2p
F
C1
22
0n
F
R2
0
22
0K
R1
64
70
K
R9
4.7
K
C5
2.2
nF
D1
BA
V9
9
C8
47
0n
F
+ -U
1A
LM
32
4
3 21
4 11
R1
0
10
K
R5
82
k
C7
4.7
uF
TP
2
R4
4.7
K
R1
22
0K
R2
1
56
0R
R1
8
82
K
+ -U
1B
LM
32
4
5 67
4 11
C6
68
pF
C9
10
0n
F
R1
4
4.7
K
R7
18
K
TP
3
R6
56
0K
+ -U
2A
LM
35
8
3 21
8 4
R3
1K
+ -U
1D
LM
32
4
12
13
14
4 11
R2
22
0K
R1
9
47
0K
C1
0
10
0n
F
R8
10
0K
C3
22
0n
F
R1
1
56
KC
11
10
nF
+ -U
1C
LM
32
4
10 9
8
4 11
TP
4
J2
2 P
ad
12
+ -U
2B
LM
35
8
5 67
8 4
R1
7
22
0K
R2
2
10
K
R1
5
10
0K
R1
3
4.7
K
Q1
BC
84
8B
1
3 2
C4
68
nF
5 5
4 4
3 3
2 2
1 1
DD
CC
BB
AA
of
Title
Pro
ject
Nu
mb
er
En
gin
ee
r/co
nstr
ucte
r
Sch
em
ati
c N
am
e
Da
te (
YY
YY
/MM
/DD
)
Dra
fte
rD
ate
(Y
YY
Y/M
M/D
D)
Sh
ee
tP
ag
e S
ize
Ve
rsio
n
11
A4
LE
GO
To
uch
se
nso
r
LE
GO
A
BN Cable:
1: White
2: Black
3: Red
4: Green
5: Yellow
6: Blue
L
EG
O
MIN
DS
TO
RM
S N
XT
R1
2.2
K
SW
1
D3
C
12
3
J1
Mo
du
lar
1 2 3 4 5 6
5 5
4 4
3 3
2 2
1 1
DD
CC
BB
AA
DIG
IAI0
DIG
IAI1
VC
C_
5V
VC
CG
ND
GN
D
P1
.0
DIG
IAI1
DIG
IAI0
P3
.0/S
DA
P1
.3/S
CL
P1
.0
P2
.0P
3.0
/SD
A
P2
.1
P1
.3/S
CL
P2
.1
RE
SE
T
P2
.0
VC
C
VC
C_
5V
VC
C_
5V
VC
C
VC
C
VC
C_
5V
VC
C_
5V
VC
C_
5V
VC
C_
5V
VC
C_
5V
4.3
V_P
ow
er
4.3
V_P
ow
er
4.3
V_P
ow
er
of
Title
Pro
ject
Num
be
r
En
gin
ee
r/co
nstr
ucte
r
Sch
em
ati
c N
am
e
Da
te (
YY
YY
/MM
/DD
)
Dra
fte
rD
ate
(Y
YY
Y/M
M/D
D)
She
et
Page S
ize
Ve
rsio
n
11
A3
LE
GO
Ult
raso
nic
se
nso
r
LE
GO
G
TP12
TP13
TP14
TP3
L
EG
O
MIN
DS
TO
RM
S N
XT
+C
13
10
uF
U1
F
CD
40
49
14
15
C8
10
pF
D3
BA
V99
C5
22
0pF
Q3A
PU
MH
4
U1
C
CD
40
49
76
R1
9
10K
C1
1n
F
Q3B
PU
MH
4
Q1A
PU
MX
1
C1
5
22
pF
X1
3.5
8M
Hz
13
2
PZ
1
TC
T40-1
2S
2
21
C9
10
nF
TP
10
R1
0
100K
R7
22
0R
TP
5
C1
0
47
pF
R1
4
4.7
K
RA
1B
10K
72
Q2B
PU
MX
1
R1
7100K
R6
1M
EG
C2
10
0pF
D4
LL4148
U1
E
CD
40
49
11
12
R2
410K
R1
6
10
0R
TP
12
RA
1D
10K
54
U1
D
CD
40
49
910
TP
6
R1
3
82K
TP
11
R1
4.7
K
R3
22
0R
R2
310K
C1
1
47
pF
C1
91
00
nF
R1
5
4.7
K
R1
2
82K
R9
22K
R2
1M
EG
C6
10
0pF
TP
7
PZ
2
TC
T40-1
2F
221
C3
10
0pF
Q2A
PU
MX
1
RA
1C
10K
63
Q6A
PU
MH
4
R2
1
3.3
ME
G
J1
Modula
r
1 2 3 4 5 6
C1
41
00
nF
U1
A
CD
40
49
32
TP
8
U1
B
CD
40
49
54
TP
2C
7
10
pF
U2
ES
C015
GN
D11
VC
C14
P3.0
24
P2.2
26
RE
SE
TB
34
P1.0
33
P1.1
32
P1.2
31
P1.3
30
VC
C29
P2.0
28
P2.1
27
GN
D38
OS
CO
37
OS
CI
36
P3.1
23
RA
1A
10K
81
C4
1n
F
R8
47K
R1
81.5
ME
G
R5
22
0R
Q1B
PU
MX
1
R2
2
1.8
ME
G
R1
1
330K
D2
BA
V99
+C
16
10
uF
C1
2
10
0nF
Q6B
PU
MH
4
R4
1M
EG
TP
9