Para sacarle toda la funcionalidad a nuestro Arduino no vale con saber trabajar con señales digitales, ya que vivimos en un mundo analógico y en muchas ocasiones debemos de interpretar estas señales analógicas y actuar de manera proporcional. Para ello no nos vale con la lógica digital que trabaja a "todo o nada", ya que si queremos por ejemplo tomar la temperatura o medir una distancia, los sensores que se encargan de medir estos parámetros nos van a dar una señal analógica proporcional al parámetro leído, señal que deberemos de interpretar con nuestro Arduino.
Para esta práctica vamos a necesitar:
- 1 Placa Arduino
- 1 Protoboard (placa de prototipado)
- 1 Diodo Led
- 1 Potenciómetro 10KΩ
- 1 Resistencia de 220Ω
- 1 Resistencia de 1KΩ
- 1 LDR (resistencia variable con la luz)
En este tutorial, voy a realizar 2 pequeños ejemplos en los que voy a trabajar tanto con las entradas analógicas como con las salidas, en el primer ejemplo voy a variar la luminosidad de un LED variando el voltaje de salida de manera automática y en el segundo ejemplo voy a variar esta luminosidad usando para ello un potenciómetro (que me dará un nivel de tensión variable). Posteriormente, voy a sustituir el potenciometro por una LDR (Resistencia que varia con la luz) y vais a ver con esto un claro ejemplo de aplicación de las E/S analógicas.
Aclaración antes de trabajar con E/S analógicas
Antes de empezar con la práctica, conviene dejar claro algunos puntos importantes a la hora de trabajar con entradas y salidas analógicas.
Lo primer que debemos de tener en cuenta, es que Arduino posee pines de conexión para el uso especifico de señales analógicas, en las diferentes placas podemos reconocer estos pines ya que tendrán serigrafiado "ANALOG IN" para los pines de entrada analógicos y serán nombrados desde A0 a Ax (dependiendo del modelo tendrá más o menos entradas).
Para las salidas analógicas se usan los pines que están marcados como PWM (Pulse Width Modultation) ó modulación por ancho de pulso, y es que en realidad las salidas analógicas no dan una señal continua a un nivel determinado, sino que mediante pulsos consiguen obtener un nivel de tensión promedio proporcional al ancho de estos pulsos.
Como podéis ver en la imagen superior, variando en ancho del pulso, podemos obtener una señal promedio equivalente. Para la primera señal, cuyo ancho de pulso es del 10%, nos daría una señal analógica de 0.5v (el 10% de 5V), para la segunda una señal de 2.5v y para la tercera señal obtendríamos una señal equivalente de 4.5v.
Hay que tener en cuenta que la tensión de salida que podemos sacar de nuestro Arduino va a ir de 0 a 5v o de 0 a 3.3v (dependiendo del modelo con el que estemos trabajando)
Primer ejercicio
En este primer ejercicio, vamos a variar la luminosidad de un LED de manera automática variando para ello la tensión que le entregamos al LED. Para esto, vamos a utilizar la instrucción analogwrite(PIN, VALOR), la cual va a sacar por el "PIN" que le indiquemos un valor de tensión que será equivalente al valor introducido en "VALOR".
Esta instrucción trabaja con valores de 8bit's, o lo que es lo mismo, con valores que van de 0 a 255, al valor 0 le corresponderá un valor 0 de voltaje, y al valor 255 se le asignara el valor máximo de voltaje, que será 5v ó 3.3v (dependiendo del modelo de Arduino que estemos usando).
En la siguiente imagen, podéis ver un esquema del montaje. Este montaje será muy sencillo, tan solo debemos de conectar a una salida PWM de nuestro Arduino un LED con una resistencia de 220Ω
Ahora vamos con la programación..... en este primer ejemplo podemos ver elementos que usamos con anterioridad y en los que no me parare mucho en detallar, como puede ser la declaración de variables y creación de una estructura de programa típica formada por la función "SetUp" y "Loop".
En este primer ejemplo, hay tan solo dos cosas destacables que quiero que aprendáis, la primera es la utilización de la escritura analógica (que es de lo que va este tutorial), pero también os voy a enseñar a declarar un bucle que se repetirá mientras dure la condición establecida, este es el bucle "FOR".
/* Tutorial 2: Entradas y salidas analógicas En este tutorial, vamos a aprender a usar las E/S analógicas de Arduino mediante 3 pequeños ejemplos. Ejemplo 1º: Regulación de la luminosidad de un LED de manera automática. */ int LED = 10; //Asociamos el pin 10 a la salida del LED int VALOR = 0; //Creamos una variable y le asignamos el valor "0" como partida void setup(){ pinMode(LED, OUTPUT); //Establece el el pin al que conectamos el LED como salida (no es necesario) } void loop(){ for ( VALOR = 0; VALOR<=255; VALOR++) //incializa la variable VALOR a 0 y ejecuta el bucle siempre que se cumpla VALOR<=255 //(al final de cada repetición incrementa valor en 1) { analogWrite(LED, VALOR); //Manda un nivel de señal analógico equivalente a "VALOR" (para "VALOR=0" tendremos 0v y para "VALOR=255" sacará 5v delay (5); //Ponemos un "delay" de 5ms para poder ver la secuencia } for ( VALOR = 255; VALOR>=0; VALOR--) //incializa la variable VALOR a 255 y ejecuta el bucle siempre que se cumpla VALOR>=0 //(al final de cada repetición decrementa valor en 1) { analogWrite(LED, VALOR); //Manda un nivel de señal analógico equivalente a "VALOR" (para "VALOR=0" tendremos 0v y para "VALOR=255" sacará 5v delay (5); //Ponemos un "delay" de 5ms para poder ver la secuencia } }
Dentro de la función "LOOP", hemos declarado 2 bucles "FOR", la estructura del buclue "FOR" es la siguente:
for (inicialización de variable; condición; expresión) { Instrucciones a ejecutar }
En el ejemplo podemos ver como he inicializado "VALOR" a 0 y le he dado la condición para que se repita bucle mientras que "VALOR<=255", por lo que va a estar encerrado en este bucle mientras se cumpla esta condición. Pero en la expresión final, le he puesto "VALOR++" lo que incrementará en 1 la variable "VALOR" cada vez que se ejecute el bucle, por lo que cuando se ejecute 256 veces, "VALOR" será mayor de 255 y saldrá de este bucle.
Le he dado valores entre 0 y 255, porque son los valores mínimo y máximo para sacar por la salida analógica y en este ejemplo era lo más adecuado, pero cuando necesitéis crear un bucle que se repita cierto número de veces, podéis asignarle el valor que mas os convenga.
Dentro del bucle "FOR", encontramos las instrucciones que vamos a ejecutar, en este caso es la instrucción de escritura analógica analogWrite(LED, VALOR) Esta instrucción saca por el pin que hemos asignado a LED (Pin 10 del PWM) un nivel de tensión equivalente a "VALOR" que como recordemos es una variable que cada vez que se ejecuta el bucle es incrementada en una unidad, por lo que el nivel de tensión irá aumentando y con ello la luminosidad del LED.
He colocado un delay de 5ms al final tan solo para poder ver cómo cambia la luminosidad del LED, sin esto se ejecutaría tan rápido que nos parecería que esta siempre encendido.
En el siguiente bucle vamos a ejecutar lo mismo, pero de manera inversa. Se establece la variable "VALOR" en 255 e iremos decrementando esta cifra hasta llegar a 0 que será el momento en el que salgamos del bucle y comience a ejecutarse la función "LOOP" de nuevo.
Segundo ejercicio
En este segundo ejercicio, vamos a aprovechar la parte que ya teníamos creada del ejemplo anterior, y vamos a añadirle un potenciómetro que es con el que vamos a regular la intensidad del LED, esto se podría hacer directamente sin Arduino, pero esta es la mejor manera para asimilar el concepto de "entrada analógica".
La función que va a tener el potenciómetro, va a ser la de regular el valor de tensión que entregamos a nuestro Arduino, haciendo que este valor oscile entre 0 y 5 voltios. Para conectar el potenciómetro, tan solo debéis de conectar las patillas de los extremos a tensión (+5v o +3.3v) y la masa del circuito (GND). La patilla central será la que se conecte al pin de entrada analógico de Arduino.
En la siguiente imagen podéis ver el circuito que debeis montar en la protoboard.
Ahora vamos con el código de programa!! Como veis es incluso más sencillo que el anterior, en este programa, lo que vamos a hacer es leer el valor de tensión que nos entrega el potenciómetro y regular la luminosidad del LED en función de este valor.
/* Tutorial 2: Entradas y salidas analógicas En este tutorial, vamos a aprender a usar las E/S analógicas de Arduino mediante 3 pequeños ejemplos. Ejemplo 2º: Regulación de la luminosidad de un LED en función de un nivel de tensión leido. */ int LED = 10; //Asociamos el pin 10 a la salida del LED int NIVEL_TENSION = 0; //Asociamos el pin 0 a la entrada de señal int VALOR = 0; //Creamos una variable y le asignamos el valor "0" como partida void setup(){ pinMode(LED, OUTPUT); //Establece el el pin al que conectamos el LED como salida (no es necesario) pinMode(NIVEL_TENSION, INPUT); //Establece el el pin por el que entrará la señal analógica (no es necesario) } void loop(){ VALOR = analogRead(NIVEL_TENSION); //Asignamos a la variable "VALOR" el nivel de tensión leido VALOR = VALOR/4; //Al leer un valor analogico, este tiene 10 bit's, va de 0 a 1023, por lo que debemos adaptarlo al rango de 0 a 255 //(una manera sencilla es dividiendo entre 4) analogWrite (LED, VALOR); }
Para leer un valor analógico, usaremos la instrucción analogRead(PIN) donde tendremos que indicar en que "PIN" queremos realizar la lectura. Este valor leido, debemos de almacenarlo en alguna variable, por lo que previamente tendremos que crear una variable y asignarle el valor leido, quedando de la siguiente manera "VARIABLE = analogRead(PIN)".
Una vez almacenado el valor de esta variable, podemos hacer con esto lo que queramos, podemos compararlo con otro valor y actuar de una forma u otra, podemos aplicarle operaciones matemáticas para transformar o adaptar el valor...
En el código de programa, podemos ver dentro del bucle "LOOP" justo después de almacenar el valor leído en la variable "VALOR" una instrucción que divide el valor leído entre 4 "VALOR = VALOR/4" esto hay que hacerlo para adaptar el valor que leemos (10bit's) a el valor que sacamos por el PWM (8bit's). La resolución que tenemos a la hora de leer un valor irá de 0 a 1023, mientras que al escribir en el PWM es de 0 a 255, por lo que si no realizamos la operación de dividir esto entre 4, no vamos a tener una equivalencia entre el valor leído y lo que escribimos.
Ejemplo práctico
Como ejemplo práctico y para que veáis la funcionalidad que puede tener esto de las E/S analógicas, he sustituido el potenciómetro por una LDR (resistencia que varia con la luz) y he configurado el circuito para que cuanto más baja sea la luz del entorno, mayor luminosidad tenga el LED. Esto se puede aplicar perfectamente para iluminación de exteriores y hacer que según vaya anocheciendo las luces se enciendan poco a poco en proporción a la luz ambiente. Pero vosotros en lugar de la LDR, podéis poner cualquier tipo de sensor analógico, sensor de humedad, de inclinación, de ultrasonidos (para medir distancias), de detección de gas.... cualquier cosa que os podáis imaginar y para lo que queráis una respuesta proporcional.
Aquí tenéis el esquema del montaje:
Como podéis ver, lo que he hecho, ha sido crear un divisor de tensión con la LDR y una resistencia de 1KΩ, la parte de la LDR, la he conectado a GND, y la de la resistencia a +5v, de manera que al recibir luz, la LDR disminuye su resistencia considerablemente, haciendo que la tensión que tenemos en el punto intermedio del divisor de tensión sea prácticamente de 0v. Si bien, cuando la LDR no recibe luz, la resistencia sube haciendo que en el punto intermedio del divisor, tengamos prácticamente 5v.
Comentarios potenciados por CComment