Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
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.
10
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.
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:
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.
14
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
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