Documente Academic
Documente Profesional
Documente Cultură
https://www.luisllamas.es/entrada-analogica-adc-de-16-bits-con-arduino-y-ads1115/
14 NOVIEMBRE, 2016
¿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 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.
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ón Pin ADDR
0x48 GND
0x49 VDD
0x4A SDA
0x4B SCL
Para la conexión single end, simplemente conectamos la carga a medir entre GND y uno de los 4
pines disponibles.
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
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.
1 #include <Wire.h>
2 #include <Adafruit_ADS1015.h>
4 Adafruit_ADS1115 ads;
7 void setup(void)
8 {
9 Serial.begin(9600);
10
18 ads.begin();
19 }
20
21 void loop(void)
22 {
24
25
26 adc0 = ads.readADC_SingleEnded(0);
27 adc1 = ads.readADC_SingleEnded(1);
28 adc2 = ads.readADC_SingleEnded(2);
29 adc3 = ads.readADC_SingleEnded(3);
34 Serial.println(" ");
35
36 delay(1000);
37 }
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.
1 #include <Wire.h>
2 #include <Adafruit_ADS1015.h>
4 Adafruit_ADS1115 ads;
6
7 void setup(void)
8 {
9 Serial.begin(9600);
10
11 ads.begin();
12 }
13
14 void loop(void)
15 {
17
18 Serial.print("Diferencial: ");
19 Serial.print(results);
20 Serial.print(" ");
21 Serial.print(results * multiplier);
22 Serial.println("mV");
23
24 delay(1000);
25 }
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.
1 #include <Wire.h>
2 #include <Adafruit_ADS1015.h>
4 Adafruit_ADS1115 ads;
5
6 void setup(void)
7 {
8 Serial.begin(9600);
10 ads.begin();
11
14 ads.startComparator_SingleEnded(0, 13333);
15 }
16
17 void loop(void)
18 {
19 int16_t adc0;
20
21 // Actualizar comparadores
22 adc0 = ads.getLastConversionResults();
24
25 delay(100);
26 }
Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección tutoriales de
Arduino
Anuncio:
AnalogicasArduinoArduino intermedioEntradasI/OSensores
8
newestoldest
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!!!!!
Reply
1 year ago
luisllamas
1 year ago
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 »
Reply
10 months ago
Luis
Hola. He añadido a la entrada la tabla para asignar las direcciones de I2C, que dependen de la conexión
de pin ADDR (address).
No necesitas modificar la librería, el constructor tiene una sobrecarga para que puedas crear una instancia
pasando la dirección como parámetro (ej: Adafruit_ADS1115 ads(0x49)
Reply
10 months ago
Paco Dob
No sé incluir tu indicación, tengo las direcciones 0x48 y 0x49, si me lo aclaras con un ejemplo de codigo
te lo agradezco, un saludo….Paco
Reply
10 months ago
Mauro
Buenas Luis,
Muchas gracias por el post.
Una duda, cuando declaras la constante multiplier = 0.1875F, qué sentido tiene la F?
Reply
9 months ago
Luis
La F se emplea en literales para indicar al compilador que debe tratarlo como float
Reply
9 months ago
Mauro
9 months ago
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.
Reply
9 months ago
Luis
Comprueba que has cableado correctamente. El pinout del mega es distinto al Uno/Nano. Échale un ojo a
esta entrada https://www.luisllamas.es/esquema-de-patillaje-de-arduino-pinout/
Reply
9 months ago
Carlosantos220
Hola Luis mi pregunta es cuantas placas puedo montar
Reply
5 months ago
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é
Reply
4 months ago
Antonio
17 days ago
Antonio
Me gustaría comentar que, al menos a mí, no me ha funcionado el Sketch en el que se leen distintas
entradas a modo Single end (todas las entradas arrojaban el mismo valor, aún comprobando que eran
voltajes distintos), el problema parece ser que el ADS toma un tiempo entre una y otra medida, yo lo
solucioné añadiendo un delay (50), entre medida y medida del ads.
Más información aquí: https://github.com/adafruit/Adafruit_ADS1X15/issues/14