Retos LEGO MINDSTORMS 2: Mando a distancia

Page 1


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 ingeniería siempre hay más de una solución, algunas más eficientes que otras. La descripción del proceso incluye algunos de los errores que he cometido y cómo los he solucionado.

Atribuciones LEGO y MINDSTORMS son marcas registradas de LEGO Group. Las instrucciones de montaje las he dibujado con MLCad para a continuación 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 encontrarás 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 debería ser capaz de realizar sus tareas de modo autónomo, en ocasiones puede resultar necesario controlarlo de modo remoto. Para ello hay diferentes sistemas de comunicación a distancia: el clásico radiocontrol de los coches teledirigidos, control por luz infrarroja… e incluso, vía Internet. El NXT dispone de un sistema de comunicaciones inalámbrico vía 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 compresión 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 móvil 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 atrás

Regulación de la velocidad

2.-Comunicaciones con Bluetooth El NXT dispone de un sistema de comunicaciones inalámbricas vía Bluetooth. El NXT puede enviar y recibir mensajes de texto, numéricos o lógico y mostrar diferentes comportamientos en función 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 máster que será el que lleve la batuta mientras que el resto, los esclavos, solo podrán comunicarse entre ellos por medio del máster.

1


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

En caso contrario lo haremos por medio de los menús del NXT utilizando las flechas grises y el botón naranja. Una vez que hayamos decidido cuál será el máster, conectaremos los dos NXT. Para ello, buscaremos desde el NXT máster el NXT esclavo y lo conectaremos seleccionando una de las tres conexiones disponibles, la 1, la 2 ó la 3. Una vez conectado el símbolo 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 versión 2 de NXT-G permite que sea el mismo NXT el que realice estas tareas de activación del Bluetooth y conexión.

2.2.-Ejercicios con Bluetooth Antes de comenzar con un proyecto real en el que se utilicen comunicaciones vía 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 continuación se proponen algunos ejercicios, dos de los cuales van a ser resueltos en este artículo. 1. Desarrollar un programa que envíe 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 duración de medio segundo e intervalos de silencio de medio segundo sin interrupción. 3. En el mismo ejercicio anterior el botón naranja del NXT1 conmuta entre subir o bajar frecuencia y subir o bajar duración 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 máster) Antes de abrir el software de programación 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 máster será el siguiente: 2


1. Elige un número entre 200 y 400 de modo aleatorio 2. Envía 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 configuración de estos bloques. Tras obtener un número aleatorio entre 200 y 400 utilizaremos el bloque Enviar mensaje del menú Acción. Hay que modificar la opción mensaje para decirle que queremos enviar un valor numérico. El resto lo dejaremos como está. El número de conexión 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 máster, que no es el caso en este programa, lo deberá enviar a la Conexión 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 cuál es el algoritmo: 1. Leer el buzón 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 numéricos. Para asignar el valor recibido al bloque que reproduce el sonido habrá que iniciar el cableado como en la imagen.

3


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 opción Esperar hasta finalización. 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 buzón vacío es cero). Una vez que los programas estén creados sólo queda conectar los NXT vía Bluetooth, descargar los programas y ejecutarlos (para este ejercicio primero hay que poner en marcha el programa esclavo y a continuación el máster). Mejora Si se dispone de la versión 2 del NXT-G es posible integrar en el programa la conexión entre los NXT. El siguiente programa incorpora al anterior máster dos nuevos bloques que se encuentran en el menú Avanzado: el bloque Conexión Bluetooth configurado de dos diferentes maneras. El primero enciende el Bluetooth (este bloque también debería ser incorporado en el programa del esclavo), mientras que el segundo establece la conexión. Para configurar esta conexión 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 máster

que el NXT máster esté encendido y conectado al ordenador para que la lista de contactos aparezca en el panel de configuración tal y como aparece en la siguiente imagen.

4


2.2.2.-Ejercicio nº 2 Veamos a ver aquí cómo 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 vía 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 máster). 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 vía Bluetooth el valor de la variable Frecuencia d. Retardar el reinicio del bucle una décima 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 opción Declarar Variables del menú Edición. Cuando se pulsa una de las flechas se ejecuta en el condicional correspondiente el código correspondiente a la opción 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 opción Falso (que no se visualiza en la imagen) se deja vacía. 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 buzón y asigna la lectura al bloque Sonido de 5


modo continuo, reciba o no mensaje. Mientras no recibe mensajes o una vez leído, el contenido del buzón es cero, así que en dicho caso no emite ningún sonido. Ahora vamos a hacerlo de tal manera que sólo antes de utilizar el contenido del buzón compruebe que ha recibido un mensaje. El programa del NXT esclavo, el que reproducirá el sonido, constará de dos tareas que se ejecutarán de modo simultaneo, una se encargará de leer el buzón 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

