Professional Documents
Culture Documents
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 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.
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.
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.
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.
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)
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.
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.
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.
Ampliacin
Podrais modicar el programa para que haga parpadear alternativamente dos led?
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.
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
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
12
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
Figura 11: Modulacin de ancho de pulso (PWM) como forma de emular una seal analgica.
LOW HIGH
LOW HIGH
LOW
HIGH
LOW
15
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 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
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
(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.
19
M
3V3 5V RST POWER Vin D13 D12
PWM
100nF
220 ohm
AREF
1k
1k ARDUINO UNO
DIGITAL INPUT/OUTPUT
C B E
D11
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
21