Se trata de comparar a nivel práctico las capacidades de los conversores de 10 bits Analógico a Digital (A0-A5) del Arduino con uno de 16 bits como el ADS1115. El ADC del Arduino permiten descomponer una señal analógica en 1024 muestras (210) mientras que el ADS1115 lo hace 32768 (215) ya que un bit se reserva para el signo, lo que permite leer valores de tensión negativos. Realiza 860 muestras por segundo a través del bus I2C. Esta precisión es útil cuando se trata de medir valores con cambios muy rápidos o con variaciones muy pequeñas de tension. El chip tiene cuatro entradas pero puede usarse dos a dos como diferencial. Además puede configurarse con diferentes amplificaciones (hasta x16) para aumentar señales débiles. Funciona entre 2 y 5,5 voltios. Permite seleccionar fácilmente 4 direcciones I2C. En los Sketch se ha utilizado la librería Adafruit
Para este test he usado un esquema muy sencillo usando únicamente la entrada A0 del Arduino y la misma A0 del ADS1115. Las líneas SCL y SDA van a las A5 y A4 del Arduino. El pin ADDR lo ponemos a masa lo que determina una dirección I2C de 0x84. El "fondo de escala" del ADS1115 es por defecto 6,144v, ello significa que dividido por 32768 nos da una precisión de 0,1875 que comparados con los 5mv del Arduino es 26 veces mejor. Lo mejor de esto es que este es el peor de los casos. En otra configuración PGA, puede establecer una escala completa de +/- 2.048 voltios. Eso nos proporciona una resolución de 0.0635 mV. Además puede generar una alerta por el pin ALERT cuando cualquiera de los canales supera un valor de tensión que podemos fijar por código. Lógicamente he usado un código diferente para evaluar el A0 del Arduino y el del ADS1115. Son muy simples. La salida ha sido por el Serial Plotter del IDE.
En una primera prueba en vez de la resistencia NTC puse una fija de 2k2 y en vez de los 3,3v del Arduino usé una fuente regulable de 1 voltio que hacia variar levemente, unos pocos milivoltios.
//Para A0 de ADS1115
#include <Wire.h> #include <Adafruit_ADS1015.h>
Adafruit_ADS1115 ads; /* Use this for the 16-bit version */
void setup(void) { Serial.begin(57600); Serial.println("Hello!"); // The ADC input range (or gain) can be changed via the following // functions, but be careful never to exceed VDD +0.3V max, or to // exceed the upper and lower limits if you adjust the input range! // Setting these values incorrectly may destroy your ADC! // ADS1015 ADS1115 // ------- ------- //ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default) ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV // ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV // ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV // ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV // ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV
int sensorPin = A0; // Entrada de voltaje int sV = 0; // variable que almacena sensor
void setup() { Serial.begin(57600); }
void loop() { // read the value from the sensor: sV=analogRead(sensorPin); Serial.println(sV); delay(20); }
A la izq. el ADC del Arduino nos da una gráfica escalonada que no es capaz de reflejar los cambios mínimos de voltaje de la fuente. En la derecha el ADS1115 es totalmente lineal. Observar que la escala Y del Arduino corresponde a 0-1024 y la del ADS1115 va de 0-32768.
Las siguientes gráficas corresponden exactamente al esquema de arriba con la NTC y los 3,3 voltios del propio Arduino. Se hace acercando levemente una llama a la NTC.
Se repite la diferencia que evidencia que el ADS1115 es muy superior en medidas analógicas y nos permite distinguir con precisión variaciones mínimas de voltaje. Por supuesto ADS1115 es especialmente útil con el ESP8266 y Raspberry Pi