ADXL345: El Acelerómetro que Salvó mi Impresora 3D (y Cómo Usarlo con Arduino)

ADXL345: El Acelerómetro que

Escrito por

en

¿Qué es el ADXL345 y por qué te importa?

Mira. Llevo años peleándome con impresoras 3D. Y si hay una cosa que odio más que un spaghetti de filamento, son las líneas fantasma en las paredes de una pieza. Ese defecto llamado ringing o ghosting que aparece cuando la impresora acelera y frena bruscamente. La solución no es solo apretar tornillos. Es entender la física del movimiento.

Ahí entra el ADXL345. Un acelerómetro de tres ejes tan pequeño que cabe en una moneda, pero tan preciso que te permite medir las vibraciones de tu impresora en tiempo real. Nosotros en DunaTech lo hemos usado para calibrar el Input Shaper de Klipper en media docena de máquinas chinas baratas, y sinceramente… el salto de calidad es brutal. Pasas de tener artefactos visibles a paredes casi perfectas.

Y sí. Todo esto es posible con un chip que en AliExpress cuesta menos que un café con leche. Pero ojo, no solo sirve para impresión 3D. También lo puedes usar para detectar caídas, medir inclinación o incluso como control de gestos en proyectos Arduino. Es un chollazo de componente.

Cómo Funciona: El Secreto de la Compensación de Resonancia

El ADXL345 mide aceleración en los ejes X, Y y Z. Pero lo importante no es lo que mide, sino cómo lo mide. Utiliza una estructura MEMS (Micro-Electro-Mechanical Systems) que detecta cambios en la capacitancia cuando el chip se mueve. Traducción: es sensible, consume muy poca energía y puede detectar vibraciones de hasta ±16g.

En el contexto de una impresora 3D, montas el ADXL345 en el hotend o en la cama, lo conectas a una Raspberry Pi (o a un Arduino), y ejecutas una rutina de prueba de vibraciones. El firmware Klipper usa esos datos para generar un filtro que cancela las frecuencias de resonancia del marco. Resultado: cero ghosting. Es como ponerle amortiguadores activos a tu impresora.

I2C vs SPI: ¿Cuál elegir?

El ADXL345 soporta ambos protocolos. Y aquí va mi recomendación basada en pruebas reales:

  • I2C: Más fácil de conectar (solo 4 cables: VCC, GND, SDA, SCL). Perfecto para principiantes o proyectos rápidos con Arduino Uno. La velocidad es suficiente para leer datos a 100 kHz.
  • SPI: Más rápido (hasta 8 MHz) y más fiable en entornos con mucho ruido eléctrico (como dentro de una impresora 3D con motores paso a paso). Requiere 6 cables (MOSI, MISO, SCK, CS, VCC, GND).

Para Input Shaper con Klipper, usa SPI. Siempre. El ruido de los motores puede corromper la señal I2C. Lo aprendí por las malas después de dos horas depurando lecturas que no tenían sentido.

Conexión paso a paso con Arduino (I2C vs SPI)

Vamos al lío. Te voy a enseñar las dos configuraciones que hemos probado en nuestro taller. No te saltes ni un paso, que luego las quejas llegan.

Opción 1: Modo I2C (La fácil, para empezar)

Esta es la conexión que usamos para prototipar rápido. Necesitas un Arduino Uno y el módulo ADXL345 (los que venden en AliExpress suelen venir en una plaquita azul con pines).

  • VCC → 3.3V del Arduino (¡nunca 5V! Lo fríes)
  • GND → GND
  • SDA → A4 (en Uno) o pin 20 (en Mega)
  • SCL → A5 (en Uno) o pin 21 (en Mega)

Nota importante: Algunos módulos traen resistencias pull-up internas. Si tu cableado es muy largo (más de 20 cm), añade resistencias externas de 4.7kΩ entre SDA/SCL y 3.3V. Si no, la señal se degrada y leerás basura.

Opción 2: Modo SPI (La profesional, para Klipper)

Esta es la que usamos para conectar el acelerómetro a una Raspberry Pi 4 y correr Input Shaper. El pinout cambia:

  • VCC → 3.3V
  • GND → GND
  • CS → Pin 10 (Arduino) o GPIO 8 (Pi)
  • MOSI → Pin 11 (Arduino) o GPIO 10 (Pi)
  • MISO → Pin 12 (Arduino) o GPIO 9 (Pi)
  • SCK → Pin 13 (Arduino) o GPIO 11 (Pi)

Una vez conectado, asegúrate de que el pin CS esté alto (HIGH) cuando no estés leyendo. Si lo dejas flotando, el ADXL345 se queda en modo I2C y no responde. Me pasó. Es frustrante.

Código Arduino: Leyendo Datos Reales

Aquí te dejo el sketch que usamos en el laboratorio. No copies y pegues sin leer los comentarios. Cada línea tiene su razón de ser.

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

Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);

void setup(void) 
{
  Serial.begin(9600);
  
  if(!accel.begin())
  {
    Serial.println("❌ Error: No se detectó el ADXL345");
    while(1);
  }
  
  // Rango: ±16g para capturar vibraciones fuertes
  accel.setRange(ADXL345_RANGE_16_G);
  
  Serial.println("✅ ADXL345 listo!");
}

void loop(void) 
{
  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(100);
}

¿Qué hace este código? Inicializa el sensor en modo I2C, configura la sensibilidad máxima (±16g) y empieza a escupir datos por el monitor serie cada 100 ms. Si ves valores que no cambian o un «0.00» constante, revisa las conexiones. Es el error más común.

Si quieres usar SPI, cambia la librería por Adafruit_ADXL345_SPI y especifica el pin CS en el constructor. La lógica es la misma, pero la velocidad de lectura se dispara.

Troubleshooting & Errores Comunes

Aquí es donde la mayoría de la gente tira la toalla. No lo hagas. He visto estos fallos cientos de veces en foros y en mi propio taller. Te ahorro las horas de debugging.

Error 1: El monitor serie muestra «0.00» constantemente

Causa: El ADXL345 no está recibiendo alimentación correcta o está en modo sleep.

Solución: Mide el voltaje entre VCC y GND con un multímetro. Debe ser 3.3V exactos. Si usas 5V, el chip se calienta y deja de funcionar (posiblemente lo hayas matado). También verifica que el pin CS esté en HIGH si usas SPI. Si está LOW, el chip espera una transacción SPI y no responde a I2C.

Error 2: Lecturas que se disparan a valores enormes (ej: 500 m/s²)

Causa: Ruido eléctrico de los motores paso a paso. Pasa muchísimo cuando montas el sensor en una impresora 3D sin apantallar los cables.

Solución: Añade un condensador de 100 µF entre VCC y GND lo más cerca posible del módulo. También puedes trenzar los cables de datos (SDA/SCL) para reducir interferencias. Si usas SPI, aumenta la frecuencia a 2 MHz para que la lectura sea más rápida que el ruido.

Error 3: El sensor no aparece en la dirección I2C (0x53)

Causa: La dirección por defecto es 0x53 si el pin SDO está a GND, y 0x1D si está a VCC. Muchos módulos chinos vienen con SDO flotando o mal configurado.

Solución: Ejecuta un escáner I2C (código: I2C Scanner) para ver qué dirección responde. Si no aparece ninguna, prueba a soldar un jumper entre SDO y GND para forzar la dirección 0x53.

Error 4: Los valores de aceleración no cambian al mover el sensor

Causa: El chip está en modo standby (registro POWER_CTL = 0x00). Algunas librerías no lo activan correctamente.

Solución: Añade esta línea después de accel.begin():

accel.writeRegister(ADXL345_REG_POWER_CTL, 0x08); // Modo medida

FAQ

¿Puedo usar el ADXL345 con una Raspberry Pi Pico?

Sí, totalmente. De hecho, la Pico funciona a 3.3V, así que no necesitas conversores de nivel lógico. Conéctalo por SPI a los pines GP2 (SCK), GP3 (MOSI), GP4 (MISO), GP5 (CS). La librería micropython-adxl345 funciona de maravilla. Eso sí, asegúrate de soldar bien los pines, que los headers hembra de la Pico a veces hacen mal contacto.

¿El ADXL345 sirve para proyectos de detección de caídas?

Funciona, pero no es lo ideal. El ADXL345 tiene un rango máximo de ±16g, que es suficiente para detectar una caída desde una mesa. Pero si necesitas medir impactos fuertes (como en un drone que se estrella), mejor usa el ADXL377 (rango de ±200g). Nosotros lo probamos para un proyecto de monitorización de paquetes frágiles y funcionó, pero los falsos positivos eran frecuentes.

¿Qué hago si mi impresora 3D sigue teniendo ghosting después de calibrar Input Shaper?

Primero, verifica que el ADXL345 esté bien sujeto al hotend. Si se mueve aunque sea 1 mm, las lecturas son basura. Usa cinta Kapton o una abrazadera impresa en 3D. Segundo, asegúrate de que el firmware Klipper esté usando los ejes correctos (el sensor mide X, Y, Z, pero la impresora necesita saber cuál es cuál). Tercero, revisa que la correa de la impresora no esté floja. El Input Shaper no puede compensar una correa que baila.

Conclusión

El ADXL345 no es el acelerómetro más moderno ni el más rápido del mercado. Pero por lo que cuesta (menos de 3 dólares en AliExpress), es una herramienta indispensable para cualquiera que quiera llevar su impresión 3D al siguiente nivel. Lo hemos usado para calibrar desde una Ender 3 hasta una Voron 2.4, y en todos los casos la mejora en calidad superficial fue espectacular.

¿Mi recomendación final? Cómprate dos. Uno para la impresora y otro para jugar con Arduino. Te aseguro que en cuanto empieces a medir vibraciones, verás el mundo de otra manera. Y si te atascas, ya sabes dónde encontrarnos. En DunaTech seguimos escarbando en el desierto de AliExpress para encontrar estos pequeños oasis tecnológicos.

Ver precio actual y cupones en AliExpress

Ofertas AliExpress