Introducción
Los microcontroladores son capaces de detectar señales binarias: ¿se presiona el botón o no? Estas son señales digitales. Cuando un microcontrolador se alimenta con cinco voltios, interpreta los cero voltios (0V) como un 0 binario y cinco voltios (5V) como un 1 binario. Sin embargo, el mundo no es tan simple y hay tonos de gris. ¿Qué pasa si la señal es de 2.72 V? ¿Es eso un cero o un uno? A menudo necesitamos medir señales que varían su voltaje; estas se llaman señales analógicas. Un sensor analógico de 5 V puede emitir 0,01 V o 4,99 V o cualquier valor intermedio. Afortunadamente, casi todos los microcontroladores tienen un dispositivo incorporado que nos permite convertir estos voltajes en valores que podemos usar en un programa para tomar una decisión.
Aquí hay algunos temas y conceptos que quizás desee saber antes de leer este tutorial:
- Voltaje, corriente, resistencia y ley de ohm
- Binarios
- Analogo vs Digital
- Arduino analogRead()
- Divisor de Voltaje
- ¿Cómo usar un multímetro?
¿Qué es un conversor análogo digital ADC?
Debido a que muchos sensores entregan los valores que leen como voltajes análogos el uso de conversores análogo digital es algo muy común, por no mencionar el hecho que vivimos en un mundo analógico y es nuestra lógica digital la que constituye una abstracción que nos permite manipular información obtenida muchas veces por ADCs.
Muchos microcontroladores tienen un periférico llamado Conversor Análogo Digital, también es conocido como ADC por las siglas de su nombre en inglés, Analog to Digital Converter. Este dispositivo sumamente útil convierte un voltaje análogo, ésto es un cierto nivel de voltaje, en un número que puede ser manipulado en un programa.
No todos los pines de un microcontrolador tienen la capacidad de realizar conversiones de analógico a digital. La placa Arduino tiene estos pines marcados una ‘A’ delante de su etiqueta (A0 a A5) para indicar que estos pines pueden leer voltajes analógicos.

No todos los microcontroladores tienen un ADC incorporado o bien podríamos necesitar uno de mayor resolución que el que trae nuestro microcontrolador. Para estos casos es que debemos utilizar un ADC externo como por ejemplo el MCP3002.


Si utilizas un conversor externo y por ejemplo quieres leer el valor de una señal emitida por un sensor, primero debes buscar la relación entre la lectura del sensor y el voltaje entregado por el mismo en el datasheet. El conversor tomará el voltaje análogo entregado por el sensor y lo convertirá en un valor binario en sus pines de salida. Luego deberás leer el valor binario e interpretarlo para poder usarlo en un microcontrolador. Si me quiero devolver al valor de voltaje, debemos hacer un pequeño cálculo. ¿Cómo hacer ésto? Es lo que aprenderemos mas adelante en este tutorial.
Los ADC pueden variar entre microcontroladores. El ADC del Arduino es un ADC de 10 bits, lo que significa que tiene la capacidad de detectar 1024 (2^10) niveles analógicos discretos. Algunos microcontroladores tienen ADC de 8 bits (2 ^ 8 = 256 niveles discretos) y algunos tienen ADC de 16 bits (2 ^ 16 = 65 536 niveles discretos).
El voltaje entre GND (0V) y el voltaje de alimentación del conversor se dividirá entre la cantidad de niveles que el conversor pueda detactar y eso nos entregará su resolución. Por ejemplo, si tenemos un conversor de 10bits alimentado con 5V (5000mV), tendremos 1023 niveles distintos y cada nivel representará 5000mV/1023 = 4.88mV

Cómo calculo el valor analógico si uso un ADC externo
Para realizar el cálculo del que hemos hablado primero debemos conocer dos valores que dependen de cómo hayamos diseñando nuestro circuito. Estos valores son: el voltaje de alimentación del sistema, normalmente 3.3V o 5V y la cantidad de niveles discretos que puede entregar nuestro conversor. Esta última cantidad es algo es simple de calcular si comprendemos la naturaleza de un número binario. Si se tiene por ejemplo un número binario de 4 bits, se ve que puede tener por cada dígito dos posibles valores (0 ó 1), luego como son 4 dígitos el número total de valores que se pueden representar será:

Esto es una regla general para cualquier número binario, por lo que si se tienes un conversor de, por ejemplo 8 bits, se podrán representar 256 valores distintos (2 elevado a 8).
Ahora que conocemos ambos valores, podremos calcular de manera simple el voltaje medido usando la ecuación que describe el funcionamiento de un conversor análogo digital.

