sábado, 30 de marzo de 2013

Bloques personalizados (NXT-G) 3/6

Y con ésta entrada llegamos a la mitad del tutorial que surge de la traducción del que original realizado por Dave Parker

Variables, cableado, y la edición de un Mi Bloque

El uso de parámetros de entrada es una manera en que un programa de NXT-G pueda enviar datos a un Mi Bloque. Otra forma es mediante el uso de variables. En esta sección, vamos a utilizar el bloque de Variables para enviar una pieza adicional de datos para el bloque de movimiento Forward que hemos desarrollado en el apartado anterior, a fin de que el bloque Forward tenga más capacidad y flexibilidad. De paso, vamos a aprender un par de otras técnicas que son útiles al editar o trabajar con Mi Bloques complejos.

Uso de variables para enviar datos a un Mi Bloque


Como se indicó en la sección anterior, Mi Bloque Forward supone que el robot está utilizando los neumáticos estándar NXT 2.0 en las ruedas con el fin de ser capaz de convertir centímetros de distancia del recorrido deseado a los grados de rotación del motor. Pero si un robot utilizase en su lugar orugas (o diferentes neumáticos), la conversión no sería correcta. Especialmente para un robot como el multi-Bot que puede llevar orugas y neumáticos, sería bueno si pudiéramos hacer un Mi Bloque que trabajase tanto para orugas como neumáticos. Podríamos cambiar el Mi Bloque Forward para agregar un tercer parámetro para esto (lo que requeriría empezar de nuevo, ya que no se puede agregar un parámetro a una existente Mi Bloque), pero aquí vamos a hacer esto con una variable.
Igual que una variable en NXT-G puede ser escrita en un punto de un programa y luego leerse en otro punto, usándose para pasar información de un punto a otro, una variable también se puede utilizar para pasar información entre un programa y un Mi Bloque. Para ampliar nuestro bloque Forward para hacer los cálculos correctos si se utilizan bandas de rodadura (orugas) o el estándar NXT 2.0, vamos a definir una variable de tipo lógico (el valor es verdadero o falso) de nombre Treads. Esta variable tendrá el valor Verdadero si el robot está utilizando bandas de rodadura, o Falso si se utilizan neumáticos. En concreto, en el programa principal se escribe el valor de la variable al principio del programa, y el contenido de Mi Bloque Forward lee la variable para decidir qué hacer. Si Treads es falso (el robot está utilizando neumáticos como antes), entonces cada centímetro de viaje requiere 27 grados de rotación del motor como antes. Sin embargo, si Treads es True, entonces cada centímetro requerirá 36 grados de rotación del motor (determinado por experimentación con un robot con orugas).

Definición de variables en un Mi Bloque


A diferencia de agregar un parámetro a un Mi Bloque, añadir una variable no requiere volver a empezar con la creación Mi Bloque, basta con abrir el contenido de Mi Bloque Forward y hacer nuestros cambios allí. El primer paso es definir la variable en Mi Bloque. La figura 31 muestra la variable Treads se define utilizando comando de menú Edición - Definir Variables en el contenido de Mi Bloque Forward.
Figura 31: Las variables definidas en el contenido de un Mi bloque puede ser utilizadas para enviar datos al bloque.

 

Reescribiendo el contenido de un Mi Bloque


Después de definir la variable Treads en Mi Bloque Forward, estamos dispuestos a modificar el contenido de la Mi Bloque Forward para usarla. Utilizar la variable de la forma deseada en realidad dará lugar a un cambio sustancial en la forma en que fue escrito el bloque, por lo que en este punto, es útil saber que una vez que Mi Bloque ha sido creado, pueden realizarse cambios importantes, hasta el punto de volver a escribirlo casi completamente si lo desea. De hecho, las únicas cosas que no puede cambiar de un Mi Bloque son el número y los tipos de los parámetros. Todo lo demás se puede borrar y volver a crear si es necesario.
La figura 32 muestra el contenido de Mi Bloque Forward después de eliminar los anteriores cálculos de cm a grados e iniciar el proceso de utilización de variable Treads para hacer esto de una manera diferente. El comentario de cabecera de bloque también se ha revisado para agregar una mención de la utilización de la variable Treads. Tenga en cuenta que los dos bloques de parámetros de conexión no se pueden eliminar, pero puede eliminar los cables que van de ellos y luego volver a conectarlos a los bloques nuevos o modificados, como vamos a hacer a continuación.
Figura 32: Empieza a escribir el Mi Bloque Forward utilizando la variable Treads.

Cables compartidos en una bifurcación


Con el fin de obtener el comportamiento que queremos de la variable de Treads en el bloque Forward, utilizaremos la técnica de cableado en un bloque de bifuración. Aunque no es específico para Mi Bloquess, esta técnica es especialmente útil cuando se trabaja con ellos debido a la necesidad de compartir los accesos a un parámetro, por lo que lo veremos a través de un ejemplo.
Una Bifurcación se utiliza para comprobar el valor de la variable Treads y decidir si se debe multiplicar el parámetro Distancia cm por 27 para neumáticos (cuando Treads es falso) o por 36 para orugas (cuando Treads cuando es verdadera). La Figura 33 muestra la primera parte del conmutador (Treads es verdadera) completada y cableada hasta un bloque Math que se multiplica por 36. Tenga en cuenta que la bifurcación debe tener la opción Vista plana sin marcar para mostrar la vista de pestañas, que permite pasar los cables de datos del exterior al interruptor.
Figura 33: La pestaña verdadera de la Bifurcaicón utiliza un bloque de matemáticas para multiplicar por 36 cm de distancia.
La figura 34 muestra el panel de control después de seleccionar la pestaña Falso y añadir otro bloque de matemáticas que se multiplica por 27 en lugar de 36.
Figura 34: Pestaña falsa del conmutador utiliza un bloque de matemáticas para multiplicar Distance cm por 27.
Ahora podemos conectar este bloque Math a los dos puntos de conexión ocultos que se crearon en el límite de la Bifurcación cuando la parte Veradero estaba visible. Para ello, se dibujan cables desde el bloque de Matemáticas y terminando en los dos puntos de conexión en los bordes de la bifurcación, como se muestra en la Figura 35a / b.
Figura 35a / b: Los puertos del bloque de matemáticas en la pestaña Falso de la Bifurcación se conectan a los puntos donde los cables entraron y salieron del conmutador en la pestaña Verdadero.

El resultado final es que los dos bloques matemáticos (una en cada pestaña de la Bifurcación) usan la mismo parámetro de entrada Distance cm (aunque sólo uno de ellos se ejecutará, en función del valor de la variable de Treads), y el valor del resultado del bloque matemático que fue elegido enviará sus datos al puerto Duración del bloque Mover.
 

Uso de Mis Variables de Mi Bloque en el Programa Principal


Una vez que se ha modificado el contenido de Mi Bloque Forward para leer la variable de Treads y modificar en consecuencia sus cálculos, podemos cambiar el programa principal para utilizarlo. El programa principal tendrá que escribir el valor de la variable Treads al valor correcto para el robot antes de que la variable de Treads sea leída por el bloque Forward. Sin embargo, antes de que podamos escribir la variable de Treads en el programa principal, primero debemos definirla. A pesar de que ya se ha definido la variable en el contenido del bloque Forward, tenemos que definirla de nuevo en el programa principal, como se muestra en la Figura 36. Es importante cuidar que el nombre de la variable sea exactamente el mismo que el definido en el bloque, incluyendo la capitalización (mayúsculas y minúsculas).
Nota: Cada programa y Mi Bloque tiene su propia lista de variables que se han definido y se pueden utilizar en su interior. Sin embargo, si una variable en un programa tiene el mismo nombre que una variable en un Mi Bloque utilizado por ese programa, las dos variables se refieren a la misma ubicación de almacenamiento, y por lo tanto se puede utilizar para pasar datos entre el programa y el Mi Bloque. Esto se refiere a veces como una variable "global" en otros lenguajes de programación, y de hecho todas las variables en NXT-G son globales en este sentido.
Figura 36: una variable definida en el programa principal con el mismo nombre que
una variable en un Mi Bloque tendrá acceso a la misma ubicación de almacenamiento.

La figura 37 muestra un ejemplo de programa de prueba que utiliza Mi Bloque Forward con la variable Treads. Al comienzo del programa, la variable Treads está actualizada con el valor Verdadero para indicar que el robot utiliza bandas de rodadura y no neumáticos. A continuación, el bloque Forward se utiliza dos veces junto con el bloque BeepBeep que hemos creado antes. Aunque el bloque Forward se utiliza dos veces, sólo necesita escribir el valor de la variable Treads una vez al principio del programa, y todas las instancias del bloque utilizan ese valor.
Nota: Si usted no escribe un valor en una variable antes de que se lea, entonces una variable de tipo lógico tendrá el valor Falso, una variable de tipo Number tendrá el valor 0 (cero), y una variable de tipo String estará vacía. Sin embargo, incluso si este es el valor deseado para una variable concreta, es una buena idea siempre escribir explícitamente el valor deseado de la variable antes de leerlo, para reducir la confusión y para ayudar a recordar a usted (y cualquier otro que lea de su programa) que la variable se usa más tarde.
Figura 37: Una variable escrita en el programa principal puede ser leída por los Mi Bloques.

Ahora bien, si más tarde decido modificar nuestro robot para utilizar los neumáticos en lugar de bandas de rodadura, podríamos simplemente cambiar el bloque de variable Treads al principio del programa para establecerla en Falso en vez de Verdarero, y todos los usos del bloque Forward automáticamente se adaptarán correctamente. Tenga en cuenta que si hubiéramos decidido utilizar un tercer parámetro de entrada para el bloque Forward para enviar el valor de Treads en lugar de utilizar una variable, cada uso de Forward en el programa tendría que ser cambiado para especificar el valor nuevo de Treads, por lo que en este caso utilizando una variable en lugar del parámetro parece mejor. En general, si el valor de un elemento de datos que necesita un Mi Bloque no va a cambiar mientras se ejecuta un programa, se puede considerar el uso de una variable en lugar de un parámetro de entrada.
Nota: Las variables también se puede utilizar para enviar datos desde un Mi Bloque al programa que usa el bloque. Un resultado calculado por mi un bloque que fue almacenado en una variable podría ser leído posteriormente por el programa principal u otros Mi Bloques en el programa.

1 comentario :