Robótica: Serie Innova
Robótica: Serie Innova
Robótica
SERIE INNOVA
2
El libro Robótica, para el segundo curso de ESO, es una obra colectiva
concebida, diseñada y creada en el Departamento de Ediciones Educativas
de Santillana Educación, S. L., dirigido por Teresa Grence Ruiz.
EDICIÓN
Raúl M.ª Carreras Soriano
Laura Muñoz Ceballos
EDITOR EJECUTIVO
David Sánchez Gómez
1. Lenguajes de programación.................................................. 6
1. Lenguajes de programación.......................................................... 8
2. Diagramas de flujo........................................................................ 9
3. Scratch.......................................................................................... 10
Proyecto. Crea un videojuego completo.......................................... 32
2. Programación......................................................................... 36
1. Lenguajes de programación. Processing...................................... 38
2. Dibujar con Processing................................................................. 40
3. Variables y funciones.................................................................... 46
4. Repeticiones y bucles................................................................... 48
5. El color en una pantalla de ordenador......................................... 49
6. Eventos de ratón y teclado........................................................... 56
7. Trabajo con imágenes................................................................... 62
8. Trabajo con tablas de datos. Arrays.............................................. 64
Proyecto. Programa un editor de imágenes..................................... 68
4. Sensores................................................................................. 106
1. ¿Qué son los sensores?................................................................ 108
2. Sensores de luz............................................................................. 110
3. Sensores de infrarrojos................................................................. 116
4. Sensores de posición.................................................................... 120
5. Sensores de temperatura............................................................. 121
6. Sensores de sonido....................................................................... 125
7. Sensores de proximidad............................................................... 128
8. Sensores de distancia. Ultrasonidos............................................. 130
Proyecto. Construye un sensor para medir el nivel de un depósito. 134
2
5. Control automático y robótica.............................................. 138
1. Máquinas automáticas y sistemas de control.............................. 140
2. ¿Qué es un robot?......................................................................... 141
3. Motores de corriente continua, DC.............................................. 142
4. Servomotores o servos................................................................. 148
5. Relés.............................................................................................. 151
6. Señales periódicas........................................................................ 153
Proyecto. Construye un robot siguelíneas....................................... 158
ANEXO
Referencia para programar en el IDE de Arduino............................. 244
3
Te encantará SABER HACER CONTIGO porque:
La introducción a cada
unidad se presenta
Se incluye teoría a partir de
(SABER) y prácticas una pregunta.
o procedimientos
(SABER HACER).
4
3 Trabajo de las competencias
4 Proyecto
5
2 Programación
SABER
• Lenguajes de programación.
Processing.
• Dibujar con Processing.
• Variables y funciones.
• Repeticiones y bucles.
• El color.
• Eventos de ratón y teclado.
• Trabajo con imágenes.
• Trabajo con tablas de datos. Arrays.
SABER HACER
36
NOS HACEMOS PREGUNTAS.
¿Cómo se producen escenas «imposibles» en el cine?
Ya sea en el ámbito de la animación infantil, de las películas de terror, de acción
o de ciencia ficción, el ordenador lleva unos años desempeñando un papel clave.
Paisajes de otros mundos, juguetes que hablan y gesticulan, transformaciones
«mágicas» o creación de seres imaginarios son algunos ejemplos.
En muchos paisajes
«fantásticos» se usan
como base imágenes
de paisajes reales.
• ¿Qué elementos de la imagen te parecen generados mediante • ¿Qué es el software de dibujo en 3D?
ordenador? ¿Crees que las películas que emplean escenas ¿Cómo pueden generarse dibujos en 3D?
generadas mediante ordenador son más fáciles • Opina. Hay quien dice que
de desarrollar? ¿Por qué? la introducción del ordenador en el cine
• ¿Qué ventajas añade la técnica de captura de movimiento ha tenido consecuencias negativas.
frente a la generación completa de imágenes mediante ¿Qué te parece a ti?
el ordenador?
37
1 Lenguajes de programación. Processing
SABER HACER
38
Programación 2
Menú principal
SABER MÁS
39
2 Dibujar con Processing
SABER HACER
40
Programación 2
SABER HACER
41
SABER HACER
PRESTA ATENCIÓN
ACTIVIDADES
Indica cuál es 3 Dibuja esta figura
el error usando sentencias
triangle().
4 Dibuja un rombo
con una sentencia
quad().
42
Programación 2
SABER HACER
Rectángulos
Para dibujar un rectángulo se utiliza la función rect():
rect(x, y, ancho, alto, radio);
• x e y son las coordenadas de la esquina superior
izquierda del rectángulo.
• ancho y alto son las dimensiones correspondientes
del rectángulo.
• radio es un parámetro opcional (si no quieres usarlo, ACTIVIDADES
puedes dejarlo en blanco) que permite dibujar
rectángulos con esquinas redondeadas, donde radio 5 Utiliza lo que acabas de aprender y dibuja
sería el radio de la circunferencia que redondearía la siguiente figura en Processing.
la esquina.
43
SABER HACER
Processing puede dibujar 256 niveles de gris distintos: Ahora practica con esto:
• 0: corresponde al negro puro.
1. Crea una ventana de 200 3 200 píxeles.
• 255: corresponde al blanco puro.
El valor que has visto como color de fondo en los ejemplos 2. Ajusta un nivel de gris de 0, 128 y 255,
en las páginas anteriores era 204, un gris claro. respectivamente.
Para establecer el nivel de gris de la ventana de dibujo 3. Ejecuta los programas. Observarás ventanas como
se usa esta sentencia: las de abajo.
background(n);
n es el valor de gris que quieres asignar al fondo
de la ventana.
44
Programación 2
En el ejemplo siguiente podemos ver variaciones en los valores de borde y relleno de una circunferencia.
ellipse (75,75,60,60);
/*Circunferencia superior izquierda. Al ACTIVIDADES
tener los valores por defecto, el relleno
es blanco y el contorno, negro.*/ 7 Dibuja la siguiente figura:
fill(195);
//Vamos oscureciendo el relleno.
stroke (90);
//Vamos aclarando el borde.
ellipse (150,75,60,60);
//Circunferencia superior derecha.
fill(120);
stroke (200);
ellipse (75,150,60,60);
//Circunferencia inferior izquierda.
fill(60);
stroke (255);
ellipse (150,150,60,60);
//Circunferencia inferior derecha.
45
3 Variables y funciones
Boolean boolean Son variables que solo pueden tomar dos valores: true o false, verdadero o falso.
String String Es una cadena de caracteres. Por ejemplo, una frase como «Había dos gatos jugando en el jardín».
Las variables deben crearse antes de usarse en 2. Ejecútalo. El programa mostrará una ventana
un programa. Esto se llama «declarar la variable». de dibujo de 200 píxeles de ancho y 100 de alto.
Escribe y ejecuta este programa en Processing. 3. Ahora elimina la primera línea (int ancho;)
y vuelve a ejecutarlo.
int ancho;
ancho=200; 4. Aparecerá el siguiente mensaje en la consola:
int alto; Cannot find anything named “ancho”.
alto=100; Ese mensaje de error indica que no encuentra nada
size(ancho, alto); con el nombre «ancho», pues no has definido
previamente qué era la variable ancho (no la has
«declarado»), y para Processing es algo desconocido.
Asignación de valores a las variables
46
Programación 2
Salida de la consola.
Salida por
Operación Símbolo Ejemplo Comentarios
consola
Resta 2 int a520; int b542; int c5a2b; print (c); 222
Producto * int a512; int b520; int c5a*b; print (c); 240
47
4 Repeticiones y bucles
SABER HACER
El bucle for()
Iniciador: el bucle for() está controlado Condición: el bucle for() se ejecutará una y otra vez
por una variable, normalmente de tipo int. Se debe siempre que se cumpla esta condición. Controla el número
iniciar la variable en este lugar de la sentencia. de veces que se repetirá el bucle.
Ahora dibuja varios círculos concéntricos. 7. Cierra la llave correspondiente al bucle: };.
48
Programación 2
G R B
SABER HACER
49
SABER HACER
50
Programación 2
Copiar el color. Puedes copiar el color deseado en el portapapeles haciendo clic en Copiar. Luego
puedes pegar el valor dentro del paréntesis de cualquier sentencia fill(), stroke() o
background(). Sin embargo, te aparecerá un código hexadecimal (por ejemplo, #D428E8) que no te
dará ninguna indicación intuitiva del color que se está utilizando. Por ejemplo, fill (#D428E8); .
ACTIVIDADES
13 Programa la figura de la derecha. Para ello deberás seguir varios pasos:
1. Dibuja una ventana de 296 3 296 píxeles, ya que vas a pintar líneas
de 256 píxeles y dejar un marco de 20 píxeles.
2. Pon el fondo en color rojo puro. Sugerencia: usa background(r,g,b);
dando valores r, g y b para que aparezca solo el color rojo.
3. Haz una secuencia de líneas que van cambiando de color desde el negro
al verde puro. El procedimiento sería el siguiente:
Repite, empezando por i50, i veces hasta que i valga 255 {
Dibuja una línea vertical con el color (0, 0, i) y desde (X1, Y1)5 (201i, 20)
hasta (X2, Y2)5 (201i, 276) }
a) ¿Por qué se está sumando el valor i a las coordenadas x de la línea?
b) ¿Cuál sería la orden para fijar el color de la línea a una secuencia de i verdes?
c) ¿Cuál sería la orden para pintar una línea desde (X1, Y1) a (X2, Y2)?
d) ¿Qué sentencia usarías para repetir desde i 5 0 hasta i < 256 sumando 1 a i
cada vez que se ejecute la sentencia?
Pista: utiliza las siguientes líneas de código:
1. Crea la ventana con un marco de 20 píxeles alrededor del verde.
2. Pon el fondo de color rojo puro.
3. Define la variable que controla la repetición del for( ).
4. Fija el color de la línea a una secuencia de i verdes.
5. Pinta de arriba abajo y mueve i píxeles la línea hacia la derecha.
51
SABER HACER
ACTIVIDADES
15 Modifica el ejemplo anterior sustituyendo println() por print(). Observa el resultado
en la consola.
52
Programación 2
Como has visto, en modo dinámico todas las sentencias 6. Cierra la llave de la función setup.
que están dentro de la función draw() se repiten }
sin parar. Sin embargo, te puede interesar que
determinadas sentencias se ejecuten una sola vez. 7. Utiliza ahora la función draw.
Por ejemplo, si vas a dibujar algo en una ventana de dibujo, void draw() {
te interesa crear la ventana una sola vez y luego pasar //Función draw().
a dibujar con draw(). 8. Dibuja líneas horizontales.
Para ello introduce las sentencias que solo se van line (20, 20+i, 380, 20+i);
a ejecutar una vez en una nueva función, setup(). //Dibuja líneas horizontales
Su sintaxis es la siguiente: //de arriba abajo.
void setup() { 9. Ve bajando la posición en la que se dibuja la línea.
//Código que se ejecuta una sola vez
} i++;
//Al aumentar i, vamos bajando
Para practicar codifica el siguiente programa en Processing. //la posición de la línea.
1. Primero define el valor entero. 10. Cierra la llave de la función draw.
int i=0; }
//Valor entero que vamos a usar para 11. Copia el programa completo y ejecútalo.
//mover las líneas.
12. Observa el resultado en la ventana de dibujo.
Ahí obtendrás una línea verde que va bajando
PRESTA ATENCIÓN y cambiando el fondo rojo a verde.
53
SABER HACER
Para tomar decisiones dentro de un programa se utiliza una • Si es falsa (false en Processing), se ejecuta el Bloque 2
sentencia fundamental: if-then-else. Aquí aprenderás de sentencias.
a tomar decisiones de control con esta sentencia. Las condiciones pueden evaluarse con operadores.
2. Ejecútalo.
54
Programación 2
ACTIVIDADES
18 En el anterior ejemplo parece que el programa Si tardas mucho en hacerlo, deberías tener algo
rellena de color verde hasta la mitad parecido al siguiente código en la función draw().
de la ventana y luego para.
a) ¿Crees que realmente para? void draw() {
if (i<360) {
b) ¿Qué está haciendo la función draw()? background (255,0,0);
//Asigna un fondo de color rojo.
19 Modifica el programa para que se vea una única line (20, 20+i, 380, 20+i);
línea verde que llega hasta el píxel de coordenada //Dibuja líneas horizontales de arriba
y5200 y que luego vuelve a empezar. //abajo.
Sugerencia: en la función draw(), la función line (20+i, 20, 20+i, 380);
line() se ejecuta una y otra vez y deja el fondo //Dibuja líneas verticales de izquierda
//a derecha.
pintado de verde. Deberías pintar el fondo
i++;
de nuevo justo antes de la sentencia line().
}
Si tardas mucho en hacerlo, quita la sentencia else{
background (255,0,0); de setup() i=0;
y escríbela justo antes de la sentencia line(), }
dentro de draw(). }
55
6 Eventos de ratón y teclado
13. Trabajar con eventos: el uso del ratón Cuando un programa tiene varias funciones, junto
con sentencias que tienen otras sentencias dentro
Muchos de los programas de ordenador pueden reaccionar de ellas, como if, for, etc., debe sangrarse.
a la posición del ratón, si sus teclas se presionan o no, etc. Esto significa que todas las sentencias que se
En estas páginas aprenderás a controlar tu programa ejecutan dentro de un bucle (por ejemplo, dentro de
de acuerdo con los eventos producidos por el ratón. draw()) o de otra sentencia (por ejemplo, dentro
de else) deben aumentar su margen izquierdo para
Coordenadas del ratón quedar dentro del bucle o sentencia que las engloba.
En Processing, mouseX y mouseY son dos variables Esta práctica mejora enormemente la legibilidad
del sistema que devuelven las coordenadas en las que del programa.
se encuentra el ratón.
56
Programación 2
2. Ejecútalo.
PRESTA ATENCIÓN
3. La salida en la ventana de dibujo será
similar a esta:
Hasta ahora has visto que la sentencia if se evalúa sobre
Si no se pulsa ningún Si se pulsa algún botón, una única condición lógica. Por ejemplo, if (a>b)
botón, dibuja círculos. dibuja cuadrados. o bien if (a!=b).
Sin embargo, se pueden evaluar varias condiciones lógicas
a la vez usando operadores lógicos. Son los siguientes:
Operador
Nombre Significado
lógico
ACTIVIDADES
23 Modifica el primer programa para que el cuadrado 25 Escribe en Processing un programa que:
no deje rastro, es decir, que solo se dibuje en a) Si no pulsas ningún botón, dibuja circunferencias
la posición del ratón. rojas sobre fondo verde al mover el ratón y deja
Pista: corta la sentencia background() rastro de esas circunferencias.
de setup() y pégala en draw() antes de b) Si mantienes pulsado el botón izquierdo
la sentencia rect(). del ratón, dibuja circunferencias azules,
sin borrar las ya dibujadas, y dejando rastro.
24 Elabora en Processing un programa que:
c) Si mantienes pulsado el botón derecho
a) Si no pulsas ningún botón del ratón, dibuja del ratón, dibuja circunferencias
circunferencias y deja rastros de ellas. amarillas, sin borrar las ya dibujadas
b) Si pulsas el botón izquierdo, dibuja cuadrados y dejando rastro.
y deja rastros de ellos. d) Si pulsas el botón central, borra todos
c) Si pulsas el botón derecho, dibuja líneas y deja los dibujos.
rastros de ellas.
El resultado final deberá tener un aspecto
d) Si pulsas el botón central, borra todos los dibujos. parecido al de la figura.
El aspecto, tras
hacer pruebas con
todos los botones
excepto con
el central, deberá
ser similar
al de la figura.
57
SABER HACER
int i=0;
5. Inserta un bucle for.
for (i=1; i<10; i++) {
6. Inserta la sentencia textSize dentro del bucle. La presencia de la variable i
dentro del paréntesis de esta sentencia hace que el tamaño del texto se modifique
en cada repetición del bucle.
textSize(12+i);
//Aumenta el tamaño del texto en cada repetición del bucle for().
7. Escribe el texto que se repetirá empleando la sentencia text. Al utilizar
la variable i dentro del paréntesis consigues que vaya cambiando la posición
del texto en cada repetición del bucle.
text (“Esto es una prueba”, 0, 0+20*i);
/*Cada línea se va escribiendo más abajo. La variable "i" se multiplica
por 20 para que quepan las líneas de texto cada vez más grandes.*/
}
58
Programación 2
TRUCO
El texto se puede alinear con la función
textAlign(modo), donde modo puede
tomar los valores RIGHT, LEFT y CENTER,
alineando a la derecha, a la izquierda
o al centro el texto que se escriba
a continuación con la sentencia text().
ACTIVIDADES
26 Escribe un programa en Processing que produzca la siguiente salida.
Observa que el tamaño aumenta, que la letra es cada vez más verde
y que la posición horizontal se desplaza hacia la derecha.
Ayuda: sigue los siguientes pasos.
1. Establece el tamaño de la ventana. 5. Aumenta el tamaño del texto en cada repetición
2. Usa fondo de color amarillo. del bucle.
4. Haz que el color de la letra sea cada vez más 7. Incrementa las coordenadas x e y de comienzo
verde a medida que se repite el bucle. en cada repetición del bucle.
59
SABER HACER
ACTIVIDADES
28 Analiza el programa anterior y comenta (con //) 30 Analiza el programa anterior y comenta
la línea en la que aparece la sentencia (con //) la línea en la que aparece la sentencia
background(240,240,10) dentro background(240,240,10) dentro
de la función setup(). de la función draw().
a) ¿Qué sucede? ¿Por qué sucede? a) ¿Qué sucede? ¿Por qué sucede?
b) Quita el comentario. b) Quita el comentario.
29 En el programa anterior, comenta (con //) 31 En el programa anterior, comenta (con //)
la línea en la que aparece text(“Pulse
una la línea en la que aparece text(“Pulse
una
tecla y aparecerá su valor en el tecla y aparecerá su valor en el
centro de la pantalla”, 20, 20) centro de la pantalla”, 20, 20)
dentro de la función setup(). dentro de la función draw() .
a) ¿Qué sucede? ¿Por qué sucede? a) ¿Qué sucede?
b) Quita el comentario. b) ¿Por qué sucede?
60
Programación 2
Carga de fuentes
Todas las frases que has escrito en la pantalla de dibujo se han represen-
tado con el mismo tipo (tamaño) y fuente (estilo) de letra. Sin embargo,
en tu ordenador hay cargadas bastantes fuentes.
Para usar una fuente de tu ordenador en tu programa debes cargarla
previamente en Processing. Para ello, en la opción de menú Tool selec-
ciona la opción Create Font.
Aparecerá la siguiente ventana:
Fuentes cargadas
en tu ordenador.
Para escribir con una de las fuentes que has convertido a .vlw debes
utilizar las siguientes sentencias:
• PFont Mi_fuente;: declara una variable, «Mi_fuente», que es del
tipo PFont, usado por Processing para manejar fuentes.
• Mi_fuente = loadFont (“ArialNarrow-48.vlw”);: car-
ga la fuente en el programa. ¡No te olvides de crearla antes!
• textFont(Mi_fuente);: todo lo que se escribe a continuación
aparecerá con esta fuente.
ACTIVIDADES
32 Crea una fuente ArialNarroww-48.vlw PFont Mi_fuente; /*Declaras una variable,
en un programa y guarda el programa. Mi_fuente, del tipo PFont.*/
Mi_fuente = loadFont (“ArialNarrow-48.vlw”);
33 Copia en este programa el código del programa textFont(Mi_fuente); /*Todo lo que se escribe
que reconocía y escribía en pantalla el carácter a continuación aparecerá con esta fuente.*/
pulsado.
34 Añádele las siguientes sentencias justo después 35 Haz que la primera línea de la ventana de dibujo
de la sentencia void setup()
y examina del programa de la página anterior se escriba con
el resultado: una fuente, y la segunda línea, con otra distinta.
61
7 Trabajo con imágenes
SABER HACER
Tamaño de
la imagen:
300 3 200. Tamaño de la ventana:
400 3 300.
62
Programación 2
SABER HACER
ACTIVIDADES
36 Modifica el programa para que
se creen distintos niveles
de transparencia de la imagen.
Sugerencia: cambia rojo
por blanco en las sentencias tint().
Te debería quedar algo como
lo que muestra la imagen
de la derecha.
63
8 Trabajo con tablas de datos. Arrays
SABER HACER
int [] pantalla_X = new int [mediciones]; //Array que almacenará las posiciones X del ratón.
void setup(){
size (800,600); //Crea la ventana de dibujo.
background (240,240,10); Continúa
} →
64
Programación 2
void draw(){
if (mousePressed && (mouseButton = = LEFT)) { //Solo cuando se presiona el botón
//izquierdo del ratón se recogen datos.
background (240,240,10);
if (puntero<mediciones){ //Muy importante para no superar
//los límites del array. Si no hacemos
//esto, Processing producirá un error
//en tiempo de ejecución.
ACTIVIDADES
37 Modifica la siguiente zona del código comentando 40 Comenta con barras la última sentencia, en la que
la primera y última línea (la de la llave). está escrito puntero = 0;, y ejecuta varios
if (puntero<mediciones){ ciclos de dibujo, hasta que el programa se pare
pantalla_X[puntero] = mouseX; por algún error.
pantalla_Y[puntero] = mouseY; a) ¿Qué error es ese? ¿A qué se debe?
puntero++; b) Vuelve a dejar el programa como estaba.
}
41 Modifica el programa para que:
38 Inicia el programa, sitúa el ratón en la zona
a) En vez de dibujar líneas, dibuje rectángulos
de la ventana y pulsa el botón izquierdo del ratón
de 40 3 40 cuya esquina superior izquierda esté
hasta que el programa dé un error en la consola
en las posiciones guardadas del puntero.
(tardará unos segundos).
b) La mitad de las figuras que dibuje sean
a) ¿Qué error aparece? ¿A qué es debido?
rectángulos, y la otra mitad, circunferencias
b) Vuelve a dejar el programa como estaba. de 40 píxeles de diámetro.
39 ¿Por qué este bucle solo cuenta hasta < (puntero 2 1):
for (a = 0; a < (puntero - 1); a++)?
65
SABER HACER Competencia científica
A la hora de programar es útil recapacitar sobre lo que queremos que realice el programa.
Y elaborar con estas ideas un esquema de las acciones llevadas a cabo por el ordenador
al ejecutar el programa. Este esquema se denomina diagrama de flujo.
Observa en la tabla un diagrama de este tipo y su correspondiente programa escrito en Processing.
void setup() {
Inicio size (400, 400);
stroke(0,0,255);
fill (250,10,250);
Crear una ventana
}
void draw() {
background (240,240,10);
Definir el color de líneas if (mousePressed){
y de relleno //Si esta condición se cumple,
//dibuja un rectángulo.
rect(mouseX, mouseY, 40,40);
}
Definir el color del fondo
else{
//Si no se cumple, es decir, cuando
//no se pulsa, se dibuja un círculo.
ellipse (mouseX, mouseY, 40,40);
¿Está Sí Dibujar rectángulos }
presionado el botón
al mover el cursor }
del ratón?
42 ¿Crees que es útil desarrollar esquemas antes 47 Busca información sobre cuáles son los lenguajes
de escribir el programa o, por el contrario, consideras de programación más empleados en la actualidad.
que es una pérdida de tiempo? a) Recopila información textual y gráfica y elabora
con ella una presentación multimedia.
43 Identifica las sentencias de Processing con
las diferentes partes que conforman el diagrama b) ¿Se usan todos los lenguajes de programación
de la izquierda. para lo mismo?
66
Programación 2
49 COMPRENSIÓN LECTORA. Busca la información 51 USA LAS TIC. Busca información en la web sobre
necesaria y explica el significado de estas expresiones ciberseguridad aplicada a los jóvenes.
en el texto. a) Elabora un listado con los posibles riesgos.
a) Códigos maliciosos. b) Elabora a continuación una lista con acciones que
b) Objetivo netamente lucrativo. entrañan riesgos a la hora de usar un ordenador,
un teléfono móvil o una tableta conectada a internet.
c) Uso responsable y seguro de las nuevas tecnologías.
d) No acceda a la banca online desde sitios 52 ¿Qué medidas de seguridad tienes en cuenta a la hora
no confiables. de navegar por internet o usar el correo electrónico?
67
PROYECTO Trabajo cooperativo
En este proyecto vas a desarrollar un programa que realiza ciertas tareas de edición
sobre una imagen. Verás que la estructura del programa es modular, así que puedes
seguir añadiendo funciones al editor de forma muy sencilla.
• De igual modo, la tecla «b» aumenta el nivel de azul. La que está situada v Disminuye el azul.
a su izquierda, la «v», lo disminuye.
l Aumenta la luminosidad.
• La tecla «l» aumenta la luminosidad de la imagen y la de su izquierda, la «k»,
la disminuye. k Disminuye la luminosidad.
• La tecla «n» convierte la imagen a tonos de grises. n Convierte a tonos de gris.
• La tecla «q» retorna a la imagen original, eliminando los cambios de color,
q Vuelve a la imagen original.
de luz o de gris.
68
Programación 2
Codificación: funciones
Función a
El programa debe detectar que las teclas «1» o «2» Función b
se están presionando. La variable keyPressed se hace
Sigue la estructura de programa vista en la función a. Por
true mientras una tecla esté presionada.
un lado detecta con un if si la tecla adecuada está siendo
Además, se debe cumplir la condición de que esa tecla presionada. Si es así, variarás alguna variable. En este caso
sea «1» para aumentar el tamaño de la imagen. estas variables son x e y, que son las que controlan
La variable key devuelve el último carácter pulsado la posición de la imagen en la pantalla.
con el teclado. El carácter que devuelve un teclado
La captura de las teclas «flecha» es ligeramente especial.
es una variable de tipo char. Para hacer comparaciones
Corresponden a un grupo de teclas donde la variable key
con una variable tipo char se usan comillas simples.
toma el valor CODED cuando se pulsa. Además, para
Por tanto, para averiguar si la tecla pulsada fue la tecla «1» averiguar qué tecla específica se ha pulsado hay que
y si se mantiene pulsada, el programa deberá hacer examinar el valor de otra variable, keyCode. Esta variable
una pregunta del tipo: puede tomar el valor UP, DOWN, RIGHT o LEFT,
if ((key = =’+’) && (keyPressed)) dependiendo de si la flecha que se ha pulsado es arriba,
//Se hace true cuando la tecla se abajo, derecha o izquierda, respectivamente. Teniendo
//mantiene pulsada y es ‘+’. en cuenta estas especificaciones, el código para actuar
con «flecha arriba», ↑, sería:
Recuerda que la función draw() se repite sin parar.
Puedes aumentar en un 1 % las variables ancho y alto if ((key = = CODED) && (keyPressed)) {
cada vez que se ejecute el bucle y se cumplan //Una tecla CODED se ha pulsado
las condiciones anteriores. Para ello basta introducir //y se mantiene presionada.
el bloque siguiente de código: if (keyCode = = UP) y = y - 2;
if ((key = =’+’) && (keyPressed)) { //Movimiento arriba. Repetir y modificar
//Ampliación de la imagen. //este if para DOWN, RIGHT y LEFT.
ancho = ancho*1.01; }
alto = alto*1.01; Como se indica, basta repetir la sentencia
} if (keyCode = = UP) y = y - 2; y modificarla
ligeramente para obtener los cuatro movimientos.
El código para reducir la imagen al pulsar la tecla «2» es Continúa
similar, pero hay que multiplicar por 0,99 en vez de 1,01. →
69
PROYECTO (continuación) Trabajo cooperativo
Función c
Esta función varía el valor de rojo, verde o azul • Función draw(). Añadir:
de la imagen. Analiza el caso del rojo. Se debe detectar if ((key = = ‹r› || key = = ‹e› ) && keyPressed) {
si se pulsa la tecla «r» o «e» (aumenta/disminuye
//Controles del color rojo.
el rojo). Si se pulsa «r», harás que cada vez
for (int i = 0; i < dimension; i++) {
que se ejecute draw() aumente en 12 el valor
//Lee todos los valores RGB de la imagen.
de RED de cada píxel.
r = red (imagen_01.pixels[i]);
Para ello debes extraer el valor de RED de cada píxel. //Lee el valor RED del píxel i.
Esto se hace en dos pasos: a = blue (imagen_01.pixels[i]);
//Guarda el valor BLUE. Se usa luego.
1. La función imagen_01.pixels[i]; extrae
el valor de color del píxel i de la imagen_01.
v = green (imagen_01.pixels[i]);
//Guarda el valor GREEN. Se usa luego.
2. La función red(color) extrae el valor de RED if (key = = ‘r’) r = r + 2;
de una variable de tipo color. if (key = = ‘e’) r = r - 2;
Así, rojo = red (imagen_01.pixels[i]); imagen_01.pixels[i] = color(r,v,a);
da el valor de RED de un píxel en la posición i. //Se actualizan los píxeles de la imagen.
Lo devuelve en una variable a la que puedes llamar, }
por simplicidad, rojo. imagen_01.updatePixels();
//Se pasan los píxeles a la imagen.
Para aumentar todo el valor de rojo del array pixels[],
}
basta hacer un bucle for() a lo largo de toda
la dimensión de la imagen. Este proceso actualiza El resultado de encuadrar la imagen y subir el color rojo
el array pixels[]. sería similar a:
Para que este cambio se refleje en la imagen
se necesita ejecutar la sentencia siguiente, fuera
del bucle for():
imagen_01.updatePixels();
//Se pasan los píxeles a la imagen.
Función d
El control de luminosidad es muy sencillo de realizar a partir del código anterior. Subir la luminosidad
eleva los tres canales de color a la vez. Bajarla reduce el valor de los tres canales. Basta introducir
las sentencias siguientes en el bucle for() de control del color:
if (key = =‘l’) {a = a + 2; r = r + 2; v = v + 2;}
if (key = =‘k’) {a = a - 2; r = r - 2; v = v - 2;}
Función e
Cambiar a gris implica que los tres canales RGB tengan el mismo valor. Para ello se asigna a los tres canales
el valor de su media. Basta añadir las siguientes líneas al bucle for() que controla el color:
if (key = =‘n’) {
gris =(a + r + v)/3; //Si los 3 luminóforos tienen el mismo valor, se ve gris.
a = r = v = gris; //Asigna el valor de gris a a (azul), r (rojo) y v (verde).
}
Además, se debe añadir una variable float gris; en la sección inicial del programa.
70
Programación 2
Función f
Es muy sencilla. Basta cargar de nuevo la imagen al principio de la función draw(),
justo después de la sentencia background():
if (key = =’q’) imagen_01 = loadImage(“IMG_3055.jpg”);
El código completo, optimizado, sería el siguiente:
71
ANEXO: Referencia para programar en el IDE de Arduino
Estructura
void loop() Se ejecutará una y otra vez mientras la placa void loop() {
Arduino tenga alimentación. //Instrucciones a ejecutar repetidamente
}
for Se utiliza para repetir instrucciones un número for (byte i50 ; i<10 ; i5i++) {
determinado de veces. //Instrucciones a repetir
}
Swicht … case Se utiliza para comparar el valor de una variable Swicht (variable) {
en los diferentes casos. case 1:
Cuando el valor de la variable coincide con el //Hacer algo cuando variable vale 1
valor de uno de los casos, se ejecutará lo que break;
haya dentro de este. case 2:
//Hacer algo cuando variable vale 2
La sentencia break se utiliza para acabar cada break;
caso. }
Sintaxis adicional
// Las líneas de comentarios se utilizan para dar int x 5 5; //Esta es una sola línea de comentario.
/*… */ información del programa. Las líneas de int x 5 10; /* Si el comentario ocupa más de una línea
comentarios son ignoradas por el compilador. puedes utilizar esta sintaxis */
#define Reemplazará el nombre definido por el valor #define PINVERDE 3 //#define Nombre Valor
asignado.
#include Se utiliza para incluir librerías fuera de su #include <Servo.h> //Librería para manejar servos
sketch.
244