PROGRAMACIÓN DE ROBOTS LEGO MINDSTORMS

Pablo Iván Romero De La Rosa
Leodegario G. Aguilera Hernández
Orlando Meza Zaleta

UNA GRAN MÁQUINA DE ESTADO


Una estructura de caso anidada se utiliza cuando hay una estructura de caso dentro de otra estructura de caso. Estas estructuras anidadas llegan a ser muy utiles cuando tiene dos sensores, tales como el sensor de contacto y el sensor ultrasónico. El sensor de contacto genera un valor booleano, y lo mismo ocurre con el sensor ultrasónico. Tiene dos sensores con valores booleanos, lo que significa que tiene cuatro posibilidades diferentes: una posibilidad verdadera y una posibilidad falsa por cada sensor.
Utilizará la estructura de caso exterior para un sensor, y la estructura de caso interior para el otro sensor.
Para comprender más sobre el uso de estructuras de caso anidadas con multiples sensores, va a crear un programa simple. Quiere que el robot se mueva siempre hacia adelante, pero quiere comprobar constantemente los sensores. Si el sensor ultrasónico o el sensor de contacto se dispara, el robot debe cambiar de dirección. Cada vez que se dispara un sensor, el robot debe hacer un pequeño giro.
Comenzará colocando funciones de control de motores dentro de un ciclo While.
A continuación creará las funciones de los sensores, similar a la forma en que los ha trabajado anteriormente, con un sensor de contacto y un sensor ultrasónico. Puede decir que el umbral para el sensor ultrasónico debe ser de 20 cm. También es necesario conectar la terminal NXT.
Ahora tiene que crear las estructuras de casos. Esta es la parte dificil. Dado que quiere leer la información de los sensores al mismo tiempo, como se ha mencionado antes, va a crear una estructura de caso anidada. Una estructura de caso será para el sensor de contacto, y la otra para el sensor ultrasónico.
Va a cablear el selector de caso de la estructura de caso exterior con el sensor de contacto. Si el sensor de contacto es presionado, mostrará un valor verdadero. Eso significa que el caso “True” se ejecutará, y puede poner código para que haga algo diferente aquí. Si el sensor de contacto no es presionado, se destinará al caso “False”. En este caso se quiere comprobar si el sensor ultrasónico se ha disparado. Aquí es donde la segunda estructura de caso irá. Va a cablear la salida booleana de la función de comparación al selector de caso de la estructura de caso interior. Si el sensor ultrasónico devuelve un valor verdadero, el caso “True” se ejectura, y aquí es donde va a colocar el código para que haga algo diferente.  Si el sensor ultrasónico devuelve un valor falso, el robot no hará más que seguir adelante.
Es importante tener en cuenta que tiene que crear una constante booleana “False” para la terminal condicional del ciclo While.
Ahora todo lo que tiene que hacer es crear el código para el giro a la izquierda.
La mejor forma de escribir el código para dar la vuelta es con la función Wait For. Esta función se puede acceder mediante la sub-paleta NXT I/O. Puede hacer que uno de los motores avance hacia atrás por medio segundo y eso será suficiente para que el robot gire.
Si selecciona 0.5 segundos como la constante para la terminal Time (1 sec), que será perfecto para dar la vuelta con una velocidad del motor de -75.
Este código ahora tiene que se colocado en el lugar correcto. Este código debe ser colocado en el caso verdadero tanto de la estructura de caso exterior como en la estructura de caso interior.
Revisará lo que el código debe hacer. Siempre se va a mantener girando el motor hacia adelante, mientras que constantemente se verifican los sensores. Una vez que el sensor de contacto se dispara, el caso “True” de la estructura de caso exterior se ejecutará. Si el sensor de contacto no se dispara el caso “False” se ejecutará. El caso “False” contiene una estructura de caso en su interior. El caso “True” de la estructura de caso interna se ejecutará si el sensor ultrasónico se ha disparado. En el caso “False”, el programa no hará nada.

El diagrama de estado de la Figura 150, será similar al del ejercicio al final de esta unidad.

Debe prestar especial atención al caso “Stop Motor”. Al estado “Stop Motor” se puede llegar desde varios lugares: desde el estado “Moving Forward” y desde el estado “Moving Backward”. De esta manera, esta reutilizando ese estado. Pudo haber puesto el código del estado “Stop Motor” dentro del estado “Moving Forward” y del estado “Moving Backward”. Sin embargo, como la ha separado y ha hecho transiciones que pueden conducir a ese estado, realmente se puede beneficiar de reutilizar el código.


