Saltar al contenido

Cómo utilizar las entradas analógicas con Arduino

En este artículo aprenderás a utilizar las entradas analógicas de tu placa Arduino; pero sobre todo, aprenderás a aplicarlo para tus proyectos, ya que son una de las herramientas que más utilizarás cuando trabajes con sensores analógicos.

https://youtu.be/PnprYiPqY10

¿Qué es una señal analógica?

Antes de entrar a la programación, es bastante importante el conocer qué es y cómo se comporta una señal analógica, ya que con ellas trabajarás durante todo este artículo.

En el siguiente video, te explico que son las señales analógicas y digitales te recomiendo verlo antes de continuar:

En resumen, una señal analógica será aquella que estará variando continuamente dentro de un rango de valores. Para las aplicaciones que estaremos realizando, las señales analógicas pueden ser producidas por un sensor, que por ejemplo, al cambio de temperatura cambia la resistencia y a su vez vararía un voltaje, por lo que si nosotros interpretamos los cambios de voltaje, podremos medir los cambios de temperatura.

Supongamos que tenemos un sensor de temperatura que detecta entre 0 y 100 ºC y nos entrega un voltaje entre 0 y 5 V, como la siguiente imagen:

Si nosotros medimos el voltaje podemos suponer la temperatura.

Esto que acabamos de deducir, se llama correlación: relacionamos una variable con otra. Y si es lineal, siempre tendrá la misma relación de movimiento, si una se mueve x cantidad, la otra se mueve y cantidad.

¿Qué es un sensor?

Sin entrar tanto a detalle, un sensor será todo dispositivo electrónico que traduce una variable física a una señal eléctrica. Para fines muy prácticos y sobre todo, para utilizar el Arduino, lo ideal es que nuestro sensor entregue un voltaje entre 0 y 5 V.

Tú podrías diseñar y construir un sensor, de hecho, lo harás más adelante.

Los sensores más comunes, traducen la señal física (como la temperatura) a otra señal física (como la resistencia). En otras palabras, los cambios de temperatura los traducen a cambios de resistencia. Pero entonces ¿cómo lo medimos?

Entradas analógicas en Arduino

La placa Arduino que tienes en tus manos cuenta con entradas dedicadas para conectarle señales analógicas mediante un convertidor de señales analógicas a digitales (ADC, por sus siglas del inglés Analog to Digital Converter). Estos convertidores tienen la capacidad de asignarle un valor digital (decimal o binario como lo quieras ver) a cada cambio detectable de la señal analógica. Esto tiene un gran beneficio: que podemos utilizar ese valor decimal dentro de nuestra programación y realizar cualquier cosa con el. Sin embargo, en el proceso para realizar esta conversión podríamos perder información, ya que el convertidor va tomando muestras de la señal analógica original a cierta velocidad. Aquí la clave sería muestrear tan rápido que podamos interpretar la señal original, siempre perderemos información, pero no entraremos a detalle en este artículo.

Lo importante, e interesante, es que el Arduino es capaz de traducir la señal continua en el tiempo (analógica) a discreta (digital) y poderla almacenar, procesar, etc. El punto importante es: ¿cuántos valores puede representar de esa señal analógica?

Bueno, el ADC que tiene implementado en tu placa Arduino es de 10 bits, esto quiere decir que puede representar valores en decimal desde el 0 hasta el 1023, esto son en total 1024 valores posibles.

Entonces, cada vez que la señal sea muestreada nos entregará un valor entre 0 y 1023 siempre y cuando estemos dentro del rango de voltajes, que para el Arduino debe de ser entre 0 y 5 V. Así que 0 V será un valor digital de 0 y 5 V será un valor digital de 1023. Esta resolución representa que el Arduino podrá detectar 0.0049 V (4.9 mV) por unidad.

El Arduino Uno tiene la capacidad de realizar una conversión con una duración de 100 micro segundos, esto representa una velocidad de 10,000 veces por segundo.

Entre más bits tengamos de resolución, más parecida a la realidad será nuestra señal resultante. En el caso de nuestro Arduino, tiene 1024 datos disponibles para representar toda la señal, por lo que será muy parecida a la real. Ojo: nunca será la misma señal de origen.

¿Cómo vamos hasta aquí, pensaste que solo te pondría el código y ya? Pues no, me gusta mucho explicarte cómo funciona todo porque así tendrás la capacidad de implementarlo con cualquier sistema, no solo con los ejemplos que aquí te pondré.

La placa Arduino Uno tiene 6 entradas analógicas (que de hecho también se pueden utilizar como entradas digitales) que pueden realizar esta conversión a 10 bits y las podemos identificar con los nombres A0, A1, A2, A3, A4 y A5.

Diagrama de pines del Arduino Uno Rev3
Diagrama de pines del Arduino Uno Rev3 (link)

Para indicarle al Arduino que queremos que realice una conversión es muy simple, tenemos que utilizar la siguiente función:

analogRead(A0);

Esta función es muy simple, te regresará la conversión digital del nivel de voltaje que se encuentre en la entrada indicada, en este ejemplo de la entrada A0. Por lo que regularmente guardaremos el resultado en otra variable:

int sensor = analogRead(A0);

Utilizar las entradas analógicas con Arduino

Para implementar algo rápido, utilizaremos una resistencia variable, simulando que el cambio de resistencia será relativo a un cambio de alguna variable física.

Aquí aprovecharé para explicarte como funciona la resistencia variable.

¿Cómo se conecta un potenciómetro?

Cuando utilizamos una resistencia variable para modificar voltaje, se le llama potenciómetro. Entonces, un potenciómetro será la aplicación. Muchas veces simplemente llamamos a la resistencia variable potenciómetro por costumbre.

Una de las preguntas que más me realizan mis alumnos es precisamente como se debe conectar ya que la resistencia variable tiene 3 terminales:

Este aparatito lo podemos representar como si fueran 2 resistencias variables conectadas entre sí, donde sus valores dependerán de la posición de la perilla. Si una resistencia baja, la otra sube su valor, de manera tal que siempre tendremos en total la suma de ambas que será el valor máximo del potenciómetro. Por ejemplo, si tenemos una resistencia variable de 10 KΩ:

Ten en cuenta que algunas resistencias variables pueden llegar a los valores extremos, donde una de esas resistencias puede llegar a ser 0 Ω.

Podemos imaginarnos que esas resistencias están conectadas en un punto común, que sería la terminal central. Recordando que las resistencias no tienen polaridad, no importa como las conectemos.

Entonces, para generar una variación de voltaje entre 0 y 5 V, conectaremos en un extremo 5 V y en el otro extremo 0 V (o tierra, GND), y tomaremos como salida la terminal central. Entonces si la perilla está en un punto extremo tendremos el máximo voltaje, y en el otro extremo tendremos el mínimo voltaje posible.

En resumen, si queremos tener variaciones de voltaje entre 0 y 5 V conectaremos como sigue:

Simulación realizada con https://everycircuit.com

Convirtiendo señales analógicas con Arduino

Ahora que ya sabemos toda la teoría, vamos a la práctica. Implementaremos el siguiente diagrama:

Diagrama de conexiones con potenciómetro.
Diagrama de conexiones con potenciómetro.

Para poder visualizar la conversión utilizaremos el monitor serie, así que implementaremos el siguiente listado de código en el IDE Arduino:

int sensor;

void setup() {
  Serial.begin(9600);
}

void loop() {
  sensor = analogRead(A0);
  Serial.print("Valor: ");
  Serial.println(sensor);
  delay(100);
}

Ahora solo resta conectar todo, cargar el código y abrir el monitor serie. Si todo sale bien, verás algo como esto:

Dibujar en el monitor serie con Arduino

Otra manera de visualizar los resultados es directamente con el monitor serie, pero ahora lo configuraremos para que los valores recibidos los represente en una gráfica directamente en el IDE. Esta forma es muy básica, pero puede aportarnos valor cuando queremos una referencia visual muy básica y rápida de desarrollar.

Una vez que tenemos el programa cargado en la placa, abrimos el Plotter Serie desde el menú de Herramientas→ Plotter Serie. O directamente en el acceso directo que encontramos del lado superior derecho.

Nota: esta captura corresponde al IDE 2 de Arduino

Lo único que debemos tener en cuenta es que para que se dibuje correctamente, no debemos enviar texto al puerto serie, quedando de la siguiente manera:

int sensor;

void setup() {
  Serial.begin(9600);
}

void loop() {
  sensor = analogRead(A0);
  //Serial.print("Valor: "); //línea comentada para que solamente imprima números
  Serial.println(sensor);
  delay(100);
}

