bclose

Arduino y los ADC ADS1X15

Convertidores externos analógico a digital

Arduino y los ADC ADS1X15 

 
    • Presentar el convertidor ADC ADS1115 .
    • Es un convertidor analogico a digital de 4 canales con mejor resolucion que los integrados en arduino.
    • Veremos cómo conectarlo a nuestro ESP8266 o Arduinos.
    • Presentaremos el modo Single Ended

 

Material requerido.

Vista principal Un NodeMCU o ESP32 o incluso cualquier arduino.

 

ProtoboardconexionesUna Protoboard mas  cables.
Imagen principalUn convertidor ADC ADS1X15
Vista principalUn potenciómetro

Convertidores ADC

 

Nuestros muy queridos Arduinos tienen grandes virtudes y los convertidores ADC (Analógico a Digital)  son una de ellas, porque nos permiten conseguir lecturas analógicas del mundo exterior, imprescindibles en múltiples ocasiones, y de los que hemos hablado largo y tendido en estas páginas.

Pero lamentablemente aunque disponemos de varios ADC, su precisión y estabilidad no son todo lo buenas que nos gustarían. No me entendáis mal, los ADC internos de Arduino son una magnifica solución para la mayor parte de los problemas típicos pero hay ocasiones en que se pueden quedar cortas.

En primer lugar porque son de 10 bits lo que nos da una gradación de 210 valores o sea 1.024 posibilidades de resolución y si lo comparamos contra los 5V de fondo de escala que nos permite Arduino UNO, nos encontramos que tenemos una resolución de

5 V /1024 = 0,00488281 Voltios o lo que es igual 4,8 mV de resolución.

Esto puede ser más que suficiente en la mayor parte de los casos, aunque en otros el problema puede ser la repetibilidad de la media, porque nuestros Arduinos no están bien aislados de interferencias a la hora de hacer la conversión y son demasiado sensibles al ruido externo.

En el caso de los ESP8266, el problema es aún mayor. Solo disponen de un único ADC y por si fuera poco solo acepta un máximo de 1V en la entrada lo que prácticamente los hacen inútiles para cualquier aplicación práctica. No hay muchos motivos para preferir un Arduino oficial a un NodeMCU, pero esta es una de esas pocas razones

Afortunadamente, disponemos en el mercado a mucha gente queriendo vendernos convertidores ADC externos que nos resuelvan el problema y en esta ocasión me gustaría presentaros a una de esas opciones que tenemos disponibles, cuando la resolución de los convertidores ADC de Arduino se nos quedan cortos: ADS1115 

El ADS1115 es un convertidor analógico digital, de 4 canales y conexión I2C que resulta muy sencillo de usar y de conectar a nuestros Arduinos cuando necesitamos más resolución que la que viene de fábrica con los Arduino o simplemente queremos usar un ESp8266 y te hace falta un convertidor de pelo en pecho.

El ADS1115 es un convertidor analógico al digital de 15 bits y 4 canales, además de otras virtudes que nos va a resolver la papeleta en prácticamente cualquier situación. Aplicando el razonamiento de arriba 215  = 32.768.  Lo que nos proporciona una resolución teórica de:

5V / 32768 = 0,00015259

O lo que es lo mismo 0,15 mV contra 4,8 mV de los convertidores propios en el caso Arduino, lo que es una mejora de casi 5 veces mejor resolución y además mejor protección a las interferencias externas.

Características del ADS1115

  • 15 bits de resolución
  • 4 canales
  • Conexión I2C
  • 4 posibles direcciones I2C para mezclar varios convertidores en un único proyecto

Además tiene unas cuantas características adicionales como que dispone de un bit adicional de signo, es decir, puede leer valores positivos y negativos y varios modos de funcionamiento de los que iremos hablando con más calma.

 

Conectando el ADS1115

Como este módulo ADS1X15  se controla por  I2C, su conexión es trivial y para poder complicar todo un poco (Y que parezca mucho más difícil de lo que es)  vamos a conectarlo a un NodeMCU conESP8266 que son los que de verdad, de verdad, se benefician de este chip.

Aunque parece que no les suele gustar la posición de los pines I2C en el pinout de estos chips, aquí os dejo una imagen de su posición:

pinout o patillaje del Nodemcu v2 con I2c

Fijaros que el I2C está en los pines D1 y D2, que corresponden a SCL y SDA respectivamente. Veamos la conexión:

diagrama de conexion
Como no tenemos intención de complicar el post, simplemente vamos a conectar un potenciómetro a la entrada analógica A0 para tener una señal de prueba que podamos medir, y vamos con el programa.

Lo primero necesitamos descargar la librería que controla el ADS1X15  aquí, e invocarla al principio.

#include <Wire.h>
#include <Adafruit_ADS1015.h>

Ahora creamos una instancia del convertidor con:

Adafruit_ADC01115 ADC0(0x48);
float Voltage = 0.0;

Donde 0x48 es la dirección I2C por defecto del convertidor y definimos una variable float que pueda contener el voltaje que leemos. Y ya solo nos queda inicializar nuestro objeto en el setup:

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

Ahora en el loop  creamos una variable y leemos el convertidor directamente:

  int16_t lectura;  // leemos el ADC y recibimos un valor de 16 bits
  lectura = lectura.readADC_SingleEnded(0);   // El 0 significa la puerta 0
  Voltage = (lectura * 0.1875)/1000;

Aquí hay un pequeño acto de fe que es la línea:

lectura = lectura.readADC_SingleEnded(0);   // El 0 significa la puerta 0

Donde estamos pidiendo que lea en un modo llamado SingleEnded. Por ahora basta con saber que este es el modo normal al que estáis acostumbrados con los convertidores de Arduino, pero este chip tiene otros modos que veremos más adelante.

El resto del programa, simplemente es imprimir los valores: Aquí tenéis el programa completo Prog_318_1:

#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads(0x48);
float Voltage = 0.0;

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

void loop(void)
   { int16_t lectura;  // Leemos un entero de 16 bits
     lectura = ads.readADC_SingleEnded(0);
     Voltage = (lectura * 0.1875)/1000;
     Serial.print("AIN0: "); 
     Serial.print(lectura);
     Serial.print("\tVoltage: ");
     Serial.println(Voltage, 9); 
   }

El resultado en pantalla es algo así:

salida a consola arduino

Fijaros en que la salida baila muy poco a pesar de que le hemos pedido 7 decimales. EL baile esta en las milésimas, lo que no está nada mal para un pueblo. Si vamos variando el potenciómetro obtenemos diferentes lecturas en el Serial Plotter:

variacion de la caida de tension en el potenciometro

Y si dejo de mover el potenciómetro lo que vemos es una curva en la que podemos apreciar la resolución del convertidor:

Manteniendo el potenciometro estable

No os dejéis engañar por el aspecto irregular. Fijaros en el fondo de escala del gráfico que es lo que cuenta. Los valores varían entre 16.100 y 16.140, es decir una variación de 40 partes en 16.000 o lo que es lo mismo variaciones del 0,25% y de vez en cuando un pico mayor, que en el gráfico se va hasta 15.060 lo que nos rebaja la precisión hasta un mas que pasable 0,5%,  pero es de una estabilidad sorprendente.

Aquí os dejo un pequeño vídeo del montaje para que le echéis una ojeada.