6


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 básico El mando va a disponer de dos levas que facilitarán el control de los sensores de contacto que se encuentran bajo ellas. En realidad, para un mando tan sencillo como este, no sería necesario montar nada, ya que se podría 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 vehículo 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

7


El programa correspondiente será el siguiente:

El algoritmo del vehículo será muy similar al del ejercicio número 2. Costará también de dos tareas, una controlará el vehículo 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 Dirección 2. Asignar a la variable Dirección el valor “Recto” para que por defecto se mueva recto. 3. Repetir los siguientes pasos a. Leer el valor de la variable Dirección 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 Bifurcación que ejecute una u otra de las opciones en función del valor de la variable. En este caso las opciones son tres y para poder hacerlo es necesario que en el panel de configuración del bloque no esté seleccionada la opción Vista Plana, en caso contrario sólo acepta dos opciones. El bloque Mover se configurará en los tres casos como Ilimitado. El de la segunda tarea será el mismo del ejercicio número 2. 1. Repetir siempre los siguientes pasos a. Esperar hasta que reciba un mensaje b. Asignar el valor del mensaje a la variable Dirección. Y el programa completo será el de la imagen de la página siguiente.

8


Pero puede haber otras maneras de hacerlo, así que vamos a ver otra más 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:

9


5.-Una nueva versión 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 número de revoluciones o grados, pero también pueden ser utilizados como sensores de rotación. 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 función). El programa convertirá los giros de los motores en potencia de los motores y magnitud de giro.

La posición de inicio de la palanca será tal y como se ve en la figura, en dicha posición 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 conexión 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 envía al robot vía Bluetooth. 1. Encender el Bluetooth (opcional) 2. Conectar con el NXT esclavo (opcional) 3. Inicializar palanca (Sensor de rotación C - potencia del motor): Reiniciar el sensor de rotación (ángulo a cero) 4. Inicializar el volante(Sensor de rotación A - volante): Reiniciar el sensor de rotación (ángulo a cero) 5. Iniciar un bucle sin fin a. Leer el valor del Sensor de rotación C (potencia) 10


b. Enviar la lectura al buzón 1 c. Leer el valor del sensor de rotación A (volante) d. Enviar la lectura al buzón 2 El programa será el siguiente:

Y a continuación el del vehículo, 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 envíe en valor de 100, la palanca debería 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 cómodo y que es posible mejorar la ergonomía del mando si con un giro más 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 máxima potencia. Hay otra corrección que conviene aplicar. Resultaría 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 dirección habrá que hacer algo similar, de modo que sea posible guiar el robot en línea recta. Pero en este segundo caso inicialmente mantendremos el valor del mensaje convirtiendo en cero los valores entre -15 y 15. Una última cuestión antes de empezar con el programa. Los motores están de modo simétrico, 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 numérica para almacenar el giro del Volante 3. Crear una variable numérica para almacenar la Potencia 4. Iniciar un bucle indefinido 11


a. Leer el valor del buzón 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 lógico Verdadero si ha de avanzar y Falso si ha de retroceder (la dirección). c. Leer el valor del buzón 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 Dirección al bloque Mover Con el objeto de simplificar el programa vamos a agrupar los fragmentos de código que procesan los valores recibidos en dos nuevos bloques de programación. De este modo se podrá visualizar mejor su estructura y será más 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 Dirección que conectarán con las tomas del bloque Mover. El algoritmo será el siguiente: 1. Multiplicar el valor de la variable Potencia por -2 (además 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 Matemáticas) 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 Bifurcación utilizado la opción Falso queda vacía. 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:

Después de hacer el primer nuevo bloque me he dado cuenta que podía simplificarse la comprobación que se hace para saber si el valor de la variable se encuentra en un intervalo determinado. Hay un bloque específico 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 Matemáticas (Valor absoluto) y Comparación 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. ¿Cuál es el problema? Una vez que se lee el contenido de un buzón su valor se convierte en cero. Si se lee de nuevo el buzón 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 más elegante que otra. La primera permite mantener el anterior algoritmo, añadiéndole una espera de dos décimas 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 solución más elegante. Se trata de esperar a que se hayan recibido los dos mensajes, y a continuación leer los buzones. El nuevo algoritmo será el siguiente: 1. Encender el Bluetooth (opcional) 2. Crear una variable numérica para almacenar el giro del Volante 3. Crear una variable numérica 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 Dirección al bloque Mover

El bucle que contiene los dos bloques Recibir mensaje está configurado para que se repita hasta que le llegue un valor lógico 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 Lógica (operación 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 botón naranja en el mando a distancia los dos programas se detendrán. 2. Agregarle un sistema que al arrancar el programa del mando a distancia centre automáticamente 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 configuración 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 continuación. NXT-G incorpora a partir de la versión 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 opción Crear Pack and Go del menú Herramientas abre un cuadro de diálogo 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 bรกsico

17


18


19


20


Mando avanzado

21


22


23


24


25



Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.