En esta ecuación Nbinario es el número binario que puede ser leído del conversor, Vanalogo es el voltaje análogo existente en el pin de entrada al conversor, Tvalores el total rango de valores que se puede representar con el conversor y Vsistema es el voltaje de funcionamiento del circuito. Si por ejemplo, queremos saber la relación para un sistema que se alimenta con 5V y con un conversor digital-análogo de 8 bits, tendremos:

¿Porqué utilizamos 5000 en lugar de 5 en el voltaje de operación? Porque es mejor expresar el voltaje en milivolts, de esta manera los voltajes leídos serán números enteros con una buena precisión.
Veamos finalmente como obtener el voltaje análogo leído si se tiene la lectura del número binario entregado por el conversor, para ello primero recordamos que un número binario puede ser visto también como un número decimal, entonces lo ocuparemos de esta manera para evitarnos enredos innecesarios. Además debemos despejar nuestra ecuación para expresar el voltaje análogo en función del número binario leído. Con ello la ecuación queda:

Supongamos entonces que nuestro conversor anterior nos entrega un valor binario 1001 0100, su equivalente en decimal será 148, se tendrá entonces que el voltaje análogo en mV existente en ese momento en el pin de entrada es:

Como nota final notemos que el voltaje resultó fraccionario y de hecho es mas cercano a 2891, pero nosotros lo truncamos a 2890. Ésto se ha hecho deliberadamente para recordar que la aritmética entera de los computadores siempre trunca un número, no lo redondea.
Si utilizas un Arduino que incorpora un ADC internamente en su microcontrolador las cosas se simplifican. A continuación un pequeño ejemplo
Ejemplo con Arduino
Para mostrar esto en el mundo real, usemos Arduino para detectar un voltaje analógico. Usemos un potenciómetro, un sensor de luz o un divisor de voltaje simple para crear un voltaje. Configuremos este simple circuito para este ejemplo:

Para comenzar, necesitamos definir el pin como una entrada. Para que coincida con el diagrama del circuito, usaremos A3:
pinMode(A3, INPUT);
y luego haga la versión analógica a digital usando el comando analogRead() :
int x = analogRead(A3); //Reads the analog value on pin A3 into x
El valor que se devuelve y almacena en x será un valor de 0 a 1023. El Arduino tiene un ADC de 10 bits (2^10 = 1024). Almacenamos este valor en un int porque x es más grande (10 bits) que lo que puede contener un byte (8 bits).
Imprimamos este valor para verlo a medida que cambia:
Serial.print(“Analog value: “);
Serial.println(x);
A medida que cambiamos el valor analógico, x también debería cambiar. Por ejemplo, si se informa que x es 334 y estamos usando el Arduino a 5 V, ¿cuál es el voltaje real? Utiliza tu multímetro digital y verifica el voltaje real. Debe ser de aproximadamente 1,63 V. ¡Felicidades! ¡Acabas de crear tu propio multímetro digital con un Arduino!
Y si lo conecto mal 🙁
¿Qué sucede si conectas un sensor analógico a un pin normal (digital)? No pasará nada malo. Simplemente no podrá hacer una lectura analógica con éxito:
int x = analogRead(8); //Try to read the analog value on digital pin 8 - this doesn’t work!
Esto compilará pero x se llenará con un valor sin sentido.
¿Qué sucede si conecto un sensor digital a un pin analógico? De nuevo, no quemarás nada. Si realiza una conversión de analógico a digital en un botón, lo más probable es que vea valores de ADC muy cercanos a 1023 (o 5 V, que es 1 binario) o muy cercanos a 0 (o 0 V, que es 0 binario).
¿Dónde continuar?
¡Hacer conversiones digitales analógicas es un gran avance! Ahora que comprendes este importante concepto, te invitamos a revisar los siguientes tutoriales:
- Algunas variedades de acelerómetros y giroscopios tienen salidas analógicas que deben leerse en un ADC para obtener valores utilizables.
- La modulación de ancho de pulso (PWM) es como una salida analógica, que es lo opuesto a la entrada analógica.
- Con un divisor de voltaje y el ADC, puede leer todo tipo de sensores y componentes variables, como potenciómetros, joysticks, controles deslizantes y resistencias sensibles a la fuerza, entre muchos, muchos más.
- La función Arduino map()
- Pines analógicos de Arduino