3 votos

Conexión I2C con ADS1115 no funciona

Tengo problemas al establecer una conexión I2C entre ESP32 NodeMCU y ADS1115 ( hoja de datos ).

El cableado: Wiring

Estoy usando lo siguiente código de ejemplo de Adafruit:

#include <Adafruit_ADS1X15.h>

Adafruit_ADS1115 ads;  /* Use this for the 16-bit version */
//Adafruit_ADS1015 ads;     /* Use this for the 12-bit version */

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

  if (!ads.begin()) {
    Serial.println("Failed to initialize ADS.");
    while (1);
  }
}

void loop(void)
{
  int16_t adc0;
  float volts0;

  adc0 = ads.readADC_SingleEnded(0);

  volts0 = ads.computeVolts(adc0);

  delay(1000);
}

Siempre me bloqueo en la parte de ads.begin(). Así que creo que la conexión I2C falla al inicializarse. Tengo otro ADS1115 que funciona bien con el mismo ESP y código.

Intenté depurar la conexión con mi osciloscopio y reconocí lo siguiente:

ADS1115 que está funcionando: Logic

Scope

ADS1115 que no funciona: Logic

Scope

  1. Por alguna razón el SCL High está alrededor de 4,5V en el ADS1115 que funciona bien y 3,3V en el que no funciona.
  2. En el caso de que no funcione, siempre obtengo un "not acknowledge" para la conexión I2C.

¿Cuáles deberían ser los siguientes pasos para seguir depurando?

ACTUALIZACIÓN:

Después de configurar la conexión I2C entre el ESP32 y el módulo ADS1115 a través de los 3,3V, las cosas mejoraron ligeramente. Ahora obtengo alrededor de 10 errores en la parte ads.begin() y luego se atasca mientras se ejecuta ads.readADC_SingleEnded(0);. Por otro lado, con el ADS1115 funcionando, ejecuto sin problemas la parte ads.begin() sin obtener ningún error.

Del osciloscopio obtengo el siguiente comportamiento:

ADS1115 que está funcionando: Oszi3S

ADS1115 que no funciona: Oszi3N

Me he dado cuenta de lo siguiente:

  1. En el caso del ADS1115 en funcionamiento, el voltaje es mucho más suave, incluso en la parte en la que el voltaje debería ser constante.
  2. Para que el voltaje del ADS1115 no funcione necesita más tiempo para ponerse en estado HIGH por la conexión SCL.

Como hice manualmente la soldadura de ambos módulos, mi suposición es que la capacitancia es mayor del módulo que no funciona. Las resistencias Pull-Up de ambos módulos son exactamente las mismas (10k).

¿Sería una posible solución disminuir la resistencia de pull-up en el módulo que no funciona?

ACTUALIZACIÓN2:

Ahora ya funciona, al menos en una (buena) protoboard. Parece que mi soldadura era mala, lo cual no entiendo porque con resistencias pull-up más bajas (5k) ese voltaje se veía muy bien en el osciloscopio. Hice un par de pruebas con mi osciloscopio con un ADS1115 completamente nuevo en una protoboard y al principio tampoco funcionaba. Después de cambiar a otra protoboard (mejor) funciona.

Acepto la respuesta de Justme porque era parte de la solución.

6voto

Justme Puntos 201

Estás alimentando el chip desde 5V pero quieres comunicarte con él usando niveles de 3,3V. El chip requiere que los voltajes del bus I2C y la tensión de alimentación coincidan. Cambia a una alimentación de 3,3V o añade un variador de nivel para conseguir un bus de 5V para el chip.

El esquema tampoco tiene resistencias de pull-up en los pines SDA y SCL por lo que no está claro por qué se obtiene nada en el ámbito, pero los chanses son que sólo está omitiendo información importante y que el esquema no es realmente cierto.

Además no tienes conexión con el pin ADDR por lo que tu dirección I2C es indefinida, y puede cambiar aleatoriamente.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X