Está en la página 1de 28

En este cuadernillo se presenta un reto a resolver con un robot LEGO MINDSTORMS programado con NXT-G, as como los pasos

necesarios para llegar a una de las posibles soluciones. Y digo una de ellas porque del mismo modo que sucede con cualquier problema en ingeniera siempre hay ms de una solucin, algunas ms eficientes que otras. La descripcin del proceso incluye algunos de los errores que he cometido y cmo los he solucionado.

Atribuciones
LEGO y MINDSTORMS son marcas registradas de LEGO Group. Las instrucciones de montaje las he dibujado con MLCad para a continuacin generar las instrucciones con LPub.

Este documento se publica bajo licencia de Creative Commons (Reconocimiento-No comercial-Compartir bajo la misma licencia 3.0 Unported). Para cualquier duda respecto a la licencia contactar con el autor en http://lrobotikas.net/.

Contacto Si deseas ponerte en contacto con su autor (sugerencias, propuestas de mejora) lo encontrars en http://lrobotikas.net.tienes dudas sobre el reto puedes compartirlas en el foro de la misma web.

1.-Propuesta
Si bien entendemos que un robot debera ser capaz de realizar sus tareas de modo autnomo, en ocasiones puede resultar necesario controlarlo de modo remoto. Para ello hay diferentes sistemas de comunicacin a distancia: el clsico radiocontrol de los coches teledirigidos, control por luz infrarroja e incluso, va Internet. El NXT dispone de un sistema de comunicaciones inalmbrico va Bluetooth, y su uso va a ser el objeto de este reto. Requiere dos NXT y va a ser resuelto poco a poco para facilitar la compresin del modo en que funcionan las comunicaciones entre dos NXT. La propuesta es montar y programar un mando a distancia que permita controlar un robot mvil de modo remoto del mismo modo que se hace con un coche teledirigido, es decir, que ofrezca las siguientes opciones: Giros a izquierda o derecha Desplazamiento hacia adelante o atrs Regulacin de la velocidad

2.-Comunicaciones con Bluetooth


El NXT dispone de un sistema de comunicaciones inalmbricas va Bluetooth. El NXT puede enviar y recibir mensajes de texto, numricos o lgico y mostrar diferentes comportamientos en funcin del mensaje recibido. Se pueden conectar hasta 4 NXT a la vez, de tal modo que puedan desarrollar sus tareas de modo coordinado. Pero esto no quiere decir que se puedan comunicar de modo libre entre los cuatro, siempre deber haber uno que denominaremos mster que ser el que lleve la batuta mientras que el resto, los esclavos, solo podrn comunicarse entre ellos por medio del mster.

2.1.-Primeros pasos
Para que dos NXT puedan comunicarse primero hay que conectarlos. Para ello deberemos empezar activando el Bluetooth. Cmo sabemos si lo tiene activado? Basta con observar en la parte superior izquierda de su pantalla, si vemos el smbolo de la siguiente figura sabremos que lo tiene activado.

En caso contrario lo haremos por medio de los mens del NXT utilizando las flechas grises y el botn naranja. Una vez que hayamos decidido cul ser el mster, conectaremos los dos NXT. Para ello, buscaremos desde el NXT mster el NXT esclavo y lo conectaremos seleccionando una de las tres conexiones disponibles, la 1, la 2 la 3. Una vez conectado el smbolo anterior se habr convertido en el de la figura siguiente.

A partir de este momento los dos NXT ya se pueden comunicar entre s. La versin 2 de NXT-G permite que sea el mismo NXT el que realice estas tareas de activacin del Bluetooth y conexin.

2.2.-Ejercicios con Bluetooth


