Sei sulla pagina 1di 36

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.1.-Propuesta
En el interior de un rea circular limitada por una lnea negra hay dos latas de bebida de 330cc llenas. Se trata de montar y programar un robot que saque las dos latas fuera del rea circular y que tras ello emita un sonido y se detenga. El material disponible es una caja de LEGO MINDSTORMS NXT 2.0 pero por diversas circunstancias solo se dispone de un sensor de contacto y uno de color (el sensor de color se puede sustituir por uno de luz).

NOTA: El rea circular se puede sustituir por una rectangular. El interior no tiene porqu ser blanco, con que sea un tono claro que se diferencie bien del negro es suficiente. En la figura las latas se representan por medio de los crculos rojos.

2.2.-Por dnde empezar


La planificacin es fundamental si queremos alcanzar un buen resultado. Reflexionar y determinar los pasos a dar debe ser el punto de partida. A la hora de hacerlo no hay que olvidar que cualquier reto con robots tiene dos partes bien diferenciadas y a la vez estrechamente relacionadas entre s: el hardware (el robot propiamente dicho) y el software (el programa). Cada una de estas partes condiciona la otra, as que en un proceso de ensayo y error habremos de tener en cuenta las dos. Las tareas a realizar sern las siguientes: 1. Disear y montar el robot 2. Escribir el programa (en el caso de NXT-G enlazando bloques de programacin). Para ello primero habr que escribir el algoritmo para a continuacin convertirlo en un programa. 3. Probarlo y cuando sea capaz de desarrollar la tarea asignada 4. Mejorarlo

3.3.-El robot
Para empezar conviene tener claro cules son las restricciones (lmites que no podemos sobrepasar es su montaje y programacin) que plantea el reto y las habilidades que ha de poseer el robot, que en este caso son las siguientes: Restricciones El robot slo puede utilizar un sensor de contacto y uno de luz. No hay ninguna en cuanto a tamao y otras piezas a utilizar. Habilidades El robot ha de ser capaz de desplazarse y girar sobre el rea de juego. Ser capaz de detectar la lnea negra que limita el rea mantenindose dentro del rea de juego. Ser capaz de detectar cundo choca contra una lata y sacarla del rea de juego. Ser capaz de saber cundo ha sacado las dos latas.

Una vez que est montado y comencemos a probarlo probablemente se presente algn problema que requiera cambios. Por ejemplo, un problema que se me ha presentado est relacionado con el sensor de color: cuando he probado el primer programa el sensor lea cualquier color como negro. Tras varias pruebas, suspiros, cambios me he dado cuenta que el problema era que el sensor estaba demasiado pegado al suelo, lo que impeda que la luz que emita se reflejase y volviese al sensor. En consecuencia todo era negro para l. Elevando un poco el sensor el problema se ha resuelto.

4.4.-El algoritmo
Antes de empezar a combinar los bloques que definirn el programa conviene escribirlo en nuestro propio lenguaje natural, es decir, escribir los pasos que pensamos que ha de dar el robot para conseguir su objetivo. No hay un algoritmo nico para una tarea del mismo modo que las personas realizamos nuestras tareas de diferentes maneras. As que despus de escribirlo conviene reflexionar por si se nos ocurre otro modo de conseguir el objetivo de un modo ms eficiente. En este caso las tareas a programar sern las siguientes: 1. Crear y poner un contador a cero (almacenar el nmero de latas que ya han sido sacadas del rea circular) 2. Avanzar recto hasta que el robot detecte raya negra u objeto a. Si detecta objeto seguir avanzando hasta que detecte la lnea negra (lo cual querr decir que la lata est fuera) y sumar al contador de latas una unidad 3. Detenerse, retroceder y girar 4. Si el contador es 2, emitir un sonido y detenerse sino volver al principio del programa Este no es mas que un punto de partida que puede requerir modificaciones o mayor concrecin en alguno de los puntos a lo largo de la programacin.