La ventaja de la reutilización de código es que se reduce el tiempo de programación y también se reduce el tamaño del código. Otra ventaja es que se más fácil de probar o depurar el código. Si tiene un problema con el estado “Stop Motor”, por ejemplo, se puede acceder y realizar cambios en una sola versión del mismo, y no tiene que hacer cambios dos veces en dos lugares diferentes.
También debe observar que en el diagrama de estados de la Figura 150, hay estados que solo realizan una acción. Si observa el diagrama de estado, inicia en el caso “START”, va al caso “Idle”, y cuando el sensor de sonido se activa, va al estado llamado “Star Motor Forward”. El estado “Star Motor Forward” va de inmediato al estado “Moving Forward”. El estado “Star Motor Forward” es un ejemplo de un estado que solo realiza una acción. En esencia, el estado “Star Motor Forward” enciende los motores y los deja encendidos, pero de inmediato salta al siguiente estado.
Va a crear un programa para ver los beneficios de los estados transitorios. Va a crear un programa en el que el robot se mueve hacia adelante hasta que el sensor de contacto es presionado. Va a crear el programa como una arquitectura de máquina de estados.
Antes de comenzar la dodificación, se describirá el programa y luego se creará el diagrama de estado.
Lo primero que quiere hacer al iniciar el programa es ponerlo en estado de reposo “Idle”. Por lo tanto, el diagrama de estado debe comenzar como la Figura 151.
Del estado inactivo “Idle”, necesita esperar hasta que se detecte un objeto, y luego quiere que los motores comiencen a girar. Va a crear una transición entre el estado “Idle” que se llama Object Detected y que apunte hacia el estado “Start Motor Forward”.
El estado “Start Motor Forward” encenderá los motores y de inmediato pasará al estado “Moving Forward”. Este estado comprueba el sensor de contacto y si el sensor está presionado, va a enviar el programa al estado de reposo “Idle”.

Ahora que tiene el diagrama de estados, puede crear facilmente el programa. Va a comenzar con un shift register. El shift register debe ser inicializado con una String Constant del estado “Idle”. También es necesario colocar una estructura de casos dentro del ciclo While, y cablear el shift register de la izquierda con el selector de caso de la estructura de casos.
Quiere que el caso “Idle” sea el predeterminado, por lo que puede pasar al caso por defecto de la estructura de casos, que actualmente se llama “False”, y cambiarle el nombre a “Idle”. En el estado “Idle”, quiere comprobar el sensor ultrasónico y quiere que el robot se detenga, por lo que colocará dos funciones de freno de motor, así como una función ¿Menor qué? Que compará la salida del sensor ultrasónico. Debe establecer el umbral del sensor ultrasónico que será de 20 cm. Es importante que también se cablee las terminales NXT de las tres funciones.
Ahora necesita una estructura de casos dentro del estado “Idle” para poder enviar el programa al estado “Start Motor Forward” si se detecta un objeto, o manternerse en el estado “Idle” si no detecta nada. Cableará la salida de la función de comparación con el selector de caso de la estructura de casos anidada y creará una String Constant en el caso “True” con el fin de enviar al programa al siguiente estado. Para ello, va a cablear el shift register de la derecha.
Vaya al caso “True” de la estructura de casos exterior y cambie el nombre del estado a “Start Motor Forward”. En este estado, todo lo que necesita hacer es arrancar los motores. También tiene que crear una String Constant, con el nombre “Moving Forward” y cablearla con el shift register de la derecha para que lo lleve al siguiente estado. El estado “Start Motor Forward” debe ser similar al de la Figura 157.
Ahora puede crear el último caso, que es el estado “Moving Forward”. Puede dar clic derecho sobre la etiqueta de la estructura de casos y seleccionar Add Case After. Despues de cambiarle el nombre a “Moving Forward”, puede empezar a programar este caso. En este caso leerá el sensor de contacto. Si se pulsa, el programa, debe ir al estado “Idle” y si no, los motores deben permanecer girando. Agregar una función de sensor de contacto y cablearla al selector de caso de la estructura de casos. En el caso “True”, tiene que crear una String Constant con el nombre “Idle”. Cuando el sensor de contacto es presionado, el programa ejecutará el estado “Idle”. También tiene que cablear la String Constant al shift register del lado derecho.
En el caso “False” de la estructura de casos anidada, quiere que los motores del robot permanezcan girando, lo que significa que quiere mantener el estado “Moving Forward”. Para hacer esto, simplemente puede crear una String Constant, con el nombre “Moving Forward” y cablearla al shift register del lado derecho.
Todo lo que resta por hacer es cablear una constante “False” a la terminal condicional del ciclo While, con esto, puede ejecutar el programa.

Volver al índice

Enciclopedia Virtual
Tienda
Libros Recomendados


1647 - Investigaciones socioambientales, educativas y humanísticas para el medio rural
Por: Miguel Ángel Sámano Rentería y Ramón Rivera Espinosa. (Coordinadores)

Este libro es producto del trabajo desarrollado por un grupo interdisciplinario de investigadores integrantes del Instituto de Investigaciones Socioambientales, Educativas y Humanísticas para el Medio Rural (IISEHMER).
Libro gratis
Congresos

15 al 28 de febrero
III Congreso Virtual Internacional sobre

Desafíos de las empresas del siglo XXI

15 al 29 de marzo
III Congreso Virtual Internacional sobre

La Educación en el siglo XXI

Enlaces Rápidos

Fundación Inca Garcilaso
Enciclopedia y Biblioteca virtual sobre economía
Universidad de Málaga
PROGRAMACIÓN DE ROBOTS LEGO MINDSTORMS Pablo Iván Romero De La Rosa Leodegario G. Aguilera Hernández Orlando Meza Zaleta Volver al índice Leer más libros Soy autor ¿Como puedo publicar mi libro? Página principal