Antes de comenzar con un proyecto real en el que se utilicen comunicaciones va Bluetooth, conviene experimentar un poco. Para ello no hace falta montar nada, es suficiente con dos NXT utilizando como elementos de entrada sus propios botones y como salidas el sonido y la pantalla. A continuacin se proponen algunos ejercicios, dos de los cuales van a ser resueltos en este artculo. 1. Desarrollar un programa que enve un valor aleatorio comprendido entre 200 y 400 de tal manera que el segundo NXT reproduzca un sonido de esa frecuencia 2. El NXT1 controla la frecuencia del sonido que emite el NXT2. Con la flecha gris a derechas la frecuencia sube, en intervalos de 10 con la flecha opuesta baja. El NXT2 emite los sonidos con una duracin de medio segundo e intervalos de silencio de medio segundo sin interrupcin. 3. En el mismo ejercicio anterior el botn naranja del NXT1 conmuta entre subir o bajar frecuencia y subir o bajar duracin en intervalos de 0,1 s. 4. En la pantalla de un NXT se puede leer la temperatura que un segundo NXT mide en el exterior de una vivienda. Si no se dispone de un sensor de temperatura puede simularse con un sensor de luz midiendo la luminosidad exterior.

2.2.1.-Ejercicio n 1
Veamos primero el programa necesario para enviar el mensaje (NXT mster) Antes de abrir el software de programacin NXT-G es importante escribir los pasos que hay que dar y el orden en que han de ejecutarse, es decir, el algoritmo. Para el NXT mster ser el siguiente: 2

1. Elige un nmero entre 200 y 400 de modo aleatorio 2. Enva un mensaje que contenga el resultado del paso anterior Cuando lo llevamos a NXT-G el programa resultante ser el de la figura:

Veamos un par de cosas sobre la configuracin de estos bloques. Tras obtener un nmero aleatorio entre 200 y 400 utilizaremos el bloque Enviar mensaje del men Accin. Hay que modificar la opcin mensaje para decirle que queremos enviar un valor numrico. El resto lo dejaremos como est. El nmero de conexin tiene que ser el mismo que al conectar los dos NXT se asigne al robot esclavo, es el modo de identificar el receptor. En caso que el esclavo tenga que enviar un mensaje al mster, que no es el caso en este programa, lo deber enviar a la Conexin 0. Y ahora el que recibir el mensaje, es decir, el que habr que descargar en el NXT esclavo. El receptor del mensaje ha de estar a la escucha por si llega un mensaje. Vamos a ver cul es el algoritmo: 1. Leer el buzn de entrada 1 2. Reproducir un sonido con la frecuencia contenida en el mensaje 3. Repetir lo mismo de modo indefinido En esta imagen podemos ver abierto el concentrador de datos del bloque Recibir mensaje. El bloque est configurado para interpretar los mensajes recibidos como datos numricos. Para asignar el valor recibido al bloque que reproduce el sonido habr que iniciar el cableado como en la imagen.

El programa completo ser el siguiente:

El bloque Sonido hay que configurarlo para que emita un tono y hay que asegurarse de que est seleccionada la opcin Esperar hasta finalizacin. En caso de no estarlo, el programa dar resultados inesperados, ya que el bucle se repetir otra vez sin dar tiempo a reproducir el sonido (el valor que contiene el buzn vaco es cero). Una vez que los programas estn creados slo queda conectar los NXT va Bluetooth, descargar los programas y ejecutarlos (para este ejercicio primero hay que poner en marcha el programa esclavo y a continuacin el mster). Mejora Si se dispone de la versin 2 del NXT-G es posible integrar en el programa la conexin entre los NXT. El siguiente programa incorpora al anterior mster dos nuevos bloques que se encuentran en el men Avanzado: el bloque Conexin Bluetooth configurado de dos diferentes maneras. El primero enciende el Bluetooth (este bloque tambin debera ser incorporado en el programa del esclavo), mientras que el segundo establece la conexin. Para configurar esta conexin es necesario que se cumplan dos condiciones: que estos dos NXT hayan estado conectados previamente de tal manera que el esclavo aparezca en Mis contactos del NXT mster que el NXT mster est encendido y conectado al ordenador para que la lista de contactos aparezca en el panel de configuracin tal y como aparece en la siguiente imagen.