5.-El programa
Ya sabemos cules son los pasos que ha de dar el robot para conseguir su objetivo, pero no es necesario que nos enfrentemos al programa completo desde el principio, ni recomendable. Una estrategia muy til es descomponer los problemas complejos en problemas sencillos; en este caso descomponerlo en dos retos que resolveremos previamente antes de combinarlos en uno solo: 1. robot que se mueve de modo aleatorio en el rea de juego sin salir fuera de ella. 2. robot que empuja una lata fuera del rea de juego y que retrocede y emite un sonido una vez lo haya conseguido. Reto bsico 1 Veamos el algoritmo del primero antes de ver el cdigo: 1. Avanza hasta que el sensor de luz lee negro 2. Se detiene

3. Retrocede 4. Gira 5. Repetir los mismos pasos. Para decirle qu ha de esperar a que el sensor lea negro se puede utilizar cualquiera de las tres siguientes opciones. La funcionalidad es exactamente la misma, sin embargo, la tercera nos abre el camino para la combinacin de los dos retos.

Dado que se tienen que repetir los mismos pasos una y otra vez habr que colocar los bloques en el interior de un bucle tal y como se ve en la siguiente figura:

Hay que probarlo y observar si su comportamiento es el esperado. Mejora al reto bsico 1 Si se observa cmo navega el robot con el anterior programa, se puede ver que los giros siempre los hace iguales. Si se quiere que la navegacin no sea tan predecible hay que permitir que sea el robot el que decida sobre su giro. Vamos a programar el robot decida si gira a izquierda o derecha y que ese giro est comprendido entre 0 y 90. Antes que nada hay que determinar cunto han de girar los motores para que el robot gire 90, para ello en este caso la nica manera es el tanteo. En mi caso he empezado con un giro de 720 que al probar se ha visto excesivo.

Tras varias pruebas he comprobado que con el valor de 500 el giro se acerca lo suficiente a 90. Una vez que ya conocemos la magnitud del giro mximo ser necesario generar dos valores aleatorios: uno para determinar el sentido de giro (0 1) y el segundo para su magnitud (entre 0 y 500). En la siguiente figura puede verse el fragmento de programa correspondiente al giro.

El cable que lleva la magnitud del giro est conectado a la entrada Duracin del bloque Mover. Para que interprete este valor como grados habr que seleccionar en su panel la opcin Grados (Segundos si lo que entra es tiempo). Para simplificar el programa se puede convertir este fragmento de programa en un nuevo bloque de programacin de tal manera que el nuevo programa para el Reto bsico 1 ser el siguiente:

Una vez hecho el programa toca probarlo. Y cul ha sido el resultado? Pues no ha sido el deseado, me he dado cuenta que el robot una vez alcanzada la lnea retroceda y a continuacin a partir de esa posicin giraba a la izquierda o derecha con un mximo de 90 a cada lado, cuando en realidad lo que quera era que hiciera eso una vez que estuviese mirando en sentido contrario. Las posibles soluciones son dos: 1. Girar primero 180 hasta mirar en el sentido contrario y despus girar a un lado u otro. 2. Girar un ngulo entre 90 y 270 con lo que se consigue el mismo resultado. Para la primera solucin slo hace falta introducir un bloque de programacin que genere un giro de 180 (1000 de los motores en base a lo que hemos calculado) antes del giro aleatorio. El programa quedara as:

Pero si reflexionamos un poco podemos deducir que con la segunda el programa resultante va a ser ms sencillo. nicamente hay que modificar el nuevo bloque que hemos creado: Giro aleatorio De este aleatorio. modo ya no har falta que echemos a dados a qu lado ha de girar, ser suficiente con que lo programemos para que gire entre 90 (500 motor) y 270 (1500 del motor). Para modificarlo hay que hacer un doble clic sobre el nuevo bloque Giro aleatorio para abrirlo, hacer los cambios que se deseen y guardarlo otra vez. Con ello el bloque Giro aleatorio se habr reducido a lo siguiente:

