Sunteți pe pagina 1din 12

Convertidor de adc de 16 bits muy interesante.

https://www.luisllamas.es/entrada-analogica-adc-de-16-bits-con-arduino-y-ads1115/

TUTORIALES ARDUINOTUTORIALES ARDUINO INTERMEDI OS

ENTRADA ANALÓGICA DE 16 BITS CON ARDUINO Y ADC 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 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.

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.

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


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

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.

1 #include <Wire.h>

2 #include <Adafruit_ADS1015.h>

4 Adafruit_ADS1115 ads;

5 const float multiplier = 0.1875F;

7 void setup(void)

8 {

9 Serial.begin(9600);

10

11 // Descomentar el que interese

12 // ads.setGain(GAIN_TWOTHIRDS); +/- 6.144V 1 bit = 0.1875mV (default)

13 // ads.setGain(GAIN_ONE); +/- 4.096V 1 bit = 0.125mV

14 // ads.setGain(GAIN_TWO); +/- 2.048V 1 bit = 0.0625mV

15 // ads.setGain(GAIN_FOUR); +/- 1.024V 1 bit = 0.03125mV

16 // ads.setGain(GAIN_EIGHT); +/- 0.512V 1 bit = 0.015625mV

17 // ads.setGain(GAIN_SIXTEEN); +/- 0.256V 1 bit = 0.0078125mV

18 ads.begin();

19 }
20

21 void loop(void)

22 {

23 int16_t adc0, adc1, adc2, adc3;

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);

30 Serial.print("AIN0: "); Serial.println(adc0 * multiplier);

31 Serial.print("AIN1: "); Serial.println(adc1 * multiplier);

32 Serial.print("AIN2: "); Serial.println(adc2 * multiplier);

33 Serial.print("AIN3: "); Serial.println(adc3 * multiplier);

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;

5 const float multiplier = 0.1875F;

6
7 void setup(void)

8 {

9 Serial.begin(9600);

10

11 ads.begin();

12 }

13

14 void loop(void)

15 {

16 int16_t results = ads.readADC_Differential_0_1();

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

12 // Activar comparador para 2.5V en canal 0

13 // (Donde 13333 = 2500 / 0.1875F)

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();

23 Serial.print("AIN0: "); Serial.println(adc0);

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

PREVIOUSMEDIR SONIDO CON ARDUINO Y MICRÓFONO AMPLIFICADO


MAX9812

NEXTSALIDA ANALÓGICA REAL CON ARDUINO Y DAC DE 12BITS MCP4725

TAMBIÉN TE PUEDE GUSTAR


LIBRERÍA ARDUINO ARTICULATED

RESOLVER ROBOTS ARTICULADOS CON ARDUINO

MOTORES PASO A PASO EN SILENCIO CON ARDUINO Y LOS DRIVER TMC2100,


TMC2130 Y TMC2208

INTERRUPCIONES EN TODOS LOS PINES DE ARDUINO CON LAS PCINT

CÓMO PROGRAMAR ESP8266 CON EL IDE DE ARDUINO


CONVERTIR UN TANQUE RC EN UN TANQUE ROBOT CON ARDUINO

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

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


Reply

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

Muchas gracias Luis!


Reply

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

En cuanto a las interrupciones: https://www.luisllamas.es/que-son-y-como-usar-interrupciones-en-


arduino/
Reply

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

S-ar putea să vă placă și