2.2.2.-Ejercicio n 2
Veamos a ver aqu cmo se resuelve el segundo ejercicio, ya que tiene una gran similitud con el reto propuesto. En este caso las flechas del NXT se utilizan para aumentar o disminuir la frecuencia del tono emitido por el NXT esclavo. En este programa se utilizar una variable para almacenar el valor de frecuencia a enviar va Bluetooth. As que primero habr que crearla y asignarle un valor inicial, por ejemplo, 200. Veamos ahora el algoritmo del programa que controlar el sonido (NXT mster). 1. Crear una variable que almacene el valor de la Frecuencia 2. Asignar a la variable Frecuencia el valor 200 3. Repetir de modo continuo los siguientes pasos a. Si se pulsa la flecha derecha sumar 10 a la variable Frecuencia, sino nada. b. Si se pulsa la flecha izquierda restar 10 a la variable frecuencia, sino nada. c. Enviar va Bluetooth el valor de la variable Frecuencia d. Retardar el reinicio del bucle una dcima de segundo para limitar el efecto del tener la flecha pulsada de modo continuo (este valor se puede ajustar a voluntad). El programa ser el siguiente:

La variable Frecuencia se crea por medio de la opcin Declarar Variables del men Edicin. Cuando se pulsa una de las flechas se ejecuta en el condicional correspondiente el cdigo correspondiente a la opcin Verdadero. En ambos casos se lee la variable, se le suma o resta 10 y se asigna el nuevo valor a la misma. En los dos condicionales la opcin Falso (que no se visualiza en la imagen) se deja vaca. Veamos ahora el programa del NXT esclavo. Vamos a introducir un cambio en el modo que recibe los mensajes. En el primer ejercicio el programa lee el buzn y asigna la lectura al bloque Sonido de 5

modo continuo, reciba o no mensaje. Mientras no recibe mensajes o una vez ledo, el contenido del buzn es cero, as que en dicho caso no emite ningn sonido. Ahora vamos a hacerlo de tal manera que slo antes de utilizar el contenido del buzn compruebe que ha recibido un mensaje. El programa del NXT esclavo, el que reproducir el sonido, constar de dos tareas que se ejecutarn de modo simultaneo, una se encargar de leer el buzn y asignar el valor a una variable mientras la otra se ocupar de emitir el tono deseado. El algoritmo correspondiente a la primera ser la siguiente: 1. Crear una variable que almacene el valor de la Frecuencia 2. Asignar a la variable Frecuencia el valor 200 3. Repetir los siguientes pasos a. Leer el valor de la variable Frecuencia b. Reproducir un tono con una frecuencia del valor contenido en la variable durante medio segundo c. Esperar medio segundo (silencio) La segunda tarea es la que recibe el mensaje y asigna su valor a la variable Frecuencia. El algoritmo ser el siguiente: 1. Repetir siempre los siguientes pasos a. Esperar hasta que reciba un mensaje b. Asignar el valor del mensaje a la variable Frecuencia. En la siguiente imagen puede verse el programa con las dos tareas, la primera la superior y la segunda la inferior.

Podemos observar los dos cables que salen del bloque Recibir mensaje. El verde est conectado a la toma Mensaje recibido que no ser Verdadero hasta que no reciba un mensaje, de tal modo que el

bucle que lo contiene no finalizar hasta que se reciba un mensaje. Una vez que reciba un mensaje asignar su valor a la variable Frecuencia y se pondr otra vez en espera.

3.-El mando bsico


El mando va a disponer de dos levas que facilitarn el control de los sensores de contacto que se encuentran bajo ellas. En realidad, para un mando tan sencillo como este, no sera necesario montar nada, ya que se podra controlar utilizando las flechas del mismo NXT. El sensor de la izquierda estar conectado al puerto 1 mientras que el derecho lo estar al 4.

4.-El programa
El mando utiliza para controlar el vehculo dos sensores de contacto, pulsando el izquierdo girar a la izquierda hasta que se deje de pulsarse mientras que el derecho har lo mismo en el sentido contrario. En este caso el NXT va a enviar mensajes en formato Texto. Vamos a empezar con el algoritmo del mando, que puede ser el siguiente: 1. Si presionado Sensor4 a. Enviar mensaje texto Derecha b. Esperar hasta soltar el Sensor4 c. Enviar mensaje texto Recto 2. Si presionado Sensor1 a. Enviar mensaje texto Izquierda b. Esperar hasta soltar el Sensor1 c. Enviar mensaje texto Recto 3. Repetir los pasos anteriores