Ahora, cuando abrimos el Plotter Serie, veríamos algo como la siguiente imagen cuando estemos variando el potenciómetro:

Ten en cuenta que si dejas de mover el potenciómetro, el valor que está convirtiendo estaré constantemente enviándose a la placa, sin embargo, puedes verificar que no es 100% constante.

Si revisas detenidamente la escala, el valor para esta imagen varía de un máximo de 636.0 a un mínimo de 635.0, es decir, tiene un ±1:

¿A qué crees que se debe esta diferencia?

Déjame en los comentarios tu teoría de esta variación.

Recuerda también que tienes este artículo donde aprendimos a controlar la intensidad de un LED utilizando el potenciómetro

¿Te está gustando este artículo?

Te invito a descargar totalmente gratis la Guía de Inicio en Arduino

Encontrarás mucha información extra, conceptos y sobre todo podrás llevarla contigo en todo momento

¿Cómo conectar cualquier sensor con Arduino?

Una vez entendiendo las bases del convertidor ADC de tu placa Arduino, ahora puedes conectar prácticamente cualquier sensor –no todos claro está–, sobre todo los que ya nos entregan de cierta manera un voltaje entre 0 y 5 volts.

Vamos ahora a utilizar una resistencia variable a la luz, o mejor conocido como LDR o fotorresistencia. Este dispositivo simplemente varía su resistencia cuando cambia la intensidad de luz que recibe. En términos muy rápidos: a mayor luz menos resistencia, a menor luz mayor resistencia.

Existen de distintos tipos de LDR en el mercado, pero los genéricos suelen tener una resistencia de 2 MΩ en oscuridad y de 50 KΩ en la luz.

Para conectarlo, seguiremos el siguiente diagrama:

Diagrama de conexiones del LDR con Arduino
Diagrama de conexiones del LDR con Arduino

Utilizando el mismo código de antes, podremos leer el valor que representará entre un 0 y un 100% de luz detectada, con ello podríamos encender una lámpara, o un motor, o un… todo lo que desees como lo vimos en [este capítulo]

Como puedes observar, realmente estamos utilizando un divisor de voltaje, que justamente es lo que hicimos con el ejemplo del potenciómetro. Retomando conceptos básicos de circuitos eléctricos, a mayor resistencia mayor voltaje, aplica para este caso que tenemos un circuito en serie.

Estamos creando un circuito entre la fuente de voltaje de 5 V la resistencia de 1 KΩ y el LDR. Al variar la luz que le llega al LDR, varía su resistencia, por lo tanto su voltaje.

Ahora, utilizaremos el mismo código del ejemplo anterior para verificar la comunicación y los valores recibidos.

Para poder mapear los valores mínimos y máximos de voltaje que llegarán a la entrada analógica del Arduino, tenemos 2 opciones: la práctica y la teórica.

La práctica es simplemente colocarle luz máxima y oscuridad máxima y tomar dichos valores:

La opción teórica, sería conocer exactamente el valor de la resistencia y realizar el cálculo de un divisor de voltaje: Enlace

Ahora con esta información, tu puedes construir un sistema que por ejemplo encienda una lámpara cuando se detecte que la intensidad de luz fue muy baja, o que te alerte si la iluminación supera un rango, etc.

Si quieres aprender más a fondo sobre cómo utilizar un LDR, déjame un comentario solicitándolo y te preparo mas detalle sobre cómo se utiliza y con más ejemplos.

Cómo funciona el ADC

Ahora vamos un poco más de fondo en cuanto a cómo funciona el ADC, esto porque ustedes me lo preguntaron en uno de mis videos –si los leo y los tomo muy en cuenta–, así que como a mí me gusta explicar a detalle, aquí vamos.

El convertidor analógico a digital, tiene que convertir desde una señal analógica que varía con el tiempo y tiene infinito número de datos, a una que está discretizada, y solamente tiene información en ciertos instantes de tiempo. Es un proceso que es bastante complejo y requiere de muchos dispositivos, por lo que consume tiempo de procesamiento.

Esto se logra en conjunto con algunos otros dispositivos conocidos como comparadores de voltaje donde se utilizan amplificadores operacionales (Opamp) y también con un convertidor digital a analógico (DAC), que es el proceso inverso.

