Tutorial

Señales analógicas con arduino:

Una señal analógica es una magnitud que puede tomarse dentro de un intervalo –Vcc y + Vcc. Por ejemplo, una señal analógica de tensión entre 0V y 5V podría valer 2,72V, o cualquier otro valor con cualquier número de decimales. De caso contrario, señal digital de tensión teórica únicamente podía registrar dos valores (en el ejemplo, 0V o 5V).

En nuestro Arduino UNO disponemos de 6 entradas analógicas. Una entrada analógica proporciona una medición codificada en forma de un valor digital con un número N de bits.

Es importante entender que en el mundo real cualquier señal de tensión es siempre analógica. Un valor digital es un concepto, una abstracción. Sin embargo conviene señalar que la medición que proporciona una entrada analógica también es un valor digital, por lo que igualmente es una abstracción. Esto nos lleva al concepto de precisión de la medición.

Para entender la precisión de una entrada analógica necesitamos entender el funcionamiento de un conversor analógico digital (ADC), que es su componente fundamental. Un ADC es un dispositivo que convierte una medición analógica en una medición digital codificada con un número N de bits.

Existen muchas formas de construir un ADC, pero lo importante es entender que en realidad no medimos el valor analógico con todos sus decimales, sino que lo “clasificamos” dentro de 2^N niveles, que definen 2^N-1 intervalos. El ancho de este intervalo medido en mV es la precisión de la señal. Cuanto mayor sea el número de bits, mayor será el número de intervalos, menor será el ancho del intervalo, y por tanto mejor la precisión de la medición.

En el caso de Arduino Uno, las entradas analógicas disponen de 10 bits de resolución, lo que proporciona 1024 niveles digitales, esto significa que con un valor máximo de 5V, se supone una precisión de la medición de +-2,44mV.

PRECISIÓN RELATIVA

Hasta ahora hemos supuesto que dispondremos una señal analógica de tensión entre 0V a 5V. En este caso, con un ADC de 10 bit tenemos una precisión de 4,88mV, lo que supone una precisión relativa respecto a la señal de entrada de 0,1% (1/1024).

Sin embargo, supongamos que medimos una señal que varía entre 0V y 1V. En este caso, con el mismo ADC de 10 bit tendríamos la misma precisión absoluta de 4,88mV, pero una menor precisión relativa respecto a la señal, que caería hasta 0,5%.

Por lo tanto, si realizamos una medición a una señal que varía en un límite inferior a Vcc (voltaje máximo) estamos perdiendo precisión relativa. Esto es la consecuencia de no aprovechar todo el rango de la medición, por lo que en realidad el ADC se comporta como si tuviera un número inferior de bits.

REFERENCIA DE TENSIÓN ANALÓGICA (AREF)

Para resolver esta situación Arduino permite cambiar la tensión tomada como referencia por el conversor analógico digital. El valor de la referencia se cambia con la función AnalogRef, y los valores posibles son:

DEFAULT: Valor por defecto, correspondiente con Vcc (5V o 3.3V, según modelos)

INTERNAL: Corresponde a 1.1V (en Atmega 168 y 328)

EXTERNAL: Voltaje aplicado de forma externa en el pin Vref (siempre entre 0 y Vcc)

INTERNAL1V1 y INTERNAL2V56, correspondientes a 1.1V y 2.56V (sólo en Arduino Mega)

En el caso de usar la referencia de tensión externa (EXTERNAL), sabiendo de forma segura que una señal no va a superar de un cierto valor de tensión, por ejemplo 0.7V, podemos proporcionar este valor como referencia a través del Pin Aref . La medición se realizará tomando esta tensión como referencia en lugar de Vcc, asi recuperando toda la precisión relativa.

Si modificamos la tensión de referencia, tenemos que definir el modo mediante la función AnalogRef antes de realizar cualquier lectura analógica.

Si vamos a introducir un valor de tensión en el pin Aref no podemos superar este valor en las entradas analógico. Además,  no se debe superar la tensión de alimentación de Arduino, de lo contrario podríamos dañar los pines analógicos.

CONEXIÓN DE ENTRADAS ANALÓGICAS EN ARDUINO

Supongamos que dispongamos un sensor analógico que proporciona una señal analógica entre 0V a 5V. A continuación se muestra un esquema de conexión:

CÓDIGO EN ARDUINO

Para leer el sensor, el código es muy sencillo. Simplemente realizamos la lectura mediante AnalogRead() y almacenamos el valor devuelto.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

const int sensorPin = A0;    // seleccionar la entrada para el sensor

int sensorValue;       // variable que almacena el valor raw (0 a 1023)

void setup()

{

Serial.begin(9600);

}

void loop()

{

sensorValue = analogRead(sensorPin);   // realizar la lectura

//mandar mensaje a puerto serie en función del valor leido

if (sensorValue > 512)

{

Serial.println(“Mayor que 2,5V”);

}

else

{

Serial.println(“Menor que 2,5V”);

}

delay(1000);

}

LECTURA DE VALORES MAYORES DE 5V

Si necesitamos leer una entrada de tensión superior a 5v, por ejemplo 12v, se debe realizar una adaptación de tensión. La forma ideal de hacer esta adaptación es empleando un simple divisor de tensión:

Con esta configuración el pin analogico de Arduino recibirá una tensión que varía entre 0 a 3,84V por lo que, como hemos explicado, se estaría perdiendo precisión relativa. Una opción sería ajustar las resistencias para que los límites estén lo más cercanos posible a 0 y 5V, o usar otro divisor de tensión para alimentar el pin Aref.

Los valores de las resistencias a emplear dependen del voltaje que queremos leer, y de la impedancia del sensor. En general, deben cumplir las siguientes condiciones:

  • Deben convertir la señal en un rango inferior pero similar a la tensión de alimentación.
  • Deben ser muy superiores a la impedancia equivalente del dispositivo a medir.
  • Deben despreciables respecto a la impedancia de la entrada Arduino.
  • Deben limitar la corriente que circula por ellas para minimizar pérdidas.
  • Deben ser capaces de disipar la potencia que van a soportar.