Page 1

Arduino • HARDWARE

Controlando el Entorno

Arduino: Entrada analógica y salida PWM

Aprendemos a monitorizar e interactuar sobre el entorno con Arduino. POR LUIS MARTÍN

D

esde tiempos remotos, el ser humano siempre ha buscado la manera de controlar todo lo que le rodea. Ejemplos de esto son el control del fuego y el agua pretendido por las civilizaciones antiguas. Sin embargo, nosotros no nos tenemos que ir tan lejos en el tiempo para encontrar

este tipo de necesidades humanas. En la actualidad, el fuego se ha cambiado por la calefacción de nuestra casa, y el agua por el riego automático de las plantas. Naturalmente, ambas cosas son controlables por Arduino. Y el sistema de hardware libre nos lo permite de

Listado 1: Lectura Entrada Analógica 01 // Variables estáticas 02 int potenciometro = A0; // Entrada para el potenciómetro 03 04 // Variables dinámicas 05 int valorPotenciometro = 0; // Variable para el valor del sensor 06 07 void setup() { 08 // Inicializa el puerto serie: 09 Serial.begin(9600); 10 } 11 12 void loop() { 13 // Lee el valor del pin del

potenciometro y lo almacena 14 // en la variable valorPotenciometro 15 valorPotenciometro = analogRead(potenciometro); 16 // Imprime por el monitor serie el valor 17 // de la señal del potenciometro 18 Serial.print(“Valor sensor = “ ); 19 Serial.println(valorPotenciometro); 20 // Pequeño retardo de tiempo: 21 delay(1000); 22 }

WWW.LINUX- MAGAZINE.ES

manera autónoma, tomando información del entorno a través de sus pines de entrada para multitud de sensores. Con la información extraída, puede afectar sobre aquello que le rodea, controlando luces, motores y otros actuadores. También puede trabajar como un “puente” entre un dispositivo electrónico y el mundo real, haciendo que un ordenador pueda sentir y controlar el mundo físico. Una vez vistos los conceptos básicos de entradas/salidas digitales en los dos anteriores artículos [1] [2], trabajaremos con las entradas analógicas de Arduino y las salidas digitales que nos permiten realizar una modulación del

Figura 1: Entradas analógicas de Arduino.

Número 84

49


HARDWARE • Arduino

Para realizar la conversión de ese valor de tensión analógico a un valor con el que el dispositivo pueda trabajar se usan los conversores A/D (Analógico > Digital). Podríamos hacer un símil con los idiomas, ya que al Figura 2: Ejemplos de valor medio obtenidos por modulación de igual que una persona no entiende otros idioancho de pulso. mas que no ha estuancho de un pulso (PWM), cerrando así diado y utiliza traductores para poder una primera etapa de aprendizaje y hacerlo, un sistema electrónico sólo toma de contacto con Arduino iniciada puede entender señales digitales por sí por Dmitri Popov y continuada por el solo, por lo que se sirve de un converequipo de Cooking Hacks [3]. sor A/D para entender y tratar señales analógicas. Ese módulo se encarga de Conceptos Básicos convertir la magnitud analógica en un Antes de meternos directamente con el número proporcional que se puede diseño hardware o la programación, almacenar en una variable. Esta convamos a intentar dejar claros dos conversión se realiza con una precisión o ceptos clave con los que vamos a trabaresolución determinada (determinada jar a lo largo de este artículo. por el número de bits) y cada cierto El primero de ellos es el de entrada intervalo de tiempo (periodo de muesanalógica. Una entrada analógica es un treo). pin en el que recibimos directamente En Arduino las entradas analógicas valor de tensión relacionado directavienen identificadas desde A0 hasta A5 mente con una señal física, sin que sea (Figura 1). Arduino realiza una converun valor de “1” ó “0” del sistema binario sión analógico-digital para señales que (como ocurre en las señales digitales), varíen entre 0 y 5 voltios, con una resoaunque deben ser codificadas/decodifilución de 10 bits, lo que significa que cadas para que nuestro sistema electrónos devolverá un valor entre 0 (cuando nico las pueda utilizar. Esto permite a los la señal analógica sea de 0 voltios) y dispositivos que las utilizan trabajar con 1023 (cuando la señal analógica sea de señales de tipo analógico (que no poseen 5 voltios). un valor fijo, sino que pueden variar) El segundo concepto que tenemos como la temperatura, la humedad… que conocer es el de PWM (Modulación por ancho de pulso). Al igual que ocu-

Listado 2: Lecturas de la Señal Analógica 01 Valor sensor = 1023 02 Valor sensor = 1023 03 Valor sensor = 1023 04 Valor sensor = 1023 05 Valor sensor = 1023 06 Valor sensor = 919 07 Valor sensor = 801 08 Valor sensor = 737 09 Valor sensor = 685 10 Valor sensor = 635 11 Valor sensor = 559 12 Valor sensor = 508 13 Valor sensor = 261 14 Valor sensor = 17 15 Valor sensor = 0 16 Valor sensor = 0

50

Número 84

Figura 3: Salidas digitales con función PWM de Arduino.

rre con las señales que queremos medir, en ocasiones necesitamos una señal de salida distinta a un valor digital bajo o alto, con el fin, por ejemplo, de variar la velocidad de un motor o la intensidad con la que brilla un LED. Para realizar este tipo de tareas podemos utilizar el PWM, que tratará de emular una señal analógica a partir de una señal digital. La modulación por ancho de pulso (del inglés Pulse Width Modulation), trabaja enviando una serie de pulsos periódicos (todos ellos de 5 voltios), en vez de un valor constante de tensión digital, a una frecuencia determinada, de manera que la tensión media que llega al dispositivo varía en función del ancho de esos pulsos. De este modo, cuanto más largos sean los pulsos, más se acercará el valor medio de tensión a 5 voltios, ya que estarán más juntos, y a medida que los acortamos, más nos acercaremos a 0 voltios. El PWM nos permite obtener cualquier valor de tensión entre 0 ó 5 voltios únicamente por medio de dos señales digitales.

Listado 3: Efecto fading 01 // Variables estáticas 02 int potenciometro = A0; // Entrada para el potenciómetro 03 int led = 9; // Declaramos la variable pin del LED 04 05 // Variables dinámicas 06 int valorPotenciometro = 0; // Variable para el valor del sensor 07 08 void setup() { 09 // Inicializa el pin del LED como salida: 10 pinMode(led, OUTPUT); 11 }

WWW.LINUX- MAGAZINE.ES

12 13 void loop() { 14 // Lee el valor del pin del potenciometro y lo almacena 15 // en la variable valorPotenciometro (entre 0 y 1023) 16 valorPotenciometro = analogRead(potenciometro); 17 // Establecemos el valor analógico para la salida PWM 18 analogWrite(led, valorPotenciometro / 4); 19 // Pequeño retardo de tiempo (30 milisegundos) 20 delay(30); 21 }


Arduino • HARDWARE

Figura 5: Circuito conexión del potenciómetro.

Figura 4: Arduino Lab Kit de Cooking Hacks.

En la Figura 2 podemos observar ejemplos de PWM: en el primer caso se aprecia que el ancho de pulso es del 50% del periodo de la onda, por lo que la señal en verde (tensión media o tensión continua equivalente) dará un valor de la mitad del valor en alto (en el caso de Arduino dará 2,5 voltios, ya que el valor superior es de 5); en la segunda gráfica observamos el mismo proceso pero con valor de ancho de pulso del 75%. En Arduino las salidas digitales que permiten PWM son las número: 3, 5, 6, 9, 10 y 11 (Figura 3). Si no estáis demasiado familiarizados con estos conceptos, podéis echarles un vistazo a distintos tutoriales sobre estos temas que encontraréis en la página oficial de Arduino [4].

Diseño del Hardware Los conceptos aprendidos van a ser la base de los ejemplos que vamos a realizar, en uno de ellos trabajaremos con las entradas analógicas utilizando un potenciómetro como señal física, y en otros dos aunaremos las entradas analógicas con diferentes aplicaciones del PWM. Para realizar estos ejemplos se pueden utilizar los elementos que encontraremos en el Arduino Lab Kit de Cooking Hacks [5], que contiene los componentes electrónicos que vamos a usar: potenciómetro, servomotor, resistencias, cables, protoboard… (Figura 4 y Tabla 1). Para el primer ejemplo únicamente necesitaremos conectar un potenciómetro, pero de cara al segundo ejemplo montaremos un LED con su resistencia de 470 ohmios a masa (limi-

Figura 6: Potenciómetro como divisor de tensión.

tadora de corriente por el diodo) (Figura 5). Vamos a utilizar un potenciómetro como esa señal analógica a tratar por el Arduino. Un pontenciómetro es una resistencia de tipo variable, con 3 patillas al exterior. Entre los extremos siempre podemos encontrar un valor de resistencia fijo, que será el valor máximo, mientras que la resistencia que veremos entre el pin central y cual-

Listado 4: Control Servomotor 01 //Añadimos la librería servo.h 02 #include <Servo.h> 03 04 //Creamos un objeto Servo 05 Servo servo1; 06 07 // Variables estáticas 08 int potenciometro = A0; // Entrada para el potenciómetro 09 int pinServo = 9; // Declaramos la variable pin del servo 10 11 // Variables dinámicas 12 int valorPotenciometro = 0; // Variable para el valor del sensor 13 14 void setup() { 15 // Asignamos el pin 9 al objeto Servo

16 servo1.attach(pinServo); 17 } 18 19 void loop() { 20 // Lee el valor del pin del potenciometro y lo almacena 21 // en la variable valorPotenciometro (entre 0 y 1023) 22 valorPotenciometro = analogRead(potenciometro); 23 // Escalamos este valor para poder usarlo para el servo (entre 0 y 180 grados) 24 valorPotenciometro = map(valorPotenciometro, 0, 1023, 0, 179); 25 // Mandamos la posicion escalada al servomotor 26 servo1.write(valorPotenciometro); 27 // Esperamos que el servo se posicione 28 delay(15); 29 }

WWW.LINUX- MAGAZINE.ES

Número 84

51


HARDWARE • Arduino

Figura 7: Conexionado del potenciómetro.

quiera de los dos extremos será variable en la medida que modifiquemos la posición central. Esto es así porque los dos extremos se encuentran conectados a los extremos de una pista resistiva conductora y el central se encuentra

Tabla 1: Contenido Lab Kit – Arduino kit Componente Arduino UNO Rev.3? Cables para Arduino Breadboard Cable USB Resistencias 100 ohm Resistencias 470 ohm Resistencias 1 K Resistencias 2K2 Resistencias 10K Resistencias 100K Resistencias 1M Potenciómetro 1K Potenciómetro 100 K Pulsador Sensor LDR Sensor de temperatura NTC LED rojo LED verde Porta-baterías 6AA Diodo 1N4001 Sensor de temperatura MCP Registro de desplazamiento Octoacoplador Zumbador Servo HiTEc o Large Bleadboard mini Protoshield LCD 16*2 Matriz de led Relé Sensores de movimiento Transistor PNP Transistor NPN Transistor ULN2003

52

Número 84

Cantidad x1 x1 x1 x1 x20 x20 x20 x20 x20 x20 x20 x2 x2 x5 x1 x1 x10 x10 x1 x2 x1 x3 x3 x1 x1 x1 x1 x1 x1 x1 x1 x2 x2 x1

sobre ésta, de manera que si modificamos la posición de la conexión, obtendremos un nuevo valor de resistencia en función de la posición. El aumento de resistencia entre la patilla de un extremo y la central es proporcional a la disminución entre el otro extremo y la central. Vamos a utilizar nuestro potenciómetro como un divisor de ten- Figura 8: Circuito conexión del servomotor. sión (Figura 6), para lo que uno de los extremos lo conectareCada servo tiene sus márgenes de mos a 5 voltios y el otro a 0 voltios operación que se corresponden con el (fijando esa tensión en la resistencia ancho del pulso máximo y mínimo que fija entre extremos). el servo entiende. Los valores más Al realizar este montaje, obtendregenerales se corresponden con pulsos mos en la patilla central una tensión de entre 1 ms y 2 ms de anchura, que regulable en función de la posición del dejarían al motor en ambos extremos potenciómetro, ya que como la resis(0º y 180º). Si se sobrepasan los límitencia variará al mover el cursor del tes de movimiento del servo, éste potenciómetro, la tensión que caerá en comenzará a emitir un zumbido, indiella también se verá alterada proporciocando que se debe cambiar la longitud nalmente entre los extremos de 0-5 voldel pulso. Para el período se suelen tios. Esta tensión de salida la conectareemplear valores de ~ 20 ms (Figura mos a la entrada analógica A0 del 10). Es importante destacar que para Arduino para poder medirla (Figura 7). que un servo se mantenga en la misma El LED lo conectaremos de manera posición durante un cierto tiempo, es similar al artículo anterior [2], aunque necesario enviarle continuamente el en el pin digital 12, por lo que es necepulso correspondiente. sario la colocación de una resistencia Los servomotores tienen tres cables: limitadora. alimentación, tierra y señal. El cable En el último ejemplo realizaremos de alimentación es normalmente rojo y una modificación en el circuito antelo conectaremos a 5 voltios, el cable rior. Eliminaremos el circuito del LED y de tierra lo conectaremos a la masa de conectaremos un servomotor con la Arduino y el pin de señal, que suele intención de controlar la posición del ser amarillo/ naranja, lo conectaremos servomotor por medio de una señal al pin digital 9 que tiene la función analógica que será dada por el potenPWM. ciómetro (Figura 8). Programación Un servomotor es un motor con un Comenzaremos la programación con un eje de rendimiento controlado, eso sigejemplo de lectura de una entrada ananifica que podemos girarlo a una posilógica, para lo que realizaremos un ción determinada (dentro de su rango código muy similar al que utilizábamos accesible que suele ser de 0º a 180º) para monitorizar el estado de un pulsaen vez de hacerlo rotar continuamente. dor en el artículo anterior [2] (Listado Uno de los sistemas más empleados 1). para el control de los servos es el PWM Pero para leer una entrada analógica a una frecuencia determinada y genees necesario definir una variable en la rando una onda cuadrada, como que almacenaremos el valor de la señal hemos explicado antes, manteniendo proveniente del potenciómetro. Para la un determinado periodo para indicarle lectura de esa entrada, a diferencia de la posición a la que se debe mover las digitales, no hace falta configurarla (Figura 9).

WWW.LINUX- MAGAZINE.ES


HARDWARE • Arduino

Figura 9: Servomotor junto a accesorios.

como salida, ya que sólo hay entradas analógicas en Arduino. Utilizaremos como novedad la instrucción analogRead(), la cual nos permite leer cualquier señal analógica que esté conectada a un pin analógico (en nuestro caso A0). Por defecto, nuestro Arduino realizará una conversión analógicodigital de la señal de entre 0 y 5 voltios, a un valor de 0 a 1023. Una vez cargado el código, podremos abrir el monitor serie para poder visualizar las lecturas analógicas, las cuales cambiarán en función de la posición de potenciómetro (Listado 2). Partiendo de este ejemplo, vamos a utilizar esta señal analógica para cambiar la intensidad de un diodo LED controlando por medio de una señal PWM el valor medio de tensión que le llegue (Listado 3). En este caso mantendremos toda la parte del código del ejemplo anterior, pero introduciremos una nueva instrucción que es analogWrite(pin,valor). Esta instrucción nos permitirá emular una señal analógica en un pin digital gracias a los conceptos de PWM previamente explicados. Para poder utilizar esta función es necesario conocer el pin en el que se quiere generar la señal PWM y el ancho del pulso de la señal (de 0 a 255 de máximo). En nuestro ejemplo queremos asignar ese valor del ancho de pulso a la lectura del potenciómetro, pero como hemos visto antes, los niveles que nos aporta la lectura analógica van desde 0 hasta 1023, por lo que es necesario adaptar los valores. Existe una función en Arduino para adaptar niveles, pero en nuestro caso dividimos el valor del potenciómetro en cuatro partes, dejando así el valor en un rango 0-255. Podéis intentar realizar la conversión por medio de esa función map(value, fromLow, fromHigh, toLow, toHigh).

54

Número 84

Para acabar utilizaremos el circuito del servomotor. Para ello explotaremos una ventaja que nos brinda Arduino: las librerías. Para controlar un servo, tenemos una librería específica Servo.h, que nos simplifica en gran medida nuestra labor, ya que no nos tenemos que preocuparnos de nada relacionado con el PWM (frecuencia, ancho de pulso, etc.), sino que directamente introducimos los grados en los que queremos que se posicione, y la librería se encarga de todo (Listado 4). Para incluir una librería es necesario utilizar #include <Servo.h>

al inicio de nuestro programa. Tras esto, es necesario definir un objeto para cada uno de los servomotores que vayamos a utilizar, que es como darles un nombre. Una vez que tenemos definidos nuestros objetos, debemos asociarles el pin digital en el que van a estar colocados por medio de la instrucción servo1.attach(<I>pin<I>)

en la que servo1 será el nombre del objeto de nuestro servo y pin el pin PWM en el que queremos que se genere la onda de control. Por último, únicamente nos queda elegir el grado al que queremos que se dirija y mantenga el servo por medio de la instrucción

Figura 10: Posición relativa del servomotor en función del ancho de pulso.

Proyecto “Casa Domótica” Una vez aprendidos y probados todos los conceptos hasta este punto, en los siguientes artículos vamos a dejar un poco de lado la teoría, que seguro que a más de uno de vosotros os parece un poco aburrida, y vamos a ponernos manos a la obra. Esto no significa que todo vaya a ser ya realizar montajes impresionantes y que todo salga a la primera sin tener que explicar nada, pero ya tenemos una base sobre la que trabajar, por lo que la asimilación de conceptos sera más rápida y sencilla. Os animo a que tengáis bien trabajado todo lo visto en esta primera serie de artículos. El proyecto que se va a llevar a cabo de aquí en adelante es el de tener nuestra propia casa domótica basada en Arduino. Comenzaremos a trabajar en pequeños proyectos independientes, pero obteniendo unos resultados finales bastante atractivos en conjunto: control de luces, riego, seguridad, etc. Se trata de un proyecto muy entretenido, y que nos facilitará muchas de las ■ tareas de nuestro hogar.

servo1.write(<I>grados<I>)

RECURSOS donde grados es el número de grados que queremos que gire el servomotor (de 0º a 180º). Para adaptar el valor de 0 a 1023 del potenciómetro a un valor de 0 a 179 grados, nos servimos en este caso de la instrucción map(). Gracias a estas sencillas instrucciones podemos controlar un servomotor por medio de un potenciómetro prácticamente sin ninguna dificultad. Además de potenciómetros, podemos trabajar con cualquier sensor que nos devuelva un valor de tensión, cosa que hacen una gran variedad de sensores, y podemos servirnos de las salidas PWM para controlar numerosos tipos de actuadores.

WWW.LINUX- MAGAZINE.ES

[1] Artículo “Introducción al Arduino: Contacto físico”, de Dmitri Popov, Linux Magazine número 82 pg. 60. [2] Artículo “Hardware Diferente”, de Luis Martín, Linux Magazine número 83, pg. 53. [3] Cooking Hacks: http://www.cooking-hacks.com/ [4] Sitio web oficial de Arduino en español: http://www.arduino.cc/es/ [5] Arduino Lab Kit: http://www.cooking-hacks.com/ index.php/arduino-lab-kit.html [6] Servo Large: http://www.cooking-hacks.com/ index.php/servo-large.html

049-054_Arduino_LM84  
Read more
Read more
Similar to
Popular now
Just for you