ADXL345: El Acelerómetro I2C/SPI que Mide Vibraciones y Golpes en tus Proyectos

ADXL345: El Acelerómetro I2C/SPI

Escrito por

en

¿Qué es el ADXL345?

El ADXL345 es un acelerómetro digital de 3 ejes fabricado por Analog Devices. Pequeño. Preciso. Y barato. Lo encuentras en módulos para Arduino por menos de 3€ en AliExpress. Y sinceramente, es uno de los sensores que más he usado en mi laboratorio.

Mide aceleración estática (gravedad) y dinámica (movimiento, vibración, golpes). Rango configurable de ±2g a ±16g. Resolución de 13 bits. Y lo mejor: comunicación por I2C o SPI. Sí, puedes elegir.

En DunaTech hemos probado decenas de módulos. Y este es de esos que simplemente funcionan. Pero ojo, hay trampas. Te cuento.

Funcionamiento Técnico

¿Cómo mide la aceleración?

Usa MEMS (Micro-Electro-Mechanical Systems). Dentro del chip hay una estructura de silicio con masas microscópicas que se desplazan cuando el sensor se mueve. Ese desplazamiento cambia la capacitancia eléctrica. El chip convierte eso en valores digitales.

Los tres ejes (X, Y, Z) se calculan internamente. El ADXL345 te devuelve valores en bruto de 10 o 13 bits. Tú luego conviertes esos valores a gravedades (g).

Rangos configurables:

  • ±2g — máxima sensibilidad (≈ 256 LSB/g)
  • ±4g
  • ±8g
  • ±16g — mínimo detalle (≈ 32 LSB/g)

Modos de funcionamiento clave

El ADXL345 no es solo «medir y soltar datos». Tiene modos avanzados que muchos ignoran:

  • Modo de bajo consumo: Consume apenas 23 µA en medición a 100 Hz. Ideal para proyectos con batería.
  • Detección de actividad/inactividad: Puede interrumpir al microcontrolador solo cuando detecta movimiento. Ahorro bestial de energía.
  • Detección de toque/golpe: ¿Quieres detectar cuándo alguien golpea el dispositivo? El sensor lo hace solo.
  • Free-fall detection: Detecta caída libre. Útil para discos duros o drones.

Y sí. Así de simple.

Conexión con Arduino

Vamos al lío. El módulo más común tiene 6 pines. Aquí te dejo la conexión por I2C (la más fácil):

ADXL345 Arduino Uno/Nano
VCC 3.3V (¡Importante! No 5V)
GND GND
SDA A4
SCL A5
CS Dejar desconectado o a 3.3V
SDO GND para dirección 0x53 / 3.3V para 0x1D

Ojo con esto: El ADXL345 funciona a 3.3V. Si le metes 5V en VCC, lo fríes. Pasa. He visto a gente hacerlo. No seas esa persona.

Conexión SPI (para más velocidad)

Si necesitas leer datos a más de 400 kHz, usa SPI. La conexión es un poco más compleja:

  • CS → pin digital 10
  • SDO/MISO → pin digital 12
  • SDA/MOSI → pin digital 11
  • SCL → pin digital 13

En DunaTech hemos probado las dos. Para el 99% de proyectos, I2C basta. Pero si estás haciendo un datalogger de impacto a alta frecuencia, ve a por SPI.

Código de Ejemplo

Aquí tienes el código básico para leer los tres ejes y mostrarlos en el monitor serie. Usamos la librería oficial de Adafruit (funciona con cualquier módulo genérico):

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>

Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);

void setup() {
  Serial.begin(9600);
  
  if(!accel.begin()) {
    Serial.println("¡Error! ¿Conectaste el ADXL345?");
    while(1);
  }
  
  accel.setRange(ADXL345_RANGE_2_G);
  Serial.println("ADXL345 listo");
}

void loop() {
  sensors_event_t event;
  accel.getEvent(&event);
  
  Serial.print("X: "); Serial.print(event.acceleration.x);
  Serial.print("  Y: "); Serial.print(event.acceleration.y);
  Serial.print("  Z: "); Serial.print(event.acceleration.z);
  Serial.println(" m/s^2");
  
  delay(500);
}

Nota importante: Si el Serial.print te da «0.00» en todos los ejes, probablemente el sensor está mal conectado o la dirección I2C no es la correcta. Prueba cambiando SDO a GND o a 3.3V.

Troubleshooting y Errores Comunes

Aquí va la parte que más valor tiene. Llevo años viendo a gente pelearse con este sensor. Estos son los fallos más frecuentes:

1. No se detecta en I2C (scanner no lo encuentra)

Causa #1: Alimentación a 5V. El chip se quema. Sí, es triste. Solución: Usa siempre 3.3V.

Causa #2: Dirección I2C incorrecta. Por defecto es 0x53 (SDO a GND). Si conectas SDO a 3.3V, cambia a 0x1D. Solución: Ejecuta un scanner I2C para saber la dirección real.

Causa #3: Pull-ups faltantes. Algunos módulos chinos vienen sin resistencias pull-up en SDA/SCL. Solución: Añade resistencias de 4.7kΩ a 3.3V en ambas líneas.

2. Lecturas que no cambian o se quedan fijas

Causa: El sensor está en modo sleep. El ADXL345 arranca en modo bajo consumo y no mide hasta que lo despiertas. Solución: Asegúrate de llamar a accel.begin() correctamente. Si usas la librería de Adafruit, ella lo maneja. Si escribes tu propio código, escribe 0x08 en el registro 0x2D (POWER_CTL) para activar la medición.

3. Ruido excesivo en las lecturas

Causa: Cables largos sin apantallar, o fuente de alimentación ruidosa. Solución: Usa cables cortos (menos de 20 cm) y añade un condensador de 10 µF entre VCC y GND cerca del sensor. También puedes activar el filtro interno configurando el registro BW_RATE (0x2C) a un valor más bajo (ej: 0x0A para 100 Hz).

4. El sensor se calienta

Causa: Has conectado VCC a 5V. El chip está muriendo. Solución: Desconéctalo inmediatamente. Si ya pasaron más de 5 segundos, probablemente el chip está dañado. Cómprate otro módulo. Cuestan 2€.

5. Lecturas negativas cuando está quieto

Causa: El sensor está orientado de forma que la gravedad actúa en dirección negativa. En reposo, el eje Z debería marcar aproximadamente +9.8 m/s² (o +1g). Si marca negativo, simplemente gira el sensor. No es un fallo.

FAQ

¿Puedo usar el ADXL345 con ESP32 o Raspberry Pi?

Sí. El protocolo I2C es universal. En ESP32 usa los pines GPIO21 (SDA) y GPIO22 (SCL). En Raspberry Pi, los pines 3 (SDA) y 5 (SCL). Solo recuerda: 3.3V siempre. Si necesitas más detalles sobre cómo elegir tu placa, te recomiendo echar un vistazo a nuestra guía de tablets baratas, donde cubrimos opciones con GPIO.

¿Cuál es la diferencia entre el ADXL345 y el MPU6050?

El MPU6050 incluye un giroscopio de 3 ejes además del acelerómetro. El ADXL345 solo es acelerómetro. Pero el ADXL345 consume menos energía (23 µA vs 3.5 mA) y tiene mejor resolución en baja escala. Para detección de caída libre o golpes, el ADXL345 gana. Para orientación 3D completa, necesitas el MPU6050.

¿Se puede usar para medir ángulos de inclinación?

Sí. Con los valores de aceleración puedes calcular los ángulos usando arco tangente. ángulo_X = atan2(acel_Y, acel_Z) * 180 / PI. Pero ojo: si el sensor también está en movimiento, la aceleración dinámica contamina la medida. Para inclinación estática funciona perfecto.

Conclusión

El ADXL345 es un sensor pequeño, barato y fiable. Lo hemos usado en DunaTech para detectar golpes en envíos, medir vibraciones en impresoras 3D, y hasta en un proyecto de detección de terremotos casero (spoiler: no funcionó, pero el sensor sí).

Si estás empezando con Arduino y quieres medir movimiento, este es tu sensor. Solo recuerda: 3.3V, pull-ups si falla, y dirección I2C correcta. Nada más.

Y si encuentras un módulo en AliExpress por menos de 2€, cómpralo. Es un chollo. Nosotros ya hemos probado media docena y todos funcionan igual.

Ver precio actual y cupones en AliExpress

Ofertas AliExpress