Llevo años en esto del hardware y la impresión 3D. Y sí. He visto de todo. Desde impresoras que imprimen capas flotantes porque el acelerómetro está mal conectado, hasta proyectos de CNC que vibran como si fueran a despegar. El ADXL345 es ese componente pequeño, barato y silencioso que te puede salvar un proyecto entero. Pero claro, si no sabes programarlo en C o no tienes las librerías .h correctas, te vas a pegar contra la pared.
En DunaTech, entre el desierto de basura de AliExpress, hemos cribado decenas de módulos. Y el ADXL345 es un oasis si sabes usarlo. Hoy te voy a contar exactamente cómo hacerlo: desde los pines hasta el código final. Sin rodeos.
¿Qué es el ADXL345 y por qué nos importa?
El ADXL345 es un acelerómetro digital de 3 ejes. Pequeño. Preciso. Y sorprendentemente potente para lo que cuesta. Hablamos de medir aceleraciones de hasta ±16g con una resolución de 13 bits. ¿Traducción? Puedes detectar desde el temblor de una mesa hasta el impacto de un dron contra el suelo.
Pero lo que realmente lo hace especial para nosotros, los ingenieros caseros, es su flexibilidad de comunicación. Puedes hablarlo por I2C o por SPI. Y eso cambia todo cuando estás diseñando un PCB o intentando no gastar pines en tu Arduino Nano.
Usos típicos:
- Compensación de vibraciones en impresoras 3D: El famoso «Input Shaping» de Klipper. Sin este chip, olvídate de imprimir a 200mm/s con calidad.
- Detección de caídas o golpes: Para robots móviles o sistemas de seguridad.
- Inclinación y orientación: Como un nivel digital barato.
- Análisis de vibraciones en máquinas CNC: Para saber si tu husillo está a punto de morir.
Y todo esto, por menos de 2€ en AliExpress. Una ganga.
Conexión Física: I2C vs SPI
Aquí viene lo primero que tienes que decidir. ¿I2C o SPI? Te resumo mi experiencia tras probar ambos en decenas de proyectos.
I2C (El fácil, el lento)
Usas solo 2 pines: SDA y SCL. Perfecto si tu microcontrolador tiene pocos pines libres o si no necesitas leer datos a 800 kHz. En Arduino Uno, con la librería Wire, funciona de maravilla. Pero ojo: si tienes varios dispositivos I2C en el mismo bus, pueden darse conflictos de direcciones. La dirección por defecto del ADXL345 es 0x53, pero puedes cambiarla a 0x1D si conectas el pin SDO a VCC.
SPI (El rápido, el que mola)
Aquí usas 4 pines: CS (Chip Select), MOSI, MISO y SCK. La velocidad de lectura es brutal. Para aplicaciones de Input Shaping en impresoras 3D, donde necesitas muestrear a 3200 Hz, SPI es la única opción realista. Además, puedes conectar varios dispositivos SPI en paralelo usando diferentes pines CS. Un truco que aprendí a las malas: asegúrate de que el pin CS no esté flotando. Ponle una resistencia de pull-up de 10kΩ o el chip se volverá loco.
Mi recomendación: Para proyectos de impresión 3D y análisis de vibraciones, usa SPI. Para prototipos rápidos y proyectos simples, I2C te basta.
Librerías .h Esenciales para tu Código
No reinventes la rueda. Las librerías para el ADXL345 están muy maduras. Pero hay que saber cuál usar según tu objetivo.
1. Librería Oficial de SparkFun (ADXL345.h)
Es la más completa y la que uso en el 90% de mis proyectos. Soporta I2C y SPI. Trae funciones para leer los ejes X, Y, Z, configurar el rango (±2g, ±4g, ±8g, ±16g) y hasta el modo de bajo consumo. El problema: es un poco pesada para micros con poca memoria.
Instalación: Desde el Gestor de Librerías de Arduino IDE, busca «SparkFun ADXL345».
2. Librería Adafruit (Adafruit_ADXL345_U.h)
Más moderna, con soporte para el sensor unificado de Adafruit. Si ya usas otras librerías de Adafruit, esta es la elección lógica. Viene con ejemplos muy claros. Pero ojo: a veces da problemas con rangos muy altos (±16g) porque el filtro interno no está bien calibrado. Me pasó con un dron y casi lo estrello.
3. Librería Minimalista para Input Shaping
Si tu objetivo es Klipper o un firmware casero para impresora 3D, no uses las librerías genéricas. Necesitas una implementación bare-metal que lea el ADXL345 por SPI a máxima velocidad. En GitHub hay varias opciones. Busca «ADXL345_SPI.h» de algún desarrollador de Klipper. Estas librerías suelen ser solo archivos .h y .cpp sin dependencias externas.
Mi consejo: Empieza con la de SparkFun. Es la más documentada y la que menos dolores de cabeza da. Cuando domines esa, ya puedes pasar a implementaciones más complejas.
Programas en C: Código Paso a Paso
Vamos al grano. Te voy a mostrar el código mínimo para leer el ADXL345 por I2C usando la librería de SparkFun. Luego, la versión rápida por SPI.
Programa Básico I2C (Lectura de Ejes)
#include <Wire.h>
#include <SparkFun_ADXL345.h>
ADXL345 adxl = ADXL345(); // Crear objeto
void setup() {
Serial.begin(9600);
Serial.println("Iniciando ADXL345...");
adxl.powerOn(); // Encender sensor
// Configurar rango a ±4g (más sensible para vibraciones suaves)
adxl.setRangeSetting(4);
// Activar modo de medición
adxl.setActivityXYZ(1, 0, 0); // Solo detectar actividad en X
adxl.setActivityThreshold(75); // 75mg de umbral
}
void loop() {
int x, y, z;
adxl.readAccel(&x, &y, &z); // Leer valores brutos
// Convertir a gravedades (g)
float gX = x * 0.0078; // Para rango ±4g, cada bit = 7.8mg
float gY = y * 0.0078;
float gZ = z * 0.0078;
Serial.print("X: "); Serial.print(gX);
Serial.print(" g\tY: "); Serial.print(gY);
Serial.print(" g\tZ: "); Serial.println(gZ);
delay(100);
}
Nota importante: El factor de conversión (0.0078) cambia según el rango. Para ±2g es 0.0039, para ±8g es 0.0156, y para ±16g es 0.0312. Si no pones el factor correcto, tus lecturas serán basura. Lo aprendí imprimiendo piezas deformadas durante una semana.
Programa Avanzado SPI (Para Input Shaping)
#include <SPI.h>
#include <SparkFun_ADXL345.h>
ADXL345 adxl = ADXL345(); // Por defecto usa SPI con CS en pin 10
// Si quieres cambiar el pin CS:
// ADXL345 adxl = ADXL345(9); // CS en pin 9
void setup() {
Serial.begin(115200); // Alta velocidad para no perder datos
Serial.println("ADXL345 SPI - Modo Alta Velocidad");
adxl.powerOn();
adxl.setRangeSetting(16); // Rango máximo para capturar golpes fuertes
adxl.setSpiBit(1); // Forzar modo SPI (importante!)
// Configurar frecuencia de muestreo máxima
adxl.setRate(3200); // 3200 Hz para capturar vibraciones finas
}
void loop() {
int x, y, z;
// Lectura rápida sin conversión (datos brutos)
adxl.readAccel(&x, &y, &z);
// Enviar por serial en formato CSV para procesar en PC
Serial.print(millis());
Serial.print(",");
Serial.print(x);
Serial.print(",");
Serial.print(y);
Serial.print(",");
Serial.println(z);
// Sin delay! Queremos la máxima frecuencia de muestreo
}
Este segundo programa es el que uso para generar los gráficos de resonancia de mis impresoras. Conectas el ADXL345 a la impresora, ejecutas un script en Python que lee el serial, y aplicas una FFT (Transformada Rápida de Fourier). El pico más alto en el gráfico te dice a qué frecuencia vibra tu impresora. Luego, en Klipper, configuras el filtro notch en esa frecuencia. Y listo. Adiós a las ondas fantasma en las paredes de tus piezas.
Troubleshooting & Errores Comunes
Aquí va la parte que más os va a interesar. He visto a decenas de personas (y a mí mismo) caer en estos errores. Dedica tiempo a esta sección, te ahorrará horas.
Error 1: El sensor no responde o da lecturas de 0, 0, 0
Causa más probable: Dirección I2C incorrecta. El ADXL345 tiene dos direcciones posibles: 0x53 (por defecto) y 0x1D (si el pin SDO está a VCC). Si tienes el pin SDO flotando, puede que el sensor se comporte de forma errática. Solución: Conecta SDO a GND para forzar la dirección 0x53. Si aún así no funciona, haz un I2C scanner. Hay sketches de ejemplo en Arduino que te escanean todas las direcciones del bus. Te sorprenderá saber cuántos sensores chinos vienen con direcciones alternativas.
Error 2: Lecturas saltarinas o ruido excesivo
Causa: Cables largos sin apantallar o fuente de alimentación sucia. El ADXL345 es sensible. Si tienes un motor paso a paso cerca (como en una impresora 3D), el campo electromagnético inducirá ruido. Solución:
- Usa cables trenzados o apantallados para las conexiones I2C/SPI.
- Añade un condensador de 10µF y otro de 100nF entre VCC y GND lo más cerca posible del módulo.
- Si usas una impresora 3D, conecta el ADXL345 a una fuente separada de 3.3V, no al pin de 3.3V de la placa que también alimenta los motores.
Error 3: La librería no compila o da errores de «multiple definition»
Causa: Tienes instaladas varias versiones de la misma librería. Pasa mucho si has estado probando forks de GitHub. Solución: Ve a la carpeta de librerías de Arduino (normalmente en Documentos/Arduino/libraries/) y borra todas las carpetas que contengan «ADXL345». Luego reinstala solo una desde el Gestor de Librerías. Confía en mí, he perdido una tarde entera por esto.
Error 4: El sensor se calienta mucho
Causa: Has conectado el módulo a 5V en lugar de 3.3V. El ADXL345 funciona a 3.3V. Si le metes 5V, el regulador interno (si lo tiene) se sobrecalienta y el chip muere lentamente. Solución: Revisa las conexiones. Si el módulo tiene un regulador de voltaje (como muchos módulos chinos), puede soportar 5V en el pin VIN, pero el pin de datos (SDA/SCL) sigue siendo de 3.3V. Si conectas esos pines directamente a un Arduino de 5V sin un conversor de nivel, freirás el sensor. Usa un divisor de tensión o un módulo conversor lógico.
Error 5: En SPI, el chip select (CS) no funciona
Causa: El pin CS no está bien configurado en software. Muchos novatos olvidan poner el pin CS como OUTPUT y ponerlo en HIGH cuando no se comunica. Solución: En el setup(), añade pinMode(csPin, OUTPUT); digitalWrite(csPin, HIGH);. Si usas la librería de SparkFun, ella se encarga de esto, pero si estás haciendo una implementación manual, es el error más común.
FAQ
¿Puedo usar el ADXL345 con un ESP32?
Sí, totalmente. De hecho, el ESP32 es ideal porque tiene más memoria y puedes hacer el análisis FFT directamente en el microcontrolador sin necesidad de un PC externo. Solo asegúrate de que los niveles de voltaje son compatibles (3.3V en ambos). He hecho varios proyectos de monitorización de vibraciones inalámbrica con ESP32 + ADXL345 y funcionan de lujo. Si te interesa, échale un ojo a nuestro artículo sobre las tablets más baratas de AliExpress para usarlas como pantalla de visualización de datos.
¿Qué frecuencia de muestreo necesito para Input Shaping en impresoras 3D?
Como mínimo, 1600 Hz. Lo ideal son 3200 Hz. El ADXL345 puede llegar a 3200 Hz en modo SPI. En I2C, te quedas en 400 kHz de bus, que traducido a muestreo real son unos 800-1000 Hz como máximo. Por eso siempre recomiendo SPI para esta aplicación. Con 3200 Hz capturas armónicos hasta 1600 Hz, que cubre el 99% de las frecuencias de resonancia de las impresoras 3D.
¿El ADXL345 es mejor que el MPU6050 para medir vibraciones?
Depende. El MPU6050 tiene acelerómetro + giroscopio, pero el acelerómetro del ADXL345 es más lineal y tiene menos ruido en frecuencias altas. Para Input Shaping, el ADXL345 gana por goleada. Para detección de orientación o inclinación, el MPU6050 es mejor porque el giroscopio ayuda a eliminar la deriva. Cada uno para lo suyo. Si quieres profundizar en el MPU6050, tenemos una guía que te puede interesar.
Conclusión
El ADXL345 es un componente pequeño pero matón. Con las librerías .h adecuadas y un código en C bien estructurado, puedes hacer maravillas: desde imprimir a 200mm/s sin artefactos hasta construir tu propio sismógrafo casero. Los errores más comunes son tontos: dirección I2C incorrecta, voltajes mal conectados o cables sin apantallar. Pero una vez que los superas, el sensor responde como un reloj suizo.
En DunaTech, seguimos cribando el desierto de AliExpress para traerte los componentes que realmente valen la pena. El ADXL345 es uno de esos chollos que no deberían faltar en tu caja de componentes. Si tienes dudas sobre tu código o tu conexión, déjame un comentario. Llevo años viendo estos problemas y seguro que puedo echarte una mano.
Ahora ve y programa ese acelerómetro. Tu impresora 3D te lo agradecerá.
Ver precio actual y cupones en AliExpress