Básicamente se trata de comparar si la señal de referencia es igual o mayor que una señal de entrada, cuando lo es, el proceso de conversión termina y entrega una combinación binaria que representa la conversión del voltaje. Esto se guarda en una variable que posteriormente podemos consultar en nuestro programa.

La siguiente imagen muestra a manera de diagramas básicos el funcionamiento. Básicamente tenemos el voltaje a convertir VA y se compara con el voltaje de referencia VAX, cuando el VAX es igual o mayor que el VA, el proceso termina y el resultado es el que se menciona como Resultado digital. Si consideramos que el convertidor de digital a analógico lo que hace es tomar el dato en digital y representarlo en una señal analógica. Lo primero que hace este sistema es resetear el Registro a cero, y el Comparador inicia con VAX en cero, por lo que siempre el proceso del ADC inicia comparando contra cero. Entonces si el VA no es cero, el Registro aumenta en 1 y el DAC vuelve a convertir, el Comparador vuelve a comparar, y así sucesivamente hasta que suceda que VAX es igual o mayor que VA.

Observa que el Registro debe ser binario, entonces si recuerdas que mas arriba mencioné que el ADC de este Arduino Uno Rev 3 es de 10 bits, quiere decir que este Registro es de 10 bits. Entonces, los cambios que va haciendo de uno en uno, los hará desde la combinación binaria 00 0000 0000 hasta la 11 1111 1111, por lo que el cambio más pequeño que podrá hacer es lógicamente de 1 bit. Si el rango total representa 5 V, quiere decir que 1 bit representa 0.0048 V, es decir, 4.8 mV. Esto significa que el ADC de este Arduino es capaz de detectar cambios de 4.8 mV en sus entradas analógicas.

Si necesitamos que nuestro sistema detecte cambios más pequeños que eso, tendremos que conseguir un mejor ADC. ¿Qué crees?, a la fecha de este artículo, ya está disponible la nueva generación llamada Arduino Uno R4, que –entre muuuuuchas otras cosas nuevas y geniales– incluye un ADC de 12 bits.

Aquí entra en juego que el tiempo que le llevará convertir al DAC dependerá del valor de VA, si es muy grande, el registro tendrá que pasar desde el valor más pequeño, aumentando de uno en uno, hasta llegar al valor de comparación. Si el valor a convertir es pequeño, este tiempo de conversión no será tan prolongado.

Por esta razón el tiempo de conversión del DAC puede variar mucho, y el fabricante nos debe recomendar el tiempo de espera que debemos considerar para asegurar un buen muestreo de la señal original. Si estamos trabajando con señales lentas como temperatura, esto no es problema, pero si estamos trabajando con señales que cambian muy rápido en el tiempo, debemos de tomar en cuenta este factor. Claro, en el mercado siempre existen DACs más rápidos, de mayor resolución, pero el precio también cambia.

Diagrama general del convertidor Analógico a Digital
Diagrama general del convertidor Analógico a Digital (Tocci, 2007).

Espero haber explicado este proceso de manera clara, se que hay muchos factores más que están involucrados en este proceso, pero quería explicarlo de manera muy general.

¿Te gustan este tipo de explicaciones a fondo?

Déjame saberlo en los comentarios de este artículo, a mi me encanta explicar siempre con mayor y mayor detalle, pero prefiero que tu me lo solicites.

Ahora solo queda a tu imaginación, puedes usar todas las entradas analógicas que tenga tu placa y guardar cada conversión en una variable distinta en tu código, compararlas para ver cuándo hacer qué con esa señal como activar ciertos actuadores, motores, etc.

Muchas gracias por llegar hasta aquí, como siempre, quedo muy al pendiente de tus comentarios, observaciones, proyectos que estés trabajando y todo lo que quieras contarme. Hasta la próxima!


Este artículo fue escrito basándome en mi propia experiencia, así como información consultada en:

arduino.cc

https://everycircuit.com

https://docs.arduino.cc/static/6ec5e4c2a6c0e9e46389d4f6dc924073/2f891/Pinout-UNOrev3_latest.png

Fritzing

Referencias

Tocci, R. (2007). Sistemas digitales principios y aplicaciones. Pearson.

Recuerda visitar nuestras redes sociales

1 comentario en «Cómo utilizar las entradas analógicas con Arduino»

  1. Excelente forma de transmitir el conocimiento, sobre todo para personas como yo que somos lentos en captar y asimilar asi como querer saber el fondo de las teorias y no solo enunciados.
    gracias

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *