CC para El Aula-2do Ciclo Secundaria-Anexos
CC para El Aula-2do Ciclo Secundaria-Anexos
CC para El Aula-2do Ciclo Secundaria-Anexos
COMPUTACIÓN
PARA EL AULA
Anexos para docentes
S E C U N DARI A
2 CICLO
o
ANEXO I
ANIMACIONES
En este anexo se trabaja con Alice, una herramienta
gráfica que permite construir animaciones a partir
personajes que se colocan en un escenario y a los
que se les dan indicaciones.
Objetivos
● Familiarizarse con el entorno de programación Alice y apropiarse de la herramienta a
partir de una producción de su propio interés.
● Conceptualizar un programa como una serie de instrucciones, en este caso, para los
personajes, objetos, etc., que participarán de la animación.
● Conocer y utilizar adecuadamente la definición de métodos, la secuenciación, la
simultaneidad, la repetición simple y la alternativa condicional, además de la
definición de variables.
Actividad 1: Alice y el Mundo
Objetivos
● Aproximarse a la noción de programa, entendiéndolo como como una serie de
guiones con instrucciones para los elementos de la escena.
● Familiarizarse con el funcionamiento de algunos aspectos básicos de la herramienta
Alice, como el armado de la escena, los métodos y la elaboración de programas
sencillos.
Modalidad de trabajo
Grupal (3 o 4)
Materiales
Computadoras
Alice
Desarrollo
A lo largo de esta actividad, los estudiantes ejecutarán por primera vez el lenguaje de
programación Alice y empezarán a familiarizarse con su interfaz. En esta primera actividad
presentaremos el proyecto a los estudiantes y daremos tiempo a los grupos para que
exploren la herramienta. Esta exploración es el objetivo central de la actividad, razón por la
cual las consignas son breves y muy generales para que, por un lado, los grupos puedan
dedicar tiempo a familiarizarse con el entorno realizando diferentes pruebas y, por otro, para
que estén motivados por sus intereses más que por una directiva del docente.
Comenzamos la clase contándoles a los grupos que realizarán una animación. Les
preguntamos cómo creen que se hace una película, y rescatamos los distintos elementos
que ellos consideren que intervienen en el proceso: actores, director, luces, cámaras,
escenografía, etc. Destacamos especialmente que (en la mayoría de los casos) antes de
comenzar la filmación se escribe un guion, es decir, un texto que dice detalladamente, no
solo lo que deben decir los personajes, sino también cómo deben moverse e interactuar
entre ellos, además de indicaciones relevantes para la cámara, las luces, el decorado y los
objetos de utilería. Durante la filmación, quien dirige la película se encarga de que todas
estas indicaciones sean reproducidas y llevadas a cabo.
Anunciamos que vamos a hacer algo muy similar en la computadora, dado que armaremos
una escena con personajes a los que les daremos instrucciones para que las ejecuten, y
también podremos dar indicaciones de luz o de cámara.
Tutoriales de Alice
http://www.daleaceptar.gob.ar/
1. Ejecutar: el botón hace que se lleven a cabo las instrucciones del programa.
2. Árbol de objetos: aquí aparecen listados los objetos que forman parte de la escena (los
personajes, las cosas, la cámara, etc.). Observamos que todos aparecen debajo de Mundo,
por lo que utilizaremos esta palabra para referirnos a la escena con todos sus componentes.
3. Métodos: al seleccionar un objeto en el árbol, aquí aparecen sus métodos disponibles, es
decir, las acciones que puede realizar. Los métodos consisten en bloques que podemos
arrastrar y encajar para construir el programa en el sector respectivo.
4. Sector del programa: aquí colocamos los bloques para construir el programa.
5. Mundo: se trata de la escena en la que se ubican los personajes y objetos; es donde
ocurre la acción.
6. Agregar objetos: este botón abre la biblioteca de objetos disponibles para que podamos
elegir los que queramos agregar al Mundo.
Lo primero que debemos observar es que, para comenzar, se solicita elegir el escenario
donde se realizará la animación, en la pestaña que se llama Plantillas (o Templates) .
Es posible que el idioma esté configurado en inglés. En ese caso, pueden cambiarlo a
español accediendo a Edit → Preferences, y en la pestaña General, elegir Spanish en la
opción Display language, en la barra de menús.
Iniciamos la clase pidiéndole a los estudiantes que armen una escena en la que aparezcan
dos personajes (recordar que en Alice los personajes son objetos) y un tercer objeto alejado
de ellos. El objetivo es que ambos personajes se acerquen al lugar donde se encuentra el
tercer objeto y luego tengan una conversación entre ellos.
Los estudiantes tienen que explorar cómo se agregan objetos al mundo. Para esto hay que
rpesionar el botón Añadir objeto. Ahí se abre la G
alería donde se podrá elegir entre los
distintos objetos disponibles, agrupados en clases. Una vez que están agregados, los
objetos pueden moverse arrastrándolos en la escena y pueden modificarse con los botones
del cuadro superior derecho. Para regresar a la ventana anterior, se debe presionar el botón
Hecho.
Luego, deben descubrir que cada objeto tiene métodos. Es decir, bloques que pueden
arrastrarse al sector de programa, donde se va armando el guion de la animación, para
darle indicaciones a un personaje.
Una vez que se agrega un objeto al mundo, aparece enumerado en el árbol del cuadro
superior izquierdo, dependiente de mundo. Si lo seleccionamos, se despliegan sus métodos
disponibles, que podemos arrastrar al sector del programa, donde aparecen como un
bloque.
Luego deben ver qué hacen algunos de los métodos más importantes, como los que
permiten que los personajes se muevan, digan frases, etc.
Si se presionamos el botón Ejecutar, veremos que se abre una nueva ventana y los objetos
llevan a cabo los métodos que arrastramos al programa, produciendo de modo que se
produce una animación. En esta ventana, además, contamos con botones para detener o
reiniciar la animación, pausarla, cambiarle la velocidad o guardar una fotografía de lo que
está sucediendo.
Como siempre, damos tiempo para que los estudiantes exploren el entorno y estamos
atentos a las preguntas que puedan surgir en los grupos para orientarlos si lo necesitan.
Observamos su avance en el dominio de la herramienta. En este sentido, debemos intentar
lograr un balance entre el tiempo dedicado a construir el mundo agregando personajes y
objetos y el momento en que comiencen a explorar los métodos y armar las primeras
animaciones. Es fundamental dedicar tiempo a lo primero para fortalecer la motivación en el
uso y la exploración de la herramienta. Sin embargo, si observamos que algún grupo no
avanza a la siguiente etapa, los invitamos explícitamente a experimentar con los distintos
métodos, recordándoles que continuaremos trabajando con el proyecto en las siguientes
clases y que podrán completarlo luego.
Cuando todos los grupos hayan armado su escena y agregado algunos métodos a sus
personajes, hacemos una puesta en común para poner en claro los siguientes conceptos,
que son centrales en la herramienta y a los que nos referiremos en las actividades
siguientes.
Los objetos añadidos al mundo del ejemplo son el astronauta, la flamenco y la carpa.
● Los objetos. En Alice, llamamos objeto a todo aquello que puede recibir
instrucciones. El ejemplo más evidente son los personajes (que pueden ser
personas, animales o, incluso, cosas), como así también la cámara y la luz.
● Los métodos. En Alice, las instrucciones que les podemos dar a los objetos para que
las realicen durante la ejecución se llaman métodos. Por ahora, observamos que
todos los objetos tienen un conjunto limitado y muy parecido de métodos, que
involucran movimiento. Más adelante construiremos nuestros propios métodos para
complejizar el comportamiento de los personajes.
●
●
Todos los objetos, incluida la cámara, comparten una serie de métodos que podemos utilizar en nuestras
animaciones.
A continuación, les pedimos a los estudiantes que hagan que la cámara realice un
recorrido hacia los personajes antes de que estos comiencen a hablar.
El objetivo de esta segunda consigna es poner en evidencia que la cámara, al ser un objeto
del mundo, se controla con métodos, al igual que los personajes. Esperamos que los
estudiantes exploren estos métodos para poder utilizarlos a medida que su proyecto se
vaya desarrollando.
Para tener en cuenta al trabajar con Alice:
● Todas las instrucciones suelen tener un menú más donde se ofrecen distintas
opciones. Si bien estas opciones dependen de cada instrucción en cuestión,
suelen permitir establecer la duración, la velocidad y el estilo.
Podemos invitar a los grupos a que lo exploren.
Vista antes y después de que se ejecute el método cámara acercarse 20 metros a carpa. Como ya dijimos, la cámara puede moverse con
los mismos métodos que los objetos, para lograr que la escena se vea de distintas maneras.
Cierre
Cerramos esta actividad observando la relación que existe entre los personajes de un guion
y los objetos del mundo de Alice, como así también entre las indicaciones que aparecen en
aquel y los métodos de este. En este mismo sentido, dejamos en claro que la secuencia de
métodos que construyeron los grupos, y que hasta ahora habíamos pensado como un guion
constituye, en realidad, un programa, es decir, una serie de instrucciones destinadas a
una computadora para que las lleve a cabo (en este caso, mover los personajes, colocar
los globos de diálogo, etc.). Utilizaremos esta palabra de ahora en adelante.
Terminamos mostrando el bloque de comentario, que nos permite introducir texto entre las
instrucciones de nuestro programa y pedimos a los grupos que lo utilicen para escribir qué
va sucediendo sucede en la animación, es decir, los fragmentos del guión guion a medida
que van avanzando.
Actividad 2: Nuestros métodos
Objetivos
● Observar que pueden crearse nuevos métodos en Alice y utilizarlos para definir
acciones más complejas.
● Reconocer las ventajas de la definición de métodos para la construcción y la
comprensión de los programas.
Modalidad de trabajo
Grupal (3 ó 4)
Materiales
Computadoras
Alice
Desarrollo
El principal objetivo de esta actividad es presentar la noción de métodos propios como un
recurso para enriquecer las posibilidades de los objetos, es decir, tener en cuenta que
podemos agregarles nuevos comportamientos definiendo un método apropiado a partir de
los que ya existen, de una manera particular.
Les pedimos a los estudiantes que logren que uno de los personajes haga siempre el
mismo gesto antes de empezar a hablar (por ejemplo, levantar los dos brazos, saludar, girar
la cabeza a ambos lados).
● Los objetos tienen subpartes a las que se accede en el árbol de objetos a través del
símbolo + a la izquierda del nombre y que estas son también objetos, por lo que
cuentan con métodos asociados para ser animadas (y, además, pueden contener
subpartes).
● Deberán animar las subpartes de los objetos, para que estos puedan realizar
movimientos en el lugar con distintas partes de su cuerpo.
● Deberán usar las mismas secuencias de instrucciones en distintos lugares de la
animación (las que controlan el gesto en cuestión).
Después de la exploración pertinente, cuando todos los grupos hayan observado estos
aspectos, planteamos que la definición de métodos propios es una solución adecuada
para estos problemas, pues estos métodos:
● Permiten escribir una única vez una serie de instrucciones y después usarla tantas
veces como queramos, simplemente colocando un bloque en el programa. Lo
primero se denomina definición del método, y a sus apariciones en el programa se
las designa como invocación, llamada o uso.
Observamos cómo podemos utilizar un método para agrupar un grupo de instrucciones que, entre todas, tienen
un efecto en particular. Por ejemplo, en este caso, el astronauta siempre hace una reverencia antes de hablar.
Luego, definimos el método hacer reverencia, que consiste en las tres instrucciones para mover el brazo, y
después lo usamos como una instrucción más en nuestra animación. Además de ahorrarnos trabajo repitiendo
instrucciones, este método permite que el programa de la animación sea más fácil de comprender y, por lo tanto,
de comunicar a otras personas, para compartirlo, arreglarlo o mejorarlo.
Mostramos cómo se crea un método y, además, observamos que este se agrega a los
métodos básicos de los personajes. Damos tiempo para que todos los grupos puedan
definir el método que describe el gesto que hace el personaje antes de hablar.
Como conclusión, podemos observar que, después de definir el método, el personaje sabe
hacer algo nuevo y, para mejor, es algo que a nosotros nos resulta útil para nuestra
animación. De hecho, a partir de aquí podemos proponer como estrategia de trabajo pensar
qué instrucciones necesitaríamos que tuvieran nuestros personajes y definir aquellas que no
aparezcan como métodos ya definidos. Con estas nuevas instrucciones definidas, entonces,
debería ser mucho más fácil construir la animación y, seguramente, resulte mucho más
claro qué está haciendo el programa.
Con esta misma idea, les proponemos a los grupos que piensen si no hay algunas partes de
sus programas que podrían conformar distintos métodos. Para esto, les podemos sugerir
que identifiquen secuencias de instrucciones que, todas juntas, producen una situación o
momento particular de la historia. Si necesitan ayuda para identificar estas partes, podemos
pedirles que nos cuenten su animación con sus propias palabras (o que observen los
comentarios que fueron agregando) y reconozcan en el programa qué instrucciones se
corresponden con cada uno de los momentos que mencionan en su narración. También
debemos preguntarles qué nombres les pondrían a esas instrucciones y motivarlos a que
elijan nombres lo más representativos posible.
Es importante observar que, en Alice, todos los métodos deben estar definidos como
asociados a algún personaje. Cuando involucran acciones de un único personaje para
agregarle capacidades (como la reverencia del astronauta), tiene sentido asociarlos a este
personaje. Sin embargo, cuando involucran más de uno o cuando no sea una acción
puntual del personaje sino una situación más general, conviene definirlos en el mundo para
poder encontrarlos fácilmente.
Por ejemplo, en nuestra animación, podemos agrupar en un método las instrucciones que
llevan los personajes hacia la carpa y, en otro, la conversación.
<epi> Programa principal de la animación, donde cada situación fue reemplazada por un método
Definiciones de los métodos invocados en el programa principal. Son las mismas instrucciones que antes, pero agrupadas en
métodos con un nombre que deja en claro qué hacen en conjunto. Observamos que están definidos como métodos del mundo.
Para resolver esta consigna, los estudiantes deberán descubrir alguna manera de hacer
aparecer objetos en la escena durante la animación. Para esto, probablemente utilicen
alguna de las siguientes alternativas: colocar el objeto fuera de cuadro, es decir, por fuera
del ángulo de visión de la cámara y moverlo hacia adentro para hacerlo aparecer; si quieren
que aparezca espontáneamente en algún lugar en vez de ingresar, deberán operar con la
propiedad opacidad o con la propiedad ¿Está apareciendo? Estas propiedades se
encuentran, justamente, en la pestaña propiedades del objeto seleccionado, al lado de la
pestaña de métodos.
Cierre
Cerramos esta actividad con una breve discusión a propósito de la utilidad de los métodos
(es muy probable que, al principio, los estudiantes no estén convencidos de esto). La
primera pregunta que debemos hacer es si la definición de métodos es imprescindible para
la confección de programas. La respuesta es que no, pues, en lugar de haber procedido
como lo hicimos en la actividad, podríamos haber reemplazado todos los usos de un
método por una copia de las instrucciones que conforman su definición y habríamos
obtenido un programa equivalente.
Entonces, ¿cuál es la ventaja? Ya observamos que programar utilizando métodos es más
cómodo, pues en general evita tener que escribir repetidas veces algunas instrucciones; sin
embargo, como ya dijimos, su principal beneficio es la posibilidad de escribir programas
más claros, es decir, programas más fáciles de entender. Además, permite organizar mejor
la tarea de construcción del programa, pues nos obliga a resolver de a un problema por vez.
Esta idea de ir construyendo una solución mayor a partir de las de pequeños problemas es
fundamental en computación y constituye una estrategia perfectamente válida para resolver
problemas en general (que, de hecho, usamos sin darnos cuenta todo el tiempo).
Actividad 3: Las cosas en orden
Secuencialidad, simultaneidad y repetición
Objetivos
● Comparar la ejecución secuencial y la simultánea, e incorporarlas a las animaciones.
● Conocer la estructura de repetición simple y aprovecharla en las animaciones.
Modalidad de trabajo
Grupal
Materiales
Computadoras
Alice
Desarrollo
Si bien la ejecución de un programa es por defecto secuencial (es decir, en orden), también
existen bloques para indicar que una serie de instrucciones debe ejecutarse
simultáneamente o ejecutarse más de una vez. El objetivo de esta actividad es poner de
manifiesto la necesidad de modificar el orden secuencial y mostrar las herramientas que
pueden usarse para conseguirlo.
El objetivo de esta consigna es que los estudiantes reconozcan que, en general, todos los
programas que construyeron se ejecutan de manera secuencial, es decir, las instrucciones
se ejecutan en el orden en el que fueron escritas y de a una por vez. Esto impide
representar acciones que se realicen simultáneamente, como, por ejemplo, que los dos
personajes levanten el brazo y acerquen las manos al mismo tiempo para chocarlas. Para
esto, esperamos que observen que, al pie del espacio del programa, entre los bloques
disponibles hay uno llamado hacer en orden y otro denominado hacer juntos.
Los bloques hacer en orden y hacer juntos, debajo del sector del programa
Es probable que, al comenzar a experimentar con el nuevo bloque, los grupos obtengan
resultados inesperados. Esto se debe a que todas las instrucciones dentro de hacer
juntos se ejecutan simultáneamente y ninguna en orden. Luego, si hace falta más de una
instrucción para realizar una acción en particular (por ejemplo, primero levantar el brazo y
luego girar la mano para saludar) y queremos que se ejecuten en orden, pero al mismo
tiempo que otra (por ejemplo, mover la cabeza), no podemos colocarlas todas juntas, pues
sucederían las tres al mismo tiempo. Para solucionar este problema existe el bloque hacer
en orden, que podemos combinar con hacer juntos, como se ve a continuación.
El primer programa hace que el astronauta gire el brazo y ningún efecto notable sobre el resto de las
articulaciones, pues se están ejecutando simultáneamente instrucciones contrarias (como girar a la izquierda y a la
derecha a la vez). En cambio, si queremos que el astronauta salude y mueva la cabeza al mismo tiempo, podemos
construir un programa como el segundo: el primer bloque hacer en orden c ontiene la secuencia para que salude
(levantar el brazo y girar la mano a ambos lados) y el segundo, la que hace que el astronauta baje y suba la
cabeza. Al estar ambos contenidos en un mismo bloque hacer juntos, el resultado del programa es que estas
dos secuencias se ejecutan simultáneamente.
Además del bloque hacer en orden, otra forma de resolver este problema (y que en
general preferiremos, pues contribuye a la claridad del programa) consiste en definir
métodos con cada una de las secuencias que deben ejecutarse en orden. Por ejemplo,
nuestro saludo secreto podría ser el siguiente.
Sin embargo, el contenido de cada bloque hacer en orden se corresponde con una acción
puntual de cada personaje. Luego, podríamos definir un método en cada uno que contenga
esta secuencia, como se ve a continuación, y utilizarlos para definir el saludo de manera
más clara. Insistimos con esta práctica para que los estudiantes identifiquen qué secuencias
pueden convertirse en métodos y los definan.
La claridad del programa mejora al definir métodos para indicar secuencias de instrucciones
Cuando todos los grupos hayan programado su saludo secreto, interrumpimos el trabajo en
la computadora y hacemos una puesta en común a propósito de lo que descubrieron y
fuimos discutiendo individualmente:
● El bloque hacer juntos permite indicar que una serie de métodos se ejecutan al
mismo tiempo, mientras que h acer en orden indica que deben ejecutarse uno
después del otro, como estábamos acostumbrados a ver en nuestros programas.
● El bloque hacer en orden colocado dentro del bloque hacer juntos permite
indicar que una secuencia de métodos debe ejecutarse en simultáneo con otros.
Esta es la posibilidad más interesante que ofrece el bloque, aunque probablemente
también una de las más confusas. Podemos detenernos en ella y mostrar algunos
ejemplos escribiendo algunas instrucciones en el pizarrón. Para esto, proveemos un
ejemplo muy sencillo:
Los puntos verde y naranja deben llegar al mismo tiempo a la estrella atravesando
el “laberinto”. Contamos con las instrucciones ←↑→↓, es decir, avanzar un paso
en cada una de las cuatro direcciones.
Si escribimos el siguiente programa
Hacer Juntos [
verde ↓
verde →
naranja ↓
naranja ←
]
esto hará que los puntos se muevan en diagonal (pues se ejecutarán al mismo
tiempo las instrucciones de desplazarse hacia abajo y hacia los costados), con lo
que chocarían contra las paredes del laberinto. Lo que queremos es que, al mismo
tiempo, cada uno primero baje y luego se desplace horizontalmente. Esto se
puede escribir con el siguiente programa, utilizando el bloque hacer en orden:
Hacer Juntos [
Hacer en orden [
verde ↓
verde →
]
Hacer en orden[
naranja ↓
naranja ←
]
]
Podemos ejecutar ambos en el pizarrón, si hace falta, para que quede más claro.
● Como destacamos al final de la actividad anterior, se advierte la importancia de
definir métodos con nombres adecuados para ordenar la elaboración y la
comprensión del programa.
A medida que los grupos se sientan cómodos con este bloque y descubran cómo pueden
aplicarlo para mejorar sus animaciones, probablemente quieran utilizarlo en otros lugares
para que la acción se vea más fluida, para lo que les damos tiempo. Sin ir más lejos, en
nuestro ejemplo, existen varias situaciones en las que podemos utilizar este bloque para
mejorar la calidad de la animación.
Tres ejemplos donde podemos utilizar el bloque hacer juntos para mejorar la fluidez de la animación y darle un
aspecto más realista. En el primer ejemplo, dentro del método conversación, ubicamos la reverencia y el
parlamento en un mismo bloque, para que sucedan al mismo tiempo. En los otros dos, en el método
interrupción, hacemos que los personajes se muevan los dos al mismo tiempo, en vez de tener que esperar a
que termine uno para que el otro comience. En el primer caso, ambos giran hacia el automóvil al mismo tiempo, y
en el segundo, retoman su posición original cuando este se va.
A partir de esta consigna esperamos que los grupos coloquen algunos objetos en el fondo
de su escena y los animen con algunos comandos. Para esto deberán resolver primero el
problema de que esta animación debe suceder en simultáneo con la animación de los
personajes que ya tenían.
Comenzamos con un momento de exploración, para que todos los grupos descubran la
dificultad mencionada y esbocen una solución, a partir de lo discutido en la consigna
anterior. Hacemos una breve interrupción y, entre todos, comentamos las distintas
propuestas. Recordamos que ya pudimos resolver fácilmente la necesidad de que dos
cosas ocurran al mismo tiempo utilizando un bloque hacer juntos, pero que hacerlo
directamente produce un programa muy poco claro y difícil de leer.
Hacemos referencia una vez más a las ventajas de escribir programas definiendo métodos
propios: debemos concluir que una buena solución es armar un método donde se programe
la animación de los personajes y otro para el fondo. De esta manera, quedarán separadas
las definiciones y solo se unirán en el programa principal, que constará de un bloque hacer
juntos y dos métodos en su interior. Al finalizar esta puesta en común, les indicamos a los
grupos que continúen con el programa y lo organicen teniendo en cuenta lo que discutimos.
En el ejemplo, vemos los métodos mundo.acción y mundo.fondo ubicados dentro de un
bloque hacer juntos, en el cuerpo del programa principal.
El método mundo.acción contiene el programa que controla los personajes, tal como
estaba antes en mundo.mi primer método, mientras que mundo.fondo hace que se
muevan los objetos del fondo. En particular, en su definición observamos:
● El bloque hacer juntos que contiene todos los otros bloques, pues queremos que
todos los objetos del fondo se animen al mismo tiempo.
● El bloque lazo o ciclo [ ] veces puede indicar una repetición finita, como en el
caso de la bandera, en el que repite tres veces su contenido en orden, o puede
indicar una repetición infinita, como en el caso de la Luna o de Saturno. Si se decide
utilizar este último bloque hay que prestar atención a que, si la ejecución es en orden
secuencial, todas las instrucciones que aparezcan por debajo de él no se ejecutarán
nunca. Por eso lo utilizamos dentro de un bloque hacer juntos.
● El método girar a la velocidad hace que la velocidad del movimiento sea
constante (en vez de acelerarse al principio y detenerse al final), lo que permite
encadenar sucesivos giros sin que se note una detención y un arranque entre ellos.
Damos tiempo a los grupos para que completen y mejoren sus animaciones, mientras
recorremos los grupos y los orientamos con algunas de las ideas que usamos en nuestro
ejemplo.
Cierre
Concluimos esta actividad observando que, si bien, en general, las instrucciones se dan
para ser seguidas en orden, esto no tiene por qué ser necesariamente así. Más aún, existen
casos en los que necesitamos que ciertas acciones se hagan en simultáneo o que, al
terminar de ejecutarse, se repitan en vez de continuar con las siguientes.
Actividad 4: Variables e interacción con el usuario
Objetivos
● Incorporar el concepto de variable como una herramienta para conservar datos
durante la ejecución de un programa.
● Presentar algunas herramientas básicas para interactuar con el usuario.
Modalidad de trabajo
Grupal (3 ó 4)
Materiales
Computadoras
Alice
Desarrollo
Les planteamos a los estudiantes la primera consigna: “En algún momento, la animación
debe preguntarle algo al usuario para que luego aparezca en los diálogos de los personajes.
Por ejemplo, puede preguntarle el nombre para que, después, uno de los personajes lo
salude por su nombre”.
Para poder completar esta consigna, los estudiantes deberán explorar la categoría pregunta
al usuario en las funciones del mundo, como vemos a continuación.
Dado que, hasta ahora, nunca fueron necesarios los bloques de esta pestaña y que se usan
de una manera muy particular, podemos sugerirles que la exploren durante un breve tiempo
y, después, mostraremos cómo son sus especificidades. De paso, podemos aprovechar
para aclarar que en Alice se denomina cadena de texto, cadena de caracteres o string (en
inglés) al texto.
Una primera observación importante es que los bloques de esta pestaña no se pueden
arrastrar directamente al área del programa. Esto se debe a que representan algún valor
(por ejemplo, vemos en la imagen un número aleatorio, una cadena de caracteres unida con
otra o algún valor ingresado por el usuario) y, por lo tanto, no son instrucciones en sí
mismos sino que deben ser usados dentro de otras instrucciones. Podemos mostrar, por
ejemplo, cómo hacer para que un personaje le pregunte el nombre al otro y que el usuario
pueda escribir un nombre para que el personaje responda. Preferimos mostrarlo primero,
dado que la construcción no es tan intuitiva como con los bloques con los que hemos
trabajado hasta ahora.
En este caso, el bloque preguntar al usuario [ ] h ace que se abra una ventana que
dice “Ingrese un nombre” y un campo para ingresar texto. A su vez, el bloque representa el
texto ingresado por el usuario, por eso podemos colocarlo en el bloque dice, en el mismo
lugar donde antes colocábamos un texto fijo para que la flamenco lo diga.
Les indicamos a los estudiantes que la respuesta del usuario debe aparecer varias veces en
la conversación de los personajes. Ahora planteamos un nuevo desafío que implica
reutilizar la respuesta del usuario. Por ejemplo: el nombre ingresado por el usuario tiene que
ser dicho a modo de respuesta por el personaje, pero también deberá formar parte del
saludo que formulará el personaje que hizo la pregunta. Es decir, en el ejemplo anterior, si
cuando el astronauta preguntó el nombre el usuario ingresó “Flavia”, la flamenco deberá
decir “Flavia”, a lo que el astronauta podría responder “Bienvenida a la Luna, Flavia”. La
limitación es que solo se debe preguntar el nombre una vez, para no molestar al usuario.
Damos unos minutos para que los grupos identifiquen la necesidad de conservar el texto
ingresado por el usuario para poder utilizarlo después en cualquier instrucción del
programa, no solo en la de la pregunta.
Contamos ahora, finalmente, que en Alice existen cajitas para guardar datos y se llaman
variables. Mostramos a continuación cómo hacer para crear una variable que reproduzca la
dramatización anterior.
1. Observamos que las variables pertenecen a los métodos. Por eso, en la parte
superior de la definición del método aparece un botón crear variable nu… (eva)
2. Al presionarlo, se abre una ventana donde tenemos que completar el nombre que
queremos darle a la variable (en este caso “Nombre de la flamenco”) y el tipo.
Explicamos que, para Alice, las cajitas para almacenar texto son diferentes a las
cajitas para almacenar números, que, a su vez, son diferentes de las cajitas para
almacenar objetos, etc. Aquello que podemos guardar en una variable se denomina
tipo; luego, debemos seleccionar “Otro → Cadena de caracteres”. Para terminar,
observamos que la variable que creamos acaba de aparecer en la parte superior de
la pestaña del método.
3. El próximo paso es utilizar las variables / cajitas en el programa. Observamos qué
sucede cuando arrastramos una variable al área del programa: se genera un bloque
establecer value a con el nombre de la variable y un espacio para completar con
un valor.
Podemos construir el siguiente ejemplo para ilustrar los puntos que acabamos de comentar.
En este momento, todos los grupos deberían estar en condiciones de incorporar este tipo de
interactividad a sus animaciones. Damos tiempo para que lo hagan y estamos atentos a las
dificultades que puedan surgir.
Cierre
Para cerrar esta actividad podemos comentar que el concepto de variable es muy amplio y
muy extendido en la programación. En particular, podemos recordar que, como vimos, en
Alice existen variables de otros tipos, lo que nos permite almacenar durante la ejecución
cualquier valor que necesitemos, como números o incluso objetos de la galería. Además,
comentamos que la necesidad de almacenar información durante la ejecución de un
programa surge casi constantemente y, por lo tanto, las variables se usan muchísimo. En
este sentido, invitamos a los grupos a tenerlas en cuenta en el futuro.
Actividad 5: Condicionales
Objetivos
● Presentar la alternativa condicional como una herramienta para construir programas
que no se ejecuten siempre igual.
Modalidad de trabajo
Grupal (3 ó 4)
Materiales
Computadoras
Alice
Desarrollo
La propuesta para esta actividad es que los estudiantes continúen incorporando a sus
animaciones interacciones con el usuario, ahora para decidir el curso de la historia. Para
esto, deberán hacer preguntas que se respondan por sí o por no, y, en función de las
respuestas, continuar con el programa de una u otra manera. Esperamos, entonces, que
observen que los programas que construyeron anteriormente producían siempre la misma
animación. Por el contrario, en este caso, el desarrollo de un mismo programa debe poder
ser distinto en diferentes ejecuciones, según las respuestas del usuario. Para salvar esta
limitación, entonces, presentaremos el bloque de alternativa condicional.
En la actividad anterior vimos cómo incorporar respuestas del usuario; por lo tanto, si es
necesario, podemos sugerirles a los grupos que revisen sus trabajos. De todos modos, la
dificultad de la consigna surge del hecho de que, hasta ahora, todos los programas que
escribieron los estudiantes se ejecutaban siempre igual, es decir, el resultado de todas las
ejecuciones era siempre exactamente el mismo. Sin embargo, la nueva consigna propone
romper esta limitación de modo que, si en distintas ejecuciones el usuario toma decisiones
distintas, la animación resulte distinta. Dejamos un tiempo para que exploren el entorno y,
sobre todo, reconozcan esta dificultad. Cuando todos los grupos hayan observado que no
han visto ninguna manera de que la animación varíe entre diferentes ejecuciones,
presentamos el bloque if/else (si / si no, en castellano) y mostramos que se construye a
partir de tres partes fundamentales:
● El bloque marcado con violeta, al
que solemos llamar condición, es
una pregunta que se responde con
sí o con no (o verdadero o falso, true
o false en inglés).
● Observamos que los dos sectores
marcados con azul permiten
encastrar bloques con instrucciones,
de la misma manera que los bloque
hacer juntos o hacer en orden.
● Si la respuesta a la pregunta fue sí
(verdadero, true), se ejecutan los
bloques del primer sector azul,
mientras que si fue no, los del
segundo. Dado que a partir del
resultado de la condición existe una
bifurcación en las ejecuciones
posibles del programa, a cada uno
de estos sectores se lo denomina
rama.
Ahora sí, dejamos tiempo para que los grupos exploren el funcionamiento del bloque y vean
cómo pueden integrarlo a sus animaciones. Podemos sugerirles que experimenten primero
con una bifurcación sencilla, como por ejemplo “¿El personaje miente?” y que, en base a
esto, se produzca una u otra respuesta, como vemos a continuación:
Una observación, que también retoma una discusión de la actividad anterior, es que el
bloque con la pregunta está colocado directamente en la condición del bloque if/else.
Esto es análogo a cuando hacíamos decir [preguntar al usuario]… pues,
recordamos, el bloque de la pregunta, además de hacer que se abra la ventana para
escribir la respuesta, representa el valor ingresado. Por este motivo, debemos colocarlo en
los bloques que esperan ser completados con valores (como decir o un condicional). De la
misma manera que antes, si quisiéramos volver a utilizar esta respuesta en algún momento,
deberíamos almacenarla en una variable. Esto se haría exactamente de la misma manera,
excepto que, en el momento de crear la variable, deberíamos especificar que sea de tipo
booleano, dado que este es el tipo de los datos para representar si / no (verdadero / falso,
true / false) .
Cuando los grupos se hayan familiarizado con esta nueva construcción, interrumpimos el
trabajo para hacer una puesta en común. Podemos pedir a algunos grupos que nos cuenten
qué alternativa incorporaron y que nos muestren cómo lo programaron en Alice. Entonces,
aprovechamos para reconocer entre todos correspondencias entre ideas expresadas en la
lengua natural y bloques programados en Alice. En particular, nos interesa observar:
● Que el bloque expresa una ejecución supeditada a una condición: si sucede tal cosa,
debe suceder esta otra; si no, debe suceder esta otra. De hecho, este es
exactamente su significado en inglés: si (if) _____, ______, si no (else).
● Que la condición es una pregunta que se responde por sí o por no. En este caso es
evidente, pues es exactamente la pregunta que hicimos, pero existen otras
condiciones que pueden ser interesantes, como por ejemplo: ¿El flamenco está
cerca del astronauta?, ¿El usuario se llama Pepe?, etc. Pedimos a los grupos que
enuncien condiciones posibles en sus programas y digan qué debería suceder en
caso de que fueran verdaderas o falsas.
Una vez que se hayan familiarizado con el nuevo bloque, les proponemos la segunda
consigna, que continúa en esta misma dirección. La consigna consiste en hacerle una(s)
pregunta(s) (de sí / no) al usuario y que el curso de la historia dependa de esta(s)
pregunta(s). Prestar atención a la definición de métodos adecuados para que el programa
sea claro y pueda comprenderse cómo se encadenan las distintas opciones.
Esta nueva consigna no plantea ninguna novedad técnica; simplemente propone utilizar la
nueva herramienta para enriquecer las animaciones de manera que los grupos puedan
experimentar con sus historias. A lo que debemos sugerirles que presten atención, es a la
definición de métodos. De la misma manera que hicimos en la actividad correspondiente
cuando separamos cada uno de los momentos de la escena en un método, ahora
esperamos que definan uno para cada alternativa posible de la historia. De esta manera, al
llegar al bloque de la alternativa condicional no habrá demasiadas instrucciones dentro de
cada rama, sino más bien un único método que deje en claro de qué se trata ese momento
de la animación. Observemos que, como las bifurcaciones pueden producirse en cualquier
momento de la historia, puede ser necesario colocar el condicional en cualquiera de los
métodos definidos.
mundo.pasear por la luna: S i elegimos que los mundo.descansar: Si elegimos no ir a pasear por la
personajes vayan a pasear por la luna, encuentran luna, los personajes se saludan y la flamenco se
una cascada en la que la flamenco se baña. Ahí acuesta dentro de la carpa. Fin de la animación.
podemos elegir otra vez si el baño es peligroso o no.
Observamos que la nueva alternativa condicional
aparece al final del método que habíamos definido
para esta situación (mundo.pasear por la luna) y
puede incluir nuevos métodos que representen
nuevas situaciones (como mundo.apocalipsis y
mundo.chapuzón).
mundo.apocalipsis: Si el agua lunar resulta mundo.chapuzón: Si el agua no es peligrosa, el
peligrosa, el cielo cambia de color y la flamenco se astronauta acompaña a la flamenco y nadan juntos
hunde. en la cascada.
Cierre
Para concluir, observamos que en esta actividad profundizamos lo que habíamos
comenzado en la anterior: que el usuario pueda controlar algún aspecto del comportamiento
del programa. Esto se parece mucho más a cómo se comportan los programas que
utilizamos a diario (por ejemplo, un navegador de Internet no abre siempre la misma página
ni un videojuego muestra siempre el mismo recorrido; todo depende de cómo nosotros
interactuemos con ellos).
ANEXO II
PROGRAMACIÓN
TEXTUAL
Los entornos de programación como Alice presentan
grandes ventajas a la hora del aprendizaje:
su propuesta lúdica permite que los estudiantes
exploren su creatividad, el sistema de bloques
encastrables evita errores y dificultades, etc. No
obstante, para escribir programas complejos,
suelen utilizarse lenguajes de programación
textuales. En ellos, los programas se construyen
escribiendo texto y no encastrando bloques.
En este anexo se introduce distintas actividades y proyectos para ser desarrollados usando
el lenguaje textual Python. Actualmente es un lenguaje muy utilizado, y su filosofía hace
hincapié en una sintaxis que favorece el desarrollo de programas que, al ser leídos, puedan
comprenderse con relativa facilidad.
El anexo está dividido en dos partes: en la primera, se presenta el lenguaje y se realiza una
aproximación a la resolución de problemas que involucran el procesamiento de secuencias
de datos; en la segunda, se propone un proyecto para realizar un sintetizador de voz.
1
Este recorrido y la mayoría de las actividades están adaptadas de “Propuesta de planificación anual
para Tecnologías de la Información, 4to año de la NES (TI4), CABA”, disponible en
http://bit.ly/2HeXjJN
Secuencia didáctica 1: Lenguajes textuales y secuencias de
datos
Los entornos de programación como Alice, que utilizamos en el primer capítulo de este
manual, presentan grandes ventajas a la hora del aprendizaje: su propuesta lúdica permite
que los estudiantes exploren su creatividad, el sistema de bloques encastrables evita
errores y dificultades. No obstante, para escribir programas complejos, suelen utilizarse
lenguajes de programación completamente textuales.
En esta secuencia didáctica, los estudiantes escribirán sus primeros programas en Python,
un lenguaje textual que resulta flexible y amigable para programar. Lo harán a la vez que
resuelven problemas relacionados con secuencias de datos, una manera muy simple pero
muy poderosa de representar grandes cantidades de información en Python (como por
ejemplo, todas las palabras de un libro o los píxeles de una imagen). Además del aspecto
técnico, trabajaremos con algoritmos generales para algunos de estos problemas.
Objetivos
● Presentar la estructura de repetición condicional
● Conocer la existencia de lenguajes de programación textuales.
● Introducir el lenguaje Python, a partir de su comparación con Alice.
● Presentar e implementar los algoritmos de búsqueda lineal y binaria
● Presentar la estructura de Python para representar secuencias: las listas.
● Presentar el recorrido sobre secuencias (ciclos for) y utilizarlo para resolver
problemas.
● Presentar y comenzar a ejercitar la noción de parametrización.
● Escribir e implementar un algoritmo para encontrar un máximo.
Actividad 1 | SD1
Adivina, adivinador
Objetivos
● Presentar la estructura de repetición condicional.
● Trabajar con un algoritmo de búsqueda lineal.
Modalidad de trabajo
En parejas
Desarrollo
El resultado de esta actividad será el punto de partida de la siguiente, en la cual
comenzaremos a trabajar con Python, un lenguaje de programación textual. Dado que los
primeros pasos en este tipo de lenguajes pueden ser muy ásperos, proponemos primero
escribir un programa no trivial en Alice y, en la actividad siguiente, observar cómo podemos
“traducirlo” a nuestro nuevo lenguaje, aprovechando la riqueza de la nueva herramienta.
Los primeros minutos podemos emplearlos, si resulta necesario, para hacer un rápido
repaso de Alice. Luego les proponemos que, trabajando en grupos de dos personas,
resuelvan la siguiente consigna, como un juego sencillo:
Consigna:
El programa le pedirá al jugador que elija un número entre 1 y 10. El usuario n o debe
decirle al programa de qué número se trata. Luego, el mismo programa debe tratar de
adivinar el número elegido. Para ello, el programa podrá ir haciendo preguntas al usuario,
como “¿el número que elegiste es X ?”, donde “X” representa algún número entre 1 y 10.
Existen varias formas o estrategias para resolver el problema, ya que el número elegido
por el usuario se puede adivinar siguiendo estrategias variadas. Una de las más sencillas es
ir preguntando uno por uno por cada uno de los números, en orden ascendente:
● ¿El número que elegiste es 1?
● ¿El número que elegiste es 2?
● ¿El número que elegiste es 3?
● …
Si intentamos escribir en Alice un programa que siga esta estrategia, notaremos que no hay
una única forma de hacerlo. Por ejemplo, si tenemos que usar alguna variable, podríamos
darle diferentes nombres; o quizás decidamos usar un bloque de repetición en lugar de
repetir explícitamente alguna instrucción. Es común que existan distintos programas para
una única estrategia, que difieren en aspectos meramente accidentales. A la estrategia que
elegimos para resolver el problema se le llama usualmente algoritmo, mientras que un
programa que aplica esa estrategia es una implementación del algoritmo. Esto significa
que pueden existir muchas maneras de implementar un mismo algoritmo. Como veremos
más adelante en esta actividad, incluso es posible escribir implementaciones para un mismo
algoritmo en lenguajes de programación distintos.
El algoritmo que acabamos de proponer para resolver el problema del adivinador suele
recibir el nombre de búsqueda secuencial. Un primer intento para implementarlo en Alice
puede consistir en una repetición simple (bloque lazo) que repita 10 veces la cantidad de
instrucciones que se encuentran en su interior, de manera que cada ejecución del lazo
prueba con un número distinto. Para poder escribir esta solución será necesario utilizar
otras tres herramientas que se trabajaron en los capítulos anteriores, aunque con algunas
particularidades:
● Cada vez que se ejecuta la repetición, el adivinador debe recordar qué número le
toca preguntar a continuación, de manera que cada vez pregunte por un número
distinto. Para esto puede utilizarse una variable Número a probar, que comienza
valiendo 1 y a la cual se le va sumando 1 cada vez que se ejecuta el lazo. En este
caso, y a diferencia de los que sucedió en el capítulo anterior, es importante que el
valor almacenado en la variable cambie en cada iteración del ciclo. Para eso,
aparece la instrucción aumentar.
● Para cada número, se le debe preguntar al jugador si es o no el que había pensado
originalmente. Para esto puede utilizarse la función preguntar al usuario sí o
no. Por cuestiones técnicas (que mencionamos cuando vimos la creación de
variables), en Alice los valores (y por lo tanto, las variables que los almacenan)
tienen un tipo de dato asociado (número, texto, objeto, etc.) y las operaciones están
preparadas trabajar con uno de ellos en particular. Por ejemplo, la operación unido
con espera que los dos valores sean de tipo texto. Por este motivo, para poder
concatenar el valor de número a probar con “El número que pensaste….”, primero
es necesario aplicarle la operación como secuencia de caracteres (string),
para, justamente, expresar el número como un texto.
● Por último, el comportamiento del programa debe ser distinto según cuál sea la
respuesta del usuario; para lograr esto podemos usar una alternativa condicional
(bloque if/else) dentro del cuerpo de la repetición.
mundo.adivinador ( )
número a probar = 1
Mago adivinador d
ice Pensá un número entre 1 y 10
esperar 2 segundos
Else
Esta solución presenta un problema, que esperamos que los grupos observen: aunque el
programa haya adivinado el número, seguirá preguntando por todos los números hasta el
final, ya que la cantidad de veces que se ejecuta la repetición (diez) está fija. Para poder
resolver este inconveniente, entonces, presentamos la repetición condicional (bloque
while), de manera de poder interrumpir la repetición cuando sea adivine el número.
Existen varias maneras de modificar el programa para poder utilizar una repetición
condicional; a continuación presentamos una de ellas. Si reemplazamos el bloque lazo por
un bloque while, el contenido de la repetición ya no se ejecuta siempre, sino que antes se
verifica si se cumple una determinada condición. En este caso, nos gustaría que la
repetición solo se ejecute si el programa todavía no adivinó el número del usuario. Por lo
tanto, tenemos que recordar qué fue lo que respondió el usuario la vez anterior. Para eso
podemos usar una variable de tipo booleano; recordemos que las variables de tipo booleano
almacenan un valor de verdad, que puede ser verdadero (true) o falso (false). Dado que
la variable recuerda si el programa ya adivinó el número, el nombre elegido para ella es
adivinó, mientras que su valor inicial es false.
mundo.adivinador ( )
número a probar = 1
adivinó = false
Mago adivinador d
ice Pensá un número entre 1 y 10
esperar 2 segundos
adivinó e
stablecer value a true
Else
Esta estrategia, que consiste en ir observando valores y probar para cada uno si es el
buscado hasta que lo encontramos, se conoce como algoritmo de búsqueda lineal.
Podemos preguntarnos en qué situaciones de la vida cotidiana la aplicamos, para observar
que es muy frecuente: cuando buscamos una carta en un mazo, cuando buscamos en un
manojo de llaves la correcta para abrir una puerta, cuando elegimos en un perchero de
venta de ropa una prenda que nos guste, etc. .
Cierre
Para terminar la actividad, podemos recordar que cuando introdujimos la alternativa
condicional, pudimos construir programas (animaciones) que no siempre se ejecutaban de
la misma manera. En esta misma dirección, la repetición condicional es aún más poderosa:
nos permite escribir programas que repitan una serie de instrucciones sin necesidad de
conocer cuántas veces debe hacerse esta repetición, simplemente expresando una
condición bajo la cual debe suceder. De hecho, podemos preguntarnos “¿Qué pasará si
siempre se cumple la condición de la repetición condicional?”, para observar que siempre se
repetirá la ejecución de las instrucciones del ciclo y, por lo tanto, el programa no terminará
nunca. Esta es una de las razones por las cuales los prorgamas que usamos a veces dejan
de responder (o, como decimos informalmente, “se cuelgan”).
Actividad 2 | SD1
Adivina, adivinador, ahora como texto.
Objetivos
● Conocer la existencia de lenguajes de programación textuales.
● Trabajar con un entorno de desarrollo orientado a Python.
● Introducir el lenguaje Python, a partir de su comparación con Alice.
Modalidad de trabajo
En parejas
Desarrollo
Después de haber terminado el programa de la actividad anterior, finalmente buscaremos
que los estudiantes tengan un primer contacto con un lenguaje de programación textual:
Python2, ya que lo usaremos de ahora en adelante para abordar algunos desafíos de
programación para los que Alice resulta demasiado limitado. Este primer contacto puede
parecer desalentador al principio, principalmente, por los siguientes motivos:
Por lo tanto, al dar los primeros pasos tendremos que ser especialmente pacientes ante
estas dificultades, teniendo presente y recordando a nuestros estudiantes que están
aprendiendo a utilizar una herramienta muy poderosa, con la que luego encararemos
proyectos muy interesantes, como un procesador de imágenes y de sonidos. Por otro lado,
podemos observar que con Alice no es posible producir software similar al que ellos usan en
2
Actualmente existen dos versiones diferentes de Python: Python 2 y Python 3, que si bien son
similares, no son enteramente compatibles. Para el desarrollo de este manual, elegimos trabajar con
la primera, con lo cual, cuando digamos Python estaremos haciendo referencia a Python 2.
sus netbooks, celulares, tablets y otros dispositivos. Sin embargo, todas estas aplicaciones
están construidas con lenguajes textuales (incluso con el que trabajaremos nosotros).
También es importante resaltar que, más allá de diferencias en la apariencia, los conceptos
fundamentales que trabajaremos son los mismos. Como ya mencionamos, debemos estar
atentos a las dificultades que puedan surgir al comienzo, teniendo en cuenta será necesario
aprender una nueva forma de escribir los programas donde es posible cometer errores de
sintaxis, pero donde todas las herramientas que utilizamos anteriormente para pensar y
construir programas siguen siendo válidas.
3
Existe una gran variedad de entornos de programación para trabajar con Python, por lo que
podemos cambiarlo si existe otro con el que nos sentimos más cómodos. Más aún, los programas de
Python son simples archivos de texto que contienen las instrucciones, por lo que no es necesario
usar un entorno de programación para modificarlos; se puede usar cualquier software editor de
textos, incluyendo algunos especializados en la edición de programas (por ejemplo, Atom, Geany o
Notepad++). En ese caso, para probar los programas es necesario contar otro software llamado
intérprete, que se encarga de ejecutar las instrucciones.
Al iniciar PyCharm Edu, se presentará una pantalla con varias opciones. Elegiremos la
opción “Create New Project” (Crear proyecto nuevo). Se nos pedirá que indiquemos dónde
queremos crear el proyecto, y luego se abrirá una ventana dividida en dos paneles
principales.
El panel izquierdo (con fondo blanco) contiene la lista de los archivos de nuestro proyecto,
mientras que en el panel derecho (con fondo gris) veremos las instrucciones de nuestros
programas.
Para abrir la consola, hacemos clic en el botón “Python Console” que aparece en la parte
inferior. Se abrirá un panel en la parte inferior del entorno, dividido en dos sectores;
nosotros trabajaremos con la parte izquierda. Los símbolos >>> en color verde indican el
lugar donde podemos escribir instrucciones para luego ver sus resultados.
La consola de Python
Ya no tenemos personajes para que “digan” cosas al usuario; en lugar de eso tendremos
que imprimir los resultados por pantalla, lo cual puede hacerse con la instrucción print.
mundo.adivinador ( ) 4 numero_a_probar = 1
número a probar = 1 5 adivino = False
adivinó = false 6
Mago adivinador dice Pensá un número 7 print "Pensá un número entre 1 y 10"
entre 1 y 10
Else 15 else:
Las primeras dos líneas del programa se encuentran allí por razones técnicas. La línea 1
permite que se puedan utilizar ciertos caracteres, como letras acentuadas o signos de
interrogación de apertura. La línea 2, por su parte, permite que en nuestro programa se
utilicen procedimientos de la biblioteca time. Una biblioteca es un conjunto de métodos5 ya
implementados que podemos utilizar en nuestros programas; esta biblioteca en particular
incluye diversas funcionalidades relacionadas al manejo del tiempo, y la utilizaremos en la
4
Los números al principio de cada línea no forman parte del programa. La mayoría de los editores de
texto muestran numeradas las líneas del programa para poder hacer referencia a ellas de manera
sencilla. Cabe destacar que, como se ve en el ejemplo, en el programa pueden intercalarse líneas en
blanco para hacerlo más sencillo de leer.
5
Python utiliza la palabra función (function) en vez de método. Existe una diferencia, pero por el
momento no haremos la diferencia para subrayar la similitud con Alice.
línea 8 del programa, al invocar el procedimiento sleep(2) para que el programa nos dé
dos segundos para pensar el número antes de comenzar a intentar adivinarlo.
IDE Tip
Una enorme ventaja de los entornos de programación es que, en general, detectan
errores a medida que vamos escribiendo el programa y nos permiten solucionarlos (casi)
automáticamente.
Por ejemplo, si utilizamos un carácter que no está permitido con la codificación estándar
de caracteres (como la ñ): la línea se resalta y si pasamos el cursor por encima nos
muestra un mensaje explicando el error (está en inglés, pero podemos identificar que el
problema es la ñ y que hay un problema con el encoding -codificación-). Además, aparece
una lamparita que, si la apretamos, nos ofrece distintas soluciones, como por ejemplo,
agregar la declaración de la nueva codificación (Add encoding declaration) . A estas
opciones también podemos acceder si colocamos el cursor de texto sobre el error y
presionamos Alt + Enter.
La línea resaltada, el
mensaje de error y las
opciones que nos ofrece
para solucionarlo.
Al aceptar la sugerencia de
la lamparita, se agrega la
línea con la declaración de
la codificación y
desaparece el error.
IDE TIP
De la misma manera que con la codificación, el entorno nos señala si nos falta importar
una biblioteca.
Continuando con el texto del programa, while condición: indica el comienzo de una
repetición condicional. En Alice, este era un bloque especial, porque podía contener otros
bloques en su interior. El equivalente en Python se logra agregando cuatro espacios al
comienzo de las instrucciones que están dentro de la repetición, lo cual permite marcar
visualmente que tienen menor jerarquía. A esto se lo conoce como sangrado (o
indentación, del inglés indentation) .
IDE TIP
El entorno también nos ayuda a colocar las indentaciones correctas
En el primer caso, vemos que automáticamente coloca el cursor para seguir escribiendo
dentro del cuerpo del ciclo (es decir, con una indentación) mientras que en el segundo
detecta el error y lo marca.
Sin embargo, podemos manejar la indentación a mano (podemos agregar cuatro espacios
o utilizar la tecla tab) y debemos ser conscientes de ella, dado que a veces la sintaxis de
un programa puede ser correcta pero no refleja lo que queremos expresar.
Para hacerle una pregunta al usuario, usamos el método raw_input, similar a p reguntar
al usuario en Alice. La diferencia es que no podemos preguntar por sí o no, sino que la
respuesta del usuario siempre viene en forma de texto; por eso, lo que hacemos en las
líneas 10 y 11 es guardar la respuesta en una variable llamada respuesta y luego verificar
si la misma fue "sí".6
6
Debemos prestar atención con este punto, ya que la comparación entre fragmentos de texto en
Python es muy estricta y esto puede causar problemas. En la solución dada como muestra, el
programa espera que el usuario responda exactamente "sí", por lo que si la respuesta es "si" (sin
tilde) o "SI" (en mayúsculas), el programa hará de cuenta que dijimos que no.
Para terminar con el programa, cabe señalar dos últimas diferencias. Una de ellas es que la
manera de sumar uno a una variable en Python es diferente a como se hace en Alice (ver la
línea 16 del programa). Por otra parte, el símbolo de comilla invertida (`) que se usa en las
líneas 11 y 14; usar este símbolo en Python para encerrar una expresión equivale a usar, en
Alice, la función [algo] como secuencia de caracteres; el símbolo más (+), por su
parte, colocado entre dos secuencias de caracteres, es el equivalente de la función de Alice
[a] unido con [b].
Además, también es una manera rápida de conocer qué cosas están definidas y
disponibles para utilizar en el programa. Por ejemplo, si en el adivinador escribimos
time., el editor nos enumera todas las funciones que contiene la biblioteca time, pues
son las palabras que podríamos escribir a continuación.
La instrucción int que encierra a los primeros dos raw_input se utiliza para que la
computadora interprete que los valores ingresados por el usuario son numéricos. Si no, la
computadora los interpretará como texto.
Cierre
Cerramos con una reflexión que servirá como puntapié inicial para la próxima actividad,
donde continuaremos trabajando con el lenguaje Python para tratar de mejorar la estrategia
usada por el programa para adivinar el número, de forma que pueda hacerlo planteando
menos preguntas al usuario. Debatimos en grupo algunas preguntas para motivar la noción
de eficiencia, pensando cuántas preguntas necesita hacer el programa a sus usuarios,
especialmente en el peor caso posible.
● ¿Cuántas preguntas tiene que hacer el programa para adivinar si el usuario elige el
número 10?
● ¿Se les ocurre una alternativa? Por ejemplo, ¿será mejor cambiar el orden de las
preguntas para ir de mayor a menor, empezando por el 10 y terminando por el 1?
● ¿Qué pasa si cambiamos por esta última estrategia y el usuario elige el 1?
● En el peor caso, con cualquiera de las dos estrategias, el programa debe hacer diez
preguntas para adivinar el número que eligió el usuario. ¿Existirá una estrategia que
realice menos pasos, sin importar qué número elija el usuario?
A la última pregunta, no le daremos por ahora una respuesta por sí o por no, sino que la
dejaremos planteada a modo de inquietud, para retomarla en la próxima actividad al abordar
el algoritmo de búsqueda binaria.
Actividad 3 | SD1
¿Podremos buscar más rápido?
Objetivos
● Conocer un algoritmo eficiente de búsqueda: la búsqueda binaria.
● Implementar en Python una búsqueda binaria.
● Adquirir una noción elemental de eficiencia algorítmica.
Modalidad de trabajo
En parejas
Desarrollo
En la actividad anterior, los estudiantes realizaron un programa sencillo que les permitía
encontrar un número (el que había pensado el usuario del programa) dentro de una
secuencia de números (los números del 1 al 10).
Una de las preguntas que quedó abierta es si existía alguna estrategia que permitiese
encontrar el número elegido por el jugador sin tener que barrer todo el conjunto de
posibilidades. En el caso de que el espacio de búsqueda sean sólo 10 números no parece
un problema serio tener que preguntar por todos. Pero, ¿si fueran 100?, ¿o 1000? ¿Y si
fueran 100 millones? Eso nos llevaría a tener que revisar, cien, mil y cien millones de
posibilidades respectivamente.
Preguntamos, entonces, a los estudiantes si se les ocurre algún contexto en donde haya
que buscar entre tantas cosas. ¿Alguna vez tuvieron que buscar entre miles o millones de
elementos? Algunas posibles respuestas sobre búsquedas en soportes físicos pueden ser
buscar una palabra en un diccionario de papel, un nombre en una guía telefónica o en una
agenda. También pueden mencionar realizar una búsqueda en un buscador web, un video,
un usuario en una red social, etc. Si no surgieran entre los ejemplos mencionados, podemos
agregar que en estos últimos casos, las búsquedas suceden entre millones, incluso, miles
de millones o billones, de elementos. Por ejemplo, un buscador web debe buscar entre más
de mil millones de sitios web para determinar cuál es la lista de los que se corresponden
con las palabras deseadas.
Para comenzar con la demostración daremos vuelta el vaso del medio, descubriendo el
número 5, el cual no es el número buscado. Realizamos nuevamente la segunda pregunta,
recordando que la secuencia de números está ordenada de menor a mayor, por más que no
se sepa qué números hay debajo de cada vaso. Por lo tanto, como el 8 es mayor que el 5,
seguramente el 8 no podrá estar debajo de ninguno de los 3 vasos a la izquierda del 5 ya
que estos deberían ser menores que 5. Por lo tanto, si el 8 estuviera presente en la
secuencia, lo estaría debajo de alguno de los 3 vasos a la derecha del 5. Habiendo llegado
a esta conclusión se pueden quitar de la mesa, o separar hacia un costado, los 3 vasos que
cubren al 1, al 2, al 3 y al 5, obteniendo así una nueva secuencia de 3 números: 8-13-21.
Ahora serán los estudiantes quienes deban continuar el proceso levantando el vaso que
cubre al 13, verificar que no es el 8 y descartar los vasos que están a su derecha, quedando
7
Como alternativa, también podemos simplemente poner los papeles dados vuelta. El objetivo de
hacer esto es simular lo que hace una computadora: revisar de a un número por vez. A diferencia de
los seres humanos, que podemos ver varios números a la vez y decidir en un golpe de ojo si el
número está o no, la computadora no “ve” sino que para cada posición se fija cuál es el valor que allí
está.
tan solo el vaso que cubre al 8. Para terminar, levantarán este vaso concluyendo que el 8 sí
está en la secuencia de números presentada.
● ¿Se podría hacer algo similar con el problema de adivinar el número elegido por el
usuario?
● ¿Si cambiamos la pregunta que hace el programa? ¿Cuál podría ser?
En este punto, iremos guiando la discusión para llegar a que, de modo similar a como
hicieron recién, se podría preguntar si el número elegido por la computadora es mayor (o
menor, es análogo) al número que eligió el usuario. De este modo, se descartan todos los
números mayores -en caso negativo- o todos los números menores o iguales -en caso
afirmativo.
● ¿Qué número elegirían para preguntar como primera opción entre el 1 y el 100?
● ¿Y por cuál seguirían preguntando si el usuario responde que el número que eligió
es mayor?
Conviene anotar esta idea en el pizarrón y trabajarla con un ejemplo en donde seamos
nosotros quienes pensemos un número y lo escribamos en un papel que nadie pueda ver
hasta que no hayan adivinado.8
El algoritmo que acabamos de presentar, que sirve para buscar un elemento dentro de una
secuencia de elementos, recibe el nombre de búsqueda binaria, nombre que proviene de
que en cada paso, la secuencia se divide en dos partes y solo se continúa buscando en una
de ellas. A continuación se muestra una representación esquemática del algoritmo de
búsqueda binaria.
8
En http://www.csfieldguide.org.nz/en/teacher/chapters/algorithms.html#searching, una guía de
trabajo sobre temas de Cs. de la Computación elaborada por el equipo que diseñó las actividades
CSUnplugged, se puede jugar a una versión interactiva de este juego (con los números ordenados y
sin ordenar). La explicación y la consigna están en inglés, pero son muy similares a lo que
desarrollamos hasta ahora.
Representación esquemática del algoritmo de búsqueda binaria
A continuación, les pedimos que modifiquen el programa para que pueda decir cuántas
n total se le hicieron al usuario hasta haber adivinado el número que eligió. Esto
preguntas e
pueden hacerlo agregando una variable que sea inicializada con el valor 0 y cuyo valor se
incremente cada vez que se hace una pregunta.
Indicamos que experimenten con distintos números para tomar nota de qué valores da. Si
se toma el rango 1-10, en ningún caso la cantidad de preguntas será 10: de hecho, la
máxima cantidad de preguntas posibles en este caso es 7.
Comparativa entre la cantidad de preguntas que se le hacen al usuario en el peor caso para los algoritmos de
búsqueda lineal y búsqueda binaria
Cierre
Para concluir, mostraremos un caso concreto de aplicación del algoritmo de búsqueda
binaria en un dominio que las/los estudiantes suelen utilizar con frecuencia: Google o, más
en general, los buscadores web. Para ello, proponemos a los estudiantes leer el artículo
“Destripando Google”9 y responder las siguientes preguntas:
● ¿Cómo relacionan la forma en que un buscador busca en una serie de palabras con
el algoritmo de búsqueda binaria?
● ¿Qué característica tienen todas las palabras que están a la izquierda de un nodo10
particular en un árbol AVL? ¿Y las que están a la derecha?
● ¿Por qué es importante esta característica?
9
Schapachnik, F. (2015). Destripando Google. https://elgatoylacaja.com.ar/destripando-google/
10
Un nodo es un elemento de un árbol. En el ejemplo del artículo, cada palabra es un nodo.
Actividad 4 | SD1
Secuencias en Python
Objetivos
● Presentar la estructura de Python para representar secuencias: las listas.
● Trabajar con recorridos sobre secuencias (ciclos for).
Modalidad de trabajo
En parejas
Desarrollo
Hasta ahora, en Python, hemos venido trabajando con elementos de manera aislada, ya
sea que fueran números, fragmentos de texto o valores de verdad. Sin embargo, Python
también nos brinda la posibilidad de agrupar múltiples elementos en una secuencia o lista y
trabajar con ellos de manera conjunta. Esto es especialmente útil porque, como veremos en
las actividades siguientes, son muchos los contextos en los que se trabaja con información
organizada en forma de secuencia, como al manipular textos, imágenes, videos o sonidos.
En Python, una secuencia de elementos se escribe listando cada uno de ellos separados
por comas (,), y encerrando la lista completa entre corchetes ([ y ]). Lo primero que
haremos será crear una secuencia de números y almacenarla en una variable. Por ejemplo:
También podemos pedirle al intérprete que muestre por pantalla la secuencia que
acabamos de crear:
que significa “para cada elemento en mi secuencia: ”. Tras escribir esto y pulsar la tecla
Enter, el intérprete nos dará la posibilidad de agregar más líneas de código (debemos tener
en cuenta el sangrado: algunos intérpretes lo colocan automáticamente y otros esperan que
lo agreguemos nosotros). Podemos escribir:
Luego deberemos pulsar Enter dos veces para indicarle al intérprete que ya terminamos de
escribir el cuerpo del ciclo y que debe ejecutarlo. Obtendremos la siguiente respuesta:
Este es el número 6
Este es el número 2
Este es el número 5
Este es el número 9
Este es el número 6
Este es el número 5
Este es el número 1
Probamos algunas veces más, poniendo diferentes instrucciones dentro del cuerpo del
recorrido, incluso poniendo más de una única instrucción. Podemos pedir sugerencias a los
estudiantes e invitarlos a que prueben sus propias ideas en sus computadoras. Podemos
sugerirles que experimenten con secuencias de textos, como por ejemplo:
Otra forma de acceder a los elementos de una secuencia es haciendo referencia explícita a
su posición. Para esto, utilizamos el operador [ _ ] y un número o índice. Es fundamental
observar que el primer elemento de la secuencia tiene índice 0 (en vez de 1) y, por lo tanto,
los índices válidos para una secuencia de n elementos son 0, 1, 2, …, n-1. Utilizar un índice
inválido (es decir, que cae “por fuera” de la lista) produce un error de ejecución.
Mostramos esto a los estudiantes y les proponemos que lo experimenten en sus consolas, a
la vez que podemos sugerir algunos ejemplos similares y pedirles que predigan el resultado.
Damos tiempo para que los grupos piensen y pongan a prueba sus propuestas antes de
hacer la puesta en común. A continuación presentamos una estrategia válida que no
requiere más espacio que para una sola palabra:
Esta estrategia, si bien puede motivarse desde la intuición, tiene un detalle que hay que
precisar: hace falta designar “a mano” una primera palabra. Una opción es pedir una
palabra especialmente para esto, como hicimos en la solución expuesta. Otra (y tal vez más
abstracta) es utilizar una palabra que sea más corta que cualquier otra que vayamos a
escuchar (y, por lo tanto, será borrada en el primer paso de la repetición). Para esto,
debemos elegir la palabra sin caracteres (que escribimos “”), cuya longitud es 0 y, por lo
tanto, menor que la de cualquier otra palabra.
Cuando cada grupo esté convencido de la estrategia presentada, les pedimos que escriban
un programa para implementar el algoritmo que acabamos de discutir.
Consigna: escribir un programa para encontrar la palabra más larga de una secuencia de
palabras.
Atención: crear una variable que contenga la lista de palabras de entre las cuales
queremos buscar.
Pista: experimentar con la función len.
Los dejamos trabajar, insistiendo con que tomen de base la estrategia que produjimos.
Como siempre, estamos atentos a las necesidades que surjan, a las que responderemos
con preguntas y pistas para orientarlos, pensando en el significado en castellano de lo que
escribimos en la estrategia y recordando qué herramienta de programación que ya vimos
puede utilizarse para resolverlo. A su vez, motivamos a que elijan siempre nombres que
expresen el significado de lo que están refiriendo.
A continuación presentamos una solución posible y las sugerencias para motivar algunos
de sus elementos que creemos que serán los que revistan mayor dificultad.
masLargaHastaAhora = palabrasEscuchadas[0]
print "La palabra más larga que escuchamos fue: " + masLargaHastaAhora
En la estrategia En el programa
la nueva palabra es más larga que la len(palabra) > Utilizamos la función len
antoada len(masLargaHastaAho y la comparación por >
ra) para decidir si la nueva
palabra es más larga.
¿Qué hay que cambiar del programa anterior para que, a partir de una secuencia de
números, encuentre el más grande de todos? ¿Es muy distinta la estrategia? ¿Y si
tuvieran que buscarlo ustedes “a mano”, cómo harían? ¿Cambiarían la estrategia?
A continuación vemos un programa en Python que utiliza esta misma estrategia para
encontrar el máximo en una secuencia de números. La variable maximo sirve para
almacenar el elemento que “apartamos” de la lista, es decir, se corresponde con
laMasLargaHastaAhora. Vamos recorriendo uno a uno los elementos de la secuencia, y si
el numero que estamos viendo es mayor que el maximo que habíamos guardado (antes: si
la nueva palabra es más larga que la palabra anotada), pasamos a almacenar este nuevo
valor en la variable. Finalmente, imprimimos por pantalla el resultado.
Sería bueno quitar los datos de entrada de nuestro programa, de manera de poder utilizarlo
para cualquier lista que se nos ocurra. Una manera en que podemos hacerlo es convirtiendo
nuestro programa en un método, análogamente a como hacíamos en Alice. En Python, un
método (que, en la bibliografía oficial se llama función) se escribe con un encabezado como
el que sigue:
def nombre_del_metodo():
Comenzaremos por mover a un método las instrucciones del programa, dejando fuera los
datos de entrada. Así obtendremos:
Si eliminamos sin más los datos de entrada, es decir, la variable mi_secuencia, tendremos
un problema. El programa dejará de funcionar, porque las instrucciones que hacen
referencia a esa variable pasarán a ser incorrectas. La manera de resolverlo es
reemplazándola por un un parámetro del procedimiento buscar_maximo. En Python, esto
se hace agregándolo entre los paréntesis del encabezado del procedimiento. Por ejemplo, si
al parámetro lo llamamos secuencia, nos queda:
Observamos que, ahora, el programa (el cuerpo del método) está escrito en base a
secuencia, es decir, una secuencia genérica que en principio desconocemos y no a
mi_secuencia que era una secuencia en particular. Luego, cuando lo queramos usar,
deberemos proveerle esta información, es decir, la secuencia sobre la que queremos que
trabaje. Esto se consigue colocando este valor en el lugar donde aparece el nombre del
parámetro en el encabezado, es decir, buscar_maximo([1, 2, 55, 3, 4]) o, si está
definida la variable, buscar_maximo(mi_secuencia). Si bien en principio la utilidad de la
parametrización puede no ser tan evidente, es fundamental en programación. Debemos
observar que, ahora, contamos con un método que se puede usar en cualquier programa
para calcular el máximo de cualquier secuencia, e incluso, podemos nombrarlo para que
quede explícito qué hace.Para probar esta nueva versión del programa, podemos hacer clic
derecho en el código y seleccionar “Run File in Console”. Esto abrirá una nueva consola
interactiva en la parte inferior de la pantalla en la cual previamente se ejecutó nuestro
programa, lo cual quiere decir que el intérprete incorporó la definición de nuestro
procedimiento. También, si ya tenemos una consola abierta (con otras definiciones) y
queremos agregar la nueva (o, incluso, cambiar una definición anterior del mismo método
por una corregida), podemos seleccionar las líneas de la definición y, haciendo clic derecho,
elegir “Execute selection in console”. Esto ejecuta la selección en la consola que tenemos
abierta y, por lo tanto, conserva todas las definiciones y recuerda las instrucciones que
ejecutamos hasta el momento.
y podremos pedirle que lo ejecute con distintos valores de entrada. Por ejemplo, si
escribimos
,345,67,12,2
>>> buscar_maximo([99,4 98,23,80])
obtendremos el resultado:
El máximo es 345
IDE TIP:
Si queremos volver a ejecutar una instrucción en la consola, no hace falta que la
escribamos de vuelta. Presionando la flecha hacia arriba, nos aparecen, una a una, las
últimas instrucciones que ejecutamos. Más aún: si escribimos las primeras letras de la
instrucción que buscamos y luego presionamos la flecha hacia arriba, nos lista las
instrucciones que ejecutamos y que comienzan con las mismas letras que escribimos.
Consigna: ¿Cuál es la palabra más larga que aparece en El Quijote? (Observamos que
podemos elegir otra obra literaria, o incluso, cualquier archivo de texto plano que
contenga muchas palabras).
Sugerencia: parametrizar el programa que busca la palabra más larga.
Herramienta: contamos con la función cargarListaDePalabras(nombreDelArchivo)
que, dado un archivo de texto, nos devuelve todas las palabras que aparecen en él.
Sin embargo, ¿para la comida favorita? En cada paso, deberíamos elegir entre un plato
favorito y uno nuevo. ¿Pero esto siempre es posible? ¿Podemos comparar una torta de
chocolate con un choripán? Si bien es muy subjetivo, nos interesa resaltar que la
estrategia que vimos sirve solo cuando todos los elementos del universo con el que
estamos trabajando son comparables entre sí por el criterio que nos interesa.
Bajada
En esta secuencia retomaremos la representación digital de imágenes, tal como la vimos en
el capítulo de representación de la información, para hacer programas que produzcan o
modifiquen imágenes. Para esto, utilizaremos lo practicado sobre recorridos de secuencias,
ya que pensaremos en las imágenes como una grilla o matriz de píxeles y a esta matriz
como una secuencia de secuencias.
Objetivos
● Afianzar las nociones de representación de imágenes.
● Trabajar con estructuras bidimensionales (matrices).
● Presentar el concepto de función de un lenguaje de programación.
● Programar filtros de imágenes.
Actividad 1 | SD2
Programamos en blanco o negro
Objetivos
● Afianzar la noción de pixel
● Familiarizarse con el recorrido de estructuras bidimensionales, como la grilla que
soporta una imagen
Modalidad de trabajo
Grupal
Para estas actividades utilizaremos Python con una biblioteca especial para trabajar sobre imágenes.
En el Anexo de instalación se encuentran las instrucciones necesarias para su instalación según el
sistema operativo.
Podrán descargarse los archivos correspondientes a las actividades y sus soluciones en
http://program.ar/descargas/TI4_clase8_codigo.zip
Comenzamos la actividad contando a los estudiantes que tendrán que realizar dibujos en blanco y
negro pensando a la imagen como una cuadrícula blanca a la que se le colorearán determinados
píxeles indicando su ubicación. Para eso, deberán importar la biblioteca img, que cuenta con
métodos para trabajar sobre imágenes. Presentamos algunos que resultarán particularmente útiles:
● img.nuevaByN(filas, columnas) Este método creará una nueva imagen que deberá ser
guardada en una variable. La imagen se creará con las dimensiones indicadas en los
parámetros cantidad de filas y de columnas. Podemos preguntarnos qué rol cumplen filas y
columnas, para recordar qué es un parámetro y cuál es el beneficio de crear métodos
paramétricos.
● img.mostrarByN(imagen) Este método muestra en pantalla la imagen en blanco y negro
que recibe como parámetro.
● img.pintarPixel(imagen, fila, columna) Este método pinta de negro un píxel
determinado de una imagen ya creada, la cual recibirá como parámetro junto a la fila y la
columna del píxel elegido. En este caso, debemos prestar atención a la importancia de
utilizar parámetros válidos: por ejemplo, no se podrá pintar un píxel ubicado en una columna
mayor a la cantidad de columnas totales.
Debemos recordar que,
como estamos usando
(0,0) (0,8)
filas secuencias, las posiciones
↓ dentro de la cuadrícula
comienzan en 0 tanto para
filas como para columnas.
(2,4) Por ejemplo, el píxel
ubicado en la esquina
superior izquierda será el
que tendrá valor 0 en la
posición de las filas y valor 0
en la posición de las
columnas. El píxel ubicado
(5,0) (5,8) en el extremo superior
derecho tendrá valor de fila
columnas →
0 y valor de columna igual a
la cantidad total de
Una imagen de 6 filas y 9 columnas. Observamos la posición de columnas - 1.
algunos de sus píxeles como (fila, columna).
Para familiarizarse con el lenguaje y las instrucciones para pintar imágenes en blanco y negro,
proponemos una primera consigna: pintar la fila del medio de una cuadrícula de 3 filas y 5 columnas.
Es posible que los grupos intenten resolver esta actividad pintando uno a uno los 5 píxeles de la fila
central. Si bien esto no está mal, podemos proponerles que piensen si no sería conveniente utilizar
alguna instrucción que permita hacer repeticiones. Por el momento no realizaremos un recorrido por
filas y columnas, sino que se avanzará únicamente columna a columna (pues la fila que nos interesa
es siempre la misma). Podemos pensar la siguiente estrategia para resolver el problema. Elegimos
trabajar con una repetición condicional, dado que es la única forma que vimos en Python de generar
repeticiones sin involucrar secuencias, es interesante preguntarse cuál es la condición de la
repetición y qué debe agregarse al programa para que ésta funcione. Aparecen marcadas en negrita
en la estategia.
Observamos que para programar la idea propuesta deberemos utilizar la repetición condicional
mediante la instrucción while. De todas maneras, presentaremos el código del programa en Python
con el recorrido de la fila resuelto, para que solo tengan que completar el espacio punteado con la
instrucción que se encarga de colorear el píxel deseado. El programa en Python es el siguiente:
import img
def pintarFilaCentral():
imagen = img.nuevaByN(3, 5)
columnaActual = 0
while columnaActual < 5:
……………………
columnaActual = columnaActual + 1
img.mostrarByN(imagen)
Para los grupos que necesiten ayuda, les indicamos que encuentren las correspondencias entre la
estrategia que presentamos y el código del programa incompleto, para que observen que falta la
instrucción que colorea el píxel. Para eso, deberán agregar img.pintarPixel(imagen, 1,
columnaActual) con la imagen, la fila número 1 y la columna actual como parámetros. Observamos
también que la repetición condicional terminará cuando la columna actual deje de ser menor a 5, es
decir cuando sea igual a dicho valor y, por lo tanto, la última columna que se pintará será la número
4. Una vez más, recordamos que las columnas se cuentan desde 0 y por ende no existe la columna
número 5, con lo cual, el comportamiento es correcto. Otra alternativa sería comparar por menor o
igual; en este caso, deberíamos usar la cantidad de columnas menos uno. El resultado obtenido será
similar al que vemos a continuación:
.Resultado del programa pintarFilaCentral: una imagen de 3x5 con la fila central pintada de negro
Para continuar con este ejercicio, reforzaremos la noción de parámetro que vimos en la
secuencia anterior. Preguntamos qué pasaría si quisiéramos hacer el mismo dibujo, pero de
largo 6, 10, 50, etc. para observar que deberíamos escribir un programa para cada uno. Sin
embargo, el problema que estamos resolviendo es siempre muy similar, y de hecho, la
estrategia no varía. Luego, podemos escribir un programa más potente (técnicamente: más
general, en el sentido de que resuelve más problemas) que, si bien necesita que nosotros le
proveamos el valor del largo, una vez que este valor está dado, es capaz de producir un
tablero para cualquier largo. Éste es el significado que queremos resaltar: un parámetro es
una entrada de información para el programa.
Para resolver este ejercicio, simplemente debemos observar que, si antes el largo era 5, ahora será
el parámetro largo. Comparamos las definiciones de los dos métodos e invitamos a los grupos a que
experimenten con ellos en la consola interactiva.
Con esta actividad se buscará identificar el recorrido de una cuadrícula como un recorrido por filas
dentro de las cuales se avanza columna a columna. Es posible realizar estos recorridos utilizando la
instrucción for indicándole un rango o la instrucción while como en el ejemplo anterior indicando en
este caso cuál es la condición que debe cumplirse para que el ciclo se detenga. Los resultados serán
levemente diferentes.
Como antes, presentamos un programa incompleto que los grupos deberán completar para conseguir
el resultado esperado. Además, incluimos el método img.esPar(número) que tendrá como resultado
un valor verdadero cuando el número sea par y falso cuando no lo sea. Vemos el programa
incompleto a continuación:
import img
def pintarTableroDeAjedrez():
imagen = img.nuevaByN(...)
for fila in range(0
, 8)
:
for columna in range(0, 8):
if (img.esPar(fila) and ….):
img.pintarPixel(imagen, fila, columna)
elif (not(img.esPar(fila)) a nd not(img.esPar(columna))):
………
……….
Esta solución incorpora algunas herramientas y usos novedosos, que nos interesa destacar para
aprovechar en las actividades siguientes:
La instrucción range(inicio, final) se utiliza para indicar un rango de valores desde el primer
parámetro hasta una unidad menos que el último. En concreto, range(inicio, final) produce la
lista [inicio, inicio+1, inicio+2, …, final-1]. Por ejemplo, range(2, 5) produce [2, 3,
4]. Por eso, al combinarlo con un recorrido for nos permite repetir el cuerpo del ciclo, una vez para
cada valor del rango. En este caso, lo utilizamos para recorrer los valores de filas y de columnas.
Al anidar dos recorridos, podemos obtener todas las combinaciones posibles de los valores de los
rangos especificados. En particular, en nuestro ejemplo, en cada repetición del primer for se fija el
valor de la fila y, una vez que éste está elegido, se van sucediendo todos los valores de columnas.
Cuando éstos se agotan, avanza la primera repetición, recorriendo todos los valores de columnas,
pero ahora con un nuevo valor de fila.
for fila in range(0, 3)
: Estoy en la fila 0 columna 0
for columna in range(0, 3): Estoy en la fila 0 columna 1
print "Estoy en la fila " + `fila` Estoy en la fila 0 columna 2
+ " columna " + `columna` Estoy en la fila 1 columna 0
Estoy en la fila 1 columna 1
Estoy en la fila 1 columna 2
Estoy en la fila 2 columna 0
Estoy en la fila 2 columna 1
Estoy en la fila 2 columna 2
Un programa sencillo para ilustrar el efecto de los recorridos anidados y su resultado. Podemos compartirlo con
los grupos y pedirles que predigan su comportamiento.
La instrucción elif se agrega a una alternativa condicional para analizar una nueva condición luego
de que no se cumpliera una previa. Su nombre proviene de unir else, que sería equivalente a un “si
no” con if, que representaría un nuevo “si”.
ondición1:
if c ondición1:
if c
bloque1 bloque1
elif condición2: else:
bloque2 if condición2:
else: bloque2
bloque3 else:
bloque3
El operador not, aplicado sobre una condición (o valor de verdad), produce la condición contraria (o
sea, su negación). Es decir, not(condición) será verdadero cuando la condición sea falsa y
viceversa. En nuestro programa, para saber si un número es impar (en este caso el número de fila o
columna), aplicamos not sobre el método img.esPar(número) .
El operador and combina dos condiciones (o valores de verdad) para expresar una nueva, que es
verdadera cuando ambas se cumplen. En inglés “and” quiere decir “y”, y de hecho, esta es la
interpretación más directa que podemos darle: condición1 and condición2 será verdadera
cuando se cumplan la condición1 y la condición2, y falsa en cualquier otro caso.
Con estas aclaraciones, esperamos que completen el programa para producir una solución similar a
la siguiente:
import img
def pintarTableroDeAjedrez():
imagen = img.nuevaByN(8 ,8)
for fila in range(0 , 8) :
for columna in range(0 , 8)
:
if (img.esPar(fila) and img.esPar(columna)):
img.pintarPixel(imagen, fila, columna)
elif (not(img.esPar(fila)) and not(img.esPar(columna))):
img.pintarPixel(imagen, fila, columna)
img.mostrarByN(imagen)
Al igual que antes, para terminar, proponemos parametrizar el tamaño del tablero, aunque,
por simplicidad, conservaremos la restricción de que sea cuadrado. Una solución es la
siguiente:
import img
def pintarTablero(lado):
imagen = img.nuevaByN(lado ,lado)
for fila in range(0 , lado):
for columna in range(0 , lado):
if (img.esPar(fila) and img.esPar(columna)):
img.pintarPixel(imagen, fila, columna)
elif (not(img.esPar(fila)) and not(img.esPar(columna))):
img.pintarPixel(imagen, fila, columna)
img.mostrarByN(imagen)
Como actividad extra podemos proponerle a los grupos que dibujen una imagen en blanco y negro
de su preferencia en una cuadrícula y luego hagan un programa en Python que la dibuje en
pantalla.
Además, si todos lo completan, podemos pedir que nos entreguen, por un lado, el dibujo y
por otro, el programa. Luego, entre todos, para cada dibujo, deberemos deducir qué
programa lo produce. Esto es muy fácil de verificar: basta con ejecutar el programa
candidato.
Cierre
Para cerrar la actividad comparamos los programas que hicimos en esta actividad con los
que hicimos cuando trabajamos procesando secuencias de texto o de números. Concluimos
que en ambos casos estamos recorriendo algún tipo de estructura: en los anteriores, la
estructura es lineal, es decir, es una estructura en la que solo se puede avanzar “hacia
adelante”. En cambio, en estos, la estructura es bidimensional, es decir, se puede recorrer
“hacia adelante” pero también “hacia abajo”. Es por eso que en el código de los programas
de esta actividad aparecen dos estructuras for in anidadas (es decir, una para recorrer las
filas y, una vez elegida una fila, ir recorriendo las columnas), mientras que en los anteriores
aparecía una sola.
Actividad 2 | SD2
Programamos en color
Objetivos
● Conocer las herramientas que utilizaremos para trabajar con imágenes en color.
● Repasar los fundamentos de la representación RGB.
● Escribir programas que modifiquen imágenes.
Modalidad de trabajo
Grupal
Para esto no brindaremos código para completar, dado que es muy similar a los programas
anteriores. Si algún grupo se sintiera muy inseguro para comenzar a escribir desde cero, les
sugerimos explícitamente que tomen alguno de los programas que ya hicieron como
modelo.
Para resolver este problema necesitan las versiones a color de las herramientas que
utilizaron en la actividad anterior:
Una solución posible, que genera una imagen del color (128, 128, 0) (es decir, un amarillo
oscuro) tomando como modelo el último programa de la actividad anterior es:
import img
def pintarLiso(filas, columnas):
imagen = img.crearRGB(filas, columnas)
for fila in range(0
, filas):
for columna in range(0 , columnas):
img.colorearPixel(imagen, fila, columna, 128, 128, 0)
img.mostrarRGB(imagen)
11
Proponemos solo un repaso. Hay actividades completas sobre este tema en el capítulo de
representación de la información.
12
Debemos recordar que el rango válido para estos valores es entre 0 y 255 inclusive.
queramos que se pinte.
Para hacer esta modificación basta con reemplazar la línea en la que se colorea el pixel
por:
img.colorearPixel(imagen, fila, columna, valorRojo, valorVerde,
valorAzul)
Para resolver este problema, los grupos deberán conocer cómo representamos un color en
nuestros programas (observemos que en este método indicamos cada color con un solo
parámetro, mientras que el anterior, tomaba tres: uno para el rojo, otro para el verde y otro
para el azul del color que queríamos indicar). Para indicar un color con un único valor,
utilizamos una lista de tres valores, donde el primero representa el rojo, el segundo el verde
y el tercero el azul. Por ejemplo, el color que tiene 255 de rojo, 128 de verde y 0 de azul (un
anaranjado), lo representamos con la lista [255, 128, 0].
Si quisieran acceder a cada elemento de la lista por separado, deberán utilizar el operador [
_ ] e indicar la posición de la lista. [0] para el rojo (recordemos que cuando contamos
elementos de listas comenzamos en 0), [1] para el verde y [2] para el azul. En nuestro
ejemplo, si c es la lista / color [255, 128, 0], c[0] equivale a 255, c[1] equivale a 128 y
c[2] a 0.
img.reemplazarPixel(im, 10, 10, [255, 128, 0]) img.colorearPixel(im, 10, 10, 255, 128, 0)
Maneras equivalentes de establecer el color del pixel (10, 10) a (255, 128, 0).
Observamos la diferencia entre los dos métodos: mientras que img.colorearPixel trabaja con las componentes
del color por separado, img.reemplazarPixel lo considera un único valor que contiene a los otros tres.
Para comenzar a programar, les decimos a los grupos que retomen el programa para pintar
el tablero en blanco y negro, hagan una copia y vayan modificándolo para que cumpla con
esta nueva consigna. Los guiamos para que observen qué alteraciones deberían hacerle al
método original. A continuación presentamos las dos versiones:
Soluciones para el problema en blanco y negro (izquierda) y en color (derecha). Observamos la similitud de la
estrategia y el uso de los métodos para color, análogos a los de blanco y negro.
Como primera aproximación, podemos sugerirles a los grupos que lo necesiten que armen
un tablero de un color y negro (recordando que los píxeles a los que no les cambiamos el
color, quedan en negro). Para esto, alcanza con hacer las modificaciones marcadas en
naranja. Luego, podemos recordar que la estructura if elif permite extenderse a if elif
else lo que nos permite agregar código para que se ejecute cuando no se cumple ni la
condición de if ni la de elif. Observamos que, justamente, esto es lo que queremos en
este caso: cuando no se cumplen ninguna de las condiciones de pintar del primer color, hay
que pintar del segundo.
Continuación posible: definir pintarBarrasPAL() que produce una imagen de 800 x 800
con las barras de ajuste de la señal PAL:
La particularidad de esta señal de ajuste es que está compuesta por los colores primarios,
sus complementarios y el blanco y negro puros. En definitiva, estos colores codificados en
RGB resultan en: (255, 255, 255), (255, 255, 0), (0, 255, 255), (0, 255, 0), (255, 0, 255),
(255, 0, 0), (0, 0, 255), (0, 0, 0). Podemos encontrar diversos patrones, como que el azul
alterna entre una barra y la otra, el verde solo está presente en las primeras cuatro y que
el rojo aparece alternando de a dos.
En esta segunda parte propondremos hacer programas para que alteren los colores de las
imágenes, imitando algunos filtros clásicos.
SoloAzul:
Cargar imagen RGB
Para cada fila de la imagen entre 0 y la cantidad de filas de la imagen:
Para cada columna de la fila actual entre 0 y la cantidad de columnas de la imagen:
Colorear el pixel de la fila y columna con rojo y verde = 0 y azul el valor que
tenía.
Al terminar de recorrer todas las filas y columnas mostrar la imagen obtenida.
Damos tiempo para que, comenzando a partir de los programas confeccionados en ítems
anteriores, surjan las siguientes dificultades y sus posibles soluciones:
● Dado que la cantidad de filas y columnas ya no está fija a priori, sino que depende
de la imagen que carguemos, necesitamos los métodos
img.cantidadDeFilas(foto) e img.cantidadDeColumnas(foto), que nos
permiten obtener la cantidad de filas y de columnas (resp.) a partir de una imagen
cargada.
● Necesitamos conocer el valor de azul de un pixel para establecer su valor final. Para
esto contamos con los siguientes métodos:
○ img.azulDelPixel(imagen, fila, columna), que retorna el valor númerico entre
0 y 255 que posee el azul en el píxel ubicado en la imagen, fila y columna indicadas
como parámetros. Comentamos que también existen métodos análogos para los
otros colores primarios: img.verdeDelPixel(imagen, fila, columna) y
img.azulDelPixel(imagen, fila, columna)
○ img.valorDelPixel(imagen, fila, columna). Este método obtiene el valor del
color del pixel, representado, al igual que antes, como una lista con tres valores (el
del rojo, el del verde y el del azul).
import img
def soloAzul():
foto = img.cargarRGB('mi_foto_color.png')
filas = img.cantidadDeFilas(foto)
columnas = img.cantidadDeColumnas(foto)
for filaActual in r ange(0, filas):
for columnaActual in range(0, columnas):
valorDeAzul = img.azulDelPixel(foto,filaActual,columnaActual)
img.colorearPixel(foto,filaActual,columnaActual,0,0,
valorDeAzul)
img.mostrarRGB(foto)
Antes de comenzar, observamos similitudes con el problema anterior. Podemos plantear los
algoritmos, que solo variarán en el paso en el que computan el color nuevo del píxel en
base al original, descartando la información de los colores que no estamos eligiendo. Los
tres programas resultantes serán muy similares, hecho que podemos resaltar escribiéndolos
uno al lado del otro:
import img
foto = img.cargarRGB('mi_foto_color.png')
filas = img.cantidadDeFilas(foto)
columnas = img.cantidadDeColumnas(foto)
for filaActual in r
ange(0, filas):
for columnaActual in range(0, columnas):
img.mostrarRGB(foto)
Podemos aprovechar esta comparación para poner en evidencia lo similar de los algoritmos
detrás de los tres programas: siempre recorremos todos los píxeles (avanzando por las filas
y las columnas) y, para cada uno, obtenemos su color y lo utilizamos para producir, de
alguna manera en particular, un nuevo valor de color para reemplazarlo. Por ejemplo, en el
caso de soloAzul, a partir del color del píxel, obtenemos su parte azul y generamos un
nuevo color con este valor y el resto de los primarios en 0.
ReemplazarColores:
Cargar imagen RGB.
Para cada fila entre 0 y la cantidad de filas de la imagen:
Recorrer cada columna entre 0 y la cantidad de columnas de la imagen:
Colorear el píxel de la fila y columna actual con
rojo = verde, verde = azul y azul = rojo.
Mostrar imagen RGB.
A continuación presentamos dos soluciones posibles, una que utiliza los métodos
trabajados en la consigna anterior y otra que retoma img.varlorDelPixel e
img.reemplazarPixel.
import img
def reemplazarColores():
foto = img.cargarRGB('mi_foto_color.png')
filas = img.cantidadDeFilas(foto)
columnas = img.cantidadDeColumnas(foto)
for filaActual in r
ange(0, filas):
for columnaActual in range(0, columnas):
valorDeRojo = colorOriginal =
img.rojoDelPixel(foto,filaActual,column img.valorDelPixel(foto,filaActual,colum
aActual) naActual)
valorDeVerde =
img.verdeDelPixel(foto,filaActual,colum colorNuevo = [colorOriginal[1],
naActual) colorOriginal[2], colorOriginal[0]]
valorDeAzul =
img.azulDelPixel(foto,filaActual,column img.reemplazarPixel(foto, filaActual,
aActual) columnaActual, coloresNuevos)
img.colorearPixel(foto,filaActual,colum
naActual, valorDeVerde, valorDeAzul,
valorDeRojo)
img.mostrarRGB(foto)
Dado que la primera solución es más parecida a las anteriores, es esperable que las
soluciones de los grupos sean similares a ésta. Sin embargo, nos interesa la segunda para
mostrar explícitamente los valores del color original y el color transformado. Podemos
mostrarla o, escribirla entre todos en el pizarrón, como una versión alternativa que usa los
métodos img.valorDelPixel e img.reemplazarPixel.
Cierre
Para terminar la actividad, reforzamos la semejanza entre todos los algoritmos de la
segunda parte. Observamos que consisten en recorrer todos los píxeles de la imagen y, a
partir del valor de color del pixel original, producir uno nuevo. Enfatizamos que cada uno de
los filtros es, en definitiva, una manera particular de producir el pixel definitivo a partir del
pixel original.
Objetivos
● Programar filtros de imágenes.
● Presentar el concepto de función y utilizarlas para construir programas.
● Reforzar el manejo de la codificación RGB.
Modalidad de trabajo
Grupal
…
colorOriginal = img.valorDelPixel(im, fila, columna)
colorNuevo = coloresIntercambiados(colorOriginal)
img.reemplazarPixel(im, fila, columna, colorNuevo)
…
def coloresIntercambiados(color):
valorRojo = color[0]
valorVerde = color[1]
valorAzul = color[2]
return [valorVerde, valorAzul, valorRojo]
Para trabajar este concepto con los estudiantes, retomamos la observación de la actividad
anterior, en la que concluimos que todos los filtros que habíamos programado sobre
imágenes a color, consistían en tomar el valor original del color de cada píxel y, en base a
éste, producir un valor nuevo según alguna regla determinada (por ejemplo, descartar todas
las componentes menos el azul o intercambiar el orden de los colores primarios).
Contamos, entonces, que con una motivación similar a la de los métodos, en Python
podemos definir funciones para separar del cuerpo de un programa un fragmento que esté
destinado a producir un valor en particular. Mostramos el ejemplo de la nueva definición de
coloresIntercambiados y proponemos que adapten, utilizando funciones, las definiciones
de soloAzul, soloVerde y s
oloRojo.
...
colorOriginal = img.colorDelPixel(im, fila, columna) def dejarSoloAzul(color):
colorNuevo = dejarSoloAzul(colorOriginal) valorAzul = color[2]
img.reemplazarPixel(im, fila, columna, colorNuevo) return [0, 0, valorAzul]
...
Posible adaptación del programa soloAzul utilizando funciones. Observamos que solo tenemos que
modificar la parte en la que reemplazamos el color del píxel, mientras que el resto de programa (el recorrido
sobre las filas y las columnas) es exactamente igual.
13
A diferencia de como solemos calcular un promedio (primero sumando los números y después
dividiendo por la cantidad), en este caso, primero dividimos cada valor y luego lo sumamos. Esto se
debe a que el formato de representación utilizado no permite números mayores a 255. Luego, si
cuando estamos calculando la suma se excede este límite (lo cual es muy probable) se produce un
error o se fija el resultado en 255. En cualquier caso, no es el valor esperado.
necesitan cambiar la función calcularGris.
● calcularGrisPerceptual: dado que hay colores “más oscuros” que otros, para
producir una imagen lo más parecida posible a cómo nosotros percibimos la
luminosidad, el valor de gris se obtiene combinando 21,26% del valor de rojo,
71,52% del verde y 7,22% del azul.
● calcularGrisCanalRojo: otra opción es considerar solo el valor de rojo y
replicarlo en los otros canales, ignorando el resto. Esto produce un efecto
visualmente notable, similar al de la fotografía infrarroja.
● calcularGrisMax: también podemos elegir el mayor valor de los tres para
replicarlo. Para esta variación, consideramos que vale la pena definir otra función
que calcule el máximo de tres valores o adaptar el ejercicio en el que calculamos
el máximo de una secuencia.
Más variaciones: además de las tres variaciones mencionadas, alentamos a los grupos a
que experimenten con otras opciones que se les ocurran. Por ejemplo, pueden variar la
fórmula de la primera alternativa con otros coeficientes (teniendo en cuenta que siempre
sumen exactamente 100% para permanecer en rango), pueden probar eligiendo solo el
canal azul o el verde, pueden tomar el mínimo, etc...
A continuación vemos los distintos efectos de las distintas fórmulas y programas que las
computan.
def calcularGrisPerceptual(color):
valorRojo = color[0]
valorVerde = color[1]
valorAzul = color[2]
valorGrisDecimal = 0.2126 * valorRojo + 0.7152 * valorVerde + 0.0722 * valorAzul
valorGris = int(valorGrisDecimal)
return [valorGris, valorGris, valorGris]
Lo único diferente en esta función con respecto a la anterior es cómo calculamos el valor de gris. Primero
aplicamos la fórmula expresada en la consigna y luego calculamos int() de ese valor para redondearlo a
un número entero, dado que nuestra representación espera números enteros para cada uno de los colores.
Podemos proponer parametrizar el color elegido La función maximo es una adaptación de la función
definiendo calcularGrisCanal(color, canal), definida en la actividad de secuencias para buscar el
donde canal = 0 indica rojo, 1 verde y 2 azul. máximo, pues el color está representado como una
lista.
El algoritmo para todos estos filtros es muy similar a los que ya veníamos trabajando:
debemos recorrer todos los píxeles de la imagen (avanzando por las filas y las columnas),
obtener el color original y producir un color nuevo aplicando alguna función, que dependerá
del filtro que queramos hacer. Luego, en los ejemplos que siguen solo presentaremos esta
función, mientras que las soluciones completas aparecen programadas en el archivo fuente
correspondiente.
def invertir(valor):
return 255 - valor
def invertirCuadratico(valor):
return int((255**2 - valor**2)**(0.5))
● posterizar(): este filtro simula un método de representación muy básico en el que
no existen valores intermedios para cada color, solamente pueden aparecer con su
mayor intensidad o no aparecer.
Pista: ¿Cuántos colores distintos puede haber en la imagen después de aplicar el
filtro? ¿Cuáles son? Observamos que son 8 colores: el blanco, el negro, los
primarios y los complementarios, que se representan como [255, 255, 255], [0, 0, 0],
[255, 0, 0], [0, 255, 0], [0, 0, 255], [0, 255, 255], [255, 0, 255], [255, 255, 0], es decir,
todas las combinaciones posibles de 0 y 255 en cada canal.
Solución: Si el valor del canal es menor que 128, reemplazarlo por 0 (pues está más
cerca de 0 que de 255) y en caso contrario, por 255 (pues está más cerca de éste
que de 0).
Variantes: Extender la cantidad de niveles posibles para cada color, es decir, en vez
de que cada canal pueda valer solo 0 o 255, por ejemplo, permitir que valga 0, 128 o
255. En este caso, utilizaríamos la función todoONada3, que es análoga a la anterior,
pero considerando tres valores. Los números de los rangos provienen de dividir los
números entre 0 y 255 en tres segmentos iguales: a los primeros, aproximarlos al 0,
a los segundos al 128 y a los últimos al 255.
Imagen original Posterizado con dos niveles Posterizado con tres niveles
14
La media geométrica entre dos valores x1 y x2 se calcula como (x1*x2)**(1/2)
def posterizarPixelByN(color): def posterizarPixelByN(color):
color = calcularGris(color) valorRojo = color[0]
valorRojo = color[0] valorVerde = color[1]
valorVerde = color[1] valorAzul = color[2]
valorAzul = color[2] valorRojoExtremo = todoONada(valorRojo)
valorRojoExtremo = todoONada(valorRojo) valorVerdeExtremo = todoONada(valorVerde)
valorVerdeExtremo = valorAzulExtremo = todoONada(valorAzul)
todoONada(valorVerde) colorFinal = [valorRojoExtremo,
valorAzulExtremo = todoONada(valorAzul) valorVerdeExtremo, valorAzulExtremo]
colorFinal = [valorRojoExtremo, colorFinal = calcularGris(colorFinal)
valorVerdeExtremo, valorAzulExtremo] return colorFinal
return colorFinal
Observamos que las líneas agregadas (marcadas en negrita) aplican la conversión a blanco y negro. En el
primer caso, antes de comenzar a trabajar, se reemplaza el valor de color por el resultado de su valor de gris.
Por lo tanto, el efecto de posterizar se aplica sobre la imagen ya convertida a escala de gris. En el segundo, se
hace lo mismo pero con el valor de colorFinal, lo que produce que primero se aplique el efecto de posterizar y
su resultado se convierta a blanco y negro. Observamos las dos versiones (arriba y abajo): ambas son
equivalentes, pero mientras que en la primera modificamos la definición de una función, en la segunda, definimos
una nueva combinando las dos anteriores. Esta es otra ventaja de tener funciones individuales definidas para las
transformaciones: que las podemos combinar fácilmente y de manera muy clara.
negativo: invierte los colores de la posterizar: produce una imagen entintar: agrega a toda la
imagen. combinando únicamente colores imagen un mismo color, por
primarios puros (es decir, al ejemplo, cian.
máximo de su intensidad).
Sugerencia: prueben qué sucede si aplicamos el filtro de blanco y negro antes o después
de alguno de los filtros que ya programaron.
Parte II: Proyecto de Sintetizador | Programas que suenan
Introducción
Cerraremos el recorrido de programación trabajando sobre un nuevo proyecto. En este
caso, los estudiantes construirán un sintetizador de sonido, es decir, un programa capaz de
generar archivos de audio a partir de una melodía codificada en un texto.
Para esto, deberán primero investigar sobre la naturaleza del sonido y luego, retomando las
herramientas del capítulo anterior, escribir sucesivos programas en Python para ir haciendo
crecer las capacidades de su sintetizador. Finalmente, deberán proponer un sistema de
representación de melodías, escribir un programa capaz de decodificarlas y utilizar las
funciones que definieron previamente para generar el archivo de sonido final.
Actividad 1A | SD1
¿Cómo es el sonido?
Objetivos
● Presentar una aproximación al fenómeno físico que percibimos como sonido.
● Conocer la noción de frecuencia y asociarla con el tono o altura del sonido.
Modalidad de trabajo
En parejas
Desarrollo
Comenzamos este proyecto comentándoles a los grupos que programarán su propio
sintetizador de sonido. Es decir, escribirán una serie de programas en Python capaces de
generar archivos de sonido, que luego podrán ser reproducidos en la computadora.
Para comenzar, observaremos una representación gráfica del sonido que, esperamos, sea
familiar para los estudiantes15. Para esto, utilizaremos un instrumento denominado
osciloscopio. Pueden usar uno en línea (https://academo.org/demos/virtual-oscilloscope/,
en inglés, es importante que elijan la opción Input -> Live input) o, incluso, podemos pedirles
que descarguen alguna aplicación para celulares que simule uno (existen muchas gratuitas,
basta con buscar en la tienda de aplicaciones). No decimos más, y simplemente les
pedimos que experimenten con distintos sonidos y observen el resultado. Si esto no fuera
posible, podemos reproducir algún video donde se haga esto, como por ejemplo
(https://www.youtube.com/watch?v=XFYLK_b9--4). Esperamos que observen algo similar a
la imagen que vemos a continuación:
15
Si ya hubieran realizado una experiencia similar o hayan visto nociones de sonido en Física,
podemos omitir esta introducción experimental.
La primera observación es que el dibujo parece periódico, es decir, compuesto por un
mismo patrón que se repite. Luego, preguntamos si encuentran alguna relación con cómo
se escucha el sonido y con cómo se ve en el osciloscopio. El primer comentario que nos
interesa hacer al respecto es que, cuanto más intenso es el sonido, más “alto” es el gráfico.
Para continuar, les pedimos que experimenten cómo se ven los sonidos graves y los
agudos. Para esto, pueden producir sonidos con algún instrumento musical o con su propia
voz (en ese caso, les sugerimos que pronuncien siempre una misma consonante, en
particular, la m o la l, que consisten en sonidos más “simples”, es decir, donde el dibujo es
más claro). También, podemos utilizar un generador de sonidos virtual, como
https://lengua.la/gtp/?n=1, donde deberemos variar la barra de velocidad. Es importante que
no se mezclen los sonidos de los diferentes grupos para poder observar el fenómeno sin
interferencias. Recomendamos unir grupos de manera que queden distanciados en el aula,
turnarlos, o realizar el experimento nosotros bajo sus directivas y proyectar el resultado.
Un sonido grave (a la izquierda) y otro agudo (a la derecha), generados artificialmente y vistos en el
osciloscopio.
Pronunciando la letra l, primero más grave y después más aguda. Observamos que, al trabajar con la voz
humana, la forma es más compleja (lo que puede hacer que el fenómeno sea difícil de observar).
Entonces la pregunta es “¿Qué cambió entre un sonido y otro? ¿Y entre un gráfico y otro?
¿Cómo se relacionan?”. El objetivo de este experimento es observar que los sonidos graves
se corresponden con dibujos más “anchos” mientras que los agudos, con dibujos más
“angostos” (y, por lo tanto, que se repiten más veces), aunque en la forma son similares.
Ahora que ya observamos algunas relaciones entre los sonidos que oímos y la forma que
adopta el osciloscopio, cabe preguntarnos qué es exactamente lo que está graficando. Para
esto, podemos explicar que los sonidos son vibraciones del aire que somos capaces de
percibir con nuestros oídos. Cuando suena la cuerda de una guitarra, la vemos oscilar entre
dos posiciones (es decir, moverse repetidas veces hacia un lado y hacia otro, a mucha
velocidad). Este movimiento produce que el aire que la rodea se comprima y se expanda.
Además, estas compresiones y expansiones también afectan al aire que tienen alrededor y
se propagan: si se expanden, “empujan” al aire que está a su alrededor, produciendo que se
comprima, y si se comprimen, “dejan lugar” y permiten al aire circundante que se expanda.
Esto produce una nueva perturbación en el aire que rodeaba a la original, que, a su vez
producirá nuevas perturbaciones en sus alrededores, que, a su vez, perturbarán el aire que
está más allá… A este tipo de fenómenos, donde hay una propagación de una perturbación
periódica (es decir, que se repite igual en el tiempo), los llamamos onda.
Finalmente, cuando estas perturbaciones llegan a nuestros oídos, hacen vibrar una
membrana llamada tímpano. Estas vibraciones producen estímulos eléctricos que son
recibidos por el cerebro e interpretados como un sonido. La computadora que utilizamos
como osciloscopio no tiene un tímpano, pero sí un micrófono que funciona de una manera
muy similar: cuenta con una membrana capaz de vibrar y producir electricidad a partir de su
movimiento. Finalmente, esta electricidad es recibida por el osciloscopio y graficada: el eje
vertical representa la intensidad, es decir, cuanto más alejada del centro está la curva,
significa que la perturbación que recibió el micrófono fue más intensa; el eje horizontal
representa el tiempo, dado que a medida que nuevas perturbaciones llegan al micrófono, el
gráfico se desplaza para dejar lugar para graficarlas.
El primer fenómeno que habíamos observado era que, a sonidos más intensos,
correspondían dibujos más “altos”: dijimos que, cuanto más intensas eran las
perturbaciones en el aire, más alejada del eje horizontal estaba la curva del gráfico. Luego,
a mayor intensidad de sonido, observamos gráficos que alcanzan valores mayores en la
dimensión vertical. A esta característica de la onda le decimos amplitud.
Continuemos ahora reflexionando a propósito del tono: vimos en el osciloscopio que a los
sonidos agudos les correspondían dibujos “más angostos”, donde las repeticiones
aparecían más juntas en el eje horizontal. Si recordamos que este eje representa el tiempo,
esto indica que, para una misma duración, un sonido agudo está formado por más
perturbaciones que uno grave. O dicho de otro modo, las perturbaciones se suceden más
rápidamente en los sonidos agudos que en los graves. A cada una de estas perturbaciones
“completas” que se repiten periódicamente les decimos oscilaciones o ciclos.
A esta característica de las ondas, de tener sus alteraciones más juntas o más separadas
en el tiempo (y, por lo tanto, tener gráficos “más anchos” o “más angostos”), le llamamos
frecuencia. Recopilando lo que comentamos hasta ahora y observamos en el osciloscopio,
podemos concluir que los sonidos más graves tienen frecuencias más bajas que los sonidos
más agudos.
Para pasar en limpio este concepto, podemos mostrar dos ondas con diferentes
frecuencias. A modo de ejemplo, la siguiente imagen muestra comparativamente una onda
correspondiente a un sonido más grave (y, por lo tanto, de menor frecuencia) y otra a un
sonido más agudo y, por lo tanto, de mayor frecuencia. De hecho, la segunda onda tiene
una frecuencia exactamente cuatro veces mayor que la primera. Además, señalamos los
ciclos para dejar en claro a qué nos estamos refiriendo y hacer énfasis en que incluye tanto
la perturbación “hacia arriba” como “hacia abajo”.
La forma más común de expresar la frecuencia de una onda es dando la cantidad de ciclos
completos que se producen en un segundo. Esto puede calcularse contando la cantidad de
crestas o puntos altos (o de valles o puntos bajos) que hay en ese período de tiempo. Por
ejemplo, si los gráficos dados como ejemplo representaran un segundo completo de sonido,
la onda de la izquierda tendría una frecuencia de dos ciclos por segundo, lo que usualmente
se expresa diciendo que la frecuencia es de dos hercios o 2 Hz. En cambio, la onda de la
derecha tendría una frecuencia de 8 Hz.
Cabe destacar que, en realidad, las ondas asociadas a los sonidos que escuchamos
cotidianamente son más complejas que los ejemplos anteriores, como vimos en el
osciloscopio al principio de la actividad. Esto se debe a que, además de tener una
frecuencia principal, contienen varias otras frecuencias secundarias sonando
simultáneamente. Estas frecuencias secundarias, llamadas armónicos, son las que le
otorgan la característica propia a cada sonido, de manera que podamos distinguir sonidos
de la misma frecuencia tocados en una guitarra, en un piano o por una voz humana.
Para terminar esta parte, indicamos a los estudiantes que resuelvan la primera actividad de
la ficha, donde se muestran tres gráficos de ondas y se pide que determinen su frecuencia
en hercios. Es importante que tengan en cuenta qué porción del gráfico representa un
segundo. Así, el primero de los gráficos representa una onda de 6 Hz, el segundo una de 3
Hz, y el tercero, de 10 Hz.
Luego de que resuelvan el ejercicio, ponemos en común los resultados y los invitamos a
preguntarse cómo creen que se escucharán esos sonidos. Les contamos que las
frecuencias de esas ondas son demasiado bajas para poder ser oídas por el ser humano.
La mayoría de las personas podemos escuchar sonidos cuyas frecuencias están entre los
20 Hz y los 20.000 Hz.
Por último, preguntamos si saben de qué manera se distinguen en la música los sonidos de
diferentes frecuencias. La idea es recuperar el concepto de nota musical. Una nota musical
es un sonido de una frecuencia determinada, al que se le asoció un nombre particular que
permite referirse a él de manera sencilla. Las notas musicales son centrales a la hora de
describir melodías: una melodía es una sucesión de sonidos de distintas frecuencias, es
decir, de notas musicales, organizados en el tiempo de forma tal que tengan cierto ritmo.
Para presentar lo que sigue, es ideal que tengamos a nuestra disposición un piano o teclado
musical. De no contar con uno físico, existen infinidad de sitios web o aplicaciones móviles
que simulan pianos y nos permitirán ilustrar las mismas ideas.
Las notas musicales que se utilizan en la música occidental pueden verse en las teclas de
un piano, ya que a cada tecla le corresponde una nota distinta. Por simplicidad, en este
proyecto trabajaremos solamente con las notas que corresponden a las teclas blancas de
un piano. Estas notas reciben siete nombres distintos, que forman un patrón que se repite a
lo largo del teclado: do, re, m
i, fa, sol, la y si. Es decir, existen varias notas que reciben el
nombre do, varias que reciben el nombre re, y así sucesivamente. Para distinguirlas suelen
usarse números, y así en un piano pueden aparecer las notas do1 , do2, do3 , do4 , etc. A cada
una de las secuencias de siete notas que van de do a si se la conoce como octava.
Notas de un teclado musical pequeño, de 49 teclas, que contiene cuatro octavas completas.
Podemos reconocer fácilmente las teclas que corresponden a un do en un teclado musical,
porque son aquellas que no tienen una tecla negra a la izquierda y tienen dos teclas negras
a la derecha. A partir de allí es sencillo encontrar el resto de las notas de la escala musical.
Existen teclados con más y con menos octavas, pero en todos ellos el do que se encuentra
más cerca del centro se conoce como do central, y es el que se denota usualmente como
do3 . Para terminar esta actividad, los estudiantes deberán investigar y averiguar cuáles son
las frecuencias de las notas de la octava correspondiente al do central, completando la tabla
que se encuentra en la ficha. Los valores correctos son los que se muestran a continuación.
do3 261,626 Hz
re3 293,665 Hz
mi3 329,628 Hz
fa3 349,228 Hz
sol3 391,995 Hz
la3 440 Hz
si3 493,883 Hz
Cierre
En esta actividad nos aproximamos a la naturaleza del sonido tal y como lo escuchamos,
pero en adelante, nos interesará trabajar con sonidos representados en una computadora.
Para ir preparando el terreno, cerramos esta actividad con una reflexión acerca de maneras
de almacenar sonido, pidiendo a los estudiantes que mencionen medios que conozcan para
hacerlo: archivos de computadora (posiblemente transmitidos a través de internet), CDs,
discos de vinilo, cintas magnéticas o cassettes, etc. ¿Qué similitudes y diferencias hay entre
estos medios? ¿Cómo será que se representa en ellos una onda de sonido?
Ficha para el estudiante
1) ¿Cuál es la frecuencia de las siguientes ondas de sonido?
Frecuencia:
a) Hz
Frecuencia:
b) Hz
Frecuencia:
c) Hz
do3
re3
mi3
fa3
sol3
la3 440 Hz
si3
Actividad 1B | SD1
¿Cómo se representa el sonido?
Objetivos
● Conocer una representación digital del sonido y el concepto de tasa de muestreo.
● Reconocer la importancia de elegir una tasa de muestreo adecuada.
Modalidad de trabajo
En parejas
Desarrollo
Ahora que conocemos las características fundamentales del sonido y podemos
representarlo y analizarlo de manera gráfica, nos resta conocer cómo se representa en una
computadora. Si conocemos esta representación, podremos generar sonido simplemente
generando los números adecuados.
Vimos anteriormente que el sonido es un fenómeno físico que se produce a lo largo del
tiempo, y, de hecho, graficamos su intensidad en un eje temporal. Si quisiéramos guardar
el sonido (es decir, representar el sonido de alguna manera en algún medio para ser
capaces de reproducirlo después), podríamos simplemente anotar el valor de la
intensidad de la perturbación que observamos en el gráfico para cada instante de tiempo.
¿Pero qué momentos deberíamos observar? ¿El instante 0 y 1s? En ese caso, no
estaríamos observando el fenómeno después de 0,5 segundos. Y aún si anotáramos ese
valor, estaríamos descartando la información para 0,25 y 0,75 segundos. Sin embargo,
entre estos cuatro puntos, hay muchísimos que no estamos considerando. De hecho, hay
infinitos. Es por esto que decimos que el sonido (el tiempo, en realidad) es un fenómeno
continuo. En cambio, a los fenómenos que ocurren como eventos aislados (y, por lo
tanto, entre dos eventos distintos, no hay uno diferente), los llamamos discretos.
A la hora de almacenar una onda de sonido en la computadora se hace algo similar, dado
que no podríamos registrar los infinitos instantes de tiempo en los que ocurre un sonido: nos
limitamos a tomar algunos momentos de la misma y guardar la información correspondiente
a ellos, descartando los demás. Cada uno de estos instantes puntuales se representará
luego como un número, y diremos que se trata de una muestra.
En esta actividad buscaremos que los estudiantes se aproximen por indagación al proceso
de discretización del sonido, descubriendo en el camino algunos de los conceptos y de las
dificultades centrales que subyacen al mismo. Para comenzar, repartiremos entre ellos
copias de las ondas de sonido proporcionadas en los materiales.
Antes de comenzar, a modo de ayuda, les indicaremos cómo pueden hacer para
representar mediante números ciertos instantes de la onda de sonido. La idea es que
habiendo elegido un momento, es decir, un punto en el eje horizontal, tracen una línea
vertical y se fijen a qué altura se cruza con la onda, mirando los números ubicados en el eje
vertical. No es relevante si expresan la altura usando números decimales o la aproximan
con el número entero más cercano. A continuación puede observarse un ejemplo.
También les mostramos cómo se puede realizar el proceso inverso: si tenemos una
secuencia de números, podemos reconstruir la onda a la cual pertenecen.
Reconstrucción de una onda de sonido a partir de su discretización en una secuencia de números
● Una de las decisiones que deben tomarse a la hora de discretizar una onda de
sonido es cuántas muestras deben tomarse en un determinado período de tiempo, lo
cual se conoce como tasa de muestreo16. Usualmente la tasa de muestreo se
expresa a través de la cantidad de muestras que se toman por segundo. Cuando la
tasa de muestreo es menor, tenemos cada vez menos información acerca del
sonido. Si es demasiado baja, podemos tener problemas para reconstruir el sonido
original.
16
A la tasa de muestreo también se le suele decir frecuencia de muestreo. Elegimos no utilizar esta
terminología para evitar confusiones con la frecuencia del sonido.
Discretización que puede ser reconstruida de dos formas distintas debido a su baja tasa de muestreo.
Con la información disponible, es imposible saber cuál de las dos era la onda original.
Es importante que los estudiantes comprendan la importancia del concepto de tasa de
muestreo. Si las dificultades surgidas durante la actividad anterior no fueran suficientes para
exponer este hecho, podemos profundizar utilizando el ejercicio que se presenta en la ficha.
Allí se encontrarán con dos ondas de sonido, y con cuatro secuencias de números distintas.
Cada una de las secuencias tendrá una cantidad de muestras menor que la anterior. Les
diremos que cada secuencia de muestras corresponde a una de las dos ondas de sonido, y
les pediremos que intenten decidir de cuál de ellas se trata, para lo cual deberán reconstruir
la onda de sonido a partir de las muestras. En caso de que se encuentren con algún
problema para hacerlo, tendrán que explicar por qué.
Al realizar la tarea comprobarán no solo que la dificultad aumenta a medida que la tasa de
muestreo disminuye, sino que en el último caso, resulta imposible decidir a cuál de las dos
ondas corresponde la versión discretizada. De las tres versiones discretizadas brindadas, la
primera corresponde a la onda 2 y la segunda a la onda 1, pero en el caso de la tercera, un
ejemplo muy similar al recién presentado, es imposible determinar si se trata de la onda 1 o
de la onda 2.
Una pregunta que puede surgir es cómo se escucha un sonido grabado con una tasa de
muestreo demasiado baja; esto lo experimentaremos en breve, cuando comencemos a
trabajar con las actividades de programación del proyecto. Por último, discutimos acerca de
qué tasa de muestreo será necesaria para poder representar correctamente los sonidos que
podemos escuchar los seres humanos.
Existe un resultado matemático17 que dice que la cantidad de muestras a tomar por segundo
debe ser, por lo menos, el doble de la frecuencia de la onda. Recordemos que las personas
podemos escuchar sonidos de hasta aproximadamente 20.000 Hz; la tasa de muestreo que
se utiliza, por ejemplo, en los CDs de audio y muchos estándares profesionales es de
17
Conocido como el teorema de muestreo de Nyquist-Shannon.
44.100 Hz, ligeramente más que el doble. Esto asegura que se puedan capturar
correctamente todas las frecuencias audibles. En definitiva, si bien en el proceso de
discretización estamos descartando información (pues solo conservamos una cantidad finita
de muestras), si elegimos una tasa de muestreo apropiada, es posible reconstruir el sonido
sin diferencias perceptibles (recordemos, que, en todo caso, estaremos perdiendo
frecuencias que no son audibles por el ser humano).
Cierre
Vimos en la actividad que podemos representar una onda de sonido simplemente a partir de
una registrar algunos valores de la onda en instantes determinados. Sin emabargo, dado
que hay que almacenar las muestras que se registraron (que suelen ser más de 40.000 por
segundo), el espacio de almacenamiento requerido puede ser muy grande. Como ya vimos
en el capítulo de representación de la información, es posible ahorrar espacio de
almacenamiento usando formatos de audio comprimidos. De la misma manera que con las
imágenes, existen formatos con compresión sin pérdida18 (como FLAC) a partir de los
cuales se puede reconstruir el sonido original exactamente como fue comprimido. Por otro
lado, también existen formatos con compresión con pérdida (MP3, OGG), muy popular para
distribuir audio por Internet. Estos últimos producen archivos mucho más pequeños que los
primeros, pero el sonido obtenido ya no es exactamente el mismo que el original sino que
será más o menos parecido, dependiendo de cuánto espacio de almacenamiento estemos
dispuestos a dedicarle. Idealmente, de todas maneras, se puede ahorrar mucho espacio y
(casi) no percibir la diferencia con el original.
18
Podemos preguntarles a los estudiantes si se les ocurre alguna manera de comprimir sonido sin
pérdida. Para esto, recordamos que lo que tenemos que comprimir es una secuencia de números y
tratamos de relacionarlo con el método RLE que vieron para comprimir imágenes. Podemos pensar,
por ejemplo, cómo se representará un segundo de silencio: probablemente sean 44100 muestras de
valor 0.
Ficha para el estudiante
Mirá atentamente las siguientes dos ondas de sonido.
Onda 1 Onda 2
¿A cuál de las dos ondas anteriores corresponde cada una de estas versiones
discretizadas? Si tenés problemas para identificar alguna de ellas, explicá brevemente por
qué.
a) [ 3, 1.5, −1.5, −3, −1.5, 1.5, 3, 1.5, −1.5, −3, −1.5, 1.5, 3 ]
Objetivos
● Conocer la representación en Python de archivos de sonido.
● Trabajar en Python con archivos de sonido.
● Aplicar transformaciones sencillas sobre archivos de sonido.
● Afianzar el concepto de tasa de muestreo.
Modalidad de trabajo
En parejas
Desarrollo
Primera Parte:
Con esta actividad, damos comienzo a la parte proyectual del capítulo. A partir de aquí, los
estudiantes comenzarán a programar un sintetizador de sonido. Para esto, primero deberán
extender los conceptos trabajados anteriormente sobre el sonido y su representación a las
herramientas de programación que utilizarán en el resto del proyecto. A esto dedicaremos la
primera parte de la actividad, en la que los grupos trabajarán con la consola para explorar el
formato .wav. Luego, les propondremos que programen algunas transformaciones sencillas,
para observar los efectos de alterar la frecuencia o la tasa de muestreo.
>>> help(ab)
Help on module audioBasico:
NAME
audioBasico
FILE
/home/jdabbah/PycharmProjects/cap4/audioBasico.py
FUNCTIONS
abrirArchivoWav(nombreDelArchivo)
agregarAlFinal(secuencia, elemento)
crearSecuenciaVacia()
graficar(muestras)
guardarComoWav(lista_de_intensidades, frecuencia_de_muestreo,
nombre_del_archivo)
Vemos que muestra el nombre del módulo (recordemos que en Python se dice módulo
para referirse a las bibliotecas), el archivo donde está implementado y, lo más
importante, las funciones que tiene definidas. Si observamos los nombres, vemos que
tenemos funciones para abrir y guardar archivos wav, para graficar y para manipular
secuencias (crear una secuencia vacía, agregar al final de una secuencia o tomar un
fragmento). No esperamos que sea claro para qué vamos a utilizar todo esto en este
momento, pero es importante que los grupos sepan que cuentan con estas
herramientas para comenzar la exploración. También es un buen momento para dejar
en claro que wav es un formato de archivos que contienen información de audio. No
entraremos en más detalles, pero podemos comentar que es probable que nunca lo
hayan visto (y, en cambio, sí se hayan encontrado con archivos con formato mp3)
debido a que como este formato no tiene compresión y, por ende, los archivos que lo
utilizan ocupan mucho espacio, solo se utiliza en contextos con muchas exigencias de
calidad. Sí podemos comentar que, internamente, el formato wav no es muy distinto de
una secuencia de muestras.
Antes de continuar con la próxima instrucción del archivo Python, preguntamos a los
grupos qué se imaginan que sucederá.
datosDelEjemplo = ab.abrirArchivoWav('ejemplo_corto_mono.wav')
Mono y Estéreo
Muchos de los archivos de audio que utilizamos son estéreo, esto quiere decir que en
realidad contienen dos pistas o canales de sonido: una para el parlante (o auricular)
izquierdo y otra para el derecho. Si cargamos estos archivos con nuestras funciones,
observaremos algo similar a lo siguiente:
(44100, array([[ -47, -32], [-211, -181], [-311, -111], ..., [ 581,
431], [1183, 1253], [1869, 1779]], dtype=int16))
En este caso, vemos que la secuencia de muestras, en vez de estar compuesta por
números, está compuesta por otras secuencias de dos números cada una, ya que el
primer número corresponde a una muestra de un canal y el segundo a una del otro.
Para evitar esta complicación, en este proyecto trabajaremos con archivos mono. De
todas maneras, las soluciones que proveemos funcionan con ambos tipos de archivo.
● Estos datos están compuestos por dos elementos bien diferentes: por un lado, un
número (44100) y por otro, un array. No nos detenemos a explicar qué significa esto
último, pero observamos que se ve muy similar a una secuencia19. En este caso,
podemos agregar que, en Python, cuando tenemos datos compuestos, accedemos a
cada uno de sus componentes como si fueran los elementos de una secuencia:
datosDelEjemplo[0] hace referencia al primer valor (es decir 44100) y
datosDelEjemplo[1] al s egundo (el array).
● Nos preguntamos qué significará el número 44100, dado que estamos hablando de
representación de sonido. Si hiciera falta, recordamos que lo mencionamos en la
actividad anterior, para observar que debe ser la tasa de muestreo pues se
corresponde con un estándar muy utilizado (el de grabación de CD).
● Finalmente, observamos que el resto de la información está presentado como si
fuera una secuencia de números. Otra vez, recordamos de la actividad anterior que
una manera de representar un sonido es como una secuencia de muestras. Luego,
es de esperar que este array contenga estos valores. De hecho, podemos agregar
que podemos operar con él de la misma manera que operábamos con las
secuencias.
Pedimos, entonces, que los grupos agreguen a sus archivos las definiciones de las
siguientes funciones:
muestrasDelEjemplo = obtenerMuestras(datosDelEjemplo)
ab.graficar(muestrasDelEjemplo)
19
En esencia, es una secuencia, pero, internamente, está construida de manera diferente que las
listas de Python. Por eso, además, aclara dtype=int16 que indica que está preparada para contener
únicamente números enteros de 16 bits. Estas diferencias se deben a motivos de rendimiento.
Observamos que los gráficos de las muestras son similares a los que observamos en las
primeras actividades, cuando investigábamos la representación del sonido. Esta
herramienta de visualización, al hacer clic sobre la lupa permite trazar un rectángulo y
visualizar los datos únicamente de esa región (lo que, en general, llamamos hacer zoom) .
Sin embargo, si esto no fuera posible por limitaciones técnicas, podemos ejecutar el
siguiente código para tomar, por ejemplo, solo las primeras 500 muestras.
muestrasDelEjemplo =
obtenerMuestras(datosDelEjemplo)
primerasMuestras =
ab.fragmento(muestrasDelEjemplo, 0, 500)
ab.graficar(primerasMuestras)
Segunda parte:
En esta segunda parte, trabajaremos manipulando la secuencia de muestras y la tasa de
muestreo. Esta parte está orientada mediante preguntas / consignas del tipo “¿Qué
sucederá sí…?”, para las que los grupos deberán confeccionar programas que
efectivamente realicen lo que se especula en la pregunta y luego los apliquen sobre
archivos de audio para observar sus efectos.
Primera pregunta: ¿Qué pasa si duplicamos cada una de las muestras y dejamos la
misma tasa de muestreo?
En este momento, planteamos la pregunta, damos a los grupos unos minutos para que
piensen y escuchamos sus hipótesis. Es fundamental que no digamos si son acertadas o
no, dado que deberán hacer un un programa para averiguarlo. Les decimos, entonces, que
comiencen con esta tarea.
Damos un tiempo para que los grupos piensen la estrategia y qué funciones de la
biblioteca o que ya hayan definido podrían usar para resolver cada paso. Además,
pueden suponer que cuentan con la función duplicarElementos(secuencia) que,
dada una secuencia, produce otra con los elementos duplicados. Por ejemplo,
duplicarElementos([1, 2, 3]) debe producir la secuencia [1, 1, 2, 2, 3, 3]. A
continuación presentamos una estrategia posible:
Ahora sí, dado que todas las funciones que necesitan ya están resueltas excepto
duplicarElementos, les indicamos que la implementen. En este momento, podemos
recordar que teníamos las funciones ab.crearSecuenciaVacia() y
ab.agregarAlFinal(secuencia, elemento) para crear secuencias y agregarle
elementos. Dejamos que los grupos trabajen solos, mientras observamos sus avances y
estamos atentos a sus necesidades.
La estrategia para esta función es crear una lista nueva (y, por lo tanto, vacía) e ir
construyéndola a partir de la anterior. Esperamos que esto sea claro al observar la
implementación incompleta que proveemos, pero de no serlo, debemos dejarlo claro con los
grupos. Para construir la lista con los duplicados, deberán observar que necesitan un
recorrido for sobre la secuencia original para ir accediendo una a una a las muestras.
Luego, lo que hay que hacer para cada muestra, si queremos obtener una secuencia en la
que todos los elementos aparezcan dos veces, es agregarla dos veces al resultado. Para
esto, podemos usar dos veces la función ab.agregarAlFinal, como vemos en la solución
que aparece a continuación:
def duplicarElementos(secuencia):
#Creamos una secuencia vacía para construir el resultado
nuevaSecuencia = ab.crearSecuenciaVacia()
A la izquierda, vemos la consola luego de seleccionar las definiciones en el código y ejecutarlas. A partir de
este momento, y si no se produjeron errores, contamos con las funciones definidas para utilizar en el
intérprete. En la segunda columna, observamos una posible prueba: primero creamos la variable
secuenciaDePrueba, donde almacenamos una secuencia de números muy simple, y luego le aplicamos la
función duplicarElementos, cuyo resultado se imprime en la línea de abajo. En este caso, vemos que
funciona correctamente.
Con esta función definida ya podemos implementar la estrategia que habíamos especificado
antes de comenzar a programar. De esta manera, tendremos un programa que procese un
archivo de audio duplicando sus muestras y podremos observar qué efecto produce y si se
condice con las hipótesis planteadas al comienzo.
datosDelEjemplo = ab.abrirArchivoWav('ejemplo_corto_mono.wav')
tasaDeMuestreoDelEjemplo = obtenerTasaDeMuestreo(datosDelEjemplo)
muestrasDelEjemplo = obtenerMuestras(datosDelEjemplo)
muestrasDuplicadas = duplicarElementos(muestrasDelEjemplo)
ab.guardarComoWav(muestrasDuplicadas, tasaDeMuestreoDelEjemplo,
'ejemplo_duplicadas.wav')
A medida que vayan consiguiendo el nuevo archivo, les indicamos a los grupos que lo
escuchen (si es posible, con auriculares, para no adelantarle el resultado a los otros
grupos), que observen la diferencia con el original, verifiquen si la hipótesis que habían
planteado al comienzo era correcta o no y que propongan una explicación. Cuando todos
estén listos, hacemos una puesta en común.
En este caso, observaremos que el nuevo archivo es más grave y más largo. Esto último es,
tal vez, lo más evidente: conservamos la tasa de muestreo (es decir, la cantidad de
muestras que se deben reproducir por segundo) pero descartamos la mitad de las muestras
(es decir, contamos con la mitad del material para reproducir), por lo tanto, la reproducción
durará el doble. Para poner esto en evidencia, si hiciera falta, podemos preguntar cómo
será la longitud de la nueva secuencia de muestras comparada con la longitud de la
secuencia de muestras original.
Para explicar el cambio de tono, deberán recordar que éste estaba determinado por la
frecuencia, y que, entonces, debe haber bajado la frecuencia del sonido. Damos unos
minutos para que lo piensen y podemos sugerirles que se ayuden por un esquema, en el
que se muestrea una onda simple cualquiera.
Observamos que, al duplicarse las muestras, las ondas “se estiran” pues todos los
puntos aparecen duplicados. Si recordamos que las ondas “más anchas” eran las de
menor frecuencia, podemos ver que, al hacer esta modificación, se reduce la
frecuencia. De hecho, en el esquema vemos que la onda a disminuido su frecuencia a
la mitad: en el mismo tiempo en que el sonido original completaba dos ciclos, el sonido
modificado completa uno solo.
Segunda pregunta: ¿Qué pasa si descartamos una de cada dos muestras y dejamos la
misma frecuencia de muestreo?
Al igual que antes, escuchamos hipótesis pero no decimos nada. Simplemente les
proponemos a los grupos que escriban un programa que tome un sonido y genere un
archivo nuevo descartando las muestras.
Como pista, les podemos indicar que observen el esquema de la función que definieron
en la pregunta anterior (crear una secuencia vacía e ir construyendo en ella el resultado,
a partir de recorrer la lista), para que identifiquen que la dificultad que aparece en este
caso es que no hay que hacer lo mismo con todos los elementos de la secuencia
original. Ésta debería ser la motivación para que incluyan una alternativa condicional
dentro del recorrido para hacer una u otra cosa (agregar o no agregar el elemento).
Para responder la pregunta “¿Cómo sabemos si tenemos que agregar el elemento que
estamos mirando?” podemos sugerirles que observen que existe una función esPar y
que queremos descartar las posiciones impares. A continuación vemos dos soluciones
posibles. La segunda no utiliza la función esPar, pero puede motivarse a partir de
pensar que, en el momento en que se agrega un elemento, ya se sabe que no debe
agregarse el próximo y, por lo tanto, podemos guardar esa información en una variable
booleana.
Dos soluciones distintas para la función pedida. En ambas comenzamos creando una secuencia vacía y
utilizamos un recorrido sobre los elementos de la secuencia original para ir agregándolos a la nueva. Sin
embargo, la nueva dificultad es que no siempre debemos agregar los elementos, solo uno de cada dos. Para
eso, el primer enfoque define la variable posicion que representa la posición en la secuencia del elemento que
se está considerando en cada ejecución del cuerpo del recorrido (por eso comienza en 0 y en cada paso se
incrementa en uno), y, mediante una alternativa condicional, si la posición es par, lo agrega y si no, no. La
segunda, utiliza una variable booleana que indica si hay que agregar el próximo elemento. Luego, al ejecutarse
el cuerpo del recorrido, si esta variable es verdadera, agrega el elemento (y establece su valor a falso, pues no
hay que agregar el próximo elemento pues se acaba de agregar uno). Si esto no sucede, no se agrega el
elemento pero se cambia el valor de la variable a verdadero, pues si este elemento no fue agregado, deberá
agregarse el próximo.
De manera muy similar a cómo lo hicimos anteriormente, podemos utilizar las funciones
provistas para abrir un archivo, extraer las muestras, descartar las posiciones impares y
generar un nuevo archivo con ellas, como vemos a continuación.
datosDelEjemplo = ab.abrirArchivoWav('ejemplo_corto_mono.wav')
tasaDeMuestreoDelEjemplo = obtenerTasaDeMuestreo(datosDelEjemplo)
muestrasDelEjemplo = obtenerMuestras(datosDelEjemplo)
unaDeCadaDosMuestras = descartarPosicionesImpares(muestrasDelEjemplo)
ab.guardarComoWav(unaDeCadaDosMuestras, tasaDeMuestreoDelEjemplo,
'ejemplo_unadedos.wav')
El esquema general es idéntico a la pregunt anterior. Observamos que la única diferencia es la función
descartarPosicionesImpares en vez de duplicarElementos.
IDE TIP:
A medida que ejecutamos líneas de código en la consola (ya sea seleccionándolas
individualmente y ejecutándolas o ejecutando un archivo completo) que definen
variables, vemos que éstas aparecen en un recuadro especial a la derecha de la consola.
Al igual que antes, les indicamos a los grupos que escuchen el archivo que obtuvieron,
observen las diferencias con el original, contrasten estas diferencias observadas con sus
hipótesis y propongan una explicación. No nos interesa que consigan una respuesta
cerrada, sino que puedan identificar qué conceptos vistos en este capítulo pueden ser útiles
para explicarlos. De todas maneras, es muy probable que debamos orientarlos con
preguntas o sugerencias.
La diferencia observable es que el sonido es más agudo y más corto. El argumento para
explicar la reducción en la duración es el mismo que para la pregunta anterior, pero al
revés: descartar muestras reduce la cantidad de puntos para reproducir y acabamos de
deshacernos de la mitad de las muestras que traía el archivo.
Para explicar el cambio de tono, al igual que antes, deberían comenzar por identificar que lo
que cambió del sonido fue su frecuencia. Damos unos minutos para que piensen una
explicación, sobre todo, teniendo en cuenta lo que dijimos para la modificación anterior. No
nos interesa ir a fondo en la explicación, pero basándonos en lo que ya vimos, podemos
convencernos de que, si duplicar las muestras “ensanchaba” la onda, descartar la mitad de
las muestras debería “juntarla”, lo que significa un aumento de la frecuencia.
Tercera consigna: ¿Qué sucede si, sin modificar las muestras, duplicamos la tasa de
muestreo? ¿Y si la reducimos a la mitad?
Al igual que antes, dejamos que los grupos hagan sus especulaciones y las fundamenten, y
dejamos la pregunta abierta, al mismo tiempo que les indicamos que hagan programas para
experimentar con las dos situaciones.
En este caso, dado que no hay que modificar la secuencia de muestras, sino simplemente
el valor de la tasa de muestreo, esperamos que los grupos puedan resolverlo más
rápidamente. Como siempre, cuando vayan terminando, les pedimos que escuchen y
corroboren o corrijan lo planteado antes de comenzar.
#Ya tenemos definidas todas las variables con los datos que
necesitamos.
tasaDeMuestreoDoble = 2*tasaDeMuestreoDelEjemplo
ab.guardarComoWav(muestrasDelEjemplo, tasaDeMuestreoDoble,
'ejemplo_tasadoble.wav')
tasaDeMuestreoMitad = tasaDeMuestreoDelEjemplo / 2
ab.guardarComoWav(muestrasDelEjemplo, tasaDeMuestreoMitad,
'ejemplo_tasamitad.wav')
Hacemos una puesta en común y observamos que produjimos un efecto similar al de las
funciones de las consignas anteriores:
Les preguntamos a los grupos qué creen que sucederá. Si hiciera falta, les recordamos que
ya experimentamos con cada uno de esos factores por separado, para que observen que
estas dos alteraciones tienen efectos contrarios. Luego, ¿no sucederá nada, ya que los
efectos de una serán compensados por la otra? Damos tiempo para que experimenten,
sugiriéndoles enfáticamente que reutilicen las funciones definidas y las variables ya
cargadas en la consola.
ab.guardarComoWav(unaDeCadaDosMuestras, tasaDeMuestreoMitad,
'ejemplo_unadedosmitad.wav')
Nos interesa señalar en el debate que esto representaría una ventaja enorme, pues
podríamos almacenar audio en formato digital utilizando mucha menos espacio de
almacenamiento (pues, recordemos, para almacenar cada muestra necesitamos espacio de
almacenamiento para un número), pero que, sin embargo, vimos que los estándares que
conocemos (como el CD), no lo hacen. A partir de esta observación, entonces, enlazamos
con lo visto en las primeras actividades del capítulo, en las que señalamos que utilizar tasas
de muestreo inadecuadas puede producir una representación errónea. Luego, el desafío
consistirá en repetir esta transformación hasta que la diferencia con el original sea
perceptible.
La cantidad de veces que haya que reducir la tasa de muestreo para notar una diferencia
dependerá del archivo original tomado como ejemplo, de la calidad de los instrumentos de
reproducción utilizados y de la agudeza de la percepción de los estudiantes, pero al
reducirlo a la cuarta u octava parte ya debería ser evidente.
unaDeCadaCuatroMuestras =
descartarPosicionesImpares(unaDeCadaDosMuestras)
tasaDeMuestreoCuarto = tasaDeMuestreoMitad / 2
ab.guardarComoWav(unaDeCadaCuatroMuestras, tasaDeMuestreoCuarto,
'ejemplo_bajarmuestreo4.wav')
unaDeCadaOchoMuestras =
descartarPosicionesImpares(unaDeCadaCuatroMuestras)
tasaDeMuestreoOctavo = tasaDeMuestreoCuarto / 2
ab.guardarComoWav(unaDeCadaOchoMuestras, tasaDeMuestreoOctavo,
'ejemplo_bajarmuestreo8.wav')
Ahora sí, observamos que en cada transformación obtenemos un sonido que podemos
identificar como el mismo, pero que se oye diferente. Podemos decirles a los grupos que
escuchen atentamente el audio degradado y que observen que los sonidos agudos del
original ya no se escuchan. Si consiguen observar esto, les decimos que pueden explicar lo
que ha sucedido retomando lo visto cuando expusimos los valores adecuados para la tasa
de muestreo. En ese momento mencionamos el teorema de Nyquist, que establecía que la
tasa de muestreo debía ser, por lo menos, dos veces la frecuencia más aguda que
quisiéramos representar. Luego, al bajar la tasa de muestreo, estamos perdiendo la
capacidad de representar sonidos agudos, que fue lo que observamos con nuestro
programa.
Cierre
A modo de conclusión, podemos pasar en limpio la manera en la que representaremos el
audio en nuestros programas y cómo debemos trabajar con él. Nuestros sonidos consisten,
básicamente, en una secuencia de muestras y una tasa de muestreo. Vimos cómo podemos
traba
Actividad 3 | SD1
Generamos sonidos
Objetivos
● Generar archivos de sonidos en Python.
● Conocer el concepto y la utilidad de los casos de test.
Modalidad de trabajo
En parejas
Desarrollo
Al comienzo del capítulo trabajamos sobre los fundamentos de la representación digital del
sonido y en la actividad anterior los pusimos en práctica, observando una representación
posible en Python. Más aún, hicimos programas que modificaban estos sonidos trabajando
sobre su representación interna y observamos sus efectos. En esta actividad,
comenzaremos a generar o sintetizar sonidos, es decir, a producir archivos de sonido sin
ningún archivo de entrada, simplemente escribiendo programas para que generen las
muestras que luego se codificarán dentro del archivo wav.
Comenzamos la actividad contando que, por primera vez, trabajaremos generando sonidos
y no modificando alguno ya existente. Les decimos a los grupos que el plan para esto es
escribir programas que generen secuencias de muestras para luego escribir archivos wav
que se puedan reproducir en la computadora, al igual que hicieron en la actividad anterior.
Dado que hasta ahora nunca escribieron programas que generen secuencias sin otra como
referencia, a modo de ejercicio preliminar, podemos proponer que completen la función
generarRepetidos(elemento, repeticiones), que recibe un elemento y produce la
secuencia que consiste en este elemento repetido tantas veces como se le indica en el
segundo parámetro. Por ejemplo, generarRepetidos(1, 4) debe producir la secuencia
[1, 1, 1, 1]. La solución consiste en crear una secuencia vacía y, utilizando una
repetición simple, agregar el elemento todas las veces que sean necesarias, como vemos a
continuación:
Para continuar, les contamos a los grupos que, antes de empezar a programar, deberán
completar lo que en el desarrollo de software se conoce como casos de test, es decir,
ejemplos de resultados correctos que deberían obtenerse con las funciones pedidas. Luego,
al comparar estos ejemplos con los resultados obtenidos por los programas que
efectivamente se escribieron, podemos observar si funcionan correctamente o producen
resultados incorrectos.
Aún si los tests no detectan errores, por muchos que sean, no podemos asegurar
que el programa sea correcto; para eso, deberíamos probarlo sobre los infinitos
valores posibles de todos sus parámetros, lo que evidentemente es irrealizable. De
hecho, existe un resultado teórico de las Ciencias de la Computación que dice que no
puede existir un programa capaz de decidir si otro está libre de errores.
Enfatizamos que es una buena práctica elegir y diseñar los casos de test antes de
comenzar a programar, para pensar únicamente en cómo debe comportarse el programa
(sin pensar en cómo está implementado) y, además, para explorar y comprender mejor el
problema antes de avanzar a la etapa de programación.
Para guiarlos en la elaboración de los tests proveemos uno completo a modo de ejemplo,
otro a medio completar, para hacer foco en algunos aspectos importantes del problema
(cuánto dura un ciclo y cuántas muestras hay que generar en consecuencia) y otro en
blanco para que ejerciten la tarea por completo. Observamos que no hace falta que estén
planteados sobre valores reales (veremos que utilizaremos frecuencias inaudibles y tasas
de muestreo demasiado bajas para un archivo de audio concreto); al contrario, elegiremos
valores para los cuales pueda ser fácil conocer el resultado esperado “a mano” sin tener
que utilizar el programa. En este mismo sentido, elegimos 1 como valor arbitrario para la
amplitud, solo por simplicidad.
Es importante que aclaremos en este momento que generaremos lo que se conoce como
ondas cuadradas, como la que se ve a continuación:
Onda cuadrada de amplitud a: los únicos valores que toman las muestras son a y -a.
Este tipo de ondas están representadas por muestras de únicamente dos valores: las
muestras de la parte alta (que adoptan un valor positivo) y las muestras de la parte baja
(que adoptan el mismo valor que las altas, pero negativo). Si bien esta forma les otorga un
sonido muy particular (y tal vez no del todo agradable), es un punto de partida para facilitar
el desarrollo de esta actividad con el que luego podrán experimentar los grupos a los que
les interese.
A continuación, vemos los casos de test para la función generarSonido, que recibe como
parámetros la frecuencia, la amplitud, la duración y la tasa de muestreo y produce un sonido
con estas características.
generarSonido
generarSonido
generarSonido
20
Utilizamos el punto (en vez de la coma) para separar la parte decimal de la parte entera pues así
es como lo hace Python, dado que es lo usual en inglés. Como ya vimos, la coma se utiliza para
separar valores, por ejemplo, dentro de una secuencia.
def generarSonido(frecuencia, amplitud, duracion, tasaDeMuestreo):
# generamos un ciclo
nCiclo = generarCiclo(frecuencia, amplitud, tasaDeMuestreo)
u
sonido = ab.crearSecuenciaVacia()
# ...
#COMPLETAR
# ...
eturn sonido
r
Vemos que la estrategia para generarSonido implica, primero, generar un ciclo (con la
función generarCiclo) y luego, construir una secuencia con el sonido completo.
antidadDeMuestrasDelCiclo(frecuencia, tasaDeMuestreo):
def c
duracionDelCiclo = duracionDeUnCiclo(frecuencia)
#CAMBIAR
uestras = 0
m
def duracionDeUnCiclo(frecuencia):
#Atención que este número tiene que poder tener decimales.
d uracion = 0.0
return duracion
Sugeriemos que comiencen por estas funciones, que son clave en la estrategia elegida para
resolver generarCiclo. Para completarlas, deberán proponer e implementar una solución
general para la deducción de los datos que tuvieron que completar en los casos de test. Si
no lo notaran, se lo podemos señalar para que recuerden cómo hicieron para encontrar los
valores pedidos en los ejemplos del principio de la actividad y que piensen, a partir de ahí,
cómo escribir un programa para obtenerlos para cualesquiera otros valores. Básicamente,
deben responderse las siguientes preguntas:
Esto dependerá de la tasa de muestreo elegida y de la duración del ciclo. Suponiendo que
las conocemos, dado que la tasa de muestreo determina la cantidad de muestras por
unidad de tiempo, para conocer cuántas muestras son necesarias para cubrir una cierta
duración, simplemente hay que multiplicar estos valores.
Para esto, deberán recordar lo visto en la actividad a propósito de la naturaleza del sonido.
Si la frecuencia indica cuántas veces por segundo se repite un ciclo, la duración del ciclo
será la fracción indicada por este valor. Por ejemplo, si una onda tiene frecuencia 500Hz (es
decir, se repiten 500 ciclos en un segundo), cada ciclo debe durar 1/500 = 0.02 segundos. A
este valor se lo conoce como período de la onda.
En este punto debemos estar atentos a cómo los grupos escriben esta expresión en Python.
Si escriben duracion = 1/frecuencia, observarán que el valor que se le asigna a
duracion es 0. Esto es así porque, al ser enteros los dos números involucrados en la
división, Python interpreta que se está calculando la división entera y el resultado debe ser
entero. Entonces, en el caso del ejemplo, estaríamos calculando la división entera de 1 por
500, cuyo resultado es 0 con resto 1. Para evitar esto, hay que forzar a que alguno de los
números involucrados tenga decimales, es decir, sea un float. Esto se puede conseguir
convirtiéndolo explícitamente (por ejemplo, float(1)), o escribiéndolo con decimales
aunque no haga falta (1.0 en vez de 1). Observemos que hacer float(1/500) no tiene el
efecto deseado, pues primero se calcula la división (entera) y luego se convierte el resultado
(que fue 0) a float.
def duracionDeUnCiclo(frecuencia):
return 1.0/frecuencia
Con estas dos funciones resueltas, ya pueden escribir una solución para generarCiclo sin
mayores dificultades: si ya sabemos cuántas muestras tiene el ciclo que queremos generar,
tendrá la mitad de esa cantidad de muestras altas al principio y luego, otra mitad de
muestras bajas. A continuación vemos una solución posible:
ciclo = ab.crearSecuenciaVacia()
mitadDeLasMuestras = cantidadDeMuestras / 2
or i i
f n range(
0
, mitadDeLasMuestras):
ab.agregarAlFinal(ciclo, amplitud)
or i i
f n range(
0
, mitadDeLasMuestras):
ab.agregarAlFinal(ciclo, -amplitud)
return ciclo
Esta solución, si bien creemos que es muy clara y por eso la presentamos, tiene un
pequeño problema, que se vuelve imperceptible cuando se trabaja con valores de
muestreo elevados con respecto a la frecuencia (como los que se utilizan en los sonidos
estándar). Si la cantidad de muestras por ciclo es un valor impar, cuando se calcula la
mitad en m itadDeLasMuestras = cantidadDeMuestras / 2, el resultado se redondea hacia
abajo, lo que produce que, al final de cuentas, el ciclo cuente con una muestra menos que
la que debería tener.
Por ejemplo, si la cantidad de muestras por ciclo (según lo calculado en la primera línea)
es 5, mitadDeLasMuestras valdrá 2 y por lo tanto, el ciclo producido consistirá en dos
muestras altas y dos muestras bajas, es decir, cuatro muestras en total. Esto produce que
el ciclo dure menos y, por lo tanto, la frecuencia sea mayor que la pedida.
Si queremos ser precisos, podemos corregirlo utilizando una alternativa condicional y la
función esPar que presentamos en la actividad anterior o utilizando directamente el
operador % (que calcula el resto de la división entera), como vemos a continuación:
En el primer caso, si la cantidad de muestras que hay que generar no es par (o sea, es
impar) agregamos una muestra baja más al final del ciclo, mientras que en el segundo,
calculamos cuántas muestras bajas agregar como la mitad de las muestras (que en
realidad es la división entera) más el resto de dividir por 2 (que será 1 si el número
original era impar).
Es importante tener esto en cuenta, no para el proyecto final, pues la diferencia puede ser
muy fina, pero sí para los casos de test, en los que hacemos énfasis en la cantidad de
muestras por ciclo. También podemos desentendernos del problema si elegimos valores
de prueba que requieran una cantidad par de muestras por ciclo.
Al igual que con las actividades anteriores, insistimos para que los grupos vayan probando
sus funciones a medida que van avanzando. Si bien todavía no pueden obtener sonidos
completos, pueden utilizar la función ab.graficar (que ya la conocen) y, además, importar
el archivo audioGraficos y experimentar con las funciones disponibles. En particular,
contiene audioGraficos.graficarCiclo que además dibuja las muestras y agrega
información de tiempo para observar los ciclos obtenidos. Dado que no escucharemos los
sonidos, no nos preocuparemos por el valor de la amplitud, por lo que utilizaremos siempre
el valor 1 como ejemplo.
duración del ciclo = cantidad de muestras duración del ciclo = cantidad de muestras
1/10 s = 0.01 s = 10 1/500 s = 0.002 s = 20
Los dos casos de tests y las dos funciones que ejecutan generarCiclo con los valores correspondientes.
Una vez completadas estas funciones, podemos continuar con generarSonido. Para esto,
observamos que la estrategia elegida comienza generando un ciclo utilizando
generarCiclo y luego crea una secuencia vacía para construir el resultado.
sonido = ab.crearSecuenciaVacia()
# ...
#COMPLETAR
# ...
return sonido
En este punto, los grupos deben darse cuenta que para generar un sonido de una duración
razonable, deberán repetir muchas veces el mismo ciclo. Para conocer cuántos ciclos
deben repetirse para completar el sonido y cómo pueden obtener esta respuesta, les
recordamos los casos de test completados al principio, donde tuvieron que completar este
dato. Para expresar la regla general, pueden seguir alguno de los siguientes razonamientos:
Una nueva dificultad que encontrarán, que ahora ya no tiene que ver con el sonido en sí,
sino meramente con la manipulación de secuencias en Python, tiene que ver con cómo unir
varias secuencias (es decir, cómo resolver el problema de generar una secuencia que
consista en sucesivas repeticiones de una secuencia original). Sugerimos definir una
función auxiliar para dejar en clara la división en subtareas (y poder reutilizarla más
adelante si es necesario)
Una solución simple consiste en agregar sucesivamente los elementos de la secuencia a
unir al final de la secuencia original, como vemos a continuación:
Al igual que antes, recorremos uno por uno los elementos de la secuencia a agregar y lo
agregamos al final de la secuencia original. Además, devolvemos la secuencia base,
aunque podríamos omitir este paso, pues agregarAlFinal lo agrega modificando la misma
secuencia que recibió por parámetro. Para motivar esta solución, podemos recordarles que
ya saben cómo hacer crecer una secuencia, con el fin de que reutilicen la función
agregarAlFinal. Comentamos que a la operación de unir dos secuencias se la conoce
como concatenar.
Existe una solución más breve, que en esencia es equivalente a la anterior, pero utiliza
directamente el operador + que, al aplicarse sobre secuencias, produce la unión de
ambas. Es decir [1, 2, 3] + [4, 5, 6] produce [1, 2, 3, 4, 5, 6]. Esta
solución es más difícil de motivar, pero si algún grupo ya la conoce es muy probable que
quiera utilizar este operador para resolver el problema o, incluso, considere innecesario
definir una función que únicamente aplique +.
A tener en cuenta:
Hasta ahora no hicimos diferencias (ni nos interesa hacerlas) pero estuvimos trabajando
con dos tipos diistintos de secuencias. Por un lado, utilizamos las listas de Python, que
son las que generamos explícitamente cuando escribimos los corchetes o las que
producimos con la función crearSecuenciaVacia. Por otro, la biblioteca numérica que
utilizamos internamente tanto para levantar sonidos como para graficar (numpy), utiliza su
propio tipo de secuencias por motivos de rendimiento (el array que descubrimos en la
actividad anterior). Si bien suelen ser compatibles, no lo son para estas funciones:
Ahora sí, pueden escribir la parte restante de la función generarSonido que, como ya
identificaron luego del ejercicio en papel, consiste en generar una secuencia con una
determinada cantidad de repeticiones de la secuencia ciclo.
Junto con una repetición simple (acá vemos por qué queríamos que el valor de cantidadDeCiclos
fuera un número entero: para poder utilizarlo como la cantidad de repeticiones) y una concatenación,
construimos sonido como una secuencia que contiene repetidas veces la secuencia ciclo.
Presentamos las dos alternativas para la concatenación: en la primera agregamos los elementos al final
de la secuencia sonido, mientras que en la segunda producimos una nueva secuencia con + y la
asignamos a la variable sonido.
sonido = ab.crearSecuenciaVacia()
#Calculamos la cantidad de ciclos que hay que generar para cubrir la duración
#Generamos una secuencia que contenga las repeticiones necesarias del ciclo
return sonido
Otra solución:
Otra solución que puede surgir es utilizar la función generarRepetidos (que
programamos como ejercicio preliminar) para generar, justamente, la repetición de los
ciclos. Sin embargo, con esto no es suficiente, pues recordemos que esta función
producía una secuencia con el elemento modelo repetido. Luego, si el elemento es un
ciclo (que es una secuencia), el resultado será una secuencia de secuencias, en vez de
una secuencia con todas las muestras. Por ejemplo, generarRepetidos([1, -1], 3)
produce [[1, -1], [1, -1], [1, -1]] en vez de [1, -1, 1, -1, 1, -1].
Para eso, deberán prorgamar una función que, dada una secuencia de secuencias,
produzca una única secuencia con los elementos en el mismo orden. Es decir, que, a
partir de [[1, 2], [3, 4], [5, 6]] (es decir, la secuencia que contiene a las
secuencias [1, 2], [3, 4] y [5, 6]) produzca la secuencia [1, 2, 3, 4, 5, 6]. A
esta operación se la conoce como “aplanar” y, en algún punto, es similar a lo que hicieron
en el capítulo anterior al trabajar con imágenes, pues hay dos recorridos anidados: por un
lado, acceder, una por una, a las secuencias, y, una vez elegida una de éstas, acceder
uno por uno a sus elementos.
def aplanar(secuenciaDeSecuencias):
todosLosElementos = ab.crearSecuenciaVacia()
for secuencia in secuenciaDeSecuencias:
for elemento in secuencia:
ab.agregarAlFinal(todosLosElementos, elemento)
return todosLosElementos
De la misma manera que antes, sugerimos que, una vez que hayan completado la función y
sospechen que funciona correctamente, comparen los resultados obtenidos con ella contra
los casos de test que definieron al principio. Para esto, deberán generar sonidos con las
características planteadas en los tests y utilizar la función
audioGraficos.graficarSonido para comparar los gráficos de los resultados obtenidos
con los esperados. Si la comparación es satisfactoria, ya podemos generar archivos wav y
finalmente escuchar los sonidos que sintetizamos. Pueden escribir métodos análogos a
test_1_generarCiclo() para encapsular estas dos acciones y asegurar que
generarSonido se utiliza con los parámetros que especifica cada caso de test.
Una última consideración para generar archivos audibles: deberemos trabajar con los
valores de amplitud que establece el estándar wav. Recordamos que la amplitud determina
el volumen del sonido, y, por lo tanto, si utilizamos valores muy pequeños, el sonido no se
escuchará. También, el formato de representación impone límites que no se pueden
exceder. Para averiguar estos límites, les podemos sugerir que carguen en la consola sus
programas para calcular máximos y mínimos de secuencias y que los utilicen para calcular
el máximo y el mínimo de la secuencia de muestras de algún archivo de ejemplo.
Dependerá del archivo, pero es muy probable que se encuentren con valores alrededor de
32000 y -32000 respectivamente. Si no quisiéramos dedicar tiempo a esta parte,
simplemente podemos indicarles que estos son los límites y que pueden experimentar con
valores intermedios de amplitud, enfatizando que cuanto menores sean (en valor absoluto)
más débil se escuchará el sonido.
De hecho, podemos abstraer este proceso en una única función que tome como parámetros
la frecuencia, la duración y el nombre del archivo (y utilice un valor de amplitud y de
frecuencia de muestreo estándar, dado que como vimos, no solemos modificarlos) y que
genere directamente el archivo de sonido.
Definimos una función que contenga las operaciones necesarias para generar un sonido y
guardarlo como wav, cuyos únicos parámetros sean la frecuencia, la duración y el nombre
del archivo. La tasa de muestreo (que debe ser la misma en la generación de las
muestras que en el guardado del archivo, y por eso la guardamos en una variable) se
establece en 44100 para respetar el estándar de CD y la amplitud en 16000 para utilizar
un valor intermedio.
Consigna extra: C uando generamos los ciclos, utilizamos la mitad de muestras altas y la
otra mitad de muestras bajas. ¿Cómo se escuchará un sonido si hacemos esto de
manera diferente? (Por ejemplo, ponemos un tercio de muestras altas y el resto muestras
bajas, o todas bajas menos una alta.)
Con este esquema, para cada generador de ciclos distinto, deberíamos repetir la definición
de generarSonido, solo para cambiar una línea. Sin embargo, en Python también podemos
utilizar parámetros para funciones. De esta manera, el generador de ciclos puede ser un
dato maś de entrada, y la función se limita a utilizarla.
Antes de comenzar, definan los siguientes casos de test para la función generarSonido,
que será la encargada de producir el sonido según las características especificadas.
generarSonido
generarSonido
generarSonido
Cuando los tengan listos, pueden empezar a programar. En algún momento van a tener que
completar la función generarCiclo, que pueden probarla contra los ejemplos que aparecen a
continuación:
duración del ciclo = 1/10 cantidad de muestras = duración del ciclo = cantidad de muestras =
s = 0.01 s 10 1/500 s = 0.002 s 20
Cuando estén seguros de que su función generarSonido se comporta como esperamos,
pueden definir la función generarArchivoDeSonido(frecuencia, duracion,
nombreDeArchivo) para generar un sonido y guardarlo, en una misma instrucción. Así,
pueden generar archivos más rápido y probar cómo se escuchan.
Para esto, pueden probar, primero, generando un ciclo asimétrico (es decir, no poner
mitad de muestras bajas y mitad de altas, sino, por ejemplo, un tercio de bajas y dos
tercios de altas, o una alta y el resto bajas, etc.). Luego, en el archivo ciclos.py, hay
funciones para generar ciclos con otras formas. Pueden incorporarlos a sus
programas, escuchar los resultados y graficar sus formas.
Actividad 4 | SD1
Generamos melodías
Objetivos
● Proponer un sistema de representación de melodías y programar un intérprete para
el mismo.
● Utilizar las funciones definidas previamente para generar melodías.
Modalidad de trabajo
En parejas
Desarrollo
Hasta ahora, conseguimos generar sonidos puros utilizando programas en Python. Sin
embargo, estamos lejos de poder generar una canción. En este momento del proyecto
daremos un fuerte paso en esta dirección: escribiremos un programa que, valiéndos de las
funciones que escribimos anteriormente, pueda leer una melodía codificada en un texto y
producir un archivo de sonido con ella.
Proveemos el archivo Act3_min.py con las mínimas funciones requeridas para poder
completar esta actividad, para aquellos grupos que, por algún motivo u otro, no tengan
completa la actividad anterior o no la tengan disponible en el momento de la clase.
Comenzamos la actividad contando que utilizaremos los programas que construimos hasta
ahora para hacer un programa capaz de generar melodías. Mejor aún: nuestro programa
leerá un texto en el que esté codificada la melodía, la interpretará y, a partir de generar
sonidos puros con las funciones que ya tenemos, generará un sonido con la melodía
completa.
Lo primero que debemos preguntarles a los grupos es si conocen cómo se representa (se
“escribe”) la música. Es muy probable que en la clase de música conozcan las notas, las
figuras y los pentagramas. Básicamente, este sistema parte de un pentagrama (es decir,
cinco líneas paralelas) y asocia cada posición entre ellas con una nota en particular.
Además, para definir la duración del sonido, utiliza distintos símbolos (negras, corcheas,
semicorcheas, etc.), donde cada uno representa la mitad de la duración que el anterior.
Naturalmente, el sistema completo es mucho más complejo, pero nos alcanza con estos
elementos para lo que queremos hacer.
A continuación, observamos que si queremos que la codificación propuesta sea procesada
por nuestro programa, no puede ser gráficamente tan compleja. Por el contrario, deberá
estar limitada a texto. Veremos, sin embargo, que esta no es una limitación demasiado
grande.
Consigna final: Escribir un programa que, a partir de una secuencia de notas codificada
en un texto, prodzca el sonido compuesto por la sucesión de esas notas, todas de la
misma drarción. Es decir, si la melodía codificada es “do, re, mi, do, mi, do, mi”, en el
archivo de sonido resultante deben escucharse estas notas (la duración de cada nota
queda a definir por los grupos).
A partir de esta consigna, esperamos que los grupos identifiquen dos problemas para
resolver:
La codificación que representa cada nota con su inicial, no es adecuada. ¿Por qué?
Pista: ¿Cómo se codifica una escala, es decir: Do, Re, Mi, Fa, Sol, La, Sí?
(Respuesta: Porque no es unívocamente decodificable, pues sin información extra no
podemos saber si la S representa a Sol o a Sí. En el ejemplo propuesto, la codificación
resultante sería D R M F S L S, que puede decodificarse a la escala original, pero también
a Do, Re, Mi, Fa, Si, La, Sol, por ejemplo.)
m = “DO RE MI DO MI DO m = “1 2 3 1 3 1 3” m =
MI” “do-re-mi-do-mi-do-mi”
Tres codificaciones simples que pueden resolverse con la función partir. Observamos que en el
último caso, las notas, en vez de estar separadas por un espacio, están separadas por el carácter
-, por lo cual éste debe ser el segundo argumento de la función.
Una sugerencia para evitar errores innecesarios es que utilicen siempre mayúsculas o
siempre minúsculas. Dado que en Python “Do” es distinto de “do” y de “DO”, si la
codificación propuesta es “Do” y luego, a la hora de utilizarlo, se escribe “do” o “DO” en el
programa, éste no lo reconocerá y no se comportará como se espera, lo que muy
probablemente desoriente o desmotive a los grupos, ya que deberán dedicar tiempo a
detectar y corregir este error.
Una vez decidida la codificación, resta generar sonidos a partir de la secuencia de notas
producida a partir del texto. Hacemos énfasis en que ya tenemos resuelta una parte difícil,
que es la de efectivamente generar el sonido, en la función generarSonido que
completamos anteriormente.
Como siempre, antes de comenzar a programar nos concentramos en la estrategia. De la
misma manera que hicimos antes, les indicamos que piensen qué funciones usarían para
resolver cada paso, pero con la salvedad de que ahora también deberán identificar las
funciones que falten y ponerles un nombre apropiado; la única que sugerimos nosotros es
interpretarFrecuencia(nota) que, dado un código de nota, produce la frecuencia
correspondiente al sonido de esa nota.
Damos un tiempo para que cada grupo arme una estrategia y hacemos una puesta en
común. Una posible es la siguiente:
4. Devolver el resultado
Una estrategia posible y las funciones que utiliza, identificando las que deben definir
(naranja), las que proponemos para completar (verde) y las que se pueden reutilizar de
la actividad anterior (azules). Deben definir la función separarEnNotas en base a la
codificación decidida y completar la definición de interpretarSecuencia que
proponemos. Además, para poder utilizar las funciones de la actividad anterior,
importamos el archivo que las contiene bajo el nombre de a3, por eso lo anteponemos a
generarSonido y agregarSecuenciaAlFinal.
Para resolver el primer paso, simplemente deben programar en una función la separación
de los códigos en base al sistema de representación que propusieron al principio. Además,
deben completar la variable partitura con una melodía de prueba para ir probando sus
programas con un ejemplo sencillo.
Para averiguar qué frecuencia corresponde a cada símbolo, es decir, completar la función
interpretarFrecuencia, podemos preguntarles cómo lo harían si solo tuvieran dos
símbolos posibles, para que identifiquen que necesiten una alternativa condicional. Por
ejemplo, si los dos símbolos fueran “+” o “-”, esto podría resolverse con una construcción
similar a if simbolo == ‘+’: … else …. Sin embargo, ahora, como tenemos más
símbolos, si el símbolo en cuestión no es igual al primero, no sabemos qué debemos hacer.
Por el contrario, debemos seguir preguntando si es alguno de los seis restantes. Para esto,
recordamos la construcción if elif else, y aclaramos que se le pueden agregar más
ramas “elif”, como vemos a continuación.
ondición1:
if c ondición1:
if c ondición1:
if c
bloque1 bloque1 bloque1
elif condición2: else: else:
bloque2 if condición2: if condición2:
elif condición3: bloque2 bloque2
bloque3 else: elif condición3:
else: if condición3: bloque3
bloque4 bloque3 else:
else: bloque4
bloque4
#Utilizamos el esquema for in para acceder, una por una, a las notas de
la secuencia resultado
or nota in secuenciaDeNotas:
f
#Utilizamos la función interpretarFrecuencia para obtener el valor
de frecuencia necesario
frecuenciaDeLaNota = interpretarFrecuencia(nota)
#Generamos un sonido con esta frecuencia y valores preestablecidos
de amplitud, duración y muestreo.
#Obervamos que para referirnos a la función generar sonido debemos
anteponer a3., pues está definida en uno de los archivos importados
sonidoDeLaNota = a3.generarSonido(frecuenciaDeLaNota, 16000, 1,
44100)
#Utilizamos la misma función (y de la misma manera) que cuando
necesitamos unir los ciclos repetidos para generar un sonido de duración
mayor.
a3.agregarSecuenciaAlFinal(melodia, sonidoDeLaNota)
return melodia
Como siempre, motivamos que vayan probando el programa a medida que lo escriban.
Cuando terminen, ya tendrán funcionando una versión rudimentaria del sintetizador con la
que pueden experimentar. Al igual que con la actividad anterior, para escuchar el sonido
generado, deberán guardarlo en un archivo wav y luego reproducirlo:
def generarMelodiaConSilencios(partitura):
secuenciaDeNotas = separarEnNotas(partitura)
melodia = ab.crearSecuenciaVacia()
tasaDeMuestreo = 44100
a3.agregarSecuenciaAlFinal(melodia, sonidoDeLaNota)
return melodia
16
32
64
def generarMelodiaConDuracion(partitura):
secuenciaDeCodigos = separarEnNotas(partitura)
duracionDeUnTiempo = 1
tasaDeMuestreo = 44100
melodia = ab.crearSecuenciaVacia()
duracionEnSegundos = calcularDuracion(duracionDeLaNota,
duracionDeUnTiempo)
i f codigoDeLaNota == 'x':
sonidoDeLaNota = generarSilencio(duracionEnSegundos,
tasaDeMuestreo)
else:
frecuenciaDeLaNota = interpretarFrecuencia(codigoDeLaNota)
sonidoDeLaNota = a3.generarSonido(frecuenciaDeLaNota, 16000,
duracionEnSegundos, tasaDeMuestreo)
a3.agregarSecuenciaAlFinal(melodia, sonidoDeLaNota)
return melodia
Una solución que utiliza los números de la base de los compases (que, además,
permite experimentar con valores intermedios). Otra solución podría ser identificar
cada figura con una letra y utilizar un esquema if elif elif else como para
las notas. Observamos los agregados en la función principal en negrita.
def generarMelodiaConOctavas(partitura):
secuenciaDeCodigos = separarEnNotas(partitura)
duracionDeUnTiempo = 1
tasaDeMuestreo = 44100
melodia = ab.crearSecuenciaVacia()
#La codificación es, por ejemplo, "do^3*4" para identificar una negra
de do central.
or codigo in secuenciaDeCodigos:
f
#Utilizamos la funcion partir para separar la duración del nombre
de la nota y la octava
#Accedemos a la secuencia producida para extraer cada uno.
otaYDuracion = ab.partir(codigo, '*')
n
codigoNotaYOctava = notaYDuracion[0]
duracionDeLaNota = int(notaYDuracion[1])
duracionEnSegundos = calcularDuracion(duracionDeLaNota,
duracionDeUnTiempo)
a3.agregarSecuenciaAlFinal(melodia, sonidoDeLaNota)
return melodia
def generarMelodiaConSostenidos(partitura):
secuenciaDeCodigos = separarEnNotas(partitura)
duracionDeUnTiempo = 1
tasaDeMuestreo = 44100
melodia = ab.crearSecuenciaVacia()
#La codificación es, por ejemplo, "do#^3*4" para identificar una negra
de do sostenido central.
or codigo in secuenciaDeCodigos:
f
#Utilizamos la funcion partir para separar la duración del nombre
de la nota y la octava
#Accedemos a la secuencia producida para extraer cada uno.
otaYDuracion = ab.partir(codigo, '*')
n
codigoNotaYOctava = notaYDuracion[0]
duracionDeLaNota = int(notaYDuracion[1])
duracionEnSegundos = calcularDuracion(duracionDeLaNota,
duracionDeUnTiempo)
a3.agregarSecuenciaAlFinal(melodia, sonidoDeLaNota)
return melodia
def sacarUltimoCaracter(secuencia):
return secuencia[:-1]
Cierre
Cerraremos esta actividad y, por lo tanto, este capítulo, socializando las producciones de los
grupos. Les proponemos que busquen algunas melodías de fragmentos de canciones y las
traduzcan al sistema de representación que definieron para generarlas con el sintetizador.
De la misma manera, pueden explicarles este sistema a otros grupos para intercambiar
“partituras” y generar sonidos con los programas de sus compañeros.
Como reflexión final, y para cumplir la promesa que hicimos cuando comenzamos en el
capítulo anterior, observamos que, si bien el recorrido por Python fue arduo, valió la pena
trabajar con este lenguaje para poder hacer cosas mucho más poderosas que las que
podíamos hacer con Alice. De hecho, resaltamos que con lo que hicieron hasta ahora ya
están en buenas condiciones para continuar aprendiendo Python (o incluso, otros lenguajes
similares) y resolver una enorme variedad de problemas.
ANEXO III
REDES DE DATOS
E INTERNET
Una red de computadoras es un conjunto de
dispositivos interconectados con el objetivo de
compartir información, recursos y servicios. El
conjunto de computadoras, el software de red, los
medios y los dispositivos de interconexión forman un
sistema de comunicación donde existen emisores,
receptores y medios de transmisión.
Introducción
Una red de computadoras es un conjunto de dispositivos interconectados con el objetivo
de compartir información, recursos y servicios. El conjunto de computadoras, el software de
red, los medios y los dispositivos de interconexión, forman un sistema de comunicación
donde existen emisores, receptores y m
edios de transmisión.
En este anexo se trabaja principalmente en torno a los conceptos básicos de redes, a través
de actividades que permiten experimentar y comprender el funcionamiento de una red en
general y de Internet en particular. Asimismo se incluyen algunas actividades que permiten
reflexionar sobre los buscadores en Internet.
Índice
● Secuencia didáctica 1: Sistema de comunicación
○ Actividad: El teléfono descompuesto, recargado
● Secuencia didáctica 2: Protocolos de comunicación
○ Actividad: ¿Debemos ser políglotas?
○ Actividad: Nos comunicamos con emoticones
○ Actividad: Mensajes sin contexto
● Secuencia didáctica 3: Servicios en Internet
○ Actividad: Venta de boletos
○ Actividad: Servidor web humano
● Secuencia didáctica 4: Las tecnologías de acceso para redes hogareñas
○ Actividad: Dominó de redes
● Secuencia didáctica 5: Identificación de los recursos en Internet
○ Actividad: Enviando mensajes internos
○ Actividad: Enviando mensajes intergrupo
○ Actividad: Inspeccionando la identidad de los dispositivos
● Secuencia didáctica 6: Ruteo y transporte de datos en Internet
○ Actividad: Viajes y tiempos
○ Actividad: Paquetes y tabletas
● Secuencia didáctica 7: Detección de errores
○ Actividad: Verificando la integridad del mensaje
● Secuencia didáctica 8: Búsqueda de información en la Web
○ Actividad: ¿Por qué necesitamos un buscador?
○ Actividad: El orden de los resultados, ¿altera el producto?
● Modelo de evaluación
○ Actividad Integradora 1: Las redes hogareñas y su acceso a Internet
○ Actividad Integradora 2: Programando protocolos
● Glosario
Secuencia didáctica 1: Sistema de comunicación
Bajada
En un sistema de comunicaciones el dispositivo que envía el mensaje se conoce como
transmisor o emisor mientras que el dispositivo que lo recibe se conoce como receptor.
Para que el mensaje, que físicamente se convierte en una señal, pueda llegar desde el
emisor u origen al receptor o destino, es necesario contar con un medio de transmisión, el
cual puede ser un medio guiado como un cable o no guiado como el aire.
En esta secuencia didáctica se retoma la actividad de la secuencia didáctica 1 del anexo 7,
“El teléfono descompuesto”, que propone el intercambio de mensajes entre estudiantes,
pero en esta instancia se incluyen distintos medios de transmisión.
Objetivos
Que los estudiantes logren:
- Comprender cómo funciona la transmisión de mensajes entre dispositivos
conectados a través de una red.
- Entender el concepto de medio de transmisión, sus características y restricciones.
Actividad
Titulo
El teléfono descompuesto, recargado
Objetivos
Que los estudiantes puedan:
- Identificar los elementos que forman parte de un sistema de comunicación.
- Comprender el concepto de ruido en la comunicación.
Modalidad de trabajo
Se trabajará en parejas.
Desarrollo
Cierre
A modo de cierre se puede concluir que, de acuerdo al medio de transmisión utilizado,
puede o no haber ruido afectando la recepción del mensaje.
En el caso de los mensajes transmitidos por un servicio de mensajería, no hay ruido y los
mensajes deberían recepcionarse sin problemas, siempre y cuando los teléfonos celulares
utilizados para realizar la actividad cuenten con conexión a Internet. Mientras que en los
otros casos se trata de medios que agregan ruido, distorsionando en mayor o menor nivel el
mensaje recibido. Por ejemplo, cuando se usa el aire como medio de transmisión, los
mensajes se confunden más que en otros casos, si es que todos hablan a la vez. Con los
otros dos medios utilizados es muy probable que los mensajes se distorsionen durante la
transmisión incorporando por ejemplo un eco. Esto también dependerá del contenido del
mensaje: en mensajes largos aumenta la posibilidad de alteración del mismo.
Secuencia didáctica 2: Protocolos de comunicación
Bajada
Dado que existen numerosas tecnologías, fabricantes de dispositivos, y diversidad de
sistemas operativos y software, para que los sistemas puedan comunicarse y de esta
manera los mensajes puedan enviarse y recepcionarse, es necesario establecer reglas que
todos los actores intervinientes conozcan y respeten. Un protocolo es justamente el
conjunto de reglas que definen los mensajes que se envían, el formato de los mismos y las
acciones relacionadas a la recepción y transmisión de un mensaje.
Esta secuencia didáctica propone tres actividades que, en forma gradual acercan el
concepto de protocolo de comunicación y los elementos que lo componen.
En la primera actividad se plantea una situación donde surge la necesidad de contar con un
protocolo que permita que dos entidades se comuniquen. La segunda actividad propone un
juego sencillo que pretende aproximarse al concepto de protocolo de comunicación y los
elementos que lo componen. La tercera actividad retoma la actividad “Representación de
textos” de la secuencia didáctica 1 del anexo 10, e introduce la necesidad de establecer
reglas específicas para la comunicación, que tanto el emisor como el receptor conozcan y
apliquen.
Objetivos
Que los estudiantes logren:
- Comprender el concepto de protocolo en los sistemas de comunicación y los
elementos que lo componen.
Actividad
Titulo
¿Debemos ser políglotas?
Objetivos
Que los estudiantes puedan:
- Concebir la necesidad de contar con reglas estrictas para establecer una
comunicación entre un emisor y un receptor, a través de un lenguaje común.
Modalidad de trabajo
Grupos reducidos.
Cierre
En esta actividad surge la primera noción de protocolo de comunicación, como el
conjunto de reglas que se deben cumplir para que la información emitida pueda ser
interpretada correctamente al recibirla. Esto involucra la necesidad de establecer un
lenguaje común, un formato para los mensajes que se desean transmitir y un orden en
que los mismos deben ser transmitidos.
Además de poder sistematizar y enunciar esta primera noción conceptual de protocolo de
comunicación, también se puede proponer a los estudiantes que planteen situaciones de la
vida cotidiana donde existen protocolos establecidos. Se espera que surjan ideas que vayan
desde un simple saludo formal a las normas de tránsito en una ciudad
Actividad
Nos comunicamos con emoticones
Objetivos
Que los estudiantes puedan:
- Aproximarse a los conceptos que componen un protocolo de comunicación mediante
un juego.
Modalidad de trabajo
Se trabajará en parejas.
Desarrollo
Para comenzar la actividad, dividí a los estudiantes en parejas. Cada estudiante dispondrá
Designá a uno de los integrantes de cada pareja para que inicie la comunicación y pedile
que intercambie mensajes utilizando las reglas establecidas previamente. Ambos
estudiantes deberán tomar nota de los intercambios realizados. Se pedirá que repitan el
juego al menos 3 veces usando diferentes fichas iniciales.
En algún momento del juego solicitale al estudiante que inicia la comunicación que
Cierre
A modo de cierre, reafirmá el concepto de protocolo de comunicación, como el conjunto de
reglas y la estructura de mensajes, que permiten que dos o más entidades se comuniquen.
En este punto, podés hacer una analogía con las redes de computadoras: los protocolos
determinan los mensajes a transmitir por la red, el orden en que los mismos deben
transmitirse, qué hacer luego de transmitir y/o recibir un mensaje, entre otras acciones.
Ficha N°1
Ficha para el estudiante
Nos comunicamos con emoticones
Bajada
Mensajeate con tu compañero, usando los siguientes emoticones y las reglas de
intercambio propuesta y, anotá cada intercambio realizado. Repetí el juego al menos 3
veces usando diferentes fichas iniciales y luego seguí las indicaciones de tu docente.
Emoticones a utilizar:
Reglas de intercambio:
Titulo
Mensajes sin contexto
Objetivos
Que los estudiantes puedan:
- Acercarse al concepto de codificación de mensajes en un protocolo de comunicación
mediante el uso de tablas de representación de texto.
- Reconocer la necesidad de establecer las reglas del protocolo a utilizar antes de
comenzar la interacción.
Modalidad de trabajo
Se trabajará en parejas.
Tablas de codificación:
(reservado): -
Tabla 1- XRAYA
(reservado) -
α X
β X-
γ XX
δ X--
Tabla 2 - RAYASGRIEGAS
Cierre
A modo de cierre, explicá que la actividad propuesta es una analogía de la codificación de
mensajes utilizada en los protocolos de comunicación de redes y que para que la
comunicación sea exitosa ambos integrantes del grupo, emisor y receptor, deberán
previamente ponerse de acuerdo sobre qué tabla de codificación utilizar o si es posible usar
ambas. En caso de utilizar las dos tablas, el emisor deberá indicar en cada mensaje enviado
la tabla utilizada para que el receptor pueda posteriormente decodificarlo.
La codificación de los mensajes es una parte constitutiva de la definición de un
protocolo de comunicación de redes.
Ficha N°2
Ficha para el estudiante
Mensajes sin contexto
Bajada
A) Codificá y envía a tu compañero 3 mensajes compuestos por los símbolos “X” y “-”
utilizando las tablas XRAYA y RAYASGRIEGAS de la actividad “Representación de
textos”, de la secuencia didáctica 1 del anexo 10
B) ¿El mensaje codificado que enviaste es el mismo que recibió tu compañero?, ¿por qué?.
Tablas de codificación:
(reservado): -
Tabla 1- XRAYA
Secuencia didáctica 3: Servicios en Internet
Bajada
Internet es un conjunto descentralizado de redes interconectadas que usan la familia de
protocolos TCP/IP, lo cual garantiza que las redes físicas heterogéneas que la componen
formen una red lógica única de alcance mundial.
La mayoría de los servicios de Internet se implementan siguiendo el modelo
cliente-servidor. El mismo consta de al menos dos aplicaciones: un cliente y un servidor. El
cliente es quien realiza solicitudes y el servidor es el que responde a las mismas. Si
pensamos en la vida real, un ejemplo de un sistema que respeta este modelo, podría ser
una ventanilla de atención de trámites, donde hay un empleado esperando para atender a
las personas que lleguen a hacer un trámite, cumpliendo el rol de servidor, y personas que
llegan demandando atención, que cumplen el rol de clientes.
Uno de los servicios más populares de Internet que sigue el modelo cliente-servidor, es la
Web o WWW (de sus siglas en inglés World Wide Web), que permite acceder a
documentos vinculados entre sí a través de hiperenlaces. Estos documentos, conocidos
como páginas web, pueden contener textos, imágenes, videos u otros contenidos
multimediales y se visualizan con un navegador, el cliente web. Las páginas web están
contenidas en sitios y son los servidores web quienes permiten su acceso y distribución.
El acceso a una página web involucra una serie de pasos, en general no perceptibles para
el usuario, que forman parte del protocolo de comunicación de la web: HTTP (de sus siglas
en inglés, Hypertext Transfer Protocol).
Esta secuencia didáctica propone dos actividades que abordan los conceptos mencionados
previamente. La primera actividad tiene como propósito acercar los conceptos básicos del
modelo cliente-servidor mediante el desarrollo de una aplicación implementada en Alice,
que simula la venta de boletos de pasajes aéreos. La segunda actividad aborda el
funcionamiento del protocolo HTTP, pilar fundamental de la Web.
Objetivos
Que los estudiantes logren:
- Comprender el funcionamiento del modelo cliente-servidor.
- Experimentar y comprender el funcionamiento del servicio web y el protocolo HTTP,
como un ejemplo del funcionamiento de los servicios sobre Internet .
Actividad
Titulo
Venta de boletos
Objetivos
Que los estudiantes puedan:
- Identificar los componentes intervinientes en el modelo cliente-servidor mediante la
experimentación con una aplicación simple.
- Adaptar una aplicación en Alice que simula de manera simplificada el
funcionamiento del modelo cliente-servidor, propio de los servicios de Internet.
Modalidad de trabajo
Actividad individual.
Por último, realizá una puesta en común con la clase y dialogá a partir de estas preguntas:
● ¿Podría haber más clientes?
● ¿Cuáles son los mensajes y las reglas implicadas?.
● ¿Cuál es la función del personaje Shannon?
Se espera que los estudiantes observen que Shannon queda siempre a la espera de un
requerimiento de cualquiera de los clientes. En esta aplicación podríamos agregar más
clientes y todos tendrían la misma lógica, harían lo mismo. Del análisis de la simulación, los
estudiantes deberán deducir que las reglas del protocolo, en el caso de una venta exitosa,
establecen la siguiente secuencia de comunicaciones:
1. Un cliente inicia la comunicación al decir “Quiero un pasaje”.
2. Shannon pregunta el destino: “Hola, ¿a qué lugar viaja? (Ezeiza o Salta)”.
3. El cliente indica el destino: “Salta” o “Ezeiza”.
4. Si cuenta con pasajes para ese destino, Shannon consulta la cantidad: “¿Cuántos
pasajes desea comprar?”. S i no cuenta con pasajes para ese destino, Shannon informa:
“No tenemos pasajes para ‘el destino solicitado’ ”.
5. El cliente indica la cantidad con un número.
6. Si se cuenta con la cantidad suficiente Shannon da por finalizada la compra e informa:
“Ya registré su compra”. E n caso contrario, Shannon informa: “No tenemos ‘esa
cantidad’ de asientos libres para ‘el destino solicitado’ ”.
7. Luego Shannon solicita que pase el siguiente cliente: “Siguiente”.
Analizá junto con los estudiantes que las frases expresadas en este diálogo, incluída las
respuestas de los clientes, como la cantidad de pasajes a comprar y el destino, son los
mensajes utilizados por este protocolo.
En este momento el docente podrá explicar que Shannon cumple el rol de servidor, dado
que atiende las solicitudes de pasajes de Juan y Ada. A su vez, Juan y Ada, se comportan
como clientes puesto que su función es solicitar pasajes.
Cierre
A modo de cierre, podés explicar a los estudiantes que típicamente en Internet se utilizan
aplicaciones que siguen los lineamientos de un modelo denominado cliente-servidor y que
funciona de manera similar al presentado en la simulación. En este modelo, una aplicación,
denominada cliente, en el caso de esta actividad representada por los personajes Juan y
Ada, es quien realiza los requerimientos o pedidos y el servidor, representado por el
personaje Shannon, es quien resuelve los pedidos de los clientes y les envía respuestas,
estando disponible todo el tiempo para recibir pedidos.
En las aplicaciones desarrolladas bajo el modelo cliente-servidor pueden existir tantos
clientes como el servidor pueda atender.
En Internet, la mayoría de los servicios se implementan bajo este modelo. El caso más
paradigmático es la Web, donde el navegador de Internet es el cliente, y cada vez que
queremos acceder a una página, el mismo envía un requerimiento al servidor donde está
alojada dicha página. El servidor es una aplicación que atiende y responde estos
requerimientos. El protocolo de comunicación utilizado entre un cliente web y un servidor
web es HTTP que será objeto de la siguiente actividad.
Actividad
Titulo
Servidor web humano
Objetivos
Modalidad de trabajo
Grupos de 4 estudiantes.
Tarjetas de solicitudes:
Tarjetas de respuestas:
Cierre
A modo de cierre podés explicar que la primera versión del protocolo de esta actividad, es
similar al protocolo HTTP 1.0, donde se envían las solicitudes al servidor web y se reciben
las respuestas, de a una por vez. La primera versión del protocolo HTTP utiliza para cada
petición una conexión nueva. Es decir, que cuando un navegador web solicita una página
que contiene varias imágenes, videos u otros recursos, el servidor web establece una
conexión distinta por cada uno de estos elementos a enviar. En el caso de la actividad
planteada esta nueva conexión está simbolizada con la acción de entregar una solicitud
acercándose al banco del servidor.
En las versiones posteriores del protocolo HTTP, el navegador web envía a través de una
única conexión, todas las solicitudes relacionadas a la página que quiere mostrar y recibe
las respuestas desde el servidor en una sola conexión.
Asimismo, el docente podrá comentar que la mayoría de los protocolos de redes de datos y
de Internet en particular, siguen el modelo cliente-servidor, ejemplo de ello son los
protocolos de servicios de correo electrónico, transferencia de archivos, etc. Se tomó el
protocolo HTTP a modo de ejemplo, por ser el protocolo más popular de Internet.
¿Sabés quiénes son Ada Lovelace, Margarita Manterola y Victoria Bajar?: Estas 3
mujeres fueron personas muy destacadas en las Ciencias de la Computación. Ada
Lovelace fue una matemática y escritora británica que desarrolló el primer
algoritmo destinado a ejecutarse en un computadora, por lo cual es considerada la
primera programadora. Se denominó Ada a un lenguaje de programación en su
honor. Margarita Manterola es una programadora argentina quien se ha convertido
en una de las pocas desarrolladoras mujer del proyecto Debian, distribución de
GNU/Linux utilizada y desarrollada a nivel mundial. Participa también en el
programa Debian-Women que promueve la participación de mujeres en la
programación enfocándose en el desarrollo del proyecto Debian. Victoria Bajar fue
la primera graduada de la carrera Computador Científico en la Argentina. Realizó
importantes aportes para el desarrollo computacional argentino trabajando con la
primera computadora traída a la Argentina con fines científicos, Clementina.
Posteriormente se mudó a México donde se abocó al desarrollo de currículas de
carreras de nivel superior del área informática.
Ficha N°3
Ficha para el estudiante
Servidor web humano
Bajada
Recortá por las líneas punteadas las fichas del juego “Solicitud” o “Respuesta” de acuerdo a
lo indicado por tu docente y utilizalas siguiendo las consignas que te darán.
Fichas “Solicitud”:
Fichas “Respuesta”:
Secuencia didáctica 4: Las tecnologías de acceso para redes
hogareñas
Bajada
Esta secuencia didáctica propone una actividad que permite trabajar conceptos
relacionados a las redes hogareñas y las tecnologías asociadas.
Se propone una única actividad que, a través de un juego, analiza los distintos dispositivos
que componen una red hogareña y la interconexión de los mismos.
Objetivos
Que los estudiantes logren:
- Reconocer los elementos que componen una red hogareña.
- Identificar los dispositivos que permiten interconectar redes y acceder a Internet.
Actividad
Titulo
Dominó de redes
Objetivos
Que los estudiantes puedan:
- Identificar, a través de un juego de dominó con fichas especiales, los distintos
recursos necesarios para una comunicación a través de Internet.
- Establecer la secuencia que posibilita la comunicación entre los extremos.
Modalidad de trabajo
Se trabajará en parejas.
Materiales y recursos
Un juego de fichas de dominó por cada pareja de estudiantes:
Antes de comenzar el juego, realizá una puesta en común sobre los dispositivos
involucrados en una red y su interconexión al momento de realizar una comunicación. Para
esto, se puede plantear que cada vez que se realiza una comunicación a través de Internet,
por ejemplo, desde una computadora o teléfono inteligente, los datos pasan por una serie
de dispositivos y/o puntos de conexión, algunos de los más relevantes son los siguientes:
1. El celular o computadora donde se generan los datos en formato digital: dispositivo del
emisor.
2. Un router inalámbrico o con cables, dependiendo de qué dispositivo se utilice y cómo se
conecte. El router enviará los datos recibidos al proveedor de servicios o ISP (por sus
el emisor.
siglas en inglés de Internet Service Provider) d
3. El ISP cuenta a su vez con una red con routers y otros dispositivos (que no se tendrán
en cuenta en esta actividad para reducir su complejidad).
4. Los datos llegarán al proveedor de Internet, ISP, del receptor.
5. De allí al router del receptor.
6. Y finalmente al dispositivo del receptor.
Presentar el juego, indicando que el mismo sigue reglas similares al dominó, donde cada
ficha menciona 2 recursos de red por los que pueden pasar los datos en una comunicación
entre dos extremos. Las fichas que mencionan un mismo recurso pueden conectarse entre
ellas, por ejemplo las fichas “Computadora Juan - Router inalámbrico” y “Router
inalámbrico - Router” se pueden conectar.
Este juego tiene una restricción adicional: el tablero final debe representar el camino por el
que pasan los datos en una comunicación a través de Internet. Existen distintas
combinaciones correctas y también fichas que no son válidas. Las fichas con 2 routers
pueden utilizarse como las fichas dobles del dominó para crear bifurcaciones.
El disparador de esta partida podría ser una situación como la siguiente: “Claudia está en su
casa y le envía un mensaje a su amigo Juan que vive en Brasil a través de la mensajería de
Facebook”.
La misión de los jugadores será jugar una partida de dominó, armando el camino que
deberán recorrer los datos para que Claudia se comunique con su amigo en Brasil. El
primer jugador que complete el tablero resolviendo la comunicación pedida, es el ganador.
Durante el desarrollo del juego, acompañá a los estudiantes en la elección de las fichas que
pueden usar para construir el camino, recordando la funcionalidad de cada uno de los
recursos y cuál es el rol que cumple este recurso en la comunicación. Podés advertir que la
conexión entre las distintas fichas representa el camino que siguen los datos al intercambiar
información entre dos computadoras o teléfonos inteligentes a través de Internet.
Una posible solución del juego es:
Cierre
A modo de cierre, explicale a los estudiantes que en una comunicación en Internet
participan múltiples dispositivos específicos de redes y proveedores de servicios o ISP,
además del emisor y receptor.
En el juego de dominó resuelto, se simuló el envío de un mensaje a través una red social
desde un teléfono inteligente o computadora, y se identificaron algunos de los dispositivos
que participan en la comunicación, a través de la red, junto con los ISP de cada extremo,
emisor y receptor, usando diferentes routers para encaminar los mensajes desde un
extremo al otro.
Ficha N°4
Dominó de redes
Servidor web humano
Bajada
¡Los invitamos a jugar un juego similar al Dominó tradicional!. Aquí, cada ficha contiene 2
recursos de red.
Recortá por las líneas punteadas las fichas del dominó. Cada una representa un par de
recursos que participan en la comunicación. Seguí las indicaciones dadas en clase para
resolver el juego.
Secuencia didáctica 5: Identificación de los recursos en
Internet
Bajada
Los dispositivos conectados a Internet necesitan ser identificados de forma unívoca. Para
ello se usan las direcciones IP asignadas a su placa de red. Estas direcciones son
administradas por organismos internacionales y permiten tanto identificar a la red como al
dispositivo en particular dentro de esa red.
Además cada placa de red tiene una dirección MAC, que es un identificador único de dicha
placa de red.
La dirección IP es lo que se conoce como dirección lógica y la dirección MAC es lo que se
conoce como dirección física.
Sin embargo, cuando las personas se refieren a los dispositivos u otros recursos lo hacen a
través de nombres, que son más fáciles de recordar. Para ello, existe un servicio que
traduce los nombres de los dispositivos a su correspondiente dirección IP. De esta tarea se
encarga el servicio de DNS (de sus siglas en inglés, Domain Name System).
Esta secuencia didáctica está integrada por 3 actividades que proponen trabajar sobre los
distintos mecanismos para referenciar recursos en una red.
En la primera actividad de esta secuencia, se simula el comportamiento del protocolo de
resolución de direcciones ARP (de sus siglas en inglés, Address Resolution Protocol), el
cual dada la dirección IP de un dispositivo permite obtener su dirección MAC. En la segunda
actividad, se simula la resolución de nombres a través del servicio DNS, introduciendo por
otro lado la noción de decisión de ruteo. Por último, en la tercera actividad, se relacionan los
conceptos vistos con los dispositivos disponibles en la escuela.
Objetivos
Que los estudiantes logren:
- Comprender la forma en que se identifica unívocamente un recurso en Internet,
desde una computadora hasta una página web.
- Comprender el concepto de identificación física de un dispositivo en la red.
- Acercarse al funcionamiento básico de algunos dispositivos de red como el hub, el
switch y el router.
Actividad
Titulo
Enviando mensajes internos
Objetivos
Que los estudiantes puedan:
- Aproximarse al funcionamiento del protocolo ARP que permite obtener la dirección
física o MAC a partir de la dirección lógica o IP.
- Acercarse al funcionamiento básico de un hub y un switch.
Modalidad de trabajo
Actividad con toda la clase.
Tabla de correspondencias:
F:
C:
F:
C:
Tarjetas de mensajes:
Mensaje
Dirección del F:
Emisor (origen) C:
Dirección del F:
Receptor (Destino) C:
Mensaje
Desarrollo
En esta actividad, los estudiantes se enviarán mensajes entre ellos identificando al
destinatario mediante su DNI. Para que el mensaje llegue a destino, deberán obtener la
información de ubicación dentro del aula, es decir en qué fila y columna se encuentra. Se
considerará al DNI como la “dirección lógica” y a la información de su ubicación,
expresada como fila (F) y columna (C), como la “dirección física”. Habrá un mensajero por
aula, encargado de entregar los mensajes.
La actividad consiste en un juego de roles: hay un estudiante en particular al que se le
asigna el rol de mensajero y representa al dispositivo, hub o switch, que interconecta las
computadoras, formando una red local y, los restantes estudiantes tienen el rol de las
computadoras que envían y reciben mensajes.
Para dar comienzo a la actividad, debes elaborar un mapa del aula enumerando los bancos
del aula por fila y columna, de la forma detallada en la siguiente figura, y solicitarás a cada
estudiante que registre su número de fila y columna y lo anote en una hoja. El mapa del
aula solamente será conocido por el mensajero.
Luego, elegí el mensajero del aula, encargado de entregar los mensajes desde el estudiante
origen al estudiante destino. Para llevar este proceso adelante, el mensajero usará el mapa
del aula.
Para dar comienzo al intercambio de mensajes, pedile a los estudiantes, excepto al
mensajero, que escriban su número de DNI en un papelito y luego juntá todos los papelitos
en una bolsa. Cada estudiante, a excepción del mensajero, tomará un papel de la bolsa, sin
mirar. En el caso que un estudiante saque su propio papelito deberá devolverlo a la bolsa y
tomar otro. Este papel contendrá el destinatario del mensaje a enviar.
A continuación, solicitá a los estudiantes que completen la tarjeta de mensaje con la
información con la que cuentan: DNI del destinatario y el mensaje que desean enviar.
Preguntarles: ¿es posible completar la tarjeta de mensaje?, ¿falta algún dato?.
Dado que cada estudiante solo conoce su propia ubicación en el aula, se espera que
respondan que con la información que disponen, no pueden completar la tarjeta de
mensaje. La dirección del destino no puede ser completada ya que solo tienen el DNI del
destinatario y no saben dónde está ubicado. En este punto, podés enfatizar que se
desconoce la lógica con la que fueron asignadas las direcciones físicas, fila y columna, con
lo cual no se puede inferir.
En este momento, deberá surgir la idea que es necesario averiguar la dirección física del
destinatario del mensaje, fila y columna en el aula. Podés ayudar a resolver este problema,
para ello a modo de ejemplo, elegí a un estudiante para que envíe su mensaje realizando lo
necesario para averiguar los datos que necesita. Con tu ayuda, el estudiante elegido
completará la tarjeta de mensaje y preguntará en voz alta: ¿quién tiene el número de DNI
del destinatario?. Esto debería provocar que el estudiante con dicho DNI responda. De esta
manera, el estudiante interesado en enviar el mensaje, completará su tabla de
correspondencia “DNI-ubicación en el aula” agregando los datos de su compañero. Luego,
completará la tarjeta del mensaje y se la entregará al mensajero.
En este momento, podés preguntar: ¿el mensajero puede entregar directamente el
mensaje?. Se espera que los estudiantes consideren que el mensajero conoce el mapa del
aula, es decir, sabe cómo acceder a cada dirección física y puede hacer la entrega del
mensaje.
Pedile a los estudiantes que, de a uno y en forma ordenada, envíen sus mensajes
repitiendo los pasos realizados para el envío del primer mensaje. Esto permitirá que todos
experimenten el proceso y que al terminar el mismo, dispongan de información en su tabla
de correspondencias “DNI-ubicación en el aula”.
Finalmente, podés preguntar:
● ¿Qué sucedería si el mensajero no conociera el mapa del aula?, ¿cómo se enviaría el
mensaje?
● Si tuvieran que enviar nuevamente un mensaje al mismo destino, ¿pueden completar la
tarjeta de mensaje sin volver a preguntar por el DNI?, ¿por qué?
Es probable que la respuesta a la primera pregunta no resulte sencilla, por este motivo se
puede reflexionar junto con los estudiantes sobre alternativas de envío de mensajes si el
mensajero no conoce el mapa del aula. Por ejemplo podría enviar una copia del mismo
mensaje a todos los estudiantes, asegurándose de esta manera que el destinatario lo
reciba. Podés preguntar: si un estudiante recibe un mensaje que no es para él, ¿qué hará
con el mensaje?. Se espera que respondan que lo descartará, solo retendrá los mensajes
que son dirigidos a él.
Asimismo, se espera que los estudiantes adviertan que si un estudiante tiene que enviar un
nuevo mensaje al mismo destino, conocido, podrá completar la tarjeta de mensajes sin
necesidad de preguntar quién tiene el DNI, dado que esa información la tiene registrada en
su tabla de correspondencia.
Cierre
A modo de cierre, podés explicar que la actividad desarrollada esboza los conceptos de:
● identificación física de un dispositivo en la red para poder entregar mensajes y,
● el funcionamiento del protocolo ARP para obtener la dirección física o MAC a partir de
la dirección lógica o IP.
En este punto, explicitar la analogía entre el juego y el mundo de las redes: los estudiantes
que envían y reciben mensajes, son los extremos de la comunicación, las computadoras, y
el estudiante que entrega los mensajes, el mensajero, simboliza al dispositivo que las
conecta.
A continuación podés construir la analogía, con las siguientes ideas:
Un estudiante se quiere comunicar con otro del que conoce, en un principio, su dirección
lógica, representada por el DNI; en el mundo de las redes, el DNI se corresponde con la
dirección IP.
Para que el mensaje llegue al destino final, además se debe conocer la dirección física,
representada en esta actividad por la ubicación de fila-columna del estudiante, y conocida
como dirección MAC en redes. Dicha dirección, se averigua a través del protocolo ARP y
se guarda en la tabla ARP de cada computadora, la cual contiene las correspondencias
IP-MAC. En esta actividad, se encuentra simulada por la tabla de correspondencia
“DNI-ubicación en el aula”.
Asimismo, para interconectar las computadoras en una red se necesitan otros dispositivos
que en esta actividad, están representados por el mensajero. Dependiendo de su
comportamiento, éste puede simular un hub o un switch. Simula un hub si el mensajero no
conoce el mapa del aula y, en este caso, cuando recibe un mensaje debe enviarlo a todos
los estudiantes para que el destinatario lo reciba. Mientras que en el caso que el mensajero
conozca el mapa del aula, éste puede reenviarlo directamente al destinatario, simulando el
funcionamiento de un switch.
Al llegar a este momento, podés elaborar junto con los estudiantes una tabla como la
siguiente, que sistematiza las ideas surgidas.
Juego REDES
Bajada
Comunicate con tus compañeros utilizando las tarjetas de mensajes y siguiendo las pautas
dadas en clase.
F:
C:
F:
C:
Dirección del F:
Emisor (origen) C:
Dirección del F:
Receptor (Destino) C:
Mensaje
Actividad
Titulo
Enviando mensajes intergrupo
Objetivos
Que los estudiantes puedan:
- Comprender la funcionalidad del servicio de DNS.
- Conocer el funcionamiento básico de un router.
Modalidad de trabajo
Actividad con toda la clase.
Tarjeta de mensajes:
Mensaje
Mensaje
Desarrollo
Esta actividad se organiza en 3 momentos: en el primer momento se arman dos grupos que
intercambiarán mensajes, en el segundo se simula el envío del mensaje y los procesos
involucrados en el mismo y en el tercero, se simula la entrega del mensaje al destino.
Para el desarrollo de esta actividad, deberás contar con una lista con los nombres, apellidos
y DNIs de los estudiantes.
por los otros 2 mensajeros, y 2 mensajeros de grupo , conocidos por los integrantes de
su grupo y por el mensajero intergrupo.
El mensajero intergrupo, MIG, es el encargado de decidir a qué mensajero de grupo, MG,
entregar el mensaje.
Los dos mensajeros de grupo, MG, son los encargados de entregar el mensaje al estudiante
que corresponda de su grupo.
Para identificar a los mensajeros grupo, podés usar las siglas MGP para el mensajero del
grupo par y MGI para el del grupo impar. En la siguiente figura se ilustra el esquema de
comunicación entre los grupos a modo de ejemplo. Podés usar una figura similar al
comenzar la actividad.
Advertí a los estudiantes que en esta actividad deben enviar un mensaje a un compañero
del otro grupo usando su nombre y apellido. Podés preguntar: ¿qué datos se necesitan para
poder completar la tarjeta del mensaje a enviar?. Se espera los estudiantes hayan
observado que necesitan conocer el DNI destinatario del mensaje. En este momento, podés
recordar que contás con un listado completo con los nombres y DNIs de los estudiantes.
Por lo tanto, este inconveniente podría resolverse preguntándote en voz alta cuál es el DNI
para un nombre dado. Espera unos minutos para que los estudiantes completen sus tarjetas
de mensajes, y luego preguntales: ¿quién creen que debe continuar el proceso de envío?.
Cierre
A modo de cierre, podés explicar que para las personas usualmente los nombres son más
fáciles de recordar que los números y que en Internet también se puede identificar los
recursos a través de su nombre. Cuando accedemos a una página de Internet lo hacemos
por su nombre, no por su dirección en el servidor. Sin embargo, las computadoras y
dispositivos de red solo reconocen direcciones IP, que son números, para identificarlos. Por
ello, cuando se accede a algún recurso en Internet a través de su nombre, como por
ejemplo a la página www.educ.ar, es necesario traducir este nombre a una dirección lógica
(dirección IP). Para esto existe el servicio de DNS, que se encarga de traducir los nombres
a direcciones lógicas. El rol que asumiste en la clase cuando te consultaron respecto a cuál
era el DNI de un estudiante dado su nombre, es similar a la función del DNS en una red.
Además, cuando un mensaje se transmite de una red a otra, se necesita un dispositivo que
interconecte redes y encamine los mensajes entre ellas. Este dispositivo se denomina
router. En esta actividad, el mensajero MIG cumplé ese rol, decidiendo si el mensaje debe
entregarlo al mensajero MGP o MGI, dependiendo de si el DNI del destino es par o impar.
Ficha N°3
Ficha para el estudiante
Enviando mensajes intergrupo
Bajada
Usá una tarjeta como la siguiente, para enviar un mensaje a tus compañeros de acuerdo a
las pautas presentadas en la clase.
Mensaje
Mensaje
Actividad
Titulo
Inspeccionando la identidad de los dispositivos
Objetivos
Que los estudiantes puedan:
- Averiguar las direcciones físicas y lógicas de las computadoras y/o celulares
disponibles en la escuela.
Modalidad de trabajo
Actividad individual.
Cierre
A modo de cierre, enfatizá que tanto las direcciones lógicas como físicas de una
computadora y/o teléfono celular se pueden consultar a través de alguna herramienta de
software provista por los mismos. En algunas situaciones prácticas, esta información es
requerida. Por ejemplo, el administrador de una red local puede restringir el acceso a la
misma por la dirección MAC, ya sea por cuestiones de seguridad o para controlar la
cantidad de conexiones. En este caso, cada vez que intentemos utilizar dicha red, debemos
informar nuestra dirección MAC al administrador. Los juegos en red, habitualmente solicitan
la dirección IP para unirse a un servidor.
Bajada
En las redes en general y en Internet en particular, para que la comunicación sea posible y
un mensaje llegue desde un origen a un destino, debe existir al menos un camino entre los
mismos. Dos computadoras pueden estar directamente conectadas, o pueden estarlo a
través de diversos medios y dispositivos intermedios. Pueden existir rutas o caminos
alternativos.
Los routers son dispositivos de red que conectan a una red con otra y cumplen la función
de encaminar mensajes. Cuando un mensaje llega a un router el mismo debe evaluar cuál
es el mejor camino para llegar al destino, en base a su información de ruteo (lista de
posibles rutas) y reenviar el mensaje según esa decisión.
Para poder transportar datos a través de Internet utilizando el camino más eficiente, los
routers utilizan “mapas de la red” que les permiten calcular el mejor camino en base a la
información asociada a cada ruta. Esta información puede ser, por ejemplo, la velocidad del
camino, la confiabilidad del mismo, entre otras características.
En la primera actividad de esta secuencia, se analizan las posibles rutas entre un origen y
un destino, evaluando cómo elegir una de ellas y acercándose a la función básica de los
routers.
En la segunda actividad, a través de un juego de roles, los estudiantes experimentarán cuál
es la información que los routers necesitan para poder reenviar los mensajes a través de la
red y algunas de las acciones que los mismos realizan para cumplir la función de ruteo.
Objetivos
Que los estudiantes logren:
- Comprender cómo es el transporte de datos en Internet.
- Conocer las funciones básicas de un router.
Actividad
Titulo
Viajes y tiempos
Objetivos
Que los estudiantes puedan:
- Comprender cómo se llevan a cabo las decisiones de ruteo.
Modalidad de trabajo
Actividad individual
Materiales y recursos utilizados
Papel y lápiz, y una hoja impresa con una tabla de rutas como la siguiente:
Desarrollo
La actividad propone organizar un viaje utilizando diferentes medios de transporte,
identificando detalladamente los pasos a seguir para llegar al destino deseado. El objetivo
es que los estudiantes comprendan la forma en que se conectan dos puntos
geográficamente distantes y cómo se puede actuar en caso que surja algún inconveniente
de conexión.
Plantear a los estudiantes que deben organizar un viaje imaginario, partiendo desde su casa
con destino a México, e indicarles que en la Ficha N° 7 disponen de una tabla de rutas
posibles. En este momento, pedile a cada uno que elija y dibuje en una hoja las rutas
posibles a seguir para llegar a México, indicando los medios de transporte que necesitarán
utilizar para desplazarse entre los puntos intermedios del viaje.
Revisá junto con los estudiantes los distintos puntos intermedios del recorrido para que los
tengan presentes al momento de elegir las rutas:
- Casa
- Terminal de Ómnibus
- Aeropuerto de Ezeiza
- Aeropuerto de Internacional de México
Podés dar algunas pautas para realizar el dibujo de las rutas: los puntos del recorrido se
representan con círculos y los traslados o rutas a seguir, con flechas. Las flechas que unen
círculos tienen como origen el punto de partida y como destino el punto de llegada y se
etiquetan con el medio de transporte y el tiempo estimado de traslado de dicho transporte. A
modo de ejemplo, para dibujar la ruta entre la casa y la terminal de ómnibus se espera que
los estudiantes realicen un gráfico similar al siguiente:
Luego de dar un tiempo para que cada estudiante realice su plan de viaje o dibujo, planteá
los siguientes interrogantes:
● ¿Cuál es el tiempo de demora total del viaje utilizando la ruta A en el primer tramo?
● ¿Qué sucedería si la ruta A no estuviera disponible?, ¿cómo lo solucionarían?, ¿cómo
impactaría esto en la demora total del viaje?
● ¿Qué pasaría si la ruta A no estuviera disponible y no hubiese habilitada una ruta
alternativa ?, ¿perderíamos el viaje a México?
Se espera que los estudiantes lleguen a la conclusión que si se utiliza la ruta A en el primer
tramo, el tiempo total de demora del viaje es 11 horas y 10 minutos. También se espera que
respondan que si la ruta A no estuviera disponible, podrían usar la ruta B, incrementando la
duración total de viaje. En caso que la ruta B no estuviera habilitada, y la ruta A no estuviera
disponible, no se podría realizar el primer tramo del viaje, desde la casa a la terminal, con lo
cual no se llegaría a tomar el micro y se perdería el vuelo.
Otras preguntas que podés hacer para reflexionar sobre las elecciones de rutas podrían ser:
● ¿Qué criterios tendrían en cuenta para elegir entre la ruta A y la ruta B si ambas están
disponibles?
● ¿El camino más rápido o el más corto siempre es el mejor?, ¿qué pasa si es menos
confiable, por ejemplo hay más congestión de tránsito y mayor probabilidad de
demoras?
A partir de las respuestas de los estudiantes, podrás advertir que hay dos conexiones
posibles entre la casa y la terminal de ómnibus y, si bien en un principio se eligió la ruta A
por considerarla más rápida, en la vida real la decisión no es tan simple, existen otros
factores como demoras inesperadas. Por ejemplo en determinado momento del día suele
haber mayor cantidad de tránsito en un camino que en otro, alterando el tiempo estimado
para el viaje.
En este momento podés explicar que problemas similares a los planteados en esta actividad
ocurren en las redes de datos cada vez que se intenta comunicar por Internet dos
dispositivos, por ejemplo, cuando mandamos un correo electrónico, mensajes por Whatsup
o Telegram, solicitamos una página web, etc. A menudo existen varios caminos posibles
para comunicar dos dispositivos a través de Internet y es la tarea de dispositivos
especializados llamados routers, decidir cuál puede ser el mejor camino en base a distintos
criterios.
Cierre
A modo de cierre, podés reflexionar con los estudiantes que la elección de rutas que
propone la actividad desarrollada, es análoga a la que hacen los routers de Internet cuando
se conectan dos dispositivos. Es común tener varias rutas, al menos dos con distintas
características para poder transmitir datos entre dos dispositivos. En caso de estar
disponibles varias rutas a un mismo destino, se elige aquella que resulte la mejor de
acuerdo a un determinado criterio, por ejemplo la más corta, es decir donde hay menos
routers por los que pasar, o la más rápida dependiendo de la velocidad del medio de
transmisión. También puede ocurrir que alguna ruta esté muy congestionada o incluso no
disponible, con lo cual, aunque ésta sea la mejor ruta, el router deberá elegir otro camino
para enviar el mensaje. En caso que se contara con una única ruta para conectar dos
puntos y ésta no estuviera disponible, no sería posible transmitir datos entre esos dos
puntos.
Ficha N°3
Ficha N°3
Ficha N°7
Ficha para el estudiante
Viajes y tiempos
Bajada
Armá tu propio plan de viaje o mapa para trasladarte desde tu casa a México siguiendo las
indicaciones dadas en clase y usando la siguiente tabla de rutas. Indicá los medios de
transporte que vas a utilizar para trasladarte entre los puntos intermedios del viaje.
¿Empezamos el viaje?
Titulo
Paquetes y tabletas1
Objetivos
Que los estudiantes puedan:
- Comprender el funcionamiento de un router y las decisiones que se pueden tomar al
momento de recibir y enviar un mensaje.
Modalidad de trabajo
Se trabajará con todo el curso.
Plantilla 1 - Acciones
Entregar la tableta ahora Entregar esta tableta luego de la siguiente
Plantilla 2 - Tabletas
Origen: Origen:
Contenido: Contenido:
Destino: Destino:
1
Esta actividad está inspirada en https://goo.gl/mlLcYJ
Origen: Origen:
Contenid: Contenido:
Destino: Destino:
Origen: Origen:
Contenido: Contenido:
Destino: Destino:
Desarrollo
Esta actividad propone un juego de roles cuyo objetivo es que los estudiantes se envíen
mensajes. En esta oportunidad se utilizarán unas tarjetas llamadas “tabletas” que restringen
la cantidad de caracteres y números que las mismas pueden contener, resultando en la
necesidad de enviar varias tabletas para un mismo mensaje. Éstas simulan un
comportamiento análogo a los paquetes de datos de Internet. Por otro lado, algunos
estudiantes cumplirán el rol de mensajeros y realizarán algunas acciones que representan
en forma simplificada el comportamiento de los routers en Internet.
Para dar comienzo a la actividad, elegí a tres estudiantes y asignales el rol especial de
mensajeros, y al resto organizalos en parejas y asignales el rol de emisores y receptores de
mensajes.
Para el desarrollo de la actividad es fundamental que los integrantes de cada pareja estén
separadas, por ejemplo, en 2 aulas, o en lugares del aula distantes, según tus posibilidades,
para que no puedan comunicarse.
Cada mensajero dispondrá de una copia de las “tarjetas de acción” de la Ficha N° 8. Las
mismas son de tres tipos:
- Entregar la tableta ahora.
- Entregar esta tableta luego de la siguiente.
- No entregar esta tableta.
Explicar a los estudiantes cómo deben ser los mensajes que se pueden enviar entre las
parejas: contienen más de 6 caracteres y no son frases en castellano. Por ejemplo, podría
elegirse mandar un número de teléfono o cadenas de texto sin sentido como “XXIHUAJKIL”.
En este punto recuperar las ideas de las actividades previas y mostrar que los mensajes
deben contener la dirección de origen y de destino. La restricción del idioma es para evitar
que los mensajes se re-armen infiriendo su significado.
A continuación, indicá a los estudiantes que recorten las “tabletas” de la Ficha N° 8. Con el
objetivo de comprobar si los estudiantes están entendiendo las reglas del juego,
preguntales: ¿podés escribir un mensaje en una tableta?. Se espera que los estudiantes
hayan observado que en una tableta se puede escribir un mensaje de a lo sumo seis
caracteres o números, entonces no se puede escribir el mensaje entero en una tableta.
Luego, pedile a uno de los integrantes de cada pareja que piense un mensaje respetando la
estructura de los mismos y que lo escriba en sus tabletas, teniendo en cuenta que un
mensaje ocupará más de una tableta. Es importante destacar en este momento que todas
las tabletas deben incluir el nombre del destinatario.
Solicitar a cada estudiante mensajero que mezcle las tarjetas de acción y, a los estudiantes
que enviarán mensajes, que entreguen las tabletas que los contienen, a uno de los tres
mensajeros. Por cada tableta recibida, el mensajero debe tomar una carta de acción y llevar
a cabo dicha acción. Estos pasos deben repetirse para todas las tabletas de todos los
estudiantes.
El inicio del juego probablemente sea un poco caótico y frustrante, y la entrega de mensajes
posiblemente no se pueda concretar. Podés intervenir y conversar con los estudiantes sobre
los problemas que están teniendo los mensajeros para entregar los mensajes y los
destinatarios en la recepción de los mismos. Ayudá a los estudiantes a resolver las
situaciones planteadas con preguntas como las siguientes:
● ¿Conocés el orden de las tabletas para rearmar el mensaje original?, ¿qué problema te
genera?, ¿se te ocurre cómo solucionarlo?. Se espera que los estudiantes concluyan
que no conocen el orden de las tabletas y que esto provoca un problema al destinatario
del mensaje porque no sabe cómo reconstruirlo. Es probable que las propuestas de
solución no surjan rápidamente. Orientalos con algunas ideas como por ejemplo que
resulta necesario numerar secuencialmente las tabletas y transmitir ese número, con lo
cual debe formar parte de la información de la tableta, allanando el camino para que
surja la propuesta de usar una de las 6 celdas de la tableta para anotar el número de
tableta. Luego podés preguntar, si esto trae algún problema, ¿cuál?. Conversá sobre el
tamaño de los mensajes. Seguramente los estudiantes deduzcan que hay menos
espacio para los datos reales del mensaje, un casillero se lo consume el número de
tableta. Entonces, ¿usamos la misma cantidad de tabletas para nuestros mensajes?. S e
espera que los estudiantes observen que necesitarán más tabletas para mandar los
mensajes dado que una de las celdas se utiliza para guardar información “de control”.
● ¿Estás seguro que las tabletas llegaron al destino?, ¿se podrían perder?. Si pensás que
efectivamente alguna tableta se perdió ¿qué se puede hacer para recuperarla?.
Posiblemente algunos estudiantes piensen que no hay posibilidades de pérdida de
tarjetas y otros hayan experimentado la pérdida de alguna. Podés ayudarlos a construir
estas ideas por ejemplo, entregando más tabletas para que comprueben que
efectivamente hay posibilidades de extravío: a un mensajero puede habérsele caído la
tableta, o puede haber realizado la acción “No entregar esta tableta” que consiste en
descartarla, etc. En este momento dialogá con los estudiantes sobre propuestas de
solución para el caso de pérdida de tabletas y orientalos en la elaboración de las
mismas con algunas preguntas: ¿le podríamos pedir al destinatario que le avise al
mensajero cuando recibe una tableta?, si no avisa nada, ¿podríamos pensar que la
tableta no se entregó?. Con las respuestas recogidas construí junto con los estudiantes
una propuesta de solución similar a la siguiente: el mensajero le pedirá al destinatario
que le avise cuando recibe una tableta y no le enviará una nueva hasta no recibir
confirmación de la enviada previamente. En caso de no recibir la confirmación en un
tiempo preestablecido, el mensajero podría considerar que la tableta se perdió y volverá
a enviarla, para ello el mensajero mantendrá una copia de la tableta hasta su
confirmación. Reflexioná junto con los estudiantes sobre cómo identificar estas
respuestas de confirmación. Podría surgir la idea de contar con una tableta especial
para representar la confirmación que enviará el destinatario al mensajero.
● ¿Le podemos entregar las tabletas que componen un mensaje a distintos mensajeros?.
Podés reflexionar junto con los estudiantes que al ser la función del mensajero la
entrega de tabletas de acuerdo al destino de la misma, no se presenta ningún
inconveniente si una tableta se la entregamos a un mensajero y otra, del mismo
mensaje, a un mensajero diferente. Las tabletas que componen un mensaje pueden
tomar distintos caminos e igualmente llegar al destino. Como la llegada de las tabletas
puede ocurrir en distinto orden resulta fundamental haberlas numerado.
Cierre
A modo de cierre, podés explicar a la clase que el juego propuesto es una analogía de los
mecanismos de transporte de datos que se usan en Internet: las tabletas representan los
paquetes o datagramas en Internet y su contenido, partes o fragmentos de un mensaje; en
las tabletas se guardan además de los datos, información de “control” como ser el número
de orden y si se trata de una confirmación, por ejemplo. Análogamente, en Internet los
paquetes contienen datos y un encabezado con información de control. Dado que los
paquetes tienen un tamaño preestablecido, el tamaño del encabezado reduce la cantidad de
datos que se pueden transferir, pero agrega funcionalidades útiles.
Podés comentar que en Internet los mensajes se dividen en paquetes o datagramas para su
transporte y que además, los canales por los que viajan estos paquetes no siempre son
confiables: los paquetes a veces se dañan o se pierden. En este momento podes
reflexionar con los estudiantes sobre qué impacto tiene perder paquetes de datos, pudiendo
surgir ideas como: dependiendo de la aplicación que estemos usando en Internet o lo que
estemos haciendo, la pérdida de un paquete podría no impactarnos, por ejemplo si se
transmite un video puede que no se perciba la pérdida de un paquete (un cuadro del video),
mientras que si estamos transfiriendo un archivo, perder un paquete implica la alteración del
contenido del archivo.
En esta actividad el mensajero además de entregar tabletas, realiza una serie de acciones
análogas a las de los routers de Internet:
● “Entregar la tableta ahora” representa el reenvío de un paquete recibido para que siga
su camino.
● “Entregar esta tableta luego de la siguiente” significa que el paquete recibido sufrirá una
demora antes de ser enviado por el router, debido a que tiene menos prioridad que otro
paquete encolado o el router está procesando otro paquete.
● “No entregar esta tableta” representa la acción de descartar un paquete, lo cual puede
ocurrir por ejemplo porque su tiempo de vida se agotó.
Los protocolos de Internet que se encargan del transporte y ruteo de datos son: IP, TCP y
UDP (de sus siglas en inglés de User Datagram Protocol).
Ficha N°8
Ficha para el estudiante
Paquetes y tabletas
Bajada
A) Si sos un mensajero, recortá las siguientes tarjetas de acción y seguí las indicaciones
dadas en clase para saber cómo usarlas.
Plantilla 2: Tabletas
Origen: Origen:
Contenido: Contenido:
Destino: Destino:
Origen: Origen:
Contenid: Contenido:
Destino: Destino:
Origen: Origen:
Contenido: Contenido:
Destino: Destino:
Secuencia didáctica 7: Detección de errores
Bajada
Al inicio de este anexo se mencionó que un sistema de comunicaciones está integrado por
emisores, receptores y medios de transmisión. En este contexto es crucial establecer
mecanismos para verificar la integridad de un mensaje transmitido, es decir, si fue
modificado por terceros o por ruido en el medio de transmisión.
La confiabilidad o fiabilidad en un sistema de comunicaciones se refiere a la probabilidad
de un buen funcionamiento del mismo y depende de numerosos factores. Uno de ellos, el
que se trabajará en esta secuencia didáctica, es la capacidad de poder verificar la integridad
de los mensajes. En el mundo de las redes de computadoras, esta verificación se conoce
como detección de errores.
Esta secuencia didáctica propone una única actividad en la cual se trabaja con un sistema
que realiza dicha verificación.
Objetivos
Que los estudiantes logren:
- Comprender el concepto de detección de errores en la transmisión de mensajes en
la red, a fin de garantizar su integridad en el envío.
Actividad
Titulo
Verificando la integridad del mensaje
Objetivos
Que los estudiantes puedan:
- Experimentar con un mecanismo que permite controlar la integridad de los mensajes
transmitidos en un sistema de comunicaciones.
Modalidad de trabajo
Se trabajará en parejas.
Mensaje
DNI Remitente
DNI Destino
Mensaje
Chequeo de Integridad
Mensaje
Chequeo de Integridad P
En este juego actuarás como mensajero y serás el encargado de distribuir los mensajes de
acuerdo a los DNIs indicados en el campo “DNI Destino”. Para realizar el envío del
mensaje, recoge todas las tarjetas y altera el mensaje, por ejemplo borrá o tachá algún
carácter en algunos de los mensajes. Luego, entrega todos los mensajes a sus
destinatarios y preguntales a los estudiantes: ¿pueden darse cuenta si el mensaje recibido
fue alterado?. Se espera que los estudiantes observen que en la tarjeta se incluye el
indicador, “P” o “I” indicando si el mensaje contiene una cantidad par o impar de vocales y,
propongan contar las vocales del mensaje recibido analizando si se trata de un número par
o impar. De esta manera pueden comprobar si la celda de integridad indica lo mismo.
Para finalizar la actividad, proponer a los estudiantes que analicen las siguientes
situaciones:
● ¿Qué dificultades presenta este sistema de detección de errores?
● ¿Es posible saber en qué palabra se produjo la alteración?
● ¿Se puede verificar correctamente la integridad si se borran dos vocales?
● ¿El destinatario puede verificar si se eliminó una consonante?
Se espera que los estudiantes adviertan que esta propuesta sólo detecta errores si se altera
una cantidad impar de vocales, dado que si se altera una cantidad par, se mantendría el
indicador “P” y sería imposible determinar que hubo una modificación. Con este método no
es posible detectar alteraciones en las consonantes, ni verificar en qué carácter fue el error,
por lo tanto sólo nos permite detectar algunos errores y no posibilita corregirlos.
Cierre
Para concluir la actividad, podés explicar que al enviar información a través de una red o al
almacenarla en un medio digital, es posible que las interferencias o el ruido puedan alterar
el contenido de la misma. En la actividad desarrollada se introdujeron alteraciones en las
tarjetas de mensajes y se propuso un método simple para detectar, en algunos casos, estos
errores. En el transporte de datos en redes y en Internet se usan distintas técnicas para
detectar errores y algunas incluso permiten corregirlos. Esta actividad aplica el concepto de
bit de paridad, que establece agregar un 0 si la cantidad de 1s del mensaje es par, en caso
contrario agregar un 1.
Ficha N°9
Ficha para el estudiante
Verificando la integridad del mensaje
Bajada
Utilizando la siguiente tarjeta, enviá tu propio mensaje según las pautas dadas por tu
docente.
Mensaje
DNI Remitente
DNI Destino
Mensaje
Chequeo de Integridad
Secuencia didáctica 8: Búsqueda de información en la Web
Bajada
Internet, como la gran red de redes, alberga millones de recursos accesibles a través de
múltiples servicios, siendo la Web uno de ellos. Es innegable la utilidad de la información
publicada en los distintos sitios web, pero en la actualidad acceder a información relevante
implica conocer el funcionamiento de aquellas herramientas que nos dan acceso a la
misma, es decir los buscadores web.
Los algoritmos que implementan los buscadores web incluyen, entre otras funciones,
distintas formas de mostrar a los usuarios los resultados de las búsquedas. Esto impacta
directamente en lo que el usuario puede considerar relevante o no, pensando que aquellas
referencias que se encuentran primero son las más importantes.
En esta secuencia didáctica se introducirá el concepto de búsqueda en la web y una
primera aproximación a cómo funcionan los buscadores. Para ello, se proponen dos
actividades. La primera es una actividad sencilla que permite contextualizar el problema:
existe mucha información en la web diseminada en miles de millones de páginas y
encontrarla no es una tarea que pueda realizarse manualmente. La segunda actividad
presenta un mecanismo de ordenación por relevancia para visualizar los resultados de una
búsqueda.
Objetivos
Que los estudiantes logren:
- Comprender que los buscadores web son herramientas necesarias para poder
obtener información relevante en la Web.
- Comprender que los buscadores aplican distintos mecanismos para ordenar los
resultados de las búsquedas.
Actividad
Titulo
¿Por qué necesitamos un buscador?
Objetivo
Que los estudiantes puedan:
- Reconocer la necesidad de contar con herramientas que asistan a los usuarios a la
hora de encontrar información en la Web.
Modalidad de trabajo
Grupos reducidos.
Cierre
A modo de conclusión, podés ayudar a tus estudiantes a elaborar la idea que los
buscadores en Internet permiten encontrar información en la Web. Esto se hace
simplemente escribiendo una frase o palabra relacionada con el contenido que te interesa
buscar, no siendo necesario conocer los nombres de todos los sitios web en los que podés
encontrar dicho contenido. Además es imposible saber de antemano cuáles son todos los
sitios web que contendrán información de interés y que con solo conocer la dirección de
unos pocos buenos buscadores en la web se puede encontrar información relevante en
millones de sitios web.
En 2005 había más de 11.500 millones de páginas web públicas accesibles a través
de buscadores:
https://es.wikipedia.org/wiki/World_Wide_Web#Estad.C3.ADsticas.
Existen sitios donde es posible obtener varias de estas estadísticas. Por ejemplo
según http://www.internetlivestats.com/total-number-of-websites/ hay más de 1000
millones de sitios web al momento de escribir este manual .
Actividad
Titulo
El orden de los resultados, ¿altera el producto?
Objetivos
Que los estudiantes puedan:
- Comprender cómo los buscadores en la Web ordenan los resultados mostrados
según su relevancia.
Modalidad de trabajo
Grupos reducidos.
Una vez realizada esta búsqueda, podés preguntar: ¿cuántos resultados obtuvieron?,
¿fueron los mismos resultados los obtenidos con los diferentes buscadores?. Dada la gran
cantidad y variedad de resultados que seguramente se obtendrán y con la idea de saber
qué criterio usan para seleccionar la información que les interesa, les podés preguntar:
¿cómo hacen para procesar o elegir el que les resulta más útil o interesante?. Posiblemente
surjan muchas propuestas, algunas podrán estar vinculadas a la preferencia por algún
buscador en particular, otras resultarán inesperadas, sin embargo es una buena
oportunidad para advertir que no solo es importante que el buscador encuentre sitios que
contengan los términos buscados, sino que también necesitamos que nos ayude a
ordenarlos por relevancia. Ahora podes preguntar: ¿qué es la relevancia en una
búsqueda?, ¿la relevancia se mantiene entre los distintos buscadores?, ¿para todos Uds.
son igualmente relevantes los resultados obtenidos?. Un supuesto ampliamente aceptado
postula que los primeros resultados que se muestran en la búsqueda son los más
destacados o significativos para la búsqueda.
Momento 2: calculando la relevancia
Con la intención de indagar sobre cómo los buscadores determinan la relevancia del
resultado de una búsqueda, podés preguntar a los estudiantes: ¿saben cómo los
buscadores ordenan los resultados de las búsquedas?, ¿cómo piensan que lo harán?.
Frente a estas preguntas, es probable que los estudiantes no encuentren fácilmente una
respuesta, aunque posiblemente se aproximen a la idea que algunos buscadores para
ordenar por relevancia cuentan la cantidad de ocurrencias de una o varias palabras en las
páginas: mientras más veces aparezca, más relevante se considera esa página y aparecerá
más arriba en la lista de resultados.
Luego podes explicar que existen otras formas más sofisticadas de determinar la relevancia
de un sitio en una búsqueda y que es la que se trabajará en esta actividad y que está
vinculada con la “popularidad” de las páginas. Esta técnica consiste en determinar la
relevancia de la información de acuerdo a cuántas referencias externas existen a esa
página. Los buscadores utilizan para esto los hipervínculos o enlaces que relacionan una
página con otra.
En este momento podés proponer a la clase simular el funcionamiento de un algoritmo de
ordenación de resultados de búsqueda según la relevancia en el sentido explicado. Para
ello, vas a enunciar una serie de palabras y les vas a pedir a los estudiantes que evoquen
qué película les trae primero a la mente cada palabra, solo vas a aceptar una respuesta por
estudiante. Por ejemplo, podrían ser las siguientes palabras: acción, romance, comedia,
drama, argentina, china, animación, nombres de actores, actrices o directores, entre otras.
Esta lista se puede adaptar a la cantidad de tiempo disponible para la actividad, inclusive
estas palabras pueden surgir del mismo grupo de estudiantes.
Luego, anotá en el pizarrón las respuestas de los estudiantes y, a partir de ellas, elaborá
una tabla por palabra a buscar, que sistematice las respuestas. Por ejemplo, si la lista de
palabras que enunciaste es: Histórica, Ciencia Ficción y Steven Spielberg, podrían surgir los
siguientes nombres de películas:
Histórica
300 3
Troya 1
La lista de Schindler 1
Tiburón 1
Indiana Jones 2
ET 2
Inteligencia Artificial 1
Ciencia ficción
ET 5
Inteligencia Artificial 1
Alien 4
Luego de haber armado las tablas que asocian películas con palabras y evocaciones de
estudiantes, proponé a la clase que busquen en las tablas una frase que contenga las
palabras enunciadas por vos. Solicitá a un estudiante que proponga una búsqueda usando
2 de esas palabras, podría ser “Ciencia ficción y Steven Spielberg”. En un primer momento,
podés pedir a los estudiantes que realicen la búsqueda eligiendo las películas que
contengan ambos palabras. Se espera que los estudiantes lleguen al siguiente resultado:
● ET
● Inteligencia Artificial
● La guerra de los mundos
Anotá en el pizarrón el primer resultado obtenido y luego armá junto con los estudiantes una
tabla de relevancia del resultado de la búsqueda según la “popularidad” de las películas, en
este caso serían las que fueron evocadas más veces por los estudiantes:
ET 7 5 2
Inteligencia Artificial 2 1 1
La guerra de los
4 2 2
mundos
Luego preguntá: ¿cómo se ordenará el resultado de la búsqueda?. Se espera que los
estudiantes respondan que el orden del resultado es el siguiente:
1. ET
2. La guerra de los mundos
3. Inteligencia Artificial
Luego, organizá a los estudiantes en grupos reducidos y pedile a cada grupo que haga más
búsquedas, usando un solo término y dos términos.
Una vez finalizadas estas actividades, planteá a modo de reflexión, los siguientes
interrogantes:
● ¿Podríamos haber elegido de forma diferente las películas, para incluir más?, ¿cómo?,
¿cuál sería el resultado?. Una posibilidad es elegir también a las películas que estén
asociadas con una sola de las palabras, de esta manera incluiríamos a las películas que
están solamente en la tabla “Ciencia Ficción” o “Steven Spielberg”. El nuevo resultado
incluiría 7 peliculas: 3 que contienen ambas palabras y 4 que contienen solo una de las
palabras (Rescatando al soldado Ryan, Tiburón, Indiana Jones y Alien). Sin embargo,
aunque pareciera en un principio que este resultado es más amplio, podría incluir
películas que no son de interés para el usuario.
● ¿Se podría haber contabilizado de forma diferente las evocaciones de las películas?,
¿de qué forma se les ocurre?. Una posibilidad podría ser calcular el máximo valor entre
las menciones de ambas palabras, por ejemplo: si buscamos “Ciencia ficción y Steven
Spielberg”, con este nuevo esquema de puntajes ET tendrá 5 puntos en lugar de los 7
asignados con el esquema propuesto anteriormente. En este ejemplo, el resultado final,
es decir el orden de relevancia del resultado de la búsqueda, se mantiene. Sin embargo,
en otros casos el sistema que se utilice para determinar la relevancia podría llevar
conducirnos a diferentes órdenes de relevancia.
Modelo de evaluación
En este anexo se proponen dos actividades integradoras que articulan los conceptos
abordados. Podrán desarrollarse tanto en grupos reducidos o en forma individual de
acuerdo a tu consideración. Luego de realizar las mismas, se podrá evaluar el desempeño
individual interrogando a los integrantes de cada grupo sobre los conceptos trabajados.
En la primera actividad integradora se busca poner en acción los conceptos aprendidos
sobre redes experimentando con la red de la escuela y la hogareña (si se dispone). En la
segunda actividad busca consolidar y reflexionar sobre protocolos.
Actividad Integradora 1
Titulo
Las redes hogareñas y su acceso a Internet
Objetivo
Que los estudiantes puedan:
- Relacionar los conceptos de redes aprendidos con los dispositivos de red
disponibles de la escuela.
Modalidad de trabajo
Actividad individual o en grupos reducidos.
Materiales y recursos utilizados
Las computadoras de la escuela; los celulares de los estudiantes, y un editor de imágenes,
como MiniPaint, disponible en https://lihuen.github.io/miniPaint
Bajada para el aula
Para dar comienzo a la actividad, planteá a los estudiantes los siguientes interrogantes:
¿cómo accedés a Internet desde la red de la escuela?, ¿podés hacerlo desde tu teléfono
qué necesitás para poder conectarte a Internet?, ¿con qué fichas del ‘dominó de
celular?, ¿
redes’ de la primera actividad de la secuencia didáctica 4 está relacionado?.
Se espera que los estudiantes respondan que la escuela accede a Internet a través de un
proveedor de servicios o ISP y que para conectarse a Internet desde su teléfono celular la
escuela debería contar con un router WiFi y tener permiso de acceso. Luego, solicitar a los
estudiantes que verifiquen si tienen conexión a Internet; y, a partir de ahí, analizar de qué
forma funciona.
Luego podés plantear una analogía entre la disponibilidad de Internet en la escuela y en sus
hogares (en caso que dispongan). Para ello, proponé que armen un gráfico, una especie
de maqueta simple en la que se representen los distintos dispositivos y otros elementos que
participan en el camino que recorre un mensaje enviado entre dos compañeros. Para tener
presente los elementos involucrados pueden utilizar, a modo de ayuda, las fichas del juego
de dominó de la primera actividad de la secuencia didáctica 4.
Para armar el gráfico, se podrá utilizar el editor de imágenes MiniPaint o cualquier otro con
el que se encuentren familiarizados. Una posible maqueta que representa los dispositivos
involucrados y el camino transitado por un mensaje entre los estudiantes Fernando y
Rosario, podría ser:
Actividad Integradora 2
Titulo
Programando protocolos
Objetivos
Que los estudiantes puedan:
- Desarrollar un protocolo simple de una situación conocida como es el cruce de calles
con un semáforo.
- Implementar una aplicación en Alice que simule el protocolo definido.
Modalidad de trabajo
Grupos reducidos.
Glosario
ARP: Protocolo estándar de resolución de direcciones el cual, dada una dirección lógica,
dirección IP, encuentra la dirección física asociada, dirección MAC.
Bit de paridad: Es un dígito binario que indica si el número de bits con un valor de 1 en un
conjunto de bits es par o impar. Los bits de paridad conforman el método de detección de
errores más simple.
Dirección IP: Es un número que identifica de manera lógica a una placa de red de un
dispositivo digital.
Dirección MAC: Es un número que identifica de manera física a una placa de red de un
dispositivo digital. Utiliza 48 bits que corresponde de forma única a la placa.
Familia de protocolos TCP/IP: Es el conjunto de protocolos de red estándares, en los que
se sustenta Internet y que implementan la transmisión de datos entre computadoras.
Hiperenlace o hipervínculo: Es un elemento constitutivo de una página web que referencia
a otro recurso, por ejemplo a otra página y que permite leer en Internet de forma
“hipertextual” en contraposición a la lectura secuencial.
Placa de red: Es un componente de hardware, también conocido como tarjeta de red,
incorporado en la computadora o en otros dispositivos electrónicos como teléfonos celulares
o tablets, que permite conectar a los dispositivos con una red informática para compartir
datos y recursos y, acceder a servicios.
Router: Dispositivo que permite conectar redes. Su principal función es enviar datos a una
dirección IP destino.
Servicio web: Es un aplicación de software que brinda acceso a los recursos de una
página web de un sitio determinado, a los clientes web y les envía los recursos solicitados.
Servidor: Es un programa que permite responder solicitudes de clientes. Los servidores se
pueden utilizar para diferentes tipos de servicios, el más conocido en Internet es el servicio
web.
Switch: Dispositivo que permite transmitir datos en una red cableada, interconectando otros
dispositivos. A diferencia del hub retransmite solo la información hacia el/los puerto/os que
tiene asociado/s con el destinatario, mejorando el rendimiento y la seguridad de las redes.
TCP: es un protocolo estándar de control de transmisión que permite entregar los datos al
destino, sin errores y en el orden en que se transmitieron en la red.
UDP: es un protocolo estándar de intercambio de datos a través de una red, a diferencia de
TCP, no verifica el orden en que arriban los mensajes ni si han llegado correctamente. Su
principal diferencia es que permite un intercambio más fluido ya que no realiza
retransmisiones en caso de error.
ANEXO IV
PROYECTOS
EDUCATIVOS
CON RITA
La búsqueda y adquisición de recursos digitales en
Internet, así como la producción de los propios, ofrece
un gran potencial cuando de aprender en la escuela se
trata. Por lo tanto, los proyectos educativos se presentan
como una posibilidad didáctica para que docentes y
estudiantes de diferentes años y asignaturas puedan
trabajar en torno a la creación, uso y apropiación de
diversos recursos con distintos objetivos y formatos.
Índice
● Secuencia didáctica 1: Recursos libres en la Web
○ Actividad: Buscando recursos libres
○ Actividad: Publicando recursos libres
● Secuencia didáctica 2: Empiezo a programar con RITA
○ Actividad: Descubro los bloques de RITA
○ Actividad: El robot dibuja un rectángulo imaginario
● Secuencia didáctica 3: Estrategias de robots en RITA
○ Actividad: Y si el robot choca contra un muro, ¿qué hace?
○ Actividad: El robot que enfrenta a quien le disparó
○ Actividad: El robot enfrenta a otro, solo si el arma está lista
○ Actividad: El robot que dispara y huye
Secuencia didáctica 1: Recursos libres en la Web
Bajada
Tanto en Internet como en otros medios de comunicación digital es posible encontrar
contenidos artísticos, textos, videos, audios, películas y otros tipos de información. Todos
ellos, al igual que los libros, los artículos de los diarios y las pinturas que están en soporte de
papel y telas están cubiertos por un marco legal que permite a los autores reservarse una
serie de derechos sobre sus obras. En esta secuencia didáctica se exploran distintas formas
de acceder a recursos libres que se pueden utilizar en un marco legal correcto. Se presentan
dos actividades que abordan esta problemática tanto en el momento de buscar recursos
digitales como cuando se publican los mismos, contribuyendo de esta manera para otros
usuarios de Internet puedan utilizarlos.
Objetivos
Que los estudiantes sean capaces de:
- Conocer diferentes repositorios digitales y explorarlos, atendiendo a los marcos
legales y licencias de uso.
- Producir recursos digitales y publicarlos en repositorios libres.
Actividad
Título
Buscando recursos libres
Objetivos
Que los estudiantes logren:
- Explorar algunos repositorios digitales de recursos multimediales libres.
- Identificar los filtros de búsqueda y conocer las licencias de uso, a partir de la
realización de búsquedas avanzadas en la Web.
Materiales
Computadoras con acceso a Internet.
Modalidad de trabajo
Actividad individual.
● El video es una copia de un contenido protegido, por ejemplo un anexo entero de una
serie o una película, y aparece una imagen como la Figura 2, donde el mensaje
menciona que el video fue bloqueado por violar el derecho de autor, es decir que quien lo
publicó no cuenta con el permiso para hacerlo.
Figura 2. Imagen que muestra Youtube cuando se intenta acceder a un recurso que no está disponible
● El usuario que lo subió luego lo eliminó o lo ocultó. En este caso aparece una imagen
similar a la mostrada en la Figura 2, pero esta vez indicando que el video fue eliminado
por quien lo publicó.
Mencionar que algunos de estos problemas pueden evitarse si se usan recursos libres,
tanto para la música de fondo de un video como para las imágenes mismas.
Luego preguntar a la clase: ¿cómo puedo saber si un video es libre o no?,¿qué significa que
sea libre: puedo reproducirlo, modificarlo, distribuirlo?.
En el caso de Youtube, se dispone de una herramienta que permite filtrar las búsquedas de
videos por esta característica: al presionar el botón de Filtros, es posible elegir “Creative
Commons” dentro de la sección “Características”. Explicar que con el término “Creative
Commons” se denomina a un conjunto de licencias1 que permiten indicar de qué manera se
pueden utilizar los recursos que se publican en Internet. Las licencias Creative Commons
son las más utilizadas para compartir obras artísticas en Internet. Son de carácter gratuito y
ofrecen a los autores varias posibilidades para citar, reproducir, crear obras derivadas y
distribuir obras bajo ciertas condiciones.
El sitio oficial donde se encuentra el detalle de cada una de las licencias y su aplciación es
https://creativecommons.org/licenses/?lang=es.
Proponer a los estudiantes que accedan al sitio de Youtube y busquen videos sobre el uso
de recursos libres en Internet, indicándoles que algunos de ellos podrán serle de gran
utilidad para las siguientes actividades del anexo.
Mencionar también que Youtube no es el único sitio donde encontrar videos libres, también
se pueden encontrar en:
● https://vimeo.com/
● https://commons.wikimedia.org/wiki/Category:Videos
● http://publicdomainreview.org/
1
Una licencia de uso es un documento que indica de qué manera se puede utilizar un recurso.
Es posible que de acuerdo al tipo de licencia de los contenidos encontrados no todos puedan
distribuir versiones modificadas de algunos contenidos, no puedan utilizarlos con fines
comerciales o estén obligados a mencionar al autor o dueño de los derechos si desean
publicarlos.
¿Sabías que hay recursos que son de dominio público?. Los derechos de autor
restringen el acceso y utilización de ciertas obras, pero los mismos expiran luego de cierta
cantidad de años de fallecido el autor. A partir de transcurrido este lapso, las obras
pueden ser utilizadas libremente por cualquier persona. Cuentos famosos como
“Pulgarcito” y la “Bella Durmiente” se encuentran en esta categoría de obras.
Explicar que hay varios sitios en los cuales es posible encontrar imágenes libres. Los más
conocidos son:
● Wikimedia: https://commons.wikimedia.org
● Openclipart:https://openclipart.org/
● Flickr2: https://www.flickr.com/
2
Nota: no todas las imaǵenes son libres, prestar atención cuando bajamos una imagen
Explicar que algunas de estas imágenes van a ser usadas más adelante en otras
actividades.
¿Sabías que también hay software libre?. Así como vimos que las obras artísticas se
pueden publicar con licencias que permiten su uso libremente, ocurre algo similar con el
software. El software libre abarca a todo aquél software que puede ser copiado,
modificado y distribuido libremente. Según su definición oficial. “los usuarios tienen la
”
libertad de ejecutar, copiar, distribuir, estudiar, modificar y mejorar el software
Podés encontrar más información en https://www.gnu.org/philosophy/philosophy.html
donde se describe tanto la filosofía como los orígenes de esta corriente iniciada por
Richard Stallman.
RITA una de las herramientas que usaremos en este anexo, es software libre, se puede
descargar, compartir y modificar libremente.
Cierre
A modo de cierre dialogar sobre los beneficios de publicar recursos propios con licencias
Creative Commons, de manera tal que otras personas que los necesiten puedan utilizarlos.
Si bien la ventaja más evidente es que no se deben crear nuevos recursos desde cero cada
vez que se realiza una producción, hay otros beneficios que quizás no sean tan evidentes,
como ser: dar a conocer autores a través de sus obras, favorecer la cultura libre, promover
que cada autor decida de qué manera quiere que sean utilizadas sus creaciones, entre otras.
Mencionar que existen otros sitios que también poseen varias referencias a recursos libres
como:
● Página de Creative Commons: https://creativecommons.org/about/platform/
● Sitio oficial de NASA: https://www.nasa.gov
● Proyecto OpenStreetMap: https://www.openstreetmap.org/
● Internet Archive: https://archive.org/
● Música libre: https://www.jamendo.com/
Actividad
Título
Publicando recursos libres
Objetivo
Que los estudiantes puedan:
- Producir recursos digitales con recursos libres.
- Experimentar la publicación de materiales libres en repositorios libres.
Materiales
Computadoras con acceso a Internet.
Modalidad de trabajo
Grupos reducidos.
Bajada para el aula
Para comenzar la actividad proponer a los estudiantes que busquen imágenes y videos libres
de su escuela y/o del barrio. Debido a que probablemente no encuentren gran cantidad,
indicarles que en esta actividad van a generar materiales y van a publicarlo y compartirlo de
manera tal que queden disponibles para que otras personas puedan utilizarlo libremente.
Si bien existen varios posibles formatos para armar este material, se propone armar un video
o una página del repositorio de Wikipedia. Para esto, dividir a los estudiantes en grupos
reducidos e indicar a cada grupo el tipo de trabajo a realizar: un video o una página en la
Wikipedia.
Para aquellos grupos que deban realizar un video, indicarles que pueden usar las
herramientas que más les guste para grabarlo y editarlo, pero que al finalizar el mismo, lo
deben subir a Youtube indicando que el video posea una licencia Creative Commons que
permita compartirlo y distribuirlo, para esto es necesario acceder a la pestaña “Configuración
avanzada” en la herramienta “Creator studio” de Youtube, como se muestra en la Figura 3.
Para aquellos grupos que deban trabajar con la Wikipedia se propone primero explorar el
tutorial provisto en el sitio: https://es.wikipedia.org/wiki/Ayuda:Introducci%C3%B3n. Deben
tener presente que los datos que se ingresen serán revisados y, por lo tanto deben ser
verídicos, así como la redacción, la adecuada. Recordarles que muchas veces utilizamos los
recursos de la Wikipedia para nuestras actividades escolares, con lo cual queremos
mantener la confiabilidad de la enciclopedia.
En todos los casos, recordar a los estudiantes que pueden incluir fotos, videos y grabaciones
propias, y que si incluyen materiales que obtuvieron de una búsqueda en Internet, deben
asegurarse que los mismos cuentan con los permisos adecuados para ser incluidos en sus
respectivos trabajos.
Entregar a los grupos la Ficha N° 1 donde encontrarán una guía para realizar la consigna
propuesta.
Cierre
A modo de cierre dialogar con los estudiantes respecto de lo que significa promover la
libertad de distribuir y modificar los trabajos creativos en Internet u otros medios digitales.
Explicar que ésta es una corriente de pensamiento a la que se conoce como cultura libre.
Según la Wikipedia, “la cultura libre es una corriente de pensamiento que promueve la
libertad en la distribución y modificación de trabajos creativos basándose en el principio del
contenido libre para distribuir o modificar trabajos y obras creativas, usando Internet así
como otros medios”. La cultura libre abarca tanto a los contenidos publicados bajo licencias
Creative Commons, como al software libre y las obras de dominio público.
Bajada
Vamos a producir un material digital sobre la escuela y tu barrio para luego publicarlo como
un recurso libre en Internet. En la clase te indicarán si tenés que crear un video para luego
subirlo a Youtube o si trabajarás en la elaboración de una página de la Wikipedia.
A) Buscá en la Web los recursos que vas a necesitar para armar el material: fotos, textos,
audios y videos. Tené en cuenta que todos los recursos que se utilicen deben tener permiso
de sus autores para ser usados y compartidos. También podés utilizar recursos propios:
fotos, audios o videos. Pero no te olvides que estos recursos también deberán estar
publicados como recursos libres para indicar de qué manera pueden ser utilizados. Acá
tenés algunos sitios donde buscar:
https://openclipart.org/
Imágenes
https://www.flickr.com/
https://www.jamendo.com/
Sonidos http://opsound.org
http://ccmixer.org
https://vimeo.com/
Videos https://www.youtube.com
https://commons.wikimedia.org/wiki/Category:Videos
https://www.nasa.gov
https://www.openstreetmap.org/
Varios Internet Archive: https://archive.org/
http://publicdomainreview.org.
https://commons.wikimedia.org
Bajada
RITA (Robot Inventor to Teach Algorithm) es una herramienta didáctica, cercana a la cultura
adolescente que promueve la enseñanza de la programación mediante un abordaje lúdico.
Con RITA los estudiantes programan con bloques juegos de robots virtuales que compiten
en un campo de batalla y cuyo desafío es programar estrategias de robots ganadores. Las
batallas de robots en RITA no promueven la violencia, no involucran personas, no contienen
sangre ni plantean situaciones de enfrentamiento racial, el objetivo es promover la
competencia de estrategias, programas, en un sentido positivo. RITA es una herramienta
libre, de código fuente abierto, disponible para su descarga desde
https://github.com/vaybar/RITA.
En esta secuencia didáctica se introducen los bloques de RITA, sus usos y cuestiones
propias del juego. La Figura 4 muestra la anatomía de un robot de RITA.
Los bloques de RITA representan acciones que el robot realiza en el campo de batalla.
Varias de estas acciones son para desplazarse en el campo de batalla y en respuesta a
eventos que ocurren en su entorno, por ejemplo cuando se choca contra un muro, cuando
otro robot lo ataca, entre otros. Asimismo, RITA cuenta con un amplio conjunto de bloques
para realizar operaciones aritméticas, trigonométricas, lógicas, manipular variables, etc.
Esta secuencia didáctica está organizada en 2 actividades: la primera propone a los
estudiantes explorar y reconocer cómo funcionan los bloques más significativos de RITA y la
segunda programar la primera estrategia de un robot virtual.
Objetivos
Que los estudiantes logren:
- Comprender el ambiente de programación y de ejecución de RITA.
- Introducirse en la programación de estrategias de robots en RITA.
Actividad
Título
Descubro los bloques de RITA
Objetivos
Que los estudiantes puedan:
- Identificar los bloques de RITA, su función y la ubicación en el menú de bloques.
- Comprender cómo giran y se desplazan los robots en el campo de batalla de RITA.
Modalidad de trabajo
En grupos reducidos.
Pedir a los estudiantes que analicen la disposición de los elementos de la pantalla principal
de RITA. Acercarse a la computadora de cada grupo y mostrarles cada una de estas partes:
una barra de menú en la parte superior, un conjunto de bloques disponibles del lado
izquierdo, un área de trabajo, un tacho de basura, un ícono en la parte inferior izquierda para
probar el robot en el campo de batalla y un minimapa (visualizador en miniatura del área de
trabajo). La Figura 6 muestra la pantalla de RITA que representa el área de trabajo.
Pedir a los estudiantes que averigüen dónde están los bloques de la Ficha Nº 2 y qué hace
cada uno de ellos. En este punto advertir que tienen 10 conjuntos de bloques donde
buscarlos y que el color del bloque les servirá de guía para encontrarlo. Considerar que al
posicionar el mouse sobre los bloques de RITA aparece una leyenda que explica en
castellano su funcionamiento.
Recorrer las mesas de trabajo de los diferentes grupos y preguntar: ¿qué bloques les
resultan más simples de entender?, ¿cuáles más complejos?. Anotar aquellos que resultaron
más complejos con la intención de explicarlos en una puesta en común.
Dar un tiempo para completar la Ficha Nº 2 y luego hacer la puesta en común tomando como
insumo las anotaciones que hechas. A continuación, preguntar: ¿qué piensan qué hace el
bloque “run”?, ¿para qué sirve?, ¿y el bloque “onHitWall”?. Posiblemente a los estudiantes
les resulte difícil responder estas preguntas aunque podrían aproximarse a la idea que el
bloque “run” es similar a la programación del evento: “When the world starts, do” de Alice. En
este momento, explicar que el bloque “run” contiene las acciones que se ejecutan mientras
no ocurran eventos en el entorno del robot, como por ejemplo chocar con otro robot, chocar
con un muro, detectar otro robot, entre otros. Sobre el funcionamiento del bloque “onHitWall”,
explicar que permite incorporar las acciones que realiza el robot cuando choca contra un
muro.
En relación a los restantes bloques de la ficha, se puede explicar a la clase que los usarán
para implementar la estrategia del robot y se ubicarán adentro del bloque “run” y “onHitWall”.
Seguidamente preguntar: ¿por qué piensan que hay bloques que usan grados, como por
ejemplo el “bearGunTo”, “turnTo” y “turnGunLeft”?. En este momento se puede explicar que
los robots se mueven en un campo de batalla representado en la pantalla como un plano y
que usan un sistema de coordenadas (x,y) como muestra la Figura 7. El tamaño del campo
de batalla dependerá de la resolución del monitor. Para girar el robot se necesita información
de los grados a girar, esta información puede ser absoluta o relativa a la orientación actual
del robot o de su arma. Algunos bloques hacen giros absolutos, por ejemplo 90º, 180º, 60º,
de acuerdo a como se muestra en la Figura 7 y otros hacen giros relativos por ejemplo los
que incluyen en su nombre la palabra “bear” .
La solución de la ficha propuesta es la siguiente:
Cierre
A modo de cierre se puede explicar que:
● Los robots en RITA se mueven en un plano de 2 dimensiones (x,y) cuyo tamaño es
800x600 (se trabajará con esta configuración).
● Los bloques se usan para programar un robot.
● Hay bloques que se usan para contener la estrategia de combate del robot como “run” y
“onHitWall” que se trabajaron en esta actividad, a lo largo del anexo se verán otros.
● Hay bloques que se usan para darle al robot indicaciones de cómo moverse, por ejemplo:
“turnTo”, “turnRight”; otros para obtener información de si mismo, por ejemplo:
“gunReady”, “energy” y otros de su entorno, por ejemplo: “fieldWidth”.
● Hay bloques que implementan las estructuras de control, como “if...then”, “for...times..do”,
“while…” y otros que permiten hacer operaciones lógicas como comparaciones: “==”, “>=”
y otros aritméticas como “+”, “*”.
Ficha N° 2
Ficha para el estudiante
Descubriendo los bloques de RITA
Bajada
Explorá RITA y averiguá qué hacen y dónde están ubicados los bloques del siguiente
cuadro. Para cada bloque del cuadro, anotá el grupo de bloques donde lo encontraste e
indicá para qué pensás que sirve.
Objetivos
Que los estudiantes puedan:
- Programar y ejecutar un robot sencillo en RITA.
- Comprender a partir de la puesta en acción, los bloques de desplazamiento y giro de
RITA.
- Comprobar que hay varias soluciones para un mismo problema y que es posible
mejorar las soluciones obtenidas.
Modalidad de trabajo
Actividad en grupos reducidos.
Momento 1: exploración
Indicar a los grupos que comiencen a trabajar y darles un tiempo para que resuelvan la
consigna dada, podrían ser 20 minutos o lo que se considere adecuado en función del
desempeño de los estudiantes.
Seguidamente, preguntar: ¿dónde ubican los bloques que dibujan el rectángulo? y ¿cómo
piensan que podrían probarlo?. En relación a la primera pregunta, se espera que los
estudiantes adviertan que los bloques que dibujan se ubican en el bloque “run”. Se puede
recuperar la explicación del propósito del bloque “run” de la actividad previa.
En lo que refiere a la segunda pregunta, probablemente no todos los grupos encuentren
respuesta. Indicarles que haciendo “clic” e n el botón “Ver Código”, que se encuentra en el
“área de trabajo”, se desplegarán 2 opciones, y que deben elegir la opción “Compilar y
Ejecutar”3. Al elegir esta opción se abrirá una ventana de diálogo como muestra la Figura 8.
Explicar que deben seleccionar los robots que competirán en el campo de batalla con el que
se está programando. A partir de esta ventana se puede definir la ubicación y orientación
inicial de cada robot, como muestra la Figura 9.
3
En el anexo 8 se trabajará el concepto de compilación.
Figura 8 - Ventana de selección de robots que competirá con el que se está programando
Seguidamente explicar que, por tratarse de una competencia de robots, deberán tener las
siguientes consideraciones para iniciar la competencia:
● Siempre se necesita un contrincante para hacer una competencia: al menos hay que
elegir un robot de la ventana de selección de robots (Figura 8). Si no eligen contrincante,
no hay competencia y no hay juego.
● En esta actividad hay que elegir un contrincante que no interfiera con el que dibuja el
rectángulo: lo tiene que dejar dibujar y por ejemplo no chocarlo. Proponer que compitan
con “Mambo” que no hace nada.
● En esta actividad es necesario configurar la posición y orientación inicial del robot que
dibuja el rectángulo imaginario como lo indica la Figura 10: esquina inferior izquierda del
campo de batalla, en la posición (132, 39) y orientado hacia el norte.
Figura 10- Configuración de la posición inicial del robot que dibuja el rectángulo imaginario
● Finalmente configurar la posición inicial del contrincante Mambo: centro del campo de
batalla (centro de la grilla en la Figura 10). Los valores de posición y orientación no
afectarán el resultado de la actividad, se puede elegir cualquiera.
En este momento preguntar: ¿qué métodos usaron para girar?, ¿y qué ángulos?. Recoger
las respuestas recibidas para sistematizar las siguientes ideas:
● ara girar el robot, deben ajustar el ángulo en los distintos
si eligieron el bloque “turnTo” p
momentos de giro a 0º, 90º, 180º y 270º. El ángulo de giro es absoluto.
● si usaron el bloque “turnRight” simplemente deberán ajustar el ángulo de giro a 90º en
cada momento. El ángulo de giro es relativo a la posición del robot.
Preguntar: ¿el robot es capaz de dibujar rectángulos de manera repetitiva?. Es muy probable
que no funcione repetitivamente y que surja el problema que una vez que se terminó de
dibujar el primer rectángulo, el robot no quede correctamente orientado para dibujar el
próximo. Pedir que analicen los bloques del método “run” y luego preguntar: ¿dónde está el
problema?, ¿cómo se soluciona?.
Aquí pueden surgir varias propuestas de solución. Una de ellas es colocar como primer
Cierre
A modo de cierre se puede reflexionar junto con con los estudiantes que:
● El problema propuesto tiene más de una solución y que en cualquiera de ellas se usan
los bloques “ahead”, “turnTo” ó “turnRight”.
● En el caso de usar el bloque “turnTo”, el ángulo de giro es absoluto considerando el
sistema de coordenadas de RITA, por tanto es diferente en cada esquina.
● En el caso de usar el bloque “turnRight” el giro es relativo a la orientación actual del robot
y solo necesita girar 90º.
● En la puesta a prueba de la solución aparecieron cuestiones que no se contemplaron
durante el desarrollo, esto permite la mejora continua de la solución.
Finalmente preguntar a los estudiantes ¿cuántos bloques diferentes usaron en la solución
además de los de avance y giros?. Seguramente aquí surjan distintas respuestas:
● algunos grupos dibujaron el robot usando estructuras de control iterativas, iterando 4
veces el boque de avance y giro, y
● otros grupos construyeron una solución paso a paso.
Tres soluciones del robot que dibujan el rectángulo imaginario pueden descargarse de:
http://linti.unlp.edu.ar/anexo6/Sec2act2res1
http://linti.unlp.edu.ar/anexo6/Sec2act2res2
http://linti.unlp.edu.ar/anexo6/Sec2act2res3
Ficha N° 3
Ficha para el estudiante
El robot dibuja un rectángulo imaginario
Bajada
Construí un robot en RITA que dibuje un rectángulo imaginario (sin trazo) indefinidamente,
empezando desde la esquina inferior izquierda y con el robot orientado hacia el norte. Las
medidas del rectángulo son 500 de alto y 650 de ancho. Seguí las indicaciones dadas en
clase.
Bajada
Los robots en RITA despliegan su estrategia en el campo de batalla cuando compiten con
otros robots. Pero….¿qué es la estrategia del robot? y ¿dónde la programamos?, las
respuestas a estas preguntas serán la guía de esta secuencia didáctica. La estrategia es el
comportamiento del robot, es lo que hace en el campo de batalla, y en varias situaciones son
reacciones a eventos que ocurren en su entorno, el campo de batalla.
En esta secuencia didáctica se retoman los conceptos de programación orientada eventos
introducidos en los anexos previos. Los robots de RITA reaccionan a eventos que pueden
ocurrir en su entorno, el campo de batalla, como: chocar contra un muro, chocar contra un
robot, ser alcanzado por el disparo de un robot y, escanear y detectar la presencia de un
robot.
Cada actividad de esta secuencia didáctica introduce reglas de juego propias de RITA y
propone analizar los movimientos del robot, tanto de su cuerpo como de su arma, con
especial atención en la aplicación de conceptos de ángulos y sistemas de coordenadas
cartesianas aprendidos en matemática. Asimismo en estas actividades se trabaja en la
programación de estrategias defensivas, ofensivas o simplemente acciones de supervivencia
en el campo de batalla.
Objetivos
Que los estudiantes logren:
- Comprender qué es un evento en RITA y cómo responden los robots a los eventos.
- Analizar problemas en los que ponen en acción conocimientos sobre coordenadas
cartesianas y trigonometría aprendidos en matemática.
- Construir tanto individual como colectivamente, estrategias de robot que sean
capaces de competir con otros robots en el campos de batalla de RITA.
Actividad
Título
Y si el robot choca contra un muro, ¿qué hace?
Objetivos
Que los estudiantes puedan
- Introducirse en el mundo de los eventos de RITA.
- Consultar los bloques de información para programar soluciones.
- Comprender cómo se desplaza y gira un robot en el campo de batalla de RITA.
- Programar una estrategia supervivencia.
Modalidad de trabajo
Actividad en grupos reducidos.
Materiales y recursos utilizados
Una computadora con RITA instalado y la Ficha N° 4.
Bajada para el aula
Para comenzar la actividad, entregar a cada estudiante la Ficha N° 4 y organizarlos en
grupos. Luego indicar que en esta actividad programarán un robot que reacciona cuando
choca contra uno de los muros del campo de batalla. Se puede explicar que un muro es un
borde del campo de batalla.
Advertir a los estudiantes que se espera que el robot sea lo suficientemente inteligente como
para continuar en el juego cuando choque contra un muro. En este momento explicar que
cada vez que el robot choca contra un muro se detiene momentáneamente y es vulnerable a
ataques, por lo tanto se debe programar una estrategia de supervivencia, que lo haga salir
rápidamente de ese lugar. Seguidamente, preguntar: ¿qué bloque reacciona cuando “el robot
choca contra un muro”?. Se espera que recuerden de la secuencia didáctica 2 que cada vez
que el robot choca contra un muro se ejecuta el bloque “onHitWall”. En ese momento el robot
deja de hacer lo que estaba haciendo y atiende el evento ocurrido.
Realizar una serie de preguntas para analizar colectivamente el problema a resolver.
Comenzar preguntando: ¿cuáles son los muros con los que podría chocar el robot?. Se
espera que identifiquen los siguientes casos:
● el robot choca el muro norte
● el robot choca el muro sur
● el robot choca el muro este
● el robot choca el muro oeste
Luego preguntar: ¿cómo piensan detectar contra cuál de los muros podría chocar el robot?.
Posiblemente no surja rápidamente la respuesta, en ese caso sugerir a los estudiantes que
piensen en la posición actual del robot, para ello hacer una pregunta más simple: ¿cómo
saben cuál es la posición actual del robot?. Se espera que recuerden que en la secuencia
didáctica 2 analizaron el bloque “robotX” del grupo de “Información” y que éste devuelve la
posición del robot en el eje X del campo de batalla. De manera análoga, pueden consultar la
posición en el eje Y con el bloque “robotY”. Con estos datos se puede determinar la posición
actual del robot en el campo de batalla. Seguidamente preguntar: ¿cuándo piensan que el
robot está cerca de un muro?. Las propuestas pueden ser variadas, acordar con los
estudiantes que el robot está cerca de un muro, si está a menos de 50 pasos.
Retomar la pregunta ¿cómo piensan detectar contra cuál de los muros podría chocar el
robot?. Se puede orientar la respuesta dibujando en el pizarrón un gráfico similar a la Figura
12 y analizando con toda la clase las zonas de peligro de choque:
● si el valor de robotX es menor que 50, puede chocar contra el muro oeste.
● si el valor de robotX es mayor a 750, puede chocar contra el muro este.
● si el valor de robotY es menor que 50, puede chocar contra el muro sur.
● si el valor de robotY es mayor que 550, puede chocar contra el muro norte.
Figura 12 - Zona de choques contra muros
En este punto se puede explicar que el campo de batalla tiene un tamaño predeterminado de
600x800, sin embargo podría configurarse para adoptar otras medidas. Por este motivo,
dentro del bloque “información” existen bloques que pueden ser consultados para conocer el
tamaño real del campo de batalla:
● fieldWidth: ancho del campo de batalla
● fieldHeight: alto del campo de batalla
Advertir a los estudiantes que para la actividad propuesta se pueden usar los bloques de
“Información” para consultar el tamaño del campo de batalla o directamente los valores
predeterminados (600,800).
Una vez que los estudiantes pueden identificar el muro contra el que choca el robot,
preguntar: ¿qué hace el robot cada vez que choca contra un muro?. Aquí se puede retomar
la consigna inicial: el robot debe continuar el juego y salir rápidamente de ese lugar. Pueden
surgir varias ideas, probablemente coincidan en cambiar de dirección del robot y continuar
avanzando. Para analizar esta situación, proponer que consideren que el robot choca contra
el muro norte y luego preguntar: ¿cómo posicionarían al robot en la dirección opuesta?. Se
espera que adviertan que tienen que girar el robot, sin embargo no es sencillo saber cuál es
dirección opuesta. La forma más simple de girar al sur es usar el bloque “turnTo” que
Cierre
A modo de cierre de la actividad, hacer una puesta en común de las soluciones propuestas
por los estudiantes, compararlas y explicar que:
● El bloque “onHitWall” indica al robot que chocó contra un muro. Todos los bloques
contenidos en él representan la estrategia del robot cada vez que choca contra un muro.
En el ejemplo, el robot cambia de dirección evitando ser un blanco fácil. Es una
estrategia de supervivencia.
● Los bloques “fieldWidth” y “fieldHeight” permiten abstraernos del tamaño del campo de
batalla. Si los usamos, nuestro robot va a funcionar para cualquier tamaño de campo de
batalla. Si bien los valores predeterminados son 600 y 800, estos valores son
configurables y podrían cambiar. La solución que usa los bloques “fieldWidth” y
“fieldHeight” es más general.
Ficha N°4
Ficha para el estudiante
Y si el robot choca contra un muro, ¿qué hace?
Bajada
Esta actividad no pretende que tu robot se defienda o ataque, simplemente que circule sobre
el campo de batalla. Cuando el robot se mueve y choca contra un muro, se detiene y si no
tiene una estrategia pensada, simplemente seguirá tratando de moverse en la misma
dirección sin poder lograrlo. Esta es una situación potencialmente peligrosa, otros robots
podrían atacarlo fácilmente.
Por tanto, en caso de chocar contra un muro, tu robot debe contar con alguna estrategia para
esquivarlo, ¡en definitiva este muro es un obstáculo!. ¿Te animás a agregarle inteligencia a
tu robot para seguir por otro camino cuando choque contra alguno de los muros?
El siguiente gráfico puede ayudarte a analizar las zonas de peligro de choque contra los
muros.
Actividad
Título
El robot que enfrenta a quien le disparó
Objetivos
Que los estudiantes puedan:
- Introducirse en la programación de estrategias de robots que interactúan con otros
robots.
- Conocer y comprender el tipo de información que brinda el entorno de RITA para
programar estrategias.
- Programar una estrategia defensiva.
Modalidad de trabajo
Actividad en grupos reducidos.
Proponer a los estudiantes que ejecuten su robot y comprueben su estrategia. Para ello,
recomendar que elijan como contrincante al robot “Tracker” o a “RamFire”, ambos están
incluidos en RITA y sus estrategias son ofensivas. Advertir que no es necesario posicionar
los robots en un lugar particular del campo de batalla.
Una solución de “El robot enfrenta a quien le disparó” está disponible en:
http://linti.unlp.edu.ar/anexo6/Sec3act2res1
Cierre
A modo de cierre reflexionar junto con los estudiantes la siguiente característica del juego: si
bien la estrategia consiste en que el robot reacciona apenas detecta que fue atacado por otro
robot, disparándole, hay tiempos que se deben considerar; por ejemplo el tiempo de giro
para posicionarse correctamente, el tiempo que lleva disparar y el tiempo de la trayectoria de
la bala. Por lo tanto, no se puede garantizar que la acción resulte totalmente efectiva. Se
pueden hacer sucesivas pruebas y ajustar estos tiempos.
Finalmente, explicar que así como el bloque “hitByBulletAngle” brinda información del ángulo
del que el robot recibió el ataque, existen otros bloques de información que también
resultarán útiles para programar estrategias de robots y que se irán trabajando a lo largo del
anexo.
Ficha N°5
Ficha para el estudiante
El robot enfrenta a quien le disparó
Bajada
En esta actividad tu robot tomará una actitud defensiva. Un robot enemigo acaba de
dispararle y es una buena oportunidad para devolver el ataque. El robot debe responder el
ataque en la misma dirección por donde fue recibido el impacto. ¿Te animás a posicionar tu
robot de modo que se defienda cuando ocurra este tipo de ataque?
Actividad
Título
El robot enfrenta a otro, solo si el arma está lista
Objetivos
Que los estudiantes puedan:
- Programar una estrategia ofensiva.
Modalidad de trabajo
Actividad en grupos reducidos.
Figura 15 - Estrategia ofensiva: El robot ataca cuando detecta un robot en el campo de batalla
Proponer a los estudiantes que ejecuten su robot y comprueben su estrategia. Para ello,
recomendar que elijan como contrincante al robot SpinBot, incluido en RITA. SpinBot no
tiene una estrategia en particular, es un robot movedizo, hace muchos giros en el campo de
batalla y por eso es ideal para probar estrategias que buscan atacar. Advertir que no es
necesario posicionar los robots en un lugar particular del campo de batalla.
Una solución de “El robot enfrenta a otro, solo si el arma está lista” está disponible en:
http://linti.unlp.edu.ar/anexo6/Sec3act3res1
Cierre
A modo de cierre de la actividad, reflexionar junto con los estudiantes acerca de la estrategia
ofensiva que elaboraron. Una estrategia ofensiva no se refiere a realizar disparos todo el
tiempo, sino a proponer un conjunto de acciones que pueden resultar realizables, teniendo
en cuenta las reglas del juego en RITA. A modo de ejemplo, que el arma esté lista es un
condicionante para poder disparar, dado que una de las reglas del juego establece que el
arma se calienta ante disparos sucesivos y no puede usarse hasta que se enfríe. Por ello fue
necesario usar el bloque “gunReady”.
Ficha N°6
Ficha para el estudiante
El robot enfrenta a otro, sólo si el arma está lista
Bajada
En esta actividad tu robot tomará una actitud ofensiva. Un robot ha sido detectado en el
campo de batalla, y se espera que tu robot le dispare y trate de acertar. La única
consideración especial es que no tratará de disparar en vano, solo lo hará si el arma está
lista. ¿Te animás a escribir la estrategia ofensiva de tu robot?
Actividad
Título
El robot que dispara y huye
Objetivos
Que los estudiantes puedan:
- Ejercitarse en la programación de estrategias de robots complejas que hagan uso de
los conceptos trabajados en las actividades previas.
Modalidad de trabajo
Actividad en grupos reducidos.
Seguidamente, explicar a los estudiantes una característica del juego en RITA: cuando un
robot choca contra otro, la información del ángulo en el que ocurre el choque se mantiene
durante un período de tiempo corto, por lo tanto, esa información debe guardarse, si se va a
necesitar.
Dar un tiempo para que cada grupo analice el problema planteado y luego hacer una puesta
en común, con una serie de preguntas, para ayudar a construir las ideas de la estrategia del
robot :
● ¿Cómo piensan guardar la información del ángulo donde ocurrió el choque?. Se espera
que los estudiantes respondan que necesitan una variable. En este momento se puede
explicar que las variables en RITA se definen usando el grupo “Nuevas Definiciones”. La
forma de uso de las variables en RITA es la siguiente: para definir una variable, arrastrar
el bloque “nombreDeVariable” y renombrar la variable. Luego para recuperar o modificar
su valor, hacer clic c on el botón derecho del mouse sobre la variable. En este ejercicio
solo será necesario el bloque para recuperar el valor de la variable.
● ¿Qué bloque representa al evento “el robot choca con otro robot”?. Se espera que los
estudiantes lo busquen entre los bloques “A Codificar” e identifiquen el bloque
“onHitRobot”.
● ¿Cómo se puede obtener el ángulo en el que ocurrió el choque con el contrincante?. Se
espera que los estudiantes recuerden, de las actividades previas, que la información
sobre el robot y su entorno se encuentra en el grupo “Información” y que identifiquen el
bloque “hitRobotAngle” como el que provee la información sobre el ángulo de choque.
● ¿Cómo se puede posicionar el robot en forma perpendicular a la orientación actual?. Es
probable que la respuesta no surja inmediatamente, ayudar a los estudiantes realizando
un gráfico en el pizarrón similar al de la Figura 13. Mostrar que si se resta o se suman
90º al ángulo de choque, este nuevo valor tendrá una orientación perpendicular al
anterior.
Dar un tiempo para que todos los grupos desarrollen su solución, podrían ser
aproximadamente 30 minutos y luego hacer una puesta en común. Una posible solución de
un robot que huye cuando choca contra otro robot es la que se muestra en la Figura 17:
cambia la orientación del robot girando perpendicularmente, gira el arma hacia el ángulo de
choque, dispara y luego huye.
Proponer a los estudiantes que ejecuten su robot y comprueben su estrategia. Para ello,
recomendar que lo realicen en dos etapas: en la primera que elijan a SpinBot para verificar
que la estrategia funciona de acuerdo a lo planificado y en la segunda que elijan a un robot
de ataque como Tracker o RamFire para comprobar la efectividad de la estrategia. Advertir
que no es necesario posicionar los robots en un lugar particular del campo de batalla.
Una solución de “El robot que dispara y huye” está disponible en:
http://linti.unlp.edu.ar/anexo6/Sec3act4res2
Cierre
A modo de cierre reflexionar junto con los estudiantes sobre las siguiente variaciones de la
solución:
● Solución 1: girar el robot para posicionarse perpendicularmente, girar el arma al ángulo
de choque, disparar y luego avanzar.
● Solución 2: girar el arma al ángulo de choque, disparar, posicionarse perpendicularmente
y avanzar.
En la Solución 1, el robot antes de disparar está listo para huir, sin embargo, demora en
disparar porque se posicionó, por tanto el contrincante tiene más tiempo para huir.
En la Solución 2, si bien el robot dispara inmediatamente, lo que le da más probabilidades de
acertar al contrincante, demora más para posicionarse y huir, aumentando las posibilidades
de ser atacado.
Las dos soluciones son correctas, cada una tiene sus pros y contras.
Ficha N°7
Ficha para el estudiante
El robot que dispara y huye
Bajada
En esta actividad tu robot tomará una actitud ofensiva. En caso de choque contra otro robot,
aprovechará el incidente para posicionarse apuntando al ángulo donde ocurrió el choque y
disparará. Recordá que es muy probable que el otro robot tenga una estrategia preparada
ante un disparo enemigo, por lo tanto, tu robot debe estar preparado para huir rápidamente
una vez realizado el disparo ¿Ayudás a tu robot a construir esta estrategia?.
El siguiente gráfico puede ayudarte a analizar el escenario de choque y de huída: