CD-3719.pdf

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