Entrada analógica de 16 bits con Arduino y ADC ADS1115


arduino-adc-ads1115

¿Qué es un ADS1115?

El ADS1115 es un conversor analógico digital (ADC) externo que podemos conectar a un procesador como Arduino para medir señales analógicas.

Arduino dispone de ADC internos que empleamos cuando usamos las entradas analógicas de Arduino. En los modelos Arduino Uno, Mini y Nano, disponemos de 6 ADC de 10 bits.

El ADS1115 proporciona 4 ADC de 16 bits, 15 para la medición y un último para el signo. El ADS1115 se conecta por I2C, por lo que es sencillo realizar su lectura. Dispone de 4 direcciones, que se elige mediante la conexión del pin ADDRESS.

El interés de emplear un ADC como el ADS1115 es obtener una mayor precisión, además de liberar de esta carga al procesador. Además, en ciertas configuraciones, es posible medir tensiones negativas.

Anuncio:

El ADS1115 tiene dos modos de medición, single ended y diferencial. En el modo single ended disponemos de cuatro canales de 15 bits. En el modo diferencial usamos dos ADC para cada medición, por lo que el número de canales se reduce a 2, pero tendremos la ventaja de poder medir tensiones negativas y mayor inmunidad al ruido.

También dispone de un modo comparador en el que el ADS1115 genera una alerta por el pin ALERT cuando cualquiera de los canales supera un valor de umbral que fijamos por código.

Por último, el ADS1115 incorpora un PGA que permite ajustar la ganancia desde 6.144V a 0.256V. Esto permite obtener precisiones superiores cuando midamos tensiones inferiores a 5V.

Independientemente del PGA elegido la máxima tensión que podemos medir será siempre la tensión de alimentación. Es decir, aunque el PGA sea 6.144V, no podremos medir tensiones superiores a 5V.

Como vemos, las características técnicas del ADS1115 son muy superiores a los ADC internos de Arduino. Por tanto, resultan adecuados cuando necesitemos mediciones de precisión, como en la lectura de sensores, o cuando la señal pueda tomar valores negativos, como en los sensores de intensidad o tensión.

Precio

Podemos encontrar módulos con el ADS1115 preparados para conectar a Arduino por 1.80€ buscando en vendedores internacionales en eBay o AliExpress.

arduino-adc-ads1115-componente

Esquema de montaje

La conexión es sencilla. Por un lado, alimentamos el módulo desde Arduino mediante GND y 5V y conectamos el pin SDA y SCL de Arduino con los pines correspondientes del sensor.

El pin ADDR determina la dirección I2C del dispositivo, según la tabla siguiente. El modo por defecto es conectar el pin ADDR a GND, lo que da lugar a la dirección 0x48.

DirecciónPin ADDR
0x48GND
0x49VDD
0x4ASDA
0x4BSCL

Para la conexión single end, simplemente conectamos la carga a medir entre GND y uno de los 4 pines disponibles.

arduino-adc-ads1115-single-end

Si en su lugar queremos el modo diferencial conectamos la carga entre A0 y A1 o entre A2 y A3.

arduino-adc-ads1115-conexion-comparador

Mientras que, en ambos casos, la conexión vista desde el lado de Arduino quedaría así.

arduino-adc-ads1115-esquema

En Arduino Uno, Nano y Mini Pro, SDA es el pin A4 y el SCK el pin A5. Para otros modelos de Arduino consultar el esquema patillaje correspondiente.
La tensión a medir no deberá exceder la ganancia que pongamos en el ADC, ni la Vcc +0.3V, o podemos destruir el ADS1115.

Ejemplos de código

Para realizar la lectura del ADS1115 usaremos la librería desarrollada por Adafruit, disponible en este enlace.

La librería proporciona ejemplos de código, que resulta aconsejable revisar. Los siguientes ejemplos son modificaciones a partir de los disponibles en la librería

Modo single end

El siguiente código muestra el uso del modo single end. Realizamos la lectura de los cuatro canales y mostramos el valor por puerto serie. Para convertir el valor a voltaje es necesario emplear un multiplicador, que a la vez depende de la ganancia del PGA que hayamos fijado.

Modo diferencial

El siguiente código muestra el uso del modo diferencial. Al igual que en el anterior, podemos cambiar la ganancia del PGA, que a su vez influye en el multiplicador empleado para convertir la medición a voltaje.

Modo comparador

El siguiente código define una alerta en el canal 0, que se activará cuando el valor registrado supere los 2.5 voltios. Para obtener el valor necesario para fijar la alerta nuevamente tendremos que tener en cuenta la ganancia del sensor.

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección tutoriales de Arduino

Anuncio:

Previous Medir sonido con Arduino y micrófono amplificado MAX9812
Next Salida analógica real con Arduino y DAC de 12bits MCP4725
1000
6 Comment threads
6 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
7 Comment authors
newest oldest
Diego Caparra

Hola, muy bueno el post, pero se me genera una duda que no logro resolver. Quisiera usar el ads1115 para medir dos flujos de corriente con los sensores sct-013 y usando el modo diferencial. Si hago esto, poniendo el delay en 1, el muestreo sigue siendo de 500Hz??? o se me va a 250Hz si se va a 250Hz alcanzaría el muestreo para que sea fiable la medición???
Gracias!!!!!

luisllamas

Échale un ojo a la entrada sobre el SCT-013 https://www.luisllamas.es/arduino-sensor-corriente-sct-013/

Paco Dob

Hola buenas tardes, me gustaría que me aclararas una duda, si tienes un rato 😉 Estoy intentando leer la información de dos convertidores A/D modelo ADS1115 con la misma placa arduino uno, uso dos entradas diferenciales de cada uno de ellos, uso diferentes direccones en I2c para cada uno, he intentado modificar la libreria adafruit, pero no he logrado resultado, incluso he clonado la libreria, y cambiado el nombre dentro por ADSB1115 y cambiado las ordenes ads por adsb, declarando las dos librerias (he usado en cada lib una direccion diferente la 0x48 y 0x49) pero no he conseguido el… Read more »

Mauro

Buenas Luis,

Muchas gracias por el post.

Una duda, cuando declaras la constante multiplier = 0.1875F, qué sentido tiene la F?

Alfonso

Hola Luis, Muy buen tutorial, me ha siervido mucho.
Pero tengo un problema con una tarjeta arduino Mega2560.
utilizo el codigo de ejemplo de adafruit pero en la linea de lectura (adc0 = ads.readADC_SingleEnded(0)) el codigo se queda pegado y no muestra nada en el monitor serial.

Carlosantos220

Hola Luis mi pregunta es cuantas placas puedo montar

Xosé Luis

Hola Luis.
Quizá me he metido en un proyecto demasiado ambicioso: controlar un generador a gasolina con arduino.
Agradecerte muchos de tus posts, además de este, me han ayudado.
Mi problema es que preciso hacer una interrupción cuando la lectura de corriente sea 0 (no hay consumo) para apagar el generador. No he encontrado nada que me indique por donde empezar.
Un saludo.
Gracias.
Xosé