en Secundaria
Primera edicin
MARF Bo o k s
[http://creativecommons.org/licenses/by-sa/2.0/es/
Computacin Fsica
en Secundaria
Marco A. Rodrguez Fernndez
MARF Bo o k s
A mi madre, mi padre y mi hermano que a pesar de mis ideas paranoicas y mis cambios
de humor sin sentido, aun siguen soportndome y dndome su apoyo.
A mis alumnos y compaeros de trabajo que sufren mis experimentos educativos.
Contenidos
Prlogo..........................................................................................................
POR QU?....................................................................................................................10
PARA QUIEN?...............................................................................................................10
CMO?........................................................................................................................10
Docencia Creativa......................................................................................11
EL SUELO BAJO, EL TECHO ALTO, Y LAS PAREDES AMPLIAS...........................................12
LOS LEONARDOS DEL SIGLO XXI...............................................................................13
TRABAJO COOPERATIVO Y SOCIO-CONSTRUCTIVISMO DISTRIBUIDO................................13
Material y Herramientas ...........................................................................15
HILO 0.5MM................................................................................................................15
HILO DE COSER CONDUCTOR.......................................................................................15
PINZAS DE COCODRILO ...............................................................................................16
PLACAS DE PROTOTIPAJE..............................................................................................16
LED.............................................................................................................................17
ZUMBADOR..................................................................................................................18
PULSADORES Y CONMUTADORES...................................................................................19
SIETE SEGMENTOS.......................................................................................................20
POTENCIMETRO.........................................................................................................20
LDR [FOTO-RESISTENCIA]..........................................................................................21
SENSOR DE PROXIMIDAD..............................................................................................22
SENSOR DE TEMPERATURA...........................................................................................23
ACELERMETRO..........................................................................................................23
SERVOMOTOR..............................................................................................................24
SERVOMOTOR DE ROTACIN CONTINUA.......................................................................25
MOTOR DC CON TIP120..........................................................................................27
MOTOR DC CON DRIVER L293..................................................................................28
SENSOR RFID (IDENTIFICACIN POR RADIOFRECUENCIA).......................................29
ARDUINO....................................................................................................................30
PICOBOARD O SCRATCHBOARD..................................................................................31
Programacin............................................................................................35
SECUENCIAS DE INSTRUCCIONES...................................................................................35
VARIABLES...................................................................................................................36
CONDICIONALES..........................................................................................................37
BUCLES........................................................................................................................38
Bucle contador. FOR...................................................................................................................39
FOR's anidados - [Nested Loop]................................................................................................39
Bucle condicional While............................................................................................................40
FUNCIONES Y PROCEDIMIENTOS...................................................................................40
Sobrecarga de operadores..............................................................................................................41
CLASES........................................................................................................................42
ALEATORIEDAD...........................................................................................................44
ARRAYS, ARREGLOS O MATRICES..................................................................................45
Programacin Avanzada...........................................................................46
NORMALIZACIN DE VALORES.....................................................................................46
PONDERACIN DE ENTRADAS......................................................................................46
CALIBRACIN Y CALIBRACIN DINMICA DE SENSORES................................................46
TRUCOS PARA EVITAR USAR BUCLES Y DELAYS..............................................................47
RECURSIVIDAD.............................................................................................................47
COMUNICACIN POR USB..........................................................................................48
COMUNICACIN ARDUINO-PROCESSING CON FIRMATA...............................................50
Proyectos online [ PHP+MySql ].............................................................52
MONTAR UN SERVIDOR WEB CON TECNOLOGA PHP+MYSQL.....................................52
CONSULTAR UNA BASE DE DATOS DESDE UNA WEB......................................................54
INSERTAR DATOS EN UNA BASE DE DATOS DESDE UNA WEB.........................................55
ELIMINAR DATOS DE LA BASE DE DATOS DESDE UNA WEB...........................................55
ENVIAR DATOS A UNA WEB DESDE PROCESSING...........................................................56
RECIBIR DATOS DE UNA WEB DESDE PROCESSING.........................................................57
Proyectos con la ScratchBoard..................................................................59
EL PERRO SALTARN.....................................................................................................59
CANGREJOS DEL ESPACIO EXTERIOR.............................................................................60
GORRO GIRATORIO......................................................................................................62
EL CACTUS VIRTUAL.....................................................................................................63
GAMEPAD CON CARTN Y PAPEL DE PLATA ...............................................................64
Proyectos con Arduino + Processing........................................................67
LED PARPADEANTE.....................................................................................................67
CDIGO MORSE..........................................................................................................69
EL SEMFORO PARA INVIDENTES.................................................................................70
ALARMA DE PROXIMIDAD.............................................................................................71
LA CAMISETA...............................................................................................................73
LA BANDEJA QUE NUNCA VUELCA................................................................................77
ROBOT CON RUTAS PRE-PROGRAMADAS........................................................................79
ROBOT QUE NUNCA CHOCA.........................................................................................81
ROBOT SEGUIDOR DE LINEAS.......................................................................................82
ROBOT PERSEGUIDOR..................................................................................................85
ORGANIZADOR DE MANZANAS.....................................................................................86
PONG CON SENSOR DE DISTANCIA...............................................................................90
ROBOT CONTROLADO POR INTERNET..........................................................................95
THEREMIN DE INFRAROJOS..........................................................................................98
LOCALIZADOR DE COLORES.........................................................................................99
El tintero...................................................................................................101
Apndice...................................................................................................104
Prlogo
La evolucin de los computadores ha hecho que cualquier persona pueda hacer servir un ordenador
para escribir cartas, o guardar datos. Pero, porque no hacerlo servir para otros propsitos ms
imaginativos como abrir puertas, encender el coche o analizar el contenido de un refrigerador?
Por qu?
Hace ya 10 aos que con el nico soporte econmico de mis padres, decid abrir
una pequea escuela de informtica donde poner en prctica alguna de mis ideas
sobre educacin y tecnologa. No obstante estos dos ltimos aos, gracias a la gente
que he conocido en CitiLab y en el MediaLab del MiT, me he dado cuenta que mis
ideas sobre educacin y tecnologa no son tan estpidas como yo pensaba. Tambin
he descubierto que gente de todas partes del mundo comparte planteamientos
similares.
Es por este motivo que me pareci interesante escribir este manual donde a modo
de recetas de cocina cualquiera pueda reproducir estos extraos experimentos
tecnolgicos que acostumbramos a realizar en MARF.
Para quien?
Para todo el que quiera. Compaeros de profesin, alumnos y ex-alumnos,
hobbistas, aficionados, profesionales de la industria, y/o artistas. Espero que cada
uno encuentre alguna parte de provecho en este libro.
Cmo?
El primer apartado del libro Docencia Creativa intenta resumir en un par de
pginas algunas de las ideas sobre educacin que la experiencia me ha mostrado
durante estos 10 ltimos aos. El apartado de Electrnica hace un breve resumen
de los materiales utilizados en los proyectos y de la forma como los hemos
utilizado. En este punto me gustara recordar que este libro no pretende ser un libro
de texto donde por ejemplo, se explica como funciona un led, simplemente muestro
como utilizarlo (para detalles tcnicos me remito a cualquier libro tcnico de
consulta, o cualquier web especializada). El apartado de Programacin hace un
breve resumen de los conceptos ms importantes de la programacin y algunos
trucos de software a la hora de trabajar con sensores y actuadores. Para ms
informacin sobre los lenguajes utilizados siempre podis consultar la API1 de estos
lenguajes. Y por ltimo el apartado de Proyectos, es seguramente el ms
interesante a nivel prctico.
Empezad el libro por donde creis conveniente. Si sois ex-alumnos posiblemente
sea interesante empezar por el final, si os dedicis a la docencia echadle un vistazo al
primer captulo, y si queris conocer los secretos tecnolgicos y los materiales
utilizados miraos el segundo captulo.
No dudis en enviarme sugerencias, cuestiones o aportaciones a la direccin de
correo: marf@marfonline.com o en la pagina web de MARF http://marf.es
1 Interfaz de Programacin de Aplicaciones. Conjunto de instrucciones que utiliza un lenguaje de
programacin.
10
Docencia Creativa
Docencia Creativa
La creatividad en la inmensa mayora de los sistemas educativos es casi inexistente.
Cuando planteo el tema de la creatividad a compaeros de la escuela pblica
escucho cosas como: Eso esta muy bien pero hemos de seguir el currculum, Las
aulas estn masificadas, Los alumnos vienen desganados a clase. Y es cierto,
hace 2 o 3 aos que soy profesor de secundaria y las aulas estn masificadas, la
desidia de los alumnos es considerable y el currculum casi siempre es imposible de
seguir y muchas veces da pena. Pero cuantas veces hemos visto como los mejores
pensadores, cocineros, empresarios, o artistas; han sido malos en sus estudios
acadmicos, o han sido completamente autodidactas. Hace poco estuve leyendo un
libro de un famoso director de cine espaol en el cual deca que los grandes
directores de cine aprendan haciendo cine, y que los directores que salan de las
escuelas de cine solo saban hacer pelculas sobre la guerra civil.
Pero... pensemos en positivo, todos estos genios (o cualquiera que sea bueno en su
trabajo) que tienen en comn? perseverancia, creatividad, curiosidad intelectual,
autodireccin, adaptabilidad, responsabilidad social, habilidades colaborativas,
pensamiento crtico, habilidades comunicativas... Estamos seguros de que nuestro
sistema educativo potencia estas habilidades?, o como dice Sir Ken Robinson en sus
charlas en TED2 actualmente nuestros sistemas educativos en muchos casos van
podando estas habilidades durante los diferentes ciclos?
Ok... tenemos localizado el problema y sabemos cual es nuestro objetivo. Pero...
como hacemos que nuestras clases potencien este tipo de habilidades, cual es el
truco?, que material hemos de hacer/utilizar?, cual es el mtodo a emplear?. Pues
sinceramente, no tengo ni idea. De hecho, pienso que no es cuestin de material, de
mtodo y seguramente no hay ninguna solucin que funcione siempre. Pero si que
tengo claro que una clase creativa es una clase donde el profesor esta dispuesto a
aceptar soluciones no previstas, a enfrentarse con retos extraos, y a guiar a sus
alumnos por senderos que en un principio no controla. No olvidemos que lo mejor
que le puede pasar a un profesor es que sus alumnos le superen. Si en una de estas
actividades consigues que uno de tus alumnos te supere y te ridiculice en clase...
Bien, Perfecto, eso es lo que queramos!
Durante mi participacin en la Scratch Conference-2008 en el MiT, conoc a un profesor de
Matemticas de una escuela de secundaria en Dinamarca, y tuvimos una interesante conversacin
sobre como funciona la submersion week, lo que vendra a ser el Credit de sintesi en
Catalua. El concepto es muy parecido, los chicos hacen grupos de 4 o 5 alumnos, y durante una
semana trabajan un tema concreto. La diferencia esta en como se lleva a cabo por aqu,
acostumbramos a dar un dossier con unas indicaciones de las pautas del trabajo y los chicos
2 http://www.ted.com/index.php/talks/ken_robinson_says_schools_kill_creativity
.html
11
12
Docencia Creativa
13
Ilustracin 2: Uno de los robots del curso de verano'09 por Roger G. y Marc G.
14
Material y Herramientas
Material y Herramientas
La mayora de componentes bsicos que describimos en este captulo los podemos
adquirir en tiendas de electrnica3. El material ms especfico como las placas de
arduino, las picoboards (antes conocidad como scratchboards), pueden adquirirse en
tiendas ms especficas4. Tambin podis consultar nuestra web donde ofrecemos
parte del material que utilizamos en nuestros cursos5 (www.marf.es).
Hilo 0.5mm
El hilo de conexiones de este tamao es el ideal para realizar conexiones en placas
de prototipado, se puede utilizar algn hilo ms fino pero puede darse el caso de
que el contacto con las parte no sea estable del todo y los valores que recibimos
sean muy dispares.
15
Pinzas de cocodrilo
Las pinzas de cocodrilo nos sern muy tiles para probar prototipos que van
soldados o cosidos, antes de coserlos o soldarlos. Utilizaremos dos tipos de pinzas
de cocodrilo, unas con terminal de pinza en cada borne del cable y otro con uno de
los terminales acabados en cables rgidos para poderlo conectar a una placa de
prototipado o una placa arduino. Las pinzas de cocodrilo podemos comprarlas
hechas en cualquier tienda de electrnica o comprar los conectores y soldarlos a
cables con las medida que deseemos.
Placas de prototipaje
Las placas de prototipado (breadboard) se pueden adquirir en cualquier tienda de
electrnica y se suelen hacen servir para probar el funcionamiento de un circuito
antes de proceder a soldarlo. En nuestro caso, dado que el material es caro y no
podemos andar desperdicindolo, no soldaremos nada y trabajaremos siempre
sobre una placa de prototipado.
Como podis observar en la [Ilustracin 5] la placa esta dividida en columnas de 5
agujeros conectados entre si, de forma que cualquier cosa que pinchemos en uno de
estos agujeros queda conectada fsicamente con el resto de elementos pinchados en
los cuatro agujeros restantes de la misma columna. Las placas de mayor tamao
tienen 4 filas de agujeros conectados entre s en la parte superior e inferior.
6 http://www.members.shaw.ca/ubik/thread
16
Material y Herramientas
Led
Hay una gran variedad de Diodos Emisores de Luz. Podemos encontrar leds de alta
intensidad, los cuales emiten luz de hasta 20000mcd(aunque suelen ser caros), los
leds RGB que puede emitir ms de un tono de color con un solo led, y los leds de
luz infrarroja o ultravioleta (aunque estos ltimos se han de manejar con unas gafas
especiales, dada la peligrosidad de su radiacin). Tambin es interesante poder jugar
con diferentes tamaos y con extensiones de fibra ptica para transportar la luz (por
ejemplo cuando realizamos proyectos sobre la ropa). Leds podemos comprar en
cualquier tienda de electrnica aunque por Internet podemos encontrar empresas
especializadas en la venta de leds de alta intensidad7, y otros dispositivos lumnicos.
Ilustracin 6:
Conecin de un led a
una placa de
prototipaje
Para conectar un Led necesitamos tambin una resistencia de unos 200-400 Ohmios
(un Led debera trabajar a 1,5V-1,8V y la placa de arduino nos proporcions uns 5V).
Conectaremos siempre la pata corta del LED a GND (Tierra) y la pata larga a la
7 http://www.ledz.com
17
Air Painting y LedThrowie8: Un experimento muy divertido que se puede realizar con
leds, es conectarlos directamente a una pila de botn y lanzarlo al aire de noche, o
realizar dibujos en el aire mientras hacemos una foto de larga exposicin [ver
Ilustracin 7].
Zumbador
Un zumbador o piezobuzzer, es un pequeo altavoz que emite un sonido al pasar
corriente entre sus dos bornes. Se pueden adquirir zumbadores de muchos tipos en
cualquier tienda de electrnica o podemos reciclar algn pequeo altavoz que
tengamos. A la hora de conectarlos conectaremos la pata ms corta o el cable negro
a tierra (GND) y la otra pata o cable rojo al pin de salida que deseemos. Tambin
podemos hacer servir un zumbador como detector de golpes (KnockSensor)
conectndolo junto con una resistencia del rango de algunos megaohms [ver
Ilustracin 46]. A la hora de programarlo nicamente tendremos que leer
analgicamente el valor que nos da el pin al que hemos conectado el altavoz.
8 http://es.wikipedia.org/wiki/LED_Throwie
18
Material y Herramientas
Pulsadores y conmutadores
Pulsadores podemos encontrar gran variedad en cualquier tienda de electrnica, no
obstante podemos usar como pulsador cualquier corto circuito entre dos cables.
Para conectarlo conectaremos una pata a tierra (GND) y la otra a una resistencia de
1k-10k, la cual tendr la otra pata conectada a 5V.
19
Siete Segmentos
El siete segmentos es un dispositivo que nos permite mostrar un dgito en una
pantalla con 7 leds de forma alargada. Tal y como se puede apreciar en la [Ilustracin
10] hemos de conectar el pin K a una resistencia de 200-400 Ohms que va
conectada a tierra, el resto de pins los conectaremos a las salidas que queramos
utilizar.
Potencimetro
El potencimetro es una resistencia variable que nos retornar un valor del 0 al
1024 en funcin de hacia donde lo giremos. Podemos encontrar potencimetros de
dos tipos: los pequeos para incrustar en placas integradas en los que para variar la
resistencia hemos de usar un destornillador, y los ms grandes que podemos girar a
mano mediante un cilindro saliente. Normalmente usaremos potencimetros de
unos 10k Ohmios, estos podremos adquirirlos en cualquier tienda de electrnica.
A la hora de conectarlos, conectaremos la dos patas de un lado una a 5V y la otra a
GND, y la pata del lado contrario a una de las entradas analgicas [ver Ilustracin 11].
En caso de ser un potencimetro manual (los ms grandes) la pata que hemos de
conectar a la entrada analgica es la que tenemos en el centro.
20
Material y Herramientas
LDR [Foto-resistencia]
Las foto-resistencias o ldr's son resistencias variables en funcin de la luz. En
cualquier tienda de electrnica podremos disponer de diferentes modelos. Es un
sensor muy interesante y relativamente barato.
Al igual que los pulsadores conectaremos una pata tierra (GND) y la otra pata a una
resistencia de unos 10kOhms, y esta a su vez estar conectada a 5V. La entrada
analgica tomar el valor del nexo entre la resistencia y la ldr [Ilustracin 57].
21
Ilustracin 13:
fotorresistencias (o LDRs) de
varios tamaos y resistencias
Sensor de proximidad
Los sensores de proximidad que haremos servir son los sharp 2Y0A029. Estos
sensores utilizan tecnologa de infrarojos para detectar a que distancia esta el objeto,
mediante un emisor y un receptor de luz infraroja detectan la distancia a la que esta
el objeto que tenemos delante y nos enva un voltaje mayor o menor en funcin de
la distancia. Existen varios modelos de este tipo de sensores sharp, lo que varia de
un modelo a otro es la precisin a grandes distancias o a cortas, segn el proyecto
utilizaremos unos u otros.
Material y Herramientas
Sensor de temperatura
Para medir temperaturas existen bastante tipos de sensores, pero los ms
econmicos son los denominados termistores. Los termistores son resistencias
variables en funcin de la temperatura. Este tipo de sensores son faciles de
encontrar en cualquier tienda de componentes electrnicos. Para leer el valor de
este tipo de sensor tendremos que realizar un montaje equivalente al que hicimos
con las fotorresistencias en la [pgina 21].
Acelermetro
Este tipo de sensores se ha popularizado ltimamente por su extensivo uso en
videoconsolas, telfonos mviles y reproductores de msica. Son sensores que nos
envan mayor o menor voltaje en sus salidas en funcin de la aceleracin (y por
tanto tambin su inclinacin) en 2 o 3 ejes (x-y o x-y-z esto depende del sensor). En
el mercado podemos encontrar mltiples versiones de estos sensores, nosotros
utilizamos los adxl 3xxx [Ilustracin 16] de sparkfun10. Dado que estos sensores
10 http://sparkfun.com
23
Ilustracin 16:
Acelermetro
Estos sensores acostumbran a dar valores muy diferentes en funcin del modelo
que utilizamos as que es recomendable estudiar los valores que nos envan antes de
montar ninguna aplicacin, tambin es recomendable hacer servir la tcnica de
lectura de ponderacin de entradas explicada en la [pgina 46].
Servomotor
Los servomotores son motores que pueden girar dentro de un rango de 180 con
bastante precisin, si no son muy potentes podemos alimentarlos directamente de la
placa de arduino sin necesidad de alimentacin externa. Existen gran variedad de
potencia y tamao, en funcin del proyecto podemos elegir unos u otros.
24
Material y Herramientas
Cuando realicemos el montaje conectaremos el cable negro (o marrn) a tierra, el
cable rojo a 5V y el cable blanco (o amarillo) al pin que haremos servir para
enviarles los pulsos de configuracin de la posicin (en las placas arduino los pines
9 y 10).
11 http://www.parallax.com
25
A veces nos podemos encontrar que los servos estn descalibrados. Para calibrarlo
haremos un programa que enve un pulso de 1,5 ms de duracin (para pararlo) y
con un pequeo destornillador de estrella giraremos el tornillo blanco del servo
hasta que se pare.
26
Material y Herramientas
27
Material y Herramientas
girar hacia un lado y si lo hacemos a la inversa girar hacia el lado contrario
[Ilustracin 25].
Arduino
La placa arduino es una placa para proyectos que integra un microcontrolador
amTel, un controlador de comunicacin USB, y un controlador de alimentacin
externa. Desde nuestro PC programaremos el comportamiento de la placa en
funcin de las entradas y salidas que posee desde un lenguaje de alto nivel,
enviaremos el programa y este quedar grabado en la placa hasta que lo
12 http://sparkfun.com
30
Material y Herramientas
modifiquemos. Tambin podremos utilizar la conexin USB para enviar mensajes
entre el PC y Arduino, o podremos conectar una fuente de alimentacin externa a la
placa (pila de 9V) para que esta acte de forma autnoma.
En nuestro caso decidimos utilizar arduino bsicamente porque al ser un sistema de
software y hardware libre, existen muchsimos proyectos ya desarrollados y
evolucionados, y porque el software es muy fcil de utilizar. Y por supuesto por la
satisfaccin de contribuir al desarrollo y la promocin de un proyecto de software
libre como este.
PicoBoard o ScratchBoard
La PicoBoard (antigua ScratchBoard) es una placa diseada para trabajar con el
software Scratch. Scratch es un software educativo diseado por el grupo de
desarrollo KinderLifeLong del MiT para ensear a programar a nios y nias
desde una edad muy temprana. El potencial de este software reside en su interface
que funciona ensamblando bloques (similares a los de lego), y esta pensada para que
los chicos y chicas creen sus propias animaciones y juegos, y acto seguido los
publiquen en la pgina http://scratch.mit.edu.
13 http://arduino.cc
31
Parte de estos bloques de lego de la interface de scratch sirven para controlar los
datos que provienen de la placa scratchboard.
Esta placa enva a scratch los valores de los diferentes sensores que posee: un
micrfono, un botn, una barra deslizadora, un sensor de luz, y cuatro sensores de
resistividad. De esta forma podremos disear animaciones y juegos que interactuan
con los datos que provienen del exterior.
32
Material y Herramientas
33
34
Programacin
Este libro no pretende ser un manual de programacin, el nico objetivo es dotar al
usuario inexperto de las nociones bsicas para entender el funcionamiento de
programas simples, y poder empezar a desarrollar el software necesario para sus
montajes de computacin fsica. Para todo aquel que pretenda profundizar en
alguno de los lenguajes de programacin que se tratan en este libro, seria interesante
que consulte las diversas webs14 que se anotan en los pies de pgina, o que pruebe la
infinidad de ejemplos que se pueden encontrar por la web. Si es la primera vez que
lees este captulo te pierdes en algunos temas... no te preocupes!. Intenta entender
lo bsico, prueba ejemplos, cambia valores, experimenta... Y ms tarde, cuando
releas el captulo ya empezars a entender el resto de conceptos.
Secuencias de instrucciones
Un programa o algoritmo no es ms que un conjunto de instrucciones que se
ejecutan de forma secuencial, es decir, una detrs de la otra.
Normalmente en cada lnea especificaremos una instruccin. Si la lnea empieza por
// estamos indicando que esa lnea es un comentario y no se tendr en cuenta a
efectos prcticos.
Normalmente cada lnea realizar una llamada a una funcin y entre parntesis
indicaremos los parmetros necesarios. Una funcin es una instruccin que realiza
una tarea concreta. Lo parmetros indicados proporcionan a la funcin los datos
necesarios para realizar su tarea. Por ejemplo la funcin digitalWrite de arduino
necesita dos parmetros el pin en el que queremos escribir y que valor deseamos
escribir, as por ejemplo digitalWrite(3,HIGH) escribir un HIGH en el pin 3 de
la placa. Donde HIGH significa poner a 5V la salida y LOW ponerla a 0V.
En los entornos de programacin de processing y de arduino, tendremos que
definir por defecto dos funciones base: la funcin setup que se encarga de realizar
todas las funciones de inicializacin; y la funcin loop en arduino ( o draw si
utilizamos processing ) donde indicamos las tareas que debe realizar nuestro
14 http://arduino.cc; http://processing.org; http://scratch.mit.edu
35
Variables
Una variable es un espacio de la memoria RAM reservado por nuestro programa
para almacenar un valor de cualquier tipo. Segn el tipo de dato que queramos
guardar declararemos variables de tipo: int, char, string, boolean byte, color, float, etc.
Las variables se declaran al principio del programa y podremos hacer referencia a
ellas escribiendo nicamente su nombre.
36
Programacin
Condicionales
Los elementos condicionales sirven para interrumpir la secuencialidad del programa
y bifurcar en dos posibles programas distintos en funcin de una condicin. Por
ejemplo:
37
Ejemplo
Descripcin
if ( x > 3 )
si la x es ms grande 3 ...
if ( x < 5 )
if ( x >= 5 )
if ( x <= 5 )
== (igual que)
if ( x == 5 )
si x es igual a 5 ...
!= (diferente que)
if ( x != 5 )
si la x es diferente a 5 ...
|| (o lgica)
if ( x == 3 || x == 5)
si la x es 3 o 5 ...
&& (y lgica)
! (no lgico)
if ( ! ( x ==8) )
Bucles
Los bucles o iteraciones, las haremos servir para ahorrar lneas de cdigo cuando
escribimos estructuras repetitivas.
38
Programacin
Por ejemplo los dos programas que veremos a continuacin tienen un mismo
resultado en su ejecucin, pero como podris observar el segundo ejemplo es
mucho ms corto.
Programa secuencial
size(200,200);
line(20,20,20,180);
line(30,20,30,180);
line(40,20,40,180);
line(50,20,50,180);
line(60,20,60,180);
line(70,20,70,180);
line(80,20,80,180);
line(90,20,90,180);
line(100,20,100,180);
line(110,20,110,180);
line(120,20,120,180);
line(130,20,130,180);
line(140,20,140,180);
Programa iterativo
size(200,200);
int i;
for (i=20; i<150; i=i+10) {
line(i, 20, i, 180);
}
Podramos leer este ejemplo como: Para una variable y que empieza valiendo 0, mientras
sea ms pequea que 150, sumale 10 a cada iteracin, y en cada iteracin escribe hola en
pantalla. El resultado seria la palabra hola escrita 15 veces en pantalla. Si
cambiamos i=i+10 por i=i+1 la escribira 150 veces.
FOR's anidados - [Nested Loop]
Esta tcnica consiste en introducir un bucle dentro de otro. Esto es muy til por
ejemplo para recorrer un array bidimensional como por ejemplo una imagen o un
espacio cartesiano. (no te preocupes si esto suena un poco a chino... ya veremos
ms adelante un ejemplo ms prctico).
Ejemplos:
int y;
int y;
39
Este ejemplo escribe en pantalla Pulse la tecla A mientras no pulsemos esta tecla.
Como podis ver lo que tenemos entre parntesis es la condicin que se ha de
cumplir para que el bucle siga repitindose y lo que tenemos entre llaves son las
instrucciones que queremos que repita.
Funciones y procedimientos
Cuando los programas que diseamos empiezan a hacerse grandes, es importante
hacer divisiones de ciertas partes del programa para encapsularlas y poderlas
reutilizar y modificar como unidades independientes.
Las funciones son solo etiquetas que ponemos a ciertas partes del cdigo con el
nimo de poder reutilizarlas ms adelante. Como ejemplo realizaremos una funcin
llamada dibujar_estrella(x,y) de forma que cuando escribamos dibujar_estrella(3,2)
nos dibujar una estrella en el punto 3,2. De esta forma podremos utilizar la funcin
siempre que necesitemos dibujar una estrella en cualquier punto.
void setup(){
40
Programacin
size(100,100);
}
void draw() {
dibuixa_estrella(16,20);
dibuixa_estrella(0, 10);
dibuixa_estrella(25,2 );
}
void dibuja_estrella(int x, int y) {
line(x,
y, x+10, y+10);
line(x+10, y, x,
y+10);
}
Hasta el momento hemos visto funciones a las que llamamos con unos parmetros
y realizan un trabajo en funcin de esos parmetros. Ahora podramos hacer que
una funcin que recibe parmetros nos retorne un valor. Para ello vemos como
implementar una funcin que nos calcula la media aritmtica de dos nmeros.
void setup() {
size(300,300);
}
void draw() {
int r;
r=media(3,7);
println(r);
}
int media( int n1, int n2) {
int resultado;
resultado = int ( (n1+n2)/2 );
return resultado;
}
Nota: la funcin int( ) nos redondea el resultado de una
operacin.
Sobrecarga de operadores
En los lenguajes de programacin orientados a objetos existe un fenmeno llamado
sobrecarga de operadores, segn el cual podemos definir una funcin varias veces pero
con diferente nmero de parmetros. As podremos hacer que segn los parmetros
que recibe una funcin esta realiza una tarea u otra. En nuestro ejemplo
sobrecargamos la anterior funcin media para que funcione con 2 o con 3
parmetros.
41
Clases
Dentro de la programacin orientada a objetos, todo el software que desarrollamos
lo organizamos en clases. Una clase es una coleccin de variables y de funciones
que definen una entidad. Definamos por ejemplo la clase pelota:
class Pelota {
int
int
int
int
int
x;
y;
vx;
vy;
radio;
42
Programacin
}
}
Para utilizar la clase , en primer lugar creamos un objeto llamado balon de tipo
pelota y despus desde el setup llamamos al constructor para inicializar los valores
de nuestro balon (mirar seleccin amarilla). Este objeto balon hereda todas las
propiedades y funciones de la clase pelota. Por ejemplo podemos acceder a la
variable x haciendo balon.x=30 o llamar a la funcin actualizar haciendo
balon.actualizar().
43
Aleatoriedad
La funcin random, nos permitir generar valores aleatorios entre un rango de
valores que nosotros indiquemos. Por ejemplo random(0,12) nos generar un
nmero aleatorio entre el 0 y el 12. Dado que los nmeros generados contienen
decimales, utilizaremos la funcin int() para convertirlo en un nmero entero. Si
deseamos un nmero entero aleatorio entre el 0 y el 100 escribiremos
x=int(random(0,100)); de esta forma almacenamos en la variable x un nmero al
azar entre el 0 y el 100 sin decimales.
int x;
int y;
void setup()
{
size (300,300);
}
void draw()
{
x=int(random(0,300));
y=int(random(0,300));
ellipse(x,y,30,30);
}
44
Programacin
En la [ilustracin 38] podis ver en primer lugar una variable comn var0. Esta
variable se declarar escribiendo la instruccin int var0; y se le asignaran valores
escribiendo var0=3;. La variable var1 es lo que denominamos un vector o array
unidimensional lo declararemos haciendo int[ ] var1= new int[3]; donde el 3 es
el nmero de posiciones que tiene este array unidimensional. Para escribir un valor
en alguno de las posiciones de la variable utilizaremos la instruccin var1[1]=3;,
donde el 1 es alguna de las 3 posiciones posibles (0,1,o 2).
int
var0;
int[]
var1 = new int[3];
int[] [] var2 = new int [3][3];
var0 = 3;
var1[1] = 8;
var2[1][2] = 8;
Estos arrays se pueden hacer de una dimensin, dos o todas las que queramos. En
espaol tambin se les suele denominar vectores, o matrices.
45
Programacin Avanzada
Normalizacin de valores
En muchas ocasiones tendremos un sensor que nos enviar valores de un rango
concreto y tendremos que reescalar a otro rango distinto. Para ello cualquier valor
de entrada lo normalizaremos a un rango de 0 a 1 con la funcin norm.
norm ( valor, mnimo, mximo);
por ejemplo: norm ( 0, 0, 255) Retorna 0
por ejemplo: norm (102, 0, 255) Retorna 0.4
por ejemplo: norm (255, 0, 255) Retorna 1
Ponderacin de entradas
Cuando trabajamos con sensores uno de los problemas que podemos tener es que
cada cierto tiempo el sensor lea un valor errneo. Para evitar estos picos de valores
aleatorios haremos una lectura ponderada de los sensores, es decir, que la lectura
actual del sensor no es la definitiva sino que varia en porcentaje la lectura anterior:
Vfin=
Vact Vmn
x 100
VmxVmn
Donde Vfin es el valor definitivo de 0 a 100; Vact es el valor ledo del sensor; Vmn
es el valor mnimo que puede obtenerse del sensor y Vmx es el valor ms grande
que nos puede dar nuestro sensor.
46
Programacin Avanzada
Tambin nos podemos encontrar el valor numrico que recibimos depende en gran
parte de las condiciones ambientales del entrono donde se encuentra nuestro
montaje. Es por ello que un mismo montaje puede darnos unos valores u otros en
funcin del lugar donde se encuentra. Para resolver este problema, a la frmula
anterior aadiremos un par de consideraciones respecto a los valores Vmn y Vmx.
Recursividad
La recursividad es una tcnica que utilizamos para resolver ciertos problemas de
una forma ms simple y a veces ms efectiva
47
48
Programacin Avanzada
puerto.write(49);
}
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
int leido = Serial.read();
println(leido);
}
}
sensorIzq = 0;
sensorDer = 1;
resetBot = 2;
serverBot = 3;
int
int
int
int
valorIzq = 0;
valorDer = 0;
reset = 0;
server = 0;
void setup() {
Serial.begin(9600);
pinMode(resetBot, INPUT);
pinMode(serverBot,INPUT);
}
void loop() {
valorIzq = analogRead(sensorIzq);
valorDer = analogRead(sensorDer);
reset = digitalRead(resetBot);
server= digitalRead(serverBot);
Serial.print(valorIzq, DEC);
Serial.print(",");
Serial.print(valorDer,DEC);
Serial.print(",");
Serial.print(reset,DEC);
Serial.print(",");
Serial.println(server,DEC);
//En la ultima linea hacemos println para indicar fin
}
49
Programacin Avanzada
en "Examples/Library-Firmata/Standard-Firmata-Sketch". Compilalo y cargalo en
tu placa arduino.
5.- Ejecuta processing y carga alguno de los ejemplos de processing. [Mirar ejemplo
al final de este apartado]
6.- Seguramente tendrs que cambiar el nmero del puerto serie donde esta
conectado arduino. Cambia el 0 por algun otro nmero en la siguiente instruccin:
"Arduino.list()[0]"
7.- Ejecuta el ejemplo... y sobre todo prueba cosas sin miedo!
import processing.serial.*;
import cc.arduino.*;
Arduino arduino;
void setup()
{
println(Arduino.list());
arduino = new Arduino(this, Arduino.list()[0]);
arduino.pinMode(13, Arduino.OUTPUT);
}
void draw()
{
arduino.digitalWrite(13, Arduino.HIGH);
delay(1000);
arduino.digitalWrite(13, Arduino.LOW);
delay(1000);
}
51
15 http://www.wampserver.com
52
Una vez activado lo primero que haremos es crear una base de datos simple. Para
ello cargamos el phpmyadmin y creamos una base de datos llamada datos, despus
creamos una tabla con el mismo nombre y dos campos. Cuando nos pida el tipo de
campo lo rellenaremos tal y como indica la ilustracin 40.
53
Una vez creada, ahora veremos en el siguiente captulo como crear un par de
pginas web para consultar y modificar la informacin almacenada en la base de
datos.
Todo el cdigo que se halla entre <?php y ?> es cdigo php que trabaja
directamente contra la base de datos y nos retorna cdigo HTML con los datos
que recoge de la base de datos. Fijaos que en la lnea $conexion=mys...
especificamos el nombre del servidor (que sera o bien localhost o bien la ip de
nuestro servidor), el nombre del usuario para autentificarse en el servidor, y la
contrasea. Como podis observar el nombre es root y la contrasea es inexistente
54
55
56
57
58
El perro saltarn
En este primer proyecto con la picoboard utilizaremos el sensor de sonido para
hacer que un perro salte cuando le gritamos. Para acabar de completar el juego
crearemos un gato, al que el perro debe esquivar saltando, que aparecer por un
lugar aleatorio cada vez.
Ilustracin 43: Mapeo del valor del sensor a la altura del perro.
59
Ilustracin 45: Cdigo para mapear el valor del sensor a la posicin "x"
En primer lugar mapearemos el valor que nos devuelve el sensor del deslizador a la
posicin x del cangrejo y a la vez guardaremos el valor en una variable x para
que sea tambin la posicin de la pinza.
60
Ilustracin 46: Aqui podemos ver los dos objetos que componen nuestro
montaje
Dado que el valor del sensor va de 0 a 100 y la posicin ser de -240 a +240,
corregimos el valor multiplicndolo por 5 y restndole 240.
Gorro giratorio
Este es un proyecto muy simple que nos sirvi para observar dos formas nuevas de
trabajar. El concepto es relativamente fcil, utilizaremos un potencimetro grande
conectado a uno de los sensores de resistencia para utilizarlo como control de la
rotacin de un objeto en pantalla.
De las dos pinzas del sensor conectaremos una al conector de en medio y la otra a
cualquiera de los dos restantes.
El cactus virtual
En el verano del 2008, durante el campus tecnolgico de verano en Marf, algunos
de los alumnos se dedicaron a pinchar leds y resistencias en algunos de los cactus
que hay en el aula, con lo cual algunos de estos cactus murieron.
Como castigo, propuse una prctica donde en la maceta donde estaba el cactus se
colocaban unos electrodos que detectan la humedad de la tierra, y con este valor
tuvieron que realizar un cactus virtual que creca cuando se regaba la maceta real.
El montaje consta nicamente de unas varillas de metal conectadas a los dos bornes
del sensor A de la scratchboard. Este sensor detecta la variacin de la resistencia, y
63
Ilustracin 57: Pegamos los cables al cartnRecubrimos los cables con papel de plataConexin con la picoboard
65
Cuando los dos trozo de papel de plata se toquen el sensor enviar un valor
positivo y cuando no se tocan un valor negativo. Detectamos estos valores y los
utilizamos como entradas en nuestra aplicacin de scratch.
66
Cmo vis en el ejemplo en la parte del setup lo nico que hacemos es declarar el
pin 2 como un pin de salida. Ms adelante en la parte del loop en primer lugar
ponemos el pin 2 a HIGH (5 voltios), esperamos con un delay y ms tarde lo
ponemos al LOW (0 voltios) y volvemos a esperar. La funcin loop se repite
continuamente hasta desconectar la placa o enviar otro programa diferente.
67
Una vez que tengamos escrito el programa dentro del software de arduino, en
primer lugar debemos elegir la placa de arduino que estamos usando, el puerto
donde esta conectada y pulsar el botn de transferir el programa a la placa
[ilustraciones 60, 61, 62 y 63].
68
Cdigo Morse
En este ejercicio trabajamos el uso de las funciones en arduino. Intentamos
implementar un programa que mediante un led enve mensajes en cdigo morse. En
primer lugar codificamos la funcin punto esta funcin enciende el led durante
100ms y la funcin ralla que enciende el led durante 500ms. De esta forma
haciendo llamadas a punto y ralla podemos enviar la letra que queramos.
void setup() {
pinMode(13,OUTPUT);
}
void loop() {
punto();
punto();
ralla();
}
void punto() {
digitalWrite(13,HIGH);
delay(100);
digitalWrite(13,LOW);
delay(100);
}
void ralla() {
digitalWrite(13,HIGH);
delay(500);
digitalWrite(13,LOW);
delay(100);
}
69
Alarma de proximidad
Material necesario: Sensor de rango de infrarojos sharp, 3 leds de diferentes colores o
un led rgb, 3 resistencias de 200-400 Ohms, un zumbador.
En esta prctica trabajaremos los condicionales haciendo utilizando el sensor de
rango de infrarojos como alarma. Haciendo que en funcin de la proximidad de un
objeto al sensor se enciendan 1, 2, o 3 leds y el zumbador pite. Para ello
conectaremos los leds con sus resistencias a los pines 2,3 y 4 digitales y el sensor de
infrarojos al pin 0 analgico.
71
Fase 1: En una primera fase deberamos printar el valor del sensor por pantalla y
hacer cuando el sensor enve un valor mayor que 200 por ejemplo se
encienda un primer led.
x=analogRead(0);
delay(10);
Serial.println(x);
if(x>200){
digitalWrite(2,HIGH);
} else {
digitalWrite(2,LOW);
}
...
72
La camiseta
Hace algunos aos encontramos un proveedor canadiense de hilo de coser
conductor de electricidad17, como nos pareci curioso el ingenio compramos
algunos metros y diseamos este proyecto. Hoy en da, seguramente podemos
encontrar proveedores locales que nos puedan ofrecer este tipo de elementos.
73
74
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
75
Una vez hemos probado nuestro diseo y tenemos cosidas las partes a la camiseta,
solo nos queda enviar el software creado al lilypad que tenemos cosido. Para ello
utilizaremos un FT232R o un FTDI conectado a lilypad por los pines de
conexin y al PC por el cable USB. Este chip es necesario en lilypad , ya que
arduino lo tiene integrado en la placa y lilypad no. Antes de pulsar el botn de
enviar desde arduino hemos de cambiar el tipo de placa que utilizamos.
76
Conexiones
X AnalogIn 0
Y AnalogIn 5
Gnd Gnd
77
Vcc 5V
(y>520)
(y<490)
(x>525)
(x<485)
{
{
{
{
izquierda(); }
derecha(); }
atras(); }
adelante(); }
}
void izquierda() {
digitalWrite(2,HIGH);
delayMicroseconds(1000);
digitalWrite(2,LOW);
delayMicroseconds(20000);
}
void derecha() {
digitalWrite(2,HIGH);
delayMicroseconds(2000);
digitalWrite(2,LOW);
delayMicroseconds(20000);
}
void adelante() {
digitalWrite(3,HIGH);
18 http://www.parallax.com/
78
Una vez que lo tenemos todo, solo nos queda implementar el programa principal
loop que activa una u otra funcin en base a los valores que nos envi el
acelermetro. Como podis observar la lectura de los sensores se realiza de forma
ponderada como se explica en la pgina 46.
79
void atras() {
digitalWrite(3,HIGH);
delayMicroseconds(1000);
digitalWrite(3,LOW);
digitalWrite(2,HIGH);
delayMicroseconds(2000);
digitalWrite(2,LOW);
delayMicroseconds(20000);
}
void derecha() {
digitalWrite(2,HIGH);
delayMicroseconds(2000);
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
delayMicroseconds(2000);
digitalWrite(3,LOW);
delayMicroseconds(20000);
}
void izquierda() {
digitalWrite(2,HIGH);
delayMicroseconds(1000);
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
delayMicroseconds(1000);
digitalWrite(3,LOW);
delayMicroseconds(20000);
}
Como podis observar cada una de estas funciones realiza un nico pulso, con lo
cual si queremos que el robot ande unos centmetros hacia adelante tendremos que
implementar un bucle for que llama a la funcin adelante tantas veces como tiempo
queremos que ande hacia adelante el robot.
void setup() {
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
}
80
Utilizando esta primera versin del software tenemos un pequeo bug, cuando el
robot detecta una esquina realiza un pequeo movimiento hacia atrs y acto seguido
vuelve a tirar hacia adelante. Una de las posible soluciones es ajustar el valor de uno
de los sensores ms alto que el otro, de esta manera nuestro robot en caso de duda
siempre girar hacia un lado. Otra forma ms elegante de solucionarlo sera
substituir la llamada a la funcin atras por un bucle que llame a la funcin atrs
un nmero determinado de veces, de esta forma har un recorrido mayor hacia
atrs y despus podr corregir correctamente su rumbo. Otra posible solucin es
guardar en variables un histrico de hacia donde ha girado las ltimas ejecuciones e
intentar detectar esos puntos muertos.
82
83
Respecto al software, este vuelve a ser un montaje bastante sencillo. Si las dos
fotorresistencias detectan color blanco, podemos deducir que vamos por buen
camino y seguimos hacia adelante. Si en caso contrario solo una de las
fotorresistencias detecta blanco, significa que nos hemos desviado y debemos
corregir el rumbo a derecha o izquierda. Y por ltimo si topamos con negro en los
dos sensores deberamos retroceder un poco para retomar la ruta.
void loop() {
valizq = analogRead(0);
valder = analogRead(1);
if (valder>400 && valizq>400) {
atras();
} else {
if(valder>400) {
derecha();
} else {
if (valizq>400) {
Izquierda();
} else {
adelante();
}
}
}
}
84
Robot perseguidor
La idea es realizar un robot que sea capaz de perseguir un objeto en movimiento.
Para ello aprovecharemos el montaje de la prctica de la pgina 81, y modificaremos
el software.
Respecto al movimiento hacia adelante controlaremos la distancia del objeto a tres
rangos: lejos, cerca y muy cerca. Si el objeto esta muy cerca iremos hacia atrs para
no chocar, si lo tenemos cerca nos aproximaremos l y si lo tenemos lejos nos
mantendremos en reposo. Respecto a izquierda y derecha haremos todo lo
contrario a la prctica anterior, de forma que si detectamos algo a la izquierda
giraremos a la izquierda para encararnos al objeto, y de forma similar si detectamos
algo a la derecha giraremos a la derecha para encararnos.
void loop() {
valizq = analogRead(0);
valder = analogRead(1);
if (valder>700 && valizq>700) {
atras();
} else {
if(valder>400 && valizq>400) {
adelante();
} else {
if (valizq>400) {
izquierda();
} else {
if(valder>400) {
derecha();
} else {
//No hacemos nada
}
}
}
}
}
85
Organizador de manzanas
Ilustracin 82: Esquema del montaje de la pala incluyendo un servo y piezas metlicas.
86
Como podis ver tenemos una funcin pala_up que levanta la pala a 120 grados y
una funcin pala_down que baja la pala a 30 grados. Los grados a los que se ha de
levantar la pala dependen de como coloquemos el servo y como este calibrado. Con
la librera servo.h podemos utilizar tanto servos de tamao normal como miniservos,
la forma de programarlos es idntica.
87
void setup()
{
Serial.begin(9600);
pala.attach(9);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
}
d derecha
o bajar pala
p levantar pala
void loop()
{
if (Serial.available() > 0) {
int rec = Serial.read();
if(rec=='w') adelante();
if(rec=='s') atras();
if(rec=='a') izquierda();
if(rec=='d') derecha();
if(rec=='o') pala_down();
if(rec=='p') pala_up();
delay(10);
}
}
88
Para probar si funciona, una vez hemos enviado el programa a la placa arduino
conectamos el Monitor [mirar ilustracin 86] y le enviamos mensajes a la placa a
travs del monitor [Ilustracin 87]. Al escribir algunas de las letras codificadas por el
monitor y pulsar enviar, arduino debera recibir nuestras rdenes y realizar los
movimientos programados.
89
90
Import processing.serial.*;
Importa la librera de comunicaciones
Serial puerto;
91
Con esta captura de los datos obtenemos el valor que se nos enva desde arduino.
Ahora solo hemos de convertirlo a un valor numrico y hacer que el programa
dibuje un rectngulo en la posicin que indica el valor. Dado que el valor que
recibimos (en nuestro caso) es siempre mayor que 80, al valor recibido le
restaremos 80 siempre para normalizarlo.
Ahora veamos ahora como simular el rebote y la velocidad de una pelota en
pantalla.
92
Como vemos en el esquema trabajaremos con 4 variables, x-y para guardar la posicin y vx-vy
para guardar la velocidad y direccin de hacia donde se dirige la bola.
Si vx es positiva se mover hacia la derecha y si es negativa hacia la izquierda. A cada pasada
del bucle de ejecucin incrementaremos la x en vx puntos y la y en vy puntos, asi conseguimos
que la pelota se mueva en la direccin deseada.
Y para hacer rebotar la pelota lo nico que tendremos que hacer es invertir el signo de vx o vy
cuando la x o la y de la pelota llegue a un borde.
Los rebotes de la pelota con las paredes son relativamente fciles de calcular, el
problema lo tendremos para calcular el rebote de la pelota con la barra. Cuando
detectamos que la x de la pelota es inferior a la x de la barra, pueden suceder dos
cosas que la pelota se ha tocado con la barra o que ha cado por el borde izquierdo.
Para detectar si la pelota a tocado la barra comprobaremos que la y de la pelota est
entre la esquina superior de la barra y la esquina inferior de la barra.
93
94
95
96
97
Theremin de Infrarojos
Un theremin es un instrumento musical bastante curioso, posee un par de antenas
metlicas y acercndote o separndote de estas antenas controlas el volumen y la
frecuencia de la nota que se emite. En esta prctica intentaremos simular este
instrumento musical con nuestro arduino. En lugar de dos antenas metlicas
utilizaremos dos sensores de proximidad, dos fotorresistencias o dos
potencimetros.
Una nota musical, no es ms que una onda que vibra a una frecuencia concreta, si la
frecuencia es ms alta obtenemos notas ms agudas y al contrario notas ms graves.
Por ejemplo un LA funcionaria a 440 herzios, es decir, que para reproducirlo
tenemos que producir una onda de 440 pulsos en un segundo, o lo que es lo mismo
pulsos de 2.272 microsegundos.
1s
=2,272 ms
440
En nuestra implementacin capturaremos el valor del infrarojo para saber que nota
se quiere reproducir, calcularemos de cuanto tiempo han de ser los pulsos, y
reproduciremos pulsos de la frecuencia enviada durante un cuarto de segundo.
int v1;
float tiempo;
void setup(){
Serial.begin(9600);
pinMode(8,OUTPUT);
}
void loop() {
v1=analogRead(0);
98
Localizador de colores
Processing es un lenguaje de programacin pensado para artistas, es por esta razn
que esta provisto de infinidad de libreras para trabajar con audio, video e imagen a
tiempo real. Por otro lado es un lenguaje bastante simple y muy similar a arduino.
En este proyecto vamos a trabajar con la librera videoCapture que nos permite
capturar y editar a tiempo real video de una webcam conectada al PC. Antes de
empezar a programar necesitamos tener instalado en nuestro PC (si funciona bajo
99
Con este escueto cdigo inicializamos la webcam, capturamos la imagen que esta
viendo la webcam en este momento (si esta disponible) y la dibujamos en pantalla
con la instruccin image(), y todo esto a tiempo real.
Ahora veremos como retocar en tiempo real el contenido de estas imgenes que
nos enva la cmara. Podemos acceder a los pxeles de la imgen capturada
mediante el array video.pixels[ ], este array guarda los colores de cada uno de los
pxeles de la pantalla. Para recorrerlo crearemos un par de bucles anidados que se
mueven por las columnas y filas del array video.pixels[ ]. Para cada punto
guardaremos su color en la variable col de tipo color. Haciendo red(col),
green(col) y blue(col) accedemos a cada uno de los componentes de color del
punto que estamos estudiando.
for (int x = 0; x < video.width; x ++ ) {
for (int y = 0; y < video.height; y ++ ) {
int loc = x + y*video.width;
color col = video.pixels[loc];
float r1 = red(col);
float g1 = green(col);
float b1 = blue(col);
r1=255;
col= color(r1,g1,b1);
video.pixels[loc]=col;
}
}
video.loadPixels();
20 http://www.apple.com/es/quicktime/download/
21 http://www.eden.net.nz/7/20071008/
100
Como ejemplo en el cdigo que vemos aqu arriba, descomponemos cada uno de
los pxeles en rojo, verde, azul, y volvemos a guardar el color pero con el rojo a 255,
con lo cual obtendremos un filtro rojo en todas las imgenes que vienen de la
webcam.
Pero en esta prctica lo que queremos es detectar un color concreto, para ello
descompondremos el color y lo compararemos con el color que estamos buscando.
Si la diferencia entre los dos colores es menor que la diferencia de las
comparaciones anteriores, se establece el punto x,y del color como el punto ms
cercano al color que buscamos. Al acabar de ejecutar los dos bucles anidados
tenemos el punto ms cercano al color de referencia.
int cX = 0;
int cY = 0;
float record = 500;
for (int x = 0; x < video.width; x ++ ) {
for (int y = 0; y < video.height; y ++ ) {
int loc = x + y*video.width;
color col = video.pixels[loc];
float r1 = red(col);
float g1 = green(col);
float b1 = blue(col);
float r2 = red(trackColor);
float g2 = green(trackColor);
float b2 = blue(trackColor);
float d = dist(r1,g1,b1,r2,g2,b2);
if (d < record) {
record = d;
cX = x;
cY = y;
}
}
}
if (record < 10) {
ellipse(cX,cY,16,16);
}
El tintero
Finalizo este libro una vez acabado el 2009 con un montn de nuevos proyectos en
el tintero. Tengo tres alumnas de 10 a 13 aos que a partir de un conejo de peluche
han diseado un robot que modifica su comportamiento en funcin de la
101
22 El Treball de recerca es un trabajo que realizan los alumnos en Catalunya al finalizar el primer curso de
bachillerato.
102
Apndice
104
Apndice
105
106
Apndice
107
108