Reto bsico 2 Vamos a ver el segundo, vamos a suponer como estado inicial que el robot est apuntando a la lata (para que no tenga que buscarla), lo cual permite que el algoritmo sea el siguiente: 1. Avanzar hasta que choque con la lata 2. Continuar avanzando hasta que alcance la lnea oscura que limita el borde 3. Detenerse 4. Retroceder 5. Emitir un sonido El acercamiento hasta que encuentra la lata lo he hecho de la misma manera que en el caso anterior, aunque cualquiera de los otros dos de la figura siguiente generaran idntico comportamiento.

El bloque presente entre los dos bucles lo nico que hace es reducir un poco la velocidad del robot una vez que la detecta.

Programa completo Si lo anterior va bien, ahora es el momento de combinarlo en un nuevo programa. Vamos a empezar creando una variable (representada por el bloque con aspecto de maletn) en la que podamos almacenar el nmero de latas sacadas del rea de juego. La variable se crea por medio de la opcin Definir

variable del men Herramientas y se inicializa con el valor cero de la siguiente manera:

Vamos a ver primero cmo se pueden monitorizar dos sensores a la vez y tomar decisiones en base a dichos valores (paso 2 del algoritmo).

El fragmento de programa de la imagen comienza poniendo en marcha el robot antes de dar inicio a un bucle que se repetir hasta que el sensor lea negro (llega al borde) o el sensor de contacto sea presionado (contacto con la lata). Para ello en el interior del bucle lee continuamente los dos sensores y por medio de una operacin lgica (en este caso OR), combina dichas lecturas generando un valor lgico que ser Verdadero si hay contacto con la lata, llega a la lnea o si se cumplen las dos condiciones de modo simultaneo. El robot ha de saber si ha llegado al borde o ha chocado con una lata, para lo que resulta til un condicional que slo se ejecutar en el caso en que haya habido contacto con la lata. En ese caso empujar hasta que llegue a la lnea y sumar una lata a la cuenta (es el paso 3).

Si lo que haba hecho era llegar al borde (o lo que es lo mismo, no ha chocado con la lata) evitar ejecutar esta secuencia de bloques. 8

TRUCO! : Si se desea que el programa se muestre de un modo ms ligero (en el de la figura el ramal inferior no aporta nada), es posible hacerlo haciendo clic sobre Vista Plana del panel de configuracin de la Bifurcacin. Se puede ver el resultado en la figura siguiente. Bifurcacin

Tras detener el robot, retroceder y girar (paso 4) hay que comprobar cuntas latas estn ya fuera. Para ello comprueba el valor del contador que en el caso de que sea 2 finaliza el bucle y genera un sonido antes de finalizar el programa (paso 5).

6.-Probar el robot
Ahora ya podemos probar el robot y valorar los resultados, si no se corresponden a lo que esperbamos habremos de valorar si hemos de modificar el robot, el programa o los dos. Recomendacin! No conviene aplicar mltiples cambios a la vez, ya que no sabremos cul de dichos cambios es el que ha causado la mejora o ha provocado que lo que iba bien haya dejado de hacerlo.

7.-Por dnde seguir


Si has llegado hasta aqu todava le puedes sacar ms jugo a este reto intentando incluir las siguientes modificaciones: 1. Tienes un sensor de ultrasonidos, as que puedes hacer que tu robot no se mueva a ciegas. Con este sensor podr localizar las latas sin necesidad de tocarlas. 2. Vas a cambiar la lata por otro objeto ms pesado, puede ser una lata de tomate de 800gr u otro objeto similar (o ms pesada). Este ejercicio es interesante para acercarse a lo que es una competicin de sumo entre robots, en este caso con un peso muerto.

10

A.datos A.-Cables de datos


NXT-G est basado en LabView, un lenguaje de programacin grfico que utiliza cables para unir los diferentes bloques de programacin y transportar datos.

NXT-G tambin utiliza cables para transportar datos, aunque no son necesarios al iniciarse en su programacin. Sin embargo, si se quiere avanzar en el dominio de NXT-G y desarrollar programas ms complejos es necesario dominar el uso de cables de datos. Para las conexiones hay que desplegar los concentradores de datos de los bloques de programacin haciendo clic en su parte inferior. En la siguiente imagen puede verse el bloque Visualizar con el concentrador cerrado y abierto.

Un ejercicio bsico de cableado es el convertir un nmero en texto para poder mostrarlo en el monitor del NXT, por ejemplo la lectura del sensor de ultrasonidos. El programa ser el siguiente:

11

Los cables presentan diferentes colores en funcin del tipo de datos que transportan. El amarillo se corresponde a valores numricos, el naranja a texto y el verde a valores lgicos. Si se realizan conexiones ilegales, las que unen conectores de diferentes tipos, el cable adquiere el aspecto de la siguiente figura. En dicho ejemplo se ha intentado unir una salida con valor numrico con una entrada que espera un texto.

B.-Monitorizacin de sensores Monitorizacin


Cuando se programa con sensores en muchos casos lo significativo no es el valor que lee el sensor, sino saber si esa lectura cumple una condicin, por ejemplo, si la distancia que mide el sensor de ultrasonidos es menor que 20 cm o no lo es. En otros casos el valor de lectura s ser importante, por ejemplo si queremos que un robot vaya reduciendo su velocidad cuando se acerca a una pared. Aqu voy a centrarme en el primero de los casos.

Algunos ejemplos de condiciones


Veamos algunos ejemplos de condiciones de la vida diaria que pueden ayudar a entender lo que va a continuacin: La temperatura en el balcn supera los 20 La luz del bao est apagada Ha sonado el timbre de la puerta Han pasado ms de 5 minutos desde que la clase ha empezado Miguel ha llegado tarde 12

Todas estas expresiones se pueden cumplir o no, es decir tener como valor Verdadero o Falso. En funcin de ese valor se proceder de una manera o de otra, por ejemplo:

Si Ha sonado el timbre de la puerta entonces brela


Dependiendo del valor de Ha sonado el timbre de la puerta habr que abrirla o no.

Bloques de programacin para sensores programacin


NXT-G dispone de un bloque de programacin para cada sensor que permite acceder al valor de la lectura. En la figura siguiente puede verse el men Sensor abierto con los bloques preinstalados en NXT-G Educacin 2.1. Va Por medio del men Herramientas > Asistente de Importacin y

Exportacin de bloques se pueden instalar los correspondientes a otros sensores.

Adems de este, se pueden utilizar las lecturas de los sensores ligadas a los bloques que controlan el flujo del programa: Espera, Bucle y Bifurcacin, que pueden verse en la siguiente imagen asociados a un sensor de contacto.

13

Atencin!!: Atencin!! Una fuente de errores suele ser el confundir el uso del bloque que detiene el flujo del programa hasta que la lectura del sensor es la deseada (men Flujo con franja naranja). y el que proporciona la lectura de un sensor (men Sensor, con franja amarilla) En el segundo caso el programa lee la lectura del sensor y sigue adelante con el siguiente bloque. En la figura se puede apreciar la diferencia entre los dos en el caso del sensor de contacto.

Algebra de Boole
Las funciones del lgebra de Boole son muy tiles en programacin y NXT-G permite utilizar varias de ellas. Estas funciones permiten operar con valores lgicos, es decir, con valores tales como Verdadero o Falso (estos valores tambin pueden ser representados como 1 0). Los resultados de las condiciones mencionadas anteriormente (por ejemplo, la temperatura en el balcn ha superado 220) son valores lgicos. Si se utiliza una sola condicin, o un solo sensor, se puede programar sin recurrir a estas funciones, pero cuando se combinan dos o ms condiciones, como en este reto, las funciones del lgebra de Boole son muy tiles. En los cuatro operadores que se presentan a continuacin, se indica cmo se calcula el resultado y se presenta la correspondiente tabla la verdad. Una tabla de verdad es algo similar a lo que en aritmtica es la tabla de multiplicar, esta tabla nos da el resultado de aplicar estos operadores para distintos valores de entrada.

programacin Bloques de programacin


Los bloques a utilizar con valores lgicos se encuentran en el men Datos que puede verse desplegado en la siguiente figura. En los siguientes ejemplos se utilizar el primero de ellos, denominado Lgica.

14

Operador Operador Y (AND)


El operador Y relaciona dos entradas. Para que el resultado sea Verdadero las dos entradas debern tener el valor Verdadero. Si cualquiera de las dos es Falso la salida tambin ser Falso. La tabla de verdad de este operador es la siguiente: A V V F F B V F V F Resultado V F F F

En la imagen siguiente puede verse el modo en el que se utiliza este operador. Los maletines representan variables que contienen valores lgicos.

Operador O
Este operador relaciona dos entradas, la salida es Verdadero en el caso que al menos una de ellas sea

Verdadero.

A V V F F

B V F V F

Resultado V V V F

Un ejemplo de uso de este operador es el caso en el que un robot tiene dos sensores de contacto en la parte frontal uno en cada lado. Utilizando este operador el robot podr controlar los dos sensores a la vez tal y como se muestra en el siguiente programa.

15

El robot se pone en marcha y lee continuamente los dos sensores, combina sus lecturas por medio de la funcin O y repite este proceso hasta que la funcin devuelve un Verdadero.

Operador O exclusivo
En este caso para que el resultado sea Verdadero una y solo una de las condiciones ha de ser Verdadero, en el resto de los casos el resultado ser Falso. A V V F F B V F V F Resultado F V V F

En la imagen siguiente puede verse el modo en el que se utiliza este operador. Los maletines representan variables que contienen valores lgicos.

16

Operador NO
El operador NO da como resultado el valor opuesto al de entrada, es decir, si la entrada es Verdadero, la salida ser Falso. La tabla de verdad de este operador ser la siguiente: A V F Resultado F V

En la siguiente imagen puede verse un ejemplo con NXT-G.

C.-Nmeros aleatorios C.Obtener un valor aleatorio es como echar a suertes a ver cul sale, de la misma manera que se hace con un dado o una moneda. Utilizarlos permite que el robot no sea tan previsible en su comportamiento. De este modo es posible que gire a un lado u otro, que gire ms o menos Para generar valores aleatorios se utiliza el bloque de programacin Aleatorio (Random en ingls) del men Datos.

17

Este bloque devuelve un nmero aleatorio comprendido entre los valores que se introduzcan en su panel, en el ejemplo de la figura un nmero comprendido entre -180 y 180. El siguiente programa permite probar este bloque y conocer su funcionamiento. En este ejemplo el bloque Aleatorio devuelve un nmero entre -180 y 180 que se muestra en la pantalla del NXT. Dado que la pantalla del NXT solo acepta texto y no nmeros (cantidades), el programa convierte el valor devuelto por el bloque Aleatorio en una cadena de caracteres antes de mostrarlo. El bloque de espera de dos segundos facilita la lectura de los resultados que se irn generando hasta que se detenga el programa.

Si lo que se desea es generar un valor lgico, es decir, Falso o Verdadero, lo que habr que hacer es generar primero un valor aleatorio entre 0 y 1, y convertirlo despus en un Falso o Verdadero utilizando el bloque Comparar del men Datos. Esto es lo que hay que hacer si se quiere echar a suertes hacia qu lado queremos que gire un robot tal y como puede verse en el programa de la siguiente figura. La razn es que el bloque Mover requiere de un Verdadero para moverse hacia adelante y un Falso para moverse hacia atrs

18

En la figura se puede ver en la parte superior el panel de configuracin del bloque Comparar. Compara el nmero aleatorio con 1 con el operador Iguales de tal modo que convertir el 1 en Verdadero (movimiento de avance) y el 0 en Falso (retroceso).

19

Instrucciones de montaje

Piezas necesarias

20

21

22

23

24

25

26

27

28

29

30

31

32

33

Potrebbero piacerti anche