¿Como funciona un semáforo? Parte 2 Scratch

Continuando con el semáforo, pasamos a realizar un ejemplo visual con Scratch.

El funcionamiento de un semáforo es muy sencillo, como se vio en la anterior entrada, hacer el control de un cruce no es mucho más complicado, pero con Scratch podemos aprender en este ejercicio algunos aspectos básicos de la programación y la diferencia entre como percibimos el mundo los humanos y como se comporta un mundo virtual.

Conociendo Scratch

Partimos de un cruce de doble carril. Cuatro coches uno en cada carril y sentido. Como en la anterior, esta practica esta realizada con una pequeña de 7 años. Si os animáis a hacerla con algún niño, podéis dejarle hacer los coches.

Si no tenéis ni idea de Scratch, mejor empiezo con una explicación muy rápida. El programa se divide en tres partes fundamentales.

El espacio visual del programa que se ejecuta. Donde veremos lo que hace nuestro programa.

programa

La zona de objetos. Donde cada nuevo objeto creado tendrá asociado el siguiente panel de código.

objetos

Y la zona de código. Es independiente de cada objeto. Cada vez que seleccionamos uno, nos aparecerá uno en donde poner de forma independiente un código que funcionará para ese objeto. El fondo, que también puede ser cambiado y tener varios, también tiene su propio código.

programa1

Visto esto, lo primero que tenemos que hacer es eliminar el gato que nos sale siempre que abrimos un nuevo proyecto, y crear un nuevo objeto. Yo he creado un fondo como si fuera una carretera, dos rectángulos grises es el asfalto y los cuadrados verdes los edificios o aceras, como prefiráis verlo. Las lineas blancas nos serán útiles más tarde.

calle

El editor de dibujo de Scratch es muy limitado, pero podemos importar nuestras imágenes o crear un dibujo en otro programa, siempre que no intentemos pasarnos con la resolución, que como podemos ver es muy limitada (por un tema de peso y velocidad).

Movimiento

Cuando ya tenemos nuestro primer objeto podemos dotarle de movimiento. En nuestro caso un bucle infinito donde comience en un punto y termine en otro. Cuando colocamos el objeto en pantalla, tenemos unas coordenadas que nos dice donde está. Si tomamos el bloque ir a una coordenada, veremos que tiene escritas las coordenadas donde tenemos el coche. Así comenzamos el programa. Luego un bucle que mueva 10 pasos en dirección que queramos. 10X para horizontal hacia la derecha, -10x para la izquierda. 10Y para vertical hacia abajo, -10Y vertical hacia arriba.

Por ultimo una condición. Si toca el borde, que empiece de nuevo.

primercoche

Como se ve en la imagen, hay un primer bloque ir a x:18 y:-169. Sirve para que siempre que comenzamos el programa el coche se coloque abajo, en la posición que puede verse. Podéis ver la condición, si tocando borde entonces, que hace que el coche vuelva a su posición de inicio, cuando toque cualquier borde de la pantalla. Puesto que Y solo se suma movimientos de 10, y no varia X, el coche solo se mueve hacia arriba y solo puede volver a inicio cuando toque el margen superior.

El bloque más grande, por siempre, es quien le dice al coche que nunca se pare, que repita siempre la acción.

Colisiones, variables y disfraces

Ahora un apartado bastante complicado de entender en principio, pero muy fácil cuando se coge el truco. Al coche lo hemos puesto con luces, no era necesario, pero mejora mucho el funcionamiento. Las lineas blancas se suponen que son los sitios donde el coche se debería parar, y ha de pararse antes de llegar a la linea, a la altura del semáforo. Las luces nos sirven como indicador. Si las luces amarillas llegan a la linea blanca, el coche tiene que pararse. En scratch podemos detectar cuando dos colores se tocan, así que vamos a usar una condición que hará parar el coche cuando el color amarillo toque el blanco.

semaforo2

El código tiene algunas cosas más y ahora las explico. Lo importante es fijarse por ahora en ese si-¿color – tocando -?

Ahora el problema es que no tenemos semáforo, aunque en la imagen ya podemos ver que tengo uno de color rojo. Es el siguiente paso, crear un nuevo objeto en forma de circulo. Y veremos que hay una pestaña donde pone disfraces. El lugar cambia según la versión del programa que usemos, pero suele ser una pestaña arriba como se ve en la imagen. Creamos una copia del circulo rojo y lo ponemos de color verde y creamos otra copia para el ámbar. Es importante ponerle bien el nombre a cada disfraz pues luego lo identificaremos más rápidamente. Al objeto semáforo lo vamos a llamar por su posición semáforo SE de sureste.

semaforo

Llegamos al semáforo propiamente dicho. Al pulsar en el objeto semáforo creado, se ve como una nueva ventana de código se crea y está en blanco. Para empezar, colocaremos también ese primer bloque, al presionar. Es necesario para que todas las partes se ejecuten al mismo tiempo, porque en este programa todo funciona sincronizado.

Ahora es lo mismo que vimos con Visualino y Arduino en la anterior entrada. La diferencia es que no encendemos un Led, si no que cambiamos de disfraz al semáforo. Empezamos y cambiamos el disfraz a verde, esperamos 4 segundos y cambiamos el disfraz a ambar, esperamos 1 segundo y cambiamos el disfraz a rojo. Esto de forma indefinida.

primer coche

De nuevo tenemos unos bloques naranjas que hemos visto también en la condición del coche. Es una variable.

¿Para que sirve?

Se podría hacer de muchas maneras, pero he usado una forma diferente para hacer lo mismo que con el ejemplo explicado de las luces. El coche no va a saber cuando el semáforo cambia de color. De alguna manera hay que hacerle llegar la información. Nosotros vemos la luz del semáforo y sabemos que tenemos que pararnos. La luz es el transmisor de información, aquí lo es la variable. Semáforo SE es la variable para este semáforo. Podemos crearla en el apartado de variables o datos. Se le van a fijar unos valores según el color de los semáforos, 1 para verde, 2 para ámbar y 0 para rojo.

semaforone

Parando el coche, condiciones lógicas.

Ahora podemos volver a la imagen que hemos visto al inicio y retomar esa condición que se ha quedado sin explicar.

El coche se tiene que parar con el semáforo en rojo, pero si completamos el programa, y modificamos el código para que no se pare con ámbar, nos daremos cuenta de que los coches se atraviesan unos a otros. Es necesario que se paren cuando el semáforo esta en ámbar, pero solo cuando esté en la posición correcta, y esa es cuando las luces del coche estén tocando la linea blanca.

Esas condiciones son O e Y. Cuando el semáforo este de color rojo O ámbar, el coche se tiene que parar. Eso significa que cualquiera de las dos pociones del semáforo vale. Pero es imprescindible que el coche no supere la altura del semáforo, de lo contrario se detendría en medio del cruce. Para eso tenemos la condición Y que significa que la condición solo se cumple si las dos son afirmativas. El semáforo esta en rojo o ámbar y el coche tiene las luces sobre la linea blanca.

semaforo2

Ahora podemos ver que tenemos una doble instrucción condicional, un SISI NO. La condición que hemos visto servia para comprobar si el semáforo estaba en Rojo o Ámbar. Cuando se cumple, hay una orden que dice esperar hasta que. Podemos ver que el movimiento del coche esta bajo el condicional SI NO, así que solo se moverá cuando el semáforo esta en verde. Ese esperar obliga al coche a detenerse mientras la variable Semáforo SE no sea de valor 1. En este caso podría ser Semáforo SE=1. Dejo que al quien le interese piense en sus implicaciones.

Para continuar, solo tenemos que crear el resto de coches. Aquí hemos creado también una moto, y usamos la rueda negra delantera para detectar cuando parar.

Para ver el funcionamiento completo, podéis ir al ejemplo que tengo subido a la web de Scratch. Ahí está el código completo y es posible copiarlo para realizar modificaciones.

Cualquier consulta podéis hacerla allí o en este mismo blog.

 

Deja un comentario