¿Qué es el ADXL345 y por qué lo necesitas?
Llevo años trasteando con electrónica y sensores. Y sinceramente, el ADXL345 es de esos componentes que deberías tener siempre en un cajón. Es un acelerómetro de 3 ejes con salida digital (I2C o SPI), ultra bajo consumo y una resolución de hasta 13 bits. Pero ojo: no es el típico sensor de movimiento que usas para detectar si alguien movió una caja. Este chisme mide aceleración estática (gravedad) y dinámica (movimiento brusco) con una precisión que te permite desde detectar un terremoto hasta saber si tu drone está nivelado.
¿Por qué te cuento esto? Porque en el desierto de AliExpress, donde encuentras de todo menos información fiable, el ADXL345 es un oasis. Lo he comprado en tres tiendas distintas, pagando entre 1.50€ y 3€, y siempre funciona igual. Eso sí, hay que saber conectarlo y programarlo. Y de eso va esta guía.
Conexión física: I2C vs SPI
Aquí mucha gente se lía. El ADXL345 te deja elegir entre dos protocolos. Y cada uno tiene su aquel.
Modo I2C (el más fácil para empezar)
Es el que uso siempre para prototipos rápidos. Solo necesitas 4 cables:
- VCC → 3.3V (¡no 5V! aunque el módulo tenga regulador, el sensor muere a 5V)
- GND → GND
- SDA → A4 (en Arduino Uno) o pin 20 (en Mega)
- SCL → A5 (Uno) o pin 21 (Mega)
Y ya. Sin resistencias pull-up porque la mayoría de módulos ya las traen. Si no, añade dos de 4.7kΩ. Lo aprendí a las malas cuando un proyecto dejó de funcionar porque el cable se había soltado.
Modo SPI (cuando necesitas velocidad)
Si tu proyecto lee el sensor a más de 400 Hz (por ejemplo, para un controlador de vuelo o un logger de impactos), el I2C se queda corto. Ahí entra SPI. Necesitas 6 cables:
- CS → pin 10 (o el que elijas como Slave Select)
- SDO → pin 12 (MISO)
- SDA → pin 11 (MOSI)
- SCL → pin 13 (SCK)
- VCC y GND igual que antes
¿Cuándo usar SPI? Cuando necesites leer a 3200 Hz. Sí, has leído bien. El ADXL345 en SPI puede disparar a 3200 muestras por segundo. Una bestialidad para análisis de vibraciones o detección de golpes.
Código base para Arduino (I2C)
Voy al grano. Este es el sketch que uso siempre para testear si el sensor está vivo. No te asustes, es simple:
#include <Wire.h>
#define ADXL345_ADDR 0x53 // Dirección I2C por defecto (ALTERNADA: 0x1D si SDO=HIGH)
void setup() {
Serial.begin(9600);
Wire.begin();
// Configurar rango a ±16g (valor por defecto: ±2g)
Wire.beginTransmission(ADXL345_ADDR);
Wire.write(0x31); // Registro DATA_FORMAT
Wire.write(0x0B); // ±16g, resolución completa
Wire.endTransmission();
// Activar medición
Wire.beginTransmission(ADXL345_ADDR);
Wire.write(0x2D); // Registro POWER_CTL
Wire.write(0x08); // Bit de medida
Wire.endTransmission();
Serial.println("ADXL345 listo");
}
void loop() {
int x, y, z;
leerADXL345(&x, &y, &z);
// Convertir a g (escala de 4 mg/LSB para ±16g)
float gx = x * 0.004;
float gy = y * 0.004;
float gz = z * 0.004;
Serial.print("X: "); Serial.print(gx);
Serial.print(" g | Y: "); Serial.print(gy);
Serial.print(" g | Z: "); Serial.print(gz);
Serial.println(" g");
delay(500);
}
void leerADXL345(int* x, int* y, int* z) {
Wire.beginTransmission(ADXL345_ADDR);
Wire.write(0x32); // Registro DATAX0
Wire.endTransmission(false);
Wire.requestFrom(ADXL345_ADDR, 6, true);
*x = (Wire.read() | (Wire.read() << 8));
*y = (Wire.read() | (Wire.read() << 8));
*z = (Wire.read() | (Wire.read() << 8));
}
Nota importante: Si ves valores fijos o solo ceros, cambia la dirección a 0x1D. Algunos módulos chinos vienen con el pin SDO conectado a VCC, alterando la dirección. Me pasó con un lote de 10 módulos; 3 tenían la dirección alternativa.
Calibración: el paso que nadie hace
Y luego se preguntan por qué sus lecturas de inclinación fallan. El ADXL345 de fábrica tiene offset. Puede leer 0.1g en el eje X cuando está perfectamente horizontal. Eso, para un nivel de burbuja digital, es un desastre.
La calibración es sencilla:
- Coloca el sensor en una superficie plana y horizontal.
- Lee 100 muestras de cada eje y calcula el promedio.
- Ese promedio es tu offset. En teoría, X e Y deberían dar 0g, y Z debería dar +1g (por la gravedad).
- Resta esos offsets a cada lectura futura.
¿Quieres más precisión? Usa el registro OFSX, OFSY, OFSZ (0x1E, 0x1F, 0x20). Escribes el valor de offset en complemento a dos (escala de 15.6 mg/LSB). Así el sensor se calibra internamente y no tienes que hacerlo en software.
Una vez hice esto para un proyecto de nivelación de una impresora 3D. La diferencia entre calibrar y no calibrar era de 2 grados. Inaceptable.
Problemas comunes y cómo solucionarlos
Aquí va lo que realmente te ahorrará horas de debugging. He visto estos fallos decenas de veces en foros y en mi propio taller.
1. El sensor no responde / no aparece en el bus I2C
Síntoma: El Serial Monitor muestra «Dispositivo no encontrado» o el I2C Scanner no lo detecta.
- Causa #1: Dirección incorrecta. Prueba con 0x53 y 0x1D.
- Causa #2: Alimentación a 5V. El ADXL345 es de 3.3V. Si le metes 5V, lo fríes. Literalmente. Ya lo he hecho yo.
- Causa #3: Módulo defectuoso. Los de AliExpress a veces vienen muertos. Prueba con otro.
- Solución: Mide la tensión en VCC del módulo con un multímetro. Debe dar 3.3V exactos. Si da menos de 3.0V, el regulador del módulo está fallando o tienes un corto.
2. Lecturas saltarinas o ruidosas
Síntoma: Los valores fluctúan incluso con el sensor quieto. Una variación de ±0.05g es normal; más de eso es ruido.
- Causa: Cables largos sin apantallar o fuente de alimentación sucia.
- Solución: Añade un condensador de 100µF entre VCC y GND cerca del sensor. Si usas SPI, reduce la velocidad del bus (por debajo de 5 MHz).
- Alternativa: Activa el filtro de paso bajo interno del ADXL345. Escribe en el registro BW_RATE (0x2C) un valor de 0x0A para 100 Hz, o 0x0C para 50 Hz. Para la mayoría de proyectos, 50 Hz es suficiente y elimina el ruido de vibraciones.
3. Los valores no cambian al inclinar el sensor
Síntoma: Lees siempre lo mismo, como si el sensor estuviera congelado.
- Causa: No activaste el modo de medida. El registro POWER_CTL debe tener el bit 3 (Measure) a 1.
- Solución: Asegúrate de ejecutar el código de inicialización que te puse arriba. Si ya lo hiciste, comprueba que no hay conflictos con otro dispositivo I2C en el mismo bus.
4. El sensor se calienta mucho
Síntoma: El módulo está más caliente de lo normal al tacto.
- Causa: Estás alimentando a 5V y el regulador del módulo está trabajando al límite. O el sensor está en corto.
- Solución: Desconecta inmediatamente. Mide la resistencia entre VCC y GND. Si es menor de 100Ω, el módulo está muerto. Reemplázalo.
5. Lecturas incorrectas en el eje Z
Síntoma: Con el sensor horizontal, Z no da +1g. Da 0.8g o 1.2g.
- Causa: El sensor está montado al revés en el PCB (sí, pasa) o la calibración de fábrica está desviada.
- Solución: Revisa la orientación del chip. La marca en la esquina del ADXL345 indica el pin 1. Si el chip está girado 180°, el eje Z se invierte.
Preguntas Frecuentes
¿Puedo conectar el ADXL345 directamente a 5V?
No. El ADXL345 funciona a 3.3V. Si lo conectas a 5V, lo quemas. Los módulos suelen tener un regulador, pero si el tuyo no lo tiene (los más baratos a veces lo omiten), usa un conversor de nivel lógico. He visto módulos de 1€ que literalmente no tienen regulador; se alimentan directamente del pin de 3.3V del Arduino.
¿Cuál es la diferencia entre el ADXL345 y el MPU6050?
El MPU6050 es un acelerómetro + giroscopio en un solo chip. El ADXL345 es solo acelerómetro. Si necesitas detectar rotación, el MPU6050 es mejor. Pero si solo necesitas aceleración lineal (como en un podómetro o un detector de golpes), el ADXL345 consume menos y tiene mejor resolución. Además, el ADXL345 soporta detección de caída libre y toque por hardware, algo que el MPU6050 no hace de serie. Para proyectos de tablets baratas o dispositivos portátiles, el bajo consumo del ADXL345 es una ventaja enorme.
¿Puedo usar el ADXL345 con ESP32 o Raspberry Pi?
Sí, totalmente. Con ESP32 funciona igual que con Arduino (I2C o SPI). Con Raspberry Pi, usa I2C (pines 3 y 5) o SPI (pines 19, 21, 23, 24). Eso sí, en Raspberry Pi necesitas habilitar I2C con raspi-config e instalar la librería python3-smbus. Hay una librería oficial de Adafruit para Python que funciona de maravilla. La he usado para un datalogger de vibraciones en una impresora 3D y fue pan comido.
Conclusión
El ADXL345 es un sensor sencillo pero potente. Conectarlo es trivial si sigues los pasos correctos. La clave está en la calibración y en entender que no todos los módulos chinos son iguales. Algunos vienen con la dirección I2C alterada, otros sin regulador, y algunos directamente muertos. Pero por menos de 3€, es un chollo.
Si te ha servido esta guía, compártela. Y si tienes algún problema raro, déjalo en los comentarios. Llevo años trasteando con estos cacharros y seguro que podemos dar con la solución.
Ver precio actual y cupones en AliExpress