sábado, 4 de julio de 2015

Sesión 5: Creando nuestros Bloques


Ya dijimos en el punto anterior que, si convertimos rutinas frecuentes en bloques de creación propia, podremos acudir a ellos cada vez que las necesitemos sin necesidad de escribir la secuencia cada vez que aparezca. Otra enorme ventaja añadida es que reduce espectacularmente el tamaño del programa compilado: esto es fundamental en el ladrillo NXT donde la memoria para programas es de apenas unos 70 KB; el ladrillo EV3 no está tan limitado.

Empezamos a crear nuestros primeros bloques (se explica como crearlos en el tutorial que incluye el NXT 2.1 Programmin. Se accede a este tutorial con la barra Technics naranja que ve en la pantalla del programa arriba a la derecha). Combinando lo aprendido en el manejo de los servomotores, empezamos a crear unas secuencias básicas que inmediatamente convertimos en bloques de la paleta personalizada accesibles dentro de "Mis bloques". Aparecen, si abrimos el programa "22jun" , con nombres que aparecerán en lo sucesivo en cursiva, al igual que los nombres de variables. Estos bloques básicos son:
  • girar bandeja 90º a izquierda (Mesaizquierda)
  • girar bandeja 90º a derecha (Mesaderecha)
  • bloquear (Blokeo): sujetar la capa superior del cubo para poder rotar sólo la capa inferior.
  • desbloquear (Desblokeo): dejar de sujetar la capa superior del cubo, devolviendo el brazo v/b a la posición de reposo.
  • voltear (Volteo): volcar el cubo entero 90º a la izquierda con la ayuda del brazo v/b. Importante: si trabajamos con el prototipo Tilted Twister, como quiera que voltea hacia la derecha (si mantenemos el convenio de mirar frontalmente el prototipo con el brazo v/b a la izquierda y los sensores de color a la derecha), habría que rediseñar toda la propuesta de  los 12 bloques (B, B', F, F', etc) que se explica más abajo.
A estos añadimos los bloques
  • girar capa inferior 90º a la izquierda (planoinfizq)
  • girar capa inferior 90º a la derecha (planoinfder)
Estos dos bloques deberían programarse a partir de una combinación como la que sigue:

planoinfizq = Blokeo + Mesaizquierda+ Desblokeo

Pero, debido a la necesaria holgura de la bandeja respecto del cubo, la cara superior no se terminaba de quedar escuadrada con la capa inferior. Entonces, se optó por lo siguiente:

planoinfizq = Blokeo + girar bandeja a la izquierda 105º + Desblokeo +girar bandeja a la derecha 15º

Y lo mismo para planoinfder. Este escuadre no siempre se obtiene al 100%. Cuando el desfase de ángulo entre la cara superior e inferior alcanza un mínimo, suele provocar disfunciones  en el movimiento de volteo siguiente que obligan a hacer correcciones manualmente. En la última entrada del blog aportaremos ideas para corregir o minimizar los problemas detectados.

A continuación creamos otros 12 bloques que son los movimientos básicos para resolver nuestro cubo de Rubik de 2x2x2. Estos bloques son U, U', D, D', R, R', L, L', F, F', B y B'. En el dibujo adjunto se muestran 6 de estos movimientos. Los movimientos con la "comilla" son los mismos, pero en sentido contrario, esto es, en sentido antihorario si se mira la cara afectada frontalmente.


Estos movimientos se pueden programar y guardar como bloques personalizados como sigue:

D = planoinfder
D' =planoinfizq
L = Volteo + plainfder + Volteo + Volteo + Volteo

Estos tres  últimos volteos sirven para dejar el cubo con la orientación que tenía inicialmente; veremos, cuando sigamos generando secuencias, que es fundamental dejar siempre el cubo con la orientación que tenía inicialmente para que las secuencias basadas en los 12 movimientos no pierdan el sentido.

L' = Volteo + planoinfizq + Volteo + Volteo + Volteo
U = Volteo + Volteo + planoinfder + Volteo + Volteo
U' = Voleot + Volteo + planoinfizq + Volteo+ Volteo
R = Volteo + Volteo + Volteo + planoinfder + Volteo
R' = Volteo + Volteo + Volteo + planoinfizq + Volteo
F  = planoinfder + R + planoinfizq
F' = planoinfder + R'+ planoinfizq
B = planoinfizq +R + planoinfder
B' = planoinfizq +R' + planoinfder

Éste podría ser un buen momento para programar y ejecutar la secuencia siguiente con el prototipo y un cubo completado y comprobar si hemos hecho bien toda la programación de la sesión.



En este programa de prueba sería deseable que entre un movimiento y otro hubiera una pausa de 5 segundos y un pitido y/o un mensaje en pantalla que nos diera tiempo a asegurarnos de que se ha terminado correctamente cada movimiento básico.

Y ahora acometemos otro par de bloques personalizados: son Secuencia A y Secuencia B. Para comprender de qué hablamos, hay que adelantar que la resolución del cubo la basamos en tres etapas que se detallarán en próximas entradas: la primera es la resolución de la cara blanca (superior); la segunda es completar la cara amarilla (inferior) con sus cuatro vértices sin ordenar; y la tercera es la ordenación de esta cara amarilla. Pues bien, la secuencia A es la que permite, repitiéndola varias veces dependiendo del caso, hacer la segunda etapa. Y la secuencia B es la que permite resolver la tercera etapa, repitiéndola varias veces dependiendo del caso.

Secuencia A = R' + U' + F' + U + F + R
Secuencia B = L + F'+ L + B + B + L' + F + L + B + B + L + L


No serán los últimos bloques que creemos. Ya iremos describiéndolos a medida que aparezcan en las siguientes entradas.