El programa correspondiente ser el siguiente:

El algoritmo del vehculo ser muy similar al del ejercicio nmero 2. Costar tambin de dos tareas, una controlar el vehculo mientras que la otra se encargar de recibir y almacenar los mensajes. El algoritmo de la primera ser: 1. Crear una variable que almacene el valor de la Direccin 2. Asignar a la variable Direccin el valor Recto para que por defecto se mueva recto. 3. Repetir los siguientes pasos a. Leer el valor de la variable Direccin b. Si el valor es Recto mover recto c. Si el valor es Derecha mover girando hacia la derecha d. Si el valor es Izquierda mover girando a la izquierda Para este ltimo paso se puede utilizar un bloque Bifurcacin que ejecute una u otra de las opciones en funcin del valor de la variable. En este caso las opciones son tres y para poder hacerlo es necesario que en el panel de configuracin del bloque no est seleccionada la opcin Vista Plana, en caso contrario slo acepta dos opciones. El bloque Mover se configurar en los tres casos como Ilimitado. El de la segunda tarea ser el mismo del ejercicio nmero 2. 1. Repetir siempre los siguientes pasos a. Esperar hasta que reciba un mensaje b. Asignar el valor del mensaje a la variable Direccin. Y el programa completo ser el de la imagen de la pgina siguiente.

Pero puede haber otras maneras de hacerlo, as que vamos a ver otra ms sencilla que la anterior y que no requiere uso de variables ni multitarea. Para este nuevo programa el algoritmo ser el siguiente: 1. Repetir de modo continuo a. Esperar a recibir un mensaje b. Si el valor del mensaje es Recto mover recto c. Si el valor del mensaje es Derecha mover girando hacia la derecha d. Si el valor del mensaje es Izquierda mover girando a la izquierda El programa ser el siguiente:

5.-Una nueva versin del mando


Vamos a montar un nuevo mando, pero ahora uno que disponga de un volante y una palanca que permitan controlar la velocidad y la magnitud del giro. Los motores del NXT incorporan encoders, dispositivos que permiten conocer en todo momento la magnitud del giro del motor. Estos dispositivos se utilizan para que el motor gire un determinado nmero de revoluciones o grados, pero tambin pueden ser utilizados como sensores de rotacin. El mando dispone de dos motores, al primero de ellos (Motor C) conectaremos una palanca con la que controlar la velocidad del robot y al segundo (Motor A) un volante con el que se pueda guiar el robot (si no se dispone de un volante se puede sustituir por cualquier otro montaje que cumpla la misma funcin). El programa convertir los giros de los motores en potencia de los motores y magnitud de giro.

La posicin de inicio de la palanca ser tal y como se ve en la figura, en dicha posicin el robot estar parado, girando la palanca hacia la derecha avanzar y hacia la izquierda retroceder.

6.-El programa
Lo primero el algoritmo del mando. Comienza con la conexin del Bluetooth, algo que se puede hacer de modo manual o por medio del mismo programa. Tras poner a cero el giro de los motores, lee el ngulo de giro de los motores y los enva al robot va Bluetooth. 1. Encender el Bluetooth (opcional) 2. Conectar con el NXT esclavo (opcional) 3. Inicializar palanca (Sensor de rotacin C - potencia del motor): Reiniciar el sensor de rotacin (ngulo a cero) 4. Inicializar el volante(Sensor de rotacin A - volante): Reiniciar el sensor de rotacin (ngulo a cero) 5. Iniciar un bucle sin fin a. Leer el valor del Sensor de rotacin C (potencia) 10

b. Enviar la lectura al buzn 1 c. Leer el valor del sensor de rotacin A (volante) d. Enviar la lectura al buzn 2 El programa ser el siguiente:

Y a continuacin el del vehculo, pero antes de nada hay que reflexionar sobre los valores de potencia y giro que va a recibir el robot. Los valores de potencia para el bloque Mover han de estar comprendidos entre 100 y -100 (cualquier valor superior a 100 NXT-G lo interpretar como 100). Para que el mando enve en valor de 100, la palanca debera girar un ngulo de 100. Tras hacer un par de pruebas de uso del mando, se puede observar que girar un ngulo de 100 a cada lado no resulta muy cmodo y que es posible mejorar la ergonoma del mando si con un giro ms reducido se puede llegar al tope de potencia. Esto se puede hacer multiplicando por 2 el valor de potencia recibido, con lo que con un giro de 50 se alcanzar la mxima potencia. Hay otra correccin que conviene aplicar. Resultara harto complicado colocar la palanca en la lectura 0 para que el robot se detuviese. Por ello conviene definir un rango angular en el que el robot se detenga. En este caso vamos a hacer que giros comprendidos entre -15 y 15 se correspondan con una potencia 0. Para ello convertiremos cualquier valor de potencia comprendido entre -30 y 30 en cero (hay que recordar que los ngulos se multiplican por dos para obtener el valor de potencia). Por otra parte, las entradas del bloque Mover son el valor de potencia de 0 a 100 y el sentido de giro, Verdadero avance y Falso para el retroceso. El bloque Mover no diferencia un valor positivo de uno negativo en la entrada de Potencia, pero ser necesario generar un valor Verdadero para el movimiento de avance y uno Falso para el de retroceso. Con la direccin habr que hacer algo similar, de modo que sea posible guiar el robot en lnea recta. Pero en este segundo caso inicialmente mantendremos el valor del mensaje convirtiendo en cero los valores entre -15 y 15. Una ltima cuestin antes de empezar con el programa. Los motores estn de modo simtrico, de tal modo que el giro a favor de las agujas del reloj ser positivo para uno y negativo para el otro. En este caso habremos de cambiar el signo a los valores de potencia. Veamos ahora el algoritmo: 1. Encender el Bluetooth (opcional) 2. Crear una variable numrica para almacenar el giro del Volante 3. Crear una variable numrica para almacenar la Potencia 4. Iniciar un bucle indefinido 11

a. Leer el valor del buzn 1 y asignar el valor a la variable Potencia b. Procesar el valor Potencia (nuevo bloque Calcula_ Pot): la salida ha de ser un valor de potencia en el que los valores entre 30 y -30 se convierten en cero y un valor lgico Verdadero si ha de avanzar y Falso si ha de retroceder (la direccin). c. Leer el valor del buzn 2 y asignar el valor a la variable Volante d. Procesar el valor Volante (nuevo bloque Calcula _Vol ): la salida ha de ser un valor de giro en el que los valores entre 15 y -15 se han convierten en cero. e. Asignar los valores de Potencia, Volante y Direccin al bloque Mover Con el objeto de simplificar el programa vamos a agrupar los fragmentos de cdigo que procesan los valores recibidos en dos nuevos bloques de programacin. De este modo se podr visualizar mejor su estructura y ser ms sencillo de moverse en l. Si no se utilizan nuevos bloques en ocasiones queda un programa muy largo complicado de visualizar. Al primero lo vamos a llamar Calcula_Pot y se va a encargarse de procesar el valor correspondiente a la potencia. Este bloque tendr como entrada el mensaje recibido y como salida la Potencia y la Direccin que conectarn con las tomas del bloque Mover. El algoritmo ser el siguiente: 1. Multiplicar el valor de la variable Potencia por -2 (adems de duplicar el valor recibido hay que cambiarle el signo) 2. Si el valor absoluto de Potencia es inferior a 30 asignarle el valor cero. 3. Comprobar si el valor de Potencia es positivo (salida Verdadero)

Para reducir el valor a cero de la potencia en los casos que dicho valor est comprendido entre -30 y 30, se ha calculado el valor absoluto (bloque Matemticas) de la Potencia, se ha comparado con 30 y en los casos en que dicho valor es menor que 30 se ha asignado el valor cero a la variable Potencia. En el bloque Bifurcacin utilizado la opcin Falso queda vaca. Al segundo lo vamos a llamar Calcula_Vol y se va a encargarse de procesar el valor correspondiente a la magnitud del giro. Este bloque tendr como entrada el mensaje recibido y como salida el valor de giro que va a la toma Volante del bloque Mover. El algoritmo ser el siguiente: 12

1. Guardar el valor del mensaje recibido en la variable Volante 2. Si el valor est comprendido entre -15 y 15 convertirlo en cero. 3. Leer la variable Volante y asignar su valor a la toma Volante del bloque Mover El programa ser el siguiente:

Despus de hacer el primer nuevo bloque me he dado cuenta que poda simplificarse la comprobacin que se hace para saber si el valor de la variable se encuentra en un intervalo determinado. Hay un bloque especfico para ello, el bloque Intervalo del men Datos, que toma como entrada el valor y da como salida un Verdadero o Falso. Este bloque sustituye a los bloques Matemticas (Valor absoluto) y Comparacin del bloque anterior, y se obtiene el mismo resultado que con ellos. El programa completo con los nuevos bloques ser el siguiente:

Si descargamos los programas y los probamos observaremos que el comportamiento del robot no es el deseado, a pesar de haber configurado el bloque Mover en Ilimitado, el robot se mueve a golpes, arranca y se detiene de modo continuo. Cul es el problema? Una vez que se lee el contenido de un buzn su valor se convierte en cero. Si se lee de nuevo el buzn 1 antes de que reciba un nuevo mensaje el valor de salida ser un cero, as que pondr en marcha y detendr el robot repetidamente. Qu se puede hacer? Hay varias soluciones alguna ms elegante que otra. La primera permite mantener el anterior algoritmo, aadindole una espera de dos dcimas de segundo se le da tiempo al programa para recibir un nuevo mensaje, as que el siguiente programa dar un buen resultado.

13

Pero como mencionaba anteriormente, hay otra solucin ms elegante. Se trata de esperar a que se hayan recibido los dos mensajes, y a continuacin leer los buzones. El nuevo algoritmo ser el siguiente: 1. Encender el Bluetooth (opcional) 2. Crear una variable numrica para almacenar el giro del Volante 3. Crear una variable numrica para almacenar la Potencia 4. Iniciar un bucle indefinido a. Esperar mientras no se reciban los dos mensajes b. Procesar los valores recibidos c. Asignar los valores de Potencia, Volante y Direccin al bloque Mover

El bucle que contiene los dos bloques Recibir mensaje est configurado para que se repita hasta que le llegue un valor lgico Verdadero. En su interior se combinan las tomas Mensaje recibido de los dos buzones (su valor es Verdadero cuando contiene un mensaje) por medio del bloque Lgica (operacin Y). una vez que se hayan recibido los dos mensajes, los valores se procesan y se asignan al bloque Mover. Ahora el programa responde totalmente a la propuesta inicial.

14

8.-Propuestas de mejora
Qu se puede hacer para mejorar este programa? 1. Pulsando el botn naranja en el mando a distancia los dos programas se detendrn. 2. Agregarle un sistema que al arrancar el programa del mando a distancia centre automticamente la palanca de la velocidad. 3. Agregarle un sistema que ejerza una fuerza de resistencia al giro proporcional a la magnitud de giro, de tal manera que tienda a centrarse cuando no se haga fuerza, tanto para el volante como la palanca. 4. Montar y programar un mando a distancia con una configuracin tipo Joystick.

15

A.-Compartir programas
Compartir un programa es una tarea bien sencilla, es suficiente con enviar el archivo del programa a quien deseemos, pero esto no es suficiente cuando se han utilizado bloques creados por uno mismo. En dicho caso hay que hacerlo como se explica a continuacin. NXT-G incorpora a partir de la versin 2.0 la herramienta Pack and Go que permite crear un archivo que contiene el programa y los nuevos bloques. Para utilizarla primero hay que abrir el programa a empaquetar.

La opcin Crear Pack and Go del men Herramientas abre un cuadro de dilogo que muestra los archivos que empaquetar. Es posible modificar el nombre del archivo y el directorio donde lo ha de guardar. Pulsando Aceptar finaliza el proceso.

16

Instrucciones de montaje
Mando bsico

17

18

19

20

Mando avanzado

21

22

23

24

25