You are on page 1of 21

Computacin fsica

Introduccin
En la actualidad el mundo digital est totalmente integrado a nuestras vidas, estamos muy acostumbrados a trabajar habitualmente con ordenadores. La computacin fsica es la integracin del mundo digital al mundo analgico, es decir, la construccin de sistemas fsicos que, mediante el uso de software y hardware, puedan interactuar con el mundo analgico. Dicha interaccin se produce a travs de sensores que captan informacin del medio y de actuadores que realizan alguna accin en consecuencia. Entre los dispositivos de computacin fsica ms comunes podemos mencionar los telfonos mviles que cada vez incorporan ms funciones interactivas, tambin en performances artsticas, consolas de videojuegos, robots, pizarras interactivas, etc. En museos interactivos como Cosmocaixa tenemos muchos ejemplos de aplicacin de computacin fsica donde el usuario aprende interactuando con diferentes dispositivos electromecnicos. Una de las plataformas ms extendida para el desarrollo de proyectos de computacin fsica es la placa Arduino, se trata de una placa controladora programable que permite la conexin de sensores y actuadores. Arduino es un proyecto de hardware y software libre (toda la informacin y especicaciones de la placa son accesibles, as como el software y el lenguaje usado son de cdigo abierto y gratuito). Aprenderemos a trabajar con la placa Arduino y su lenguaje de programacin mediante la realizacin de pequeos proyectos con los que adquiriremos la autonoma necesaria para la realizacin de proyectos ms complejos y ambiciosos en el futuro.

La placa Arduino Uno


Arduino Uno (http://www.arduino.cc) es una placa que contiene un microcontrolador ATmega328P, un controlador y puerto de comunicacin USB y un controlador para alimentacin externa (Figura 1).

La placa tiene una memoria ash que permite almacenar pequeos programas transmitidos al a travs puerto USB. Una vez almacenado el programa internamente, la placa es autnoma y no necesita conexin al ordenador. La placa utiliza una alimentacin externa de entre 7 y 12 V, aunque tambin se la puede alimentar a travs del cable USB.

Figura 1: Placa Arduino Uno

La placa Arduino Uno est formada por las siguientes partes: 14 entradas/salidas digitales (pines 0 a 13). La funcin de salida o entrada se establece por software. 6 entradas analgicas (pines 0 a 5). Estas entradas toman valores analgicos, es decir, lecturas de voltajes, y los transforman en valores entre 0 y 1023. 3 salidas analgicas (pines 9, 10 y 11) que corresponden a 3 de los pines digitales que son reasignados como salidas analgicas.

El software
El entorno de programacin forma parte del proyecto Arduino y permite escribir programas llamados (sketches) para la placa Arduino en un lenguaje de programacin adaptado del lenguaje Processing. Cuando el programa se enva a la placa primero se traduce a lenguaje C (un lenguaje ms complicado para un principiante) y luego se compila en un lenguaje que solo entiende el microprocesador y se almacena en l. En ste ltimo paso es donde la complejidad de la programacin de microprocesadores queda oculta para nosotros hacindonos la vida ms sencilla.

Descarga e instalacin del entorno de programacin


Para poder programar la placa Arduino deberemos descargarnos e instalar el entorno de programacin al que a partir de ahora

llamaremos IDE (son las siglas en ingls de: Integrated Development Environment) : Vamos a la pgina web: http://arduino.cc/en/Main/Software Elegimos el sistema operativo que nos corresponde. Descargamos el software a nuestro ordenador. Descomprimimos el archivo.

Instalacin de los controladores de la tarjeta en Windows


Conecta la tarjeta al ordenador mediante el cable USB. Despus de un rato de infructuosos intentos el sistema nos informa que la instalacin de controladores ha fallado. Abrimos el men Inicio y vamos al Panel de Control. Dentro del Panel de Control buscamos el icono Sistema y dentro de la ventana de Sistema la pestaa Hardware. Abrimos el Administrador de Dispositivos y deberamos ver a Arduino Uno dentro de la categora Otros dispositivos. Hacemos clic con el botn secundario del ratn sobre Arduino UNO y elegimos la opcin Actualizar controlador... Al asistente que se abre le decimos que no busque el controlador (tercera opcin: No por el momento)y hacemos clic en Siguiente. Elegimos la opcin Instalar desde una lista o ubicacin especca y Siguiente. Elegir la opcin incluir esta ubicacin en la bsqueda y Examinar para buscar la ubicacin del controlador que se encuentra en la carpeta drivers del paquete anteriormente descomprimido. Si nos sale una advertencia de que el software no ha superado la prueba del logotipo de Windows la ignoramos y elegimos Continuar. Para acabar elegimos la opcin Finalizar y nos aparecer la tarjeta con un puerto COMx asignado.

El entorno de programacin
Para ejecutar el entorno de programacin solamente hace falta hacer doble clic sobre el chero ejecutable con el icono de Arduino. El aspecto del entorno es el que aparece el la Figura 2.

Figura 2: IDE de Arduino.

Lenguaje de programacin
Para poder entendernos entre la placa y nosotros necesitamos un lenguaje en comn. En realidad nosotros escribiremos en un lenguaje ms cercano a nosotros (lenguaje de alto nivel) y el compilador del IDE se encargar de traducirlo a un lenguaje ms cercano al microprocesador (lenguaje de bajo nivel). Un programa simple se podra escribir en nuestro lenguaje cotidiano como: Cuando est oscuro quiero que se encienda la luz y que el motor comience a funcionar lentamente. Podemos reescribir esto en un pseudo cdigo (algo ms parecido a un programa pero que aun sea lenguaje humano):
If light level is less than 50 then Turn Light on Turn motor on slow Loop again

Nos damos cuenta que necesitaremos dos tipos de estructuras de programacin: bucles (Loop) y sentencias condicionales (If...then). El bucle se necesita para que el procesador lea constantemente el estado de las entradas (nivel de luz) as como para que actualice el

estado de las salidas (lmpara y motor). Las sentencias condicionales se usan para comprobar si se cumple determinada condicin y cambiar el curso del programa dependiendo de ella. Un programa de Arduino tendra la siguiente estructura:
//Este es un comentario // declaracin de variables int x; void setup(){ //poner cdigo aqu } void loop(){ //poner cdigo aqu }

En el comienzo del programa declaramos las variables, que corresponden a reas de memoria donde se almacenarn datos. Luego la funcin void setup() se usa para asignar qu pines de la placa son entradas y cuales son salidas. La ltima funcin, void loop(), se ejecutar indenidamente hasta que la placa sea apagada. Aqu es donde deben ponerse toda la lgica condicional y es la parte principal del cdigo donde se controla el ujo del programa. El texto que comienza con // es un comentario que resulta til para que recordemos qu es lo que hace el cdigo cuando lo leemos despus de un cierto tiempo, o para que otra persona que quiera modicarlo lo entienda.

Variables
Un aspecto especial de la programacin es que cada vez que quieras guardar algn valor tendrs que hacerlo a travs de una variable que debers declarar previamente. Es decir, decirle al ordenador que clase de valor espera. Existen unos pocos tipos de valores de datos que un ordenador puede esperar. Los que necesitaremos son los siguientes: int un entero es un nmero de los que podemos contar con los dedos, por ejemplo 1, 2, 3, 4, 5, etc. byte un nmero entero entre 0 y 255, es til cuando deseas reservar espacios de memoria que se dividen en bytes (la tarjeta Arduino tiene solo 1024 bytes de RAM)

Control de ujo If [condicin] then


En Arduino una sentencia if tiene el aspecto:
if (expresin) { sentencia; sentencia; }

Donde la expresin puede ser una (o una combinacin) de las siguientes: a==b a iguala a b a!=b a no es igual a b a>b a es mayor que b a<b a es menor que b a<=b a es menor o igual a b a>=b a es mayor o igual a b Las sentencias pueden ser lo que quieras, incluso ms sentencias condicionales.

No confundas == con el operador de asignacin = que cambia el valor de una variable que se encuentre a su izquierda.

Bucles for
for (i = 1; 1 <= 8; i++) { sentencia; }

Un bucle for es una manera de ejecutar un trozo de cdigo durante una cierta cantidad de veces. En el ejemplo la sentencia se ejecuta 8 veces con i tomando valores desde 1 hasta 8.

delays
delay(100)

La funcin delay() en programacin empotrada para bajar la velocidad con la que el procesador se actualiza. Son tiles para hacer que las cosas sucedan a determinado ritmo, por ejemplo, si queremos que un led parpadee cada segundo, despus de encenderlo podemos poner la sentencia delay(1000) que hace que el microprocesador no haga nada durante un segundo (1000 milisegundos). Delay tambin es til para funciones de debugging (encontrar errores de programacin) y control general del ujo.

Proyecto 1: Led parpadeante


Material: Led. Resistencia de 220 ohms. Placa Arduino Uno. Cables Protoboard.

En nuestro primer proyecto con Arduino, conectaremos un led al puerto 2 y haremos que este parpadee. En primer lugar conectaremos la pata corta del led a tierra (GND) y la pata larga a una resistencia que ir conectada tambin al pin 2.

Figura 3: Montaje del led parpadeante.

Para escribir el cdigo del programa (sketch) abrimos la interfaz del entorno de desarrollo (IDE) e introducimos el cdigo del Listado 1. Listado 1 Led parpadeante.
void setup() { pinMode(2,OUTPUT); } void loop() { digitalWrite(2,HIGH); delay(500); digitalWrite(2,LOW); delay(500); }

El cdigo del programa comienza con la funcin setup() que sirve para inicializar la funcin de los pines. En este caso se dene el pin 2 como salida (OUTPUT). La segunda funcin, loop() corresponde al programa principal que ja el valor del pin 2 como alto (HIGH), es decir, de 5 V mediante la sentencia digitalWrite(2, HIGH) para encender el led y luego espera medio segundo (500 ms) mediante

la sentencia delay(500). La segunda parte de la funcin se encarga de apagar el led (digitalWrite(2, LOW)) jando el voltaje en 0 y espera otro medio segundo. La funcin loop(), no acaba nunca as que la secuencia vuelve a comenzar haciendo que el led parpadee continuamente hasta que desconectemos la placa o le enviemos otro programa. Para transferir el sketch a la placa debemos elegir el modelo de placa (Figura 4), luego el puerto al que est conectada la placa (Figura 5) y enviamos el programa a travs de la herramienta upload (Figura 6).

Figura 4: Seleccin del tipo de placa. En este caso elegimos Arduino Uno.

Figura 5: Seleccin del puerto al que est conectada la placa. En Linux suele ser /dev/ttyACM0 y en Windows COM1 o COM2.

Figura 6: Para pasar el sketch a la placa empleamos la herramienta Upload.

Ampliacin
Podrais modicar el programa para que haga parpadear alternativamente dos led?

Proyecto 2: Cdigo Morse


En este proyecto veremos el uso de funciones auxiliares con Arduino. Utilizando el mismo montaje que usamos para el led parpadeante pasaremos el cdigo del Listado 2 a la placa. Listado 2 Sketch para el cdigo Morse.
void setup() { pinMode(2,OUTPUT); } void loop() { punto(); punto(); punto(); ralla(); ralla(); ralla(); punto(); punto(); punto(); } void punto() { digitalWrite(2,HIGH); delay(100); digitalWrite(2,LOW); delay(100); } void ralla() { digitalWrite(2,HIGH); delay(500); digitalWrite(2,LOW); delay(100); }

En el sketch se observa el uso de las funciones auxiliares punto() y ralla() que son llamadas desde la funcin principal loop(). No aparece ningn otro concepto nuevo respecto al proyecto anterior.

Ampliacin
Qu mensaje ests enviando con el led? Crea otro mensaje y haz que el led lo reproduzca (Ayuda: busca en la web el cdigo Morse).

10

Proyecto 3: Semforo
Material: Led rojo Led amarillo Led verde 3 resistencias de 220 ohms. Placa Arduino. Protoboard. Cables Zumbador

En la Figura 7 observamos un posible montaje del semforo con un zumbador para invidentes.

Figura 7: Montaje del semforo.

En este proyecto fabricaremos un semforo con tres led. Lo haremos en cuatro etapas y en cada una de ellas iremos agregando complejidad al programa. La etapas sern las siguientes: 1. Programar los led de forma que se enciendan el verde, el amarillo y el rojo. 2. Hacer que el led amarillo parpadee tres veces antes de encender el led rojo. 3. Incluir el funcionamiento del zumbador intermitente (para invidentes) mientras el led verde permanece activo. 4. Simplicar el cdigo utilizando un bucle de tipo for.

11

Proyecto 4: Hacer funcionar un motor


En este proyecto veremos como hacer funcionar un motor usando la placa Arduino. A diferencia del caso del led que poda ser alimentado con la misma placa, el motor necesita de una alimentacin externa debido a que su consumo en potencia es mayor de la que puede proporcionar la placa. Hay diferentes maneras de hacer funcionar un motor con Arduino, nosotros veremos la ms sencilla que consiste en usar un transistor como amplicador de corriente. El esquema del conexionado es el que se muestra en la Figura 8.

SALIDA ARDUINO

1k

C B E

En el esquema puede verse que la salida del Arduino controla la base del transistor, cuando la salida est en HIGH, el transistor pasa de corte a saturacin y acciona el motor que est alimentado por una fuente externa. El diodo tiene por objetivo proteger al transistor de sobretensiones al igual que lo hacamos con los rels. La resistencia de 1 k protege tambin al transistor. El condensador de 100 nF tiene por objetivo eliminar los saltos de tensin producidos por el motor y que pueden interferir con la tarjeta Arduino si usamos la misma alimentacin (4 pilas de 1,5 V cada una) para el motor y para la controladora. Si usamos alimentaciones independientes el condensador no es necesario. En la Figura 9 puede verse el montaje del circuito del motor. En este caso se opt por usar la misma alimentacin para el motor y la placa controladora (6 V), por lo que aadimos un condensador en paralelo con el motor. La alimentacin externa se introduce en la placa a travs del pin indicado con Vin. La salida 3 del Arduino controla el funcionamiento del motor. El Listado 3 muestra un posible sketch para controlar el motor. En este caso el motor gira durante 2 segundos y se detiene medio segundo para volver a comenzar el ciclo. Hemos visto como controlar un motor usando un transistor TIP120. Este transistor es un transistor Darlington que prov una mayor amplicacin, su ganancia en corriente es del orden de 1000.

100nF

Figura 8: Esquema del conexionado para el control de motor con Arduino.

12

Figura 9: Control de un motor mediante la placa Arduino y un transistor TIP120.

Listado 3 Sketch para controlar el motor.


void setup() { pinMode(3,OUTPUT); } void loop() { digitalWrite(3, HIGH); delay(2000); digitalWrite(3,LOW); delay(500); }

La conexin Darlington de transistores permite aumentar la ganancia en corriente conectando dos transistores como se observa en la Figura 10.

C
Figura 10: Conexin Darlington.

E
La corriente amplicada por el primer transistor se introduce en la base del segundo transistor de esta manera se obtiene que la ganancia total es la multiplicacin de la ganancias de cada transistor ( Darlington = 2 , donde es la ganancia de cada transistor). En nuestro caso no hemos necesitado hacer la conexin Darlington

13

porque el TIP120 trae la conexin hecha internamente, dentro de su encapsulado hay dos transisitores conectados en Darlington. El inconveniente que tiene controlar el motor a travs de un transistor es que solamente se puede hacer girar el motor en un sentido, sin embargo podemos regular la velocidad de giro si utilizamos el pin 3 de la placa controladora como salida analgica en lugar de usarla como salida digital. Prueba introduciendo el Listado 4 en la placa y observa como cambia la velocidad del motor. Listado 4 Sketch para variar la velocidad de un motor utilizando una salida analgica.
void setup() { } void loop(){ analogWrite(3,50); delay(3000); analogWrite(3,100); delay(3000); analogWrite(3,200); delay(3000); analogWrite(3,0); delay(3000); }

La palabra analgico se reere a niveles que pueden ser variados gradualmente hasta un mximo nivel (como por ejemplo en los controles de volumen o nivel de iluminacin). Arduino tiene una funcin analogWrite que permite variar el nivel de intensidad. En realidad la funcin analogWrite no es totalmente analgica, aunque se comporta como tal. la funcin usa una tcnica llamada Pulso de Ancho Modulado (Pulse Width Modulation, PWM) que emula el comportamiento de seales analgicas usando pulsos digitales. El mtodo consiste en variar el tiempo en el que el pulso acta, como se muestra en la Figura 11. Los niveles de baja intensidad son emulados produciendo pulsos de tiempos de duracin cortos. Niveles ms altos de intensidad se consiguen haciendo que el tiempo en que los pulsos estn en HIGH sean ms largos. Hay 256 niveles de intensidad, desde 0 (motor detenido) hasta 255 (motor a plena carga).

14

HIGH (5 Volts) LOW (0 Volts) HIGH

El motor est apagado analogWrite(pin, 0) (0% de plena carga)

El motor est encendido analogWrite(pin, 63) (25% de plena carga)

Figura 11: Modulacin de ancho de pulso (PWM) como forma de emular una seal analgica.

LOW HIGH

El motor est encendido analogWrite(pin, 127) (50% de plena carga)

LOW HIGH

El motor est encendido analogWrite(pin, 191) (75% de plena carga)

LOW

HIGH

El motor est encendido analogWrite(pin, 255) (100% de plena carga)

LOW

15

Proyecto 5: Sensores. Usando una LDR


Hasta ahora estuvimos trabajando con salidas digitales y analgicas para controlar actuadores. Ahora nos dedicaremos a las entradas y a los sensores. En este caso veremos como conectar una LDR para medir niveles de intensidad luminosa. Para medir el nivel de intensidad luminosa construiremos un divisor de tensin con una resistencia de 1 k y la LDR como se muestra en la Figura 12.

1k Entrada analgica Arduino

La entrada analgica del Arduino lee el voltaje sobre la LDR y le asigna un valor entre 0 y 1023, de manera que leyendo la entrada analgica podemos tener una lectura de la intensidad luminosa. Si el valor es muy alto es porque el valor de la resistencia de la LDR es tambin alto, y eso quiere decir que el nivel de luz es bajo. En el montaje de la Figura 13 tambin se ha puesto un led blanco de alta luminosidad al lado de la LDR, de manera que si acercamos un papel blanco al led veremos como cambia el nivel de luz reejada en el monitor serie.

Figura 12: Divisor de tensin para medir nivel de intensidad luminosa.

Figura 13: Esquema del montaje para la lectura de nivel de luz con una LDR.

16

Para hacer la lectura del nivel de luz usaremos el monitor serie que viene con el entorno de programacin. Para ello debemos iniciarlo dentro de la funcin setup mediante la funcin Serial.begin(9600). La funcin para hacer la lectura es analogRead(4), donde en este caso el valor del pin es la entrada analgica 4, y luego se escribe el valor en el monitor con la funcin Serial.println(x), ver Listado 5. Para hacer visible el monitor serie debemos elegir la opcin Tools -> Serial Monitor del men o pulsar la secuencia Ctrl + Maysculas +M. Listado 5 Sketch para leer el nivel de luz con una LDR.
int x; void setup(){ Serial.begin(9600); } void loop(){ x= analogRead(4); Serial.println(x); }

17

Proyecto 6: Robot que sigue una lnea


En proyectos anteriores hemos visto como accionar un motor con Arduino usando un transistor y como medir intensidad de luz usando una LDR. En este proyecto pondremos en juego esas dos cosas para construir un robot que sigue una lnea negra sobre una supercie blanca. El robot ser capaz de seguir una linea negra dibujada sobre un fondo blanco. Usaremos resistencias LDR como sensores. para que el robot no se haga sombra a s mismo, junto con las LDR se instalarn dos diodos de alta luminosidad que mantendrn los niveles de iluminacin constantes debajo del robot. En la Figura 14 podemos observar una fotografa del robot.

Figura 14: Fotografa del robot seguidor de lneas.

Cuando el robot est colocado sobre una supercie blanca la luz emitida por los diodos de alta luminosidad se reeja en la supercie y las LDR detectan la luz (Figura 15 (a)). En esta situacin los dos motores estn funcionando y el robot se desplaza hacia adelante. Cuando uno de los sensores se coloca sobre la lnea negra (Figura 15 (b)), la LDR deja de recibir el reejo de la luz (el color negro absorbe la luz del led) y el motor que est en el mismo lado que el sensor se detiene, mientras que el otro motor sigue en funcionamiento corrigiendo la trayectoria del robot. El circuito del robot se observa en la Figura 16. El programa del robot lo podemos ver en el Listado 6. El programa comienza declarando las variables que utilizaremos: x, y y umbral. Las dos primeras guardarn los valores de intensidad de luz ledos por cada una de las LDR y la variable umbral guardar el valor de intensidad a partir del cual el programa decidir si la supercie bajo la LDR es negra o blanca. En el caso del programa listado el valor us-

18

Sensores

Figura 15: Funcionamiento del robot.

(a)

(b)

ado es 700 pero esto puede cambiar bajo situaciones de iluminacin diferentes. Veremos despus cmo hacer para calibrar este valor. La funcin setup dene a los pines 3 y 11 como salidas digitales, que sern las que controlarn los motores. En la funcin loop se comienza por leer los valores de los pines 0 y 5 de las entradas analgicas que corresponden a las lecturas de las LDR. Recordemos que los valores posibles de lectura van desde 0 (mxima iluminacin) a 1023 (total oscuridad). En el listado hemos denido funciones auxiliares que son las que hacen que el robot marche hacia adelante, gire o se detenga. Utilizamos sentencias de control if para la toma de decisiones as, la sentencia
if (x<umbral && y<umbral) {adelante();}

ejecuta la funcin adelante si las variables x e y son menores a la variable umbral (los dos sensores estn sobre una supercie blanca). En cambio, si una de las variables es mayor al umbral y la otra menor quiere decir que uno de los sensores est sobre una superfcie blanca mientras que el otro est sobre una supercie negra. Para corregir la trayectoria el programa llama a la funcin derecha. De la misma manera se entienden las otras sentencias.

Determinacin del valor umbral


Para determinar qu valor debemos usar para la variable umbral mediremos los valores que entregan los sensores cuando se ubican sobre una supercie negra y sobre una blanca. Tomaremos como

19

+6V +6V +6V

M
3V3 5V RST POWER Vin D13 D12
PWM

100nF

Figura 16: Circuito del robot.


+6V

220 ohm

AREF

1k

1k ARDUINO UNO
DIGITAL INPUT/OUTPUT

C B E

D11

PWM D10 PWM

D9 D8 D7

M
C B E

100nF

LDR

+6V
A0 ANALOG INPUT A1 A2 A3

PWM PWM

D6 D5 D4

1k

PWM

D3 D2

220 ohm

1k

A4 A5

TX> RX<

D1 D0

GND

LDR

valor umbral un valor intermedio entre esos dos valores. Para leer los valores de los sensores crearemos el programa del Listado 7. Este programa lee los valores de los pines 1 y 5 y los muestra en pantalla separados por un guin. Para ver los valores debemos abrir el monitor serie (Tools >> Serial Monitor) en el entorno de programacin.

20

Listado 6 Sketch del robot rastreador.


int x,y; int umbral; void setup(){ pinMode(3, OUTPUT); pinMode(11, OUTPUT); } void loop(){ x = analogRead(0); y = analogRead(5); umbral = 700; if (x<umbral && y<umbral) {adelante();} if (x>umbral && y<umbral) {derecha();} if (x<umbral && y>umbral) {izquierda();} if (x>umbral && y>umbral) {parar();} } void adelante(){ digitalWrite(3, HIGH); digitalWrite(11,HIGH); delay(100); digitalWrite(3,LOW); digitalWrite(11,LOW); } void derecha(){ digitalWrite(3, HIGH); digitalWrite(11,LOW); delay(100); digitalWrite(3,LOW); } void izquierda(){ digitalWrite(11, HIGH); digitalWrite(3,LOW); delay(100); digitalWrite(11,LOW); } void parar(){ digitalWrite(3,LOW); digitalWrite(11,LOW); delay(100); }

21

Listado 7 Programa de calibracin para determinar el valor umbral.


int x,y; void setup(){ Serial.begin(9600); } void loop(){ x = analogRead(1); y = analogRead(5); Serial.print(x); Serial.print("-"); Serial.println(y); }

You might also like