domingo, 6 de septiembre de 2015

Videojuegos para padres y maestros - Minetest (XV) - Mesecons (y 5)

Normalmente si tenéis los conocimientos previos necesarios, podéis seguir cualquier capítulo de esta especie de cursillo de manera independiente... sin embargo... éste que estáis leyendo precisa ver el anterior. Así que lo tenéis AQUÍ

Estuvimos viendo como podemos usar el Microcontroller de Mesecons para encender los puertos que queremos en función de si un puerto está activo o no.

Pues bien, también lo podemos hacer al revés... es decir, activar o no un puerto en función de los demás. Para ello usaremos condiciones lógicas que corresponden a las puertas lógicas que vimos en ESTE CAPÍTULO. (Ahí se explica más a fondo).

Veámoslo: 

NOT (!)

Si queremos activar el puerto B si el puerto A NO está activado:

off(B) if(!A) on(B);

AND (&)

Activamos el puerto B si el puerto A está activado Y el puerto C también:

off(B) if(A&C) on(B);

Activamos el puerto B si el puerto A está activado Y el puerto C NO lo está:

off(B) if(A&!C) on(B);

OR (|)

Activamos el puerto B si el puerto A está activo O el puerto C está activo (o los dos)

off(B) if(A|C) on(B);

El simbolito éste lo tenéis en la tecla [1] con el [Alt Gr] pulsado...


XOR (~)

Activamos el puerto B si el puerto A está activo O el puerto C está activo (pero NO los dos)

off(B) if(A~C) on(B);

Para conseguir este símbolo, lo mejor es que lo copiéis de esta página y lo peguéis pulsando  [CTRL + V] en Minetest o bien podéis pulsar [Alt Gr] + [4].

Igual (=)

Activamos el puerto B si el puerto A y el puerto C son iguales.

off(B) if(A=C) on(B);

Borriquito como tú

Contemplad esta creación:



Si yo quisiera pintar un A, debería iluminar los cubos con los números 1,2,3 y 5.  ¿Qué cubos debería pintar para el resto de vocales? 

Volvamos al ejercicio anterior.... ¿Hay algo que nos impida que el 1 sea la A, el 2 la E, el 3 la I?

Recopilemos:


¿Recordáis la tabla anterior?  La hemos ampliado con las luces a encender...  Podéis imaginar que la estrategia que vamos a usar es un microcontroller conectado a las luces 1, otro a las 2, otro a las 3... y que recibirá la letra pulsada y encenderá las luces si corresponde. ¿Y como metemos la letra pulsada al microcontroller?   La tenemos del ejercicio anterior.  Recordáis que habían unas luces que se encendían en función de tener un 1, un 2... es decir... una A, una E...

Pues bien... quitamos la luz A y conectamos el cable que la iluminaba con cada uno de los puertos A de los nuevos microcontroller. Hacemos lo mismo con las luces C y D. De esta manera cada microcontroller ya sabe que letra le está entrando...

Igual para que quede un poco más limpio tendréis que pasar cables bajo el suelo... es cuestión de hacer y deshacer hasta que os satisfaga el resultado...



Conectamos una luz a cada puerto libre (el B) y ahora ¿qué código ponemos?  No hay una solución única... pero el proceso mental es el mismo... se trata de agrupar de alguna manera todas las salidas. Es razonamiento puro...


Vemos que los 1 se encienden cuando A=1 y además cuando A es 0 y al mismo tiempo C es 1 o D es 1, pero no los dos a la vez, o sea un XOR.

Así que, en función a este razonamiento, el código del microcontroller que ilumina los 1 será:

off(B) if(A) on(B); if(!A&C~D) on(B);

Si venís del ámbito informático seguro que se os ocurre meterlo todo en un sólo if... el problema es que necesitaríamos paréntesis y estos no se admiten. Otra cosa importante es pensar en no preguntar sólo por los ceros, ya que en origen el microcontroller está apagado y ¡todo es cero!

Para los siguientes microcontrollers yo he escogido una solucion, pero podría existir otra más mejor. De todas maneras no estaría de más tratar de comprenderlas.

Microcontroller 1:  off(B) if(A) on(B); if(!A&C~D) on(B);
Microcontroller 2:  off(B) if(!A&!C&D) on(B); if(!A&C&!D) on(B); if(A&!D) on(B);
Microcontroller 3:  off(B) if(C~D&!A) on(B);
Microcontroller 4:  off(B) if(A) on(B); if(!A&C&!D) on(B);
Microcontroller 5:  off(B) if(D) on(B); if(A&!C&!D) on(B);

Conectad los puertos B de cada microcontroller a una luz (como en el afoto de arriba) y probad que se enciendan las luces deseadas...

Gran remate final y no estamos en rebajas

1.- Quitamos las luces de prueba.
2.- Montamos el 8 del principio del artículo.
3.- Unimos los cubos del mismo número (Todos los 1 con un cable, los 2 con otro)
4.- Unimos el cable que une los unos con el microcontroller 1, el cable que une los doses con el microcontroller 2 y así todos... 

Paciencia... no es fácil... usad aislantes y trabajad bajo el suelo si es necesario... mirad la que he liao:


Para guiar los cables podéis construir columnas de tierra (que luego podéis eliminar) y muy importante usar la herramienta del destornillador (buscadla en el inventario) que permite rotar los elementos para que se coloquen en la posición deseada.


¿El resultado?   


Como podéis imaginar, se podría hacer lo mismo con los números... aunque se complica un poco ya que las agrupaciones de los palos tienen que ser más pequeñas... pensadlo... además sólo podréis representar hasta el número siete...  ¿Qué por qué?  Completad la tabla y lo veréis...

Y nada más... evidentemente este ejercicio es muy complicado pero tiene razonamientos lógicos profundos que pueden ser un reto para l@s chaval@s de mayor edad...

En el próximo capítulo algo más de Microcontroller...

Un besín.

sábado, 5 de septiembre de 2015

Videojuegos para padres y maestros - Minetest (XIV) - Mesecons (y 4)

Microcontroller


Bueno... atención porque ya estamos en nivel FMM(*) 

Como podéis ver, este elemento tiene cuatro conectores (que llamaremos puertos) nombrados con las letras A,B,C,D que pueden lo mismo recibir como emitir electricidad. Para conseguir tal efecto se deben programar. Para ello 'picamos' sobre el microcontroller con el botón derecho del ratón. Se nos abrirá una ventana de diálogo que nos permitirá introducir nuestro código.


Funciones básicas

Como podéis imaginar consisten en activar y desactivar los puertos con el siguiente código:

on (puerto A, puerto B, ...)     y     off (puerto A, puerto B, ...) 

Es decir, que si conectamos cuatro lámparas cada una a cada uno de los puertos, on(A) encenderá la que se encuentre conectada al puerto A y on(B, D) las conectadas a los puertos B y D.

Además se pueden concatenar, es decir podemos poner algo del tipo:   on(B,D) off(C)

Cláusula if

- DING DONG,  ¿Es la academia de inglés low-cost?
- If, if...   between, between...

Me atrevería a decir que la cláusula o instrucción if aparece en todos los lenguajes de programación de alto nivel. Su funcionamiento es muy simple:  Si pasa esto haz esto otro.

Por lo tanto podríamos poner dentro del microcontroller lo siguiente:

if (A) on(B,D) off(C);

Es decir, que si entra electricidad por el puerto A, emitiremos por B y D y dejaremos de emitir por C.

¡Mucha atención al punto y coma! 

El punto y coma nos indica hasta donde llega lo que tenemos que hacer. Si ponemos:

if (A) on(B,D); off(C)

se activarán los puertos B y D si entra electricidad por A, pero se desactivará C en todo caso.

1 + 1 = 0 y me llevo 1

Como sabéis los ordenadores lo hacen todo con 1's y 0's. De hecho lo de arriba es cómo sumaría el ordenador 1 y 1. Ahí no vamos a entrar pero es interesante saber como representan los números... para un ordenador el 0 es un 0 y el 1 es un 1, pero el 2 es 10, el 3 es 11, el 4 es 100 y el 5 es 101... o sea:


Al sagaz lector no se le habrá escapado el hecho de que las letras corresponden a los puertos del microcontroller...

Mirad esto...


Lo que vamos a intentar es que al pulsar cada botón, se enciendan las luces correspondientes y para ello nos fijaremos en la tabla que hemos puesto arriba. Es decir, vamos a intentar que al pulsar el 1 se encienda la luz D, con el 2 la C, con el 3 las luces C y D, con el 4 la A y con el 5 la A y la D.

El circuito parece enrevesado pero es muy sencillo. Ponemos un microcontroller por cada botón y hacemos los conectamos por el puerto B. Luego unimos todos los puertos A de todos los microcontroller con un cable y el cable con la luz A. Hacemos lo mismo con los puertos y luces C y D.

Deberéis usar cables con aislante para ello, Os daréis cuenta de ello nada más empezar a trabajar. Se requiere un poco de práctica, pero no os desaniméis. Otra opción sería excavar el suelo en varios pisos y que los cables fueran por el piso correspondiente para que no se unieran... pero es más trabajoso, aunque queda más limpio.

Ahora sólo nos quedaría programar los microcontroller para que enciendan las luces correspondientes:

Microcontroller 1 :  off(D) if(B) off(A,C) on(D);
Microcontroller 2 :  off(C) if(B) off(A,D) on(C);
Microcontroller 3 :  off(C,D) if(B) off(A) on(C,D);
Microcontroller 4 :  off(A) if(B) off(C,D) on(A);
Microcontroller 5 :  off(A,D) if(B) off(C) on(A,D);

Si os fijáis, todas las instrucciones empiezan con un off de las mismos puertos que activaremos. Esto es así. Si no lo pusiéramos, el puerto quedaría activo de por vida. No tiene mucho sentido lo se... pero me tenéis que creer.

El resto de off podríamos obviarlos. Pero los pongo porque queda más claro... 

Y creo que esto está quedando muy denso... así que a merendar!

De todas formas no creáis que esto va a quedar así... en la próxima entrega le vamos a dar una vuelta al microcontroller y seguiremos ampliando el ejercicio. No os lo perdáis el resultado va a ser sorprendente...

----
(*) FFM = F***ing Master of Minetest