
¿Alguna vez te has preguntado cómo sabe tu smartphone qué camino es hacia arriba? Es una de las características más innovadoras de los teléfonos inteligentes de hoy. Todos tienen un pequeño dispositivo llamado acelerómetro integrado en el circuito que detecta cuando inclinas el dispositivo de lado a lado. Así es como su teléfono inteligente sabe cuándo cambiar del modo vertical al horizontal.
Los acelerómetros se utilizan ampliamente en aplicaciones de detección de movimiento e inclinación principalmente en dispositivos que requieren bajo consumo y bajo costo, como un teléfono móvil, sistemas de juegos, protección de unidades de disco, estabilización de imagen, dispositivos deportivos y de salud.
Repasemos qué son, qué hacen y cómo funcionan.
¿Cómo funciona un acelerómetro?
Para comprender cómo funcionan los acelerómetros, imagina una pelota dentro de un cubo 3D.

Asumiendo que el cubo está en el espacio exterior, donde no hay gravedad, la bola simplemente flotará en el centro del cubo.
Ahora supón que cada pared representa un eje específico.
Si de repente movemos la caja hacia la izquierda con una aceleración de 1g (una sola fuerza G de 1g equivale a una aceleración de la gravedad de 9,8 m/s2), la pelota indudablemente chocará contra la pared X. Si medimos la fuerza que ejerce la pelota sobre la pared X, podemos obtener un valor de salida de 1g a lo largo del eje X.

Veamos qué sucede cuando colocamos ese cubo en la Tierra. La pelota simplemente caerá sobre la pared Z, ejerciendo una fuerza de 1g como se muestra en el siguiente diagrama:

En este caso, la caja no se mueve, pero aún obtenemos una lectura de 1 g en el eje Z. Esto se debe a que la gravedad (que en realidad es una forma de aceleración) tira de la pelota hacia abajo con una fuerza de 1 g.
Si bien, este modelo no representa exactamente cómo se construye un sensor de acelerómetro del mundo real, a menudo es útil para comprender por qué la señal de salida de un acelerómetro generalmente se especifica en ±g, o por qué un acelerómetro lee 1g en el eje z en reposo, o qué lecturas del acelerómetro puedes esperar en diferentes orientaciones.
En el mundo real, los acelerómetros se basan en sistemas microelectromecánicos (tecnología de fabricación MEMS). Entonces, aprendamos cómo funciona un acelerómetro MEMS.
¿Cómo funciona un acelerómetro MEMS?
Un acelerómetro MEMS (Sistema Micro-Electro-Mecánico) es una estructura micromecanizada construida sobre una lámina de silicio.

Esta estructura está suspendida por resortes de polisilicio. Permite que la estructura se desvíe cuando se acelera a lo largo de los ejes X, Y y/o Z.
Como resultado de la deflexión, cambia la capacitancia entre las placas fijas y las placas unidas a la estructura suspendida. Este cambio en la capacitancia es proporcional a la aceleración a lo largo de ese eje.
El sensor procesa este cambio de capacitancia y lo convierte en un voltaje de salida analógico.
Descripción general del hardware del módulo ADXL335
En el núcleo del módulo se encuentra un acelerómetro MEMS de triple eje, bajo consumo y bajo nivel de ruido de Analog Devices: ADXL335. Puede medir no solo la aceleración estática causada por la gravedad, sino también la aceleración dinámica causada por el movimiento, el impacto o la vibración.

Este módulo puede utlizarse en un protoboard ya que la separación de sus pines es de 0,1”. Incluye 3 salidas analógicas para mediciones de los ejes X, Y y Z, 2 pines de suministro y un pin de autocomprobación.
Energía
El ADXL335 funciona con 1,8 V a 3,6 V CC (típicamente 3,3 V). Sin embargo, el regulador de 3,3 V incorporado lo hace ideal para interactuar con microcontroladores de 5V como el Arduino.
El sensor consume solo 350 μA de corriente durante el funcionamiento normal.
Rango de medición
El ADXL335 tiene un rango de detección completo de ±3g. Lo que significa que la cantidad máxima de aceleración que el ADXL335 puede medir con precisión y representar como una salida es de ±3 g. Si se acelera a 4 g, por ejemplo, el acelerómetro no se romperá, pero la salida puede fallar.
La aceleración máxima absoluta del ADXL335 es de 10000 g. Cuando se somete a aceleraciones superiores a 10 000 g, el ADXL335 puede fallar.
Salida radiométrica
La salida ADXL335 es radiométrica, por lo tanto, el voltaje de salida aumenta linealmente con la aceleración en el rango. Esto significa que la salida de medición de 0g siempre está a la mitad del voltaje de suministro de 3,3 V (1,65 V), -3g está a 0v y +3g está a 3,3V, con una escala completa en el medio.
Especificaciones técnicas
Aquí están las especificaciones.

Para obtener más información, consulta la hoja de datos.
Configuración de pines del acelerómetro ADXL335
Antes de entrar en la conexión y el código de ejemplo, echemos un vistazo a su Pinout.

VCC suministra energía al módulo. Conéctalo a la salida de 5V de tu Arduino.
X-OUT emite un voltaje analógico proporcional a la aceleración a lo largo del eje X
Y-OUT emite un voltaje analógico proporcional a la aceleración a lo largo del eje Y.
Z-OUT emite un voltaje analógico proporcional a la aceleración a lo largo del eje Z.
GND es el pin de tierra.
ST (autoprueba) es el pin que controla la función de autocomprobación. Permite probar la funcionalidad del sensor en la aplicación final. Esta característica se analiza en profundidad al final de este tutorial.
Conexión de un acelerómetro ADXL335 a un Arduino
Ahora que sabemos cómo funciona el acelerómetro ADXL335, podemos conectarlo a nuestro Arduino.
Las conexiones son bastante simples. Comienza montando el acelerómetro en la protoboard. Conecta el pin VCC al pin de 5V de Arduino y el pin GND al pin de tierra de Arduino. Conecta las salidas X, Y y Z a los pines analógicos A0, A1 y A2 de Arduino.
Para obtener resultados precisos, debemos cambiar el voltaje de referencia analógica (AREF) en el Arduino. Esto se logra conectando el pin de 3.3V de Arduino al pin AREF.
La siguiente imagen muestra el cableado.

Código de ejemplo de Arduino: lectura del acelerómetro ADXL335
El código es bastante simple. Simplemente muestra la salida del sensor calibrado en cada eje en la interfaz serial. Prueba el programa antes de entrar en detalles.
const int xInput = A0;
const int yInput = A1;
const int zInput = A2;
// initialize minimum and maximum Raw Ranges for each axis
int RawMin = 0;
int RawMax = 1023;
// Take multiple samples to reduce noise
const int sampleSize = 10;
void setup()
{
analogReference(EXTERNAL);
Serial.begin(9600);
}
void loop()
{
//Read raw values
int xRaw = ReadAxis(xInput);
int yRaw = ReadAxis(yInput);
int zRaw = ReadAxis(zInput);
// Convert raw values to 'milli-Gs"
long xScaled = map(xRaw, RawMin, RawMax, -3000, 3000);
long yScaled = map(yRaw, RawMin, RawMax, -3000, 3000);
long zScaled = map(zRaw, RawMin, RawMax, -3000, 3000);
// re-scale to fractional Gs
float xAccel = xScaled / 1000.0;
float yAccel = yScaled / 1000.0;
float zAccel = zScaled / 1000.0;
Serial.print("X, Y, Z :: ");
Serial.print(xRaw);
Serial.print(", ");
Serial.print(yRaw);
Serial.print(", ");
Serial.print(zRaw);
Serial.print(" :: ");
Serial.print(xAccel,0);
Serial.print("G, ");
Serial.print(yAccel,0);
Serial.print("G, ");
Serial.print(zAccel,0);
Serial.println("G");
delay(200);
}
// Take samples and return the average
int ReadAxis(int axisPin)
{
long reading = 0;
analogRead(axisPin);
delay(1);
for (int i = 0; i < sampleSize; i++)
{
reading += analogRead(axisPin);
}
return reading/sampleSize;
}
Las siguientes imágenes muestran las lecturas del acelerómetro en varias orientaciones.



Explicación del código:
El sketch comienza declarando los pines de entrada analógica de Arduino a los que se conectan los pines de salida X, Y y Z del sensor.
const int xInput = A0;
const int yInput = A1;
const int zInput = A2;
A continuación, se definen dos variables, RawMin y RawMax. Debido a que el Arduino tiene un ADC de 10 bits (210 = 1024), asignará los voltajes de salida del ADXL335, que van de 0 a 3,3 voltios, en valores enteros entre 0 y 1023. Por eso RawMin se establece en 0 y RawMax se establece en 1023.
// initialize minimum and maximum Raw Ranges for each axis
int RawMin = 0;
int RawMax = 1023;
La variable sampleSize especifica el número de muestras que Arduino debe tomar durante cada conversión. En nuestro caso, configuramos sampleSize en 10 para lograr resultados más precisos.
En setup(), primero establecemos la referencia analógica a EXTERNA llamando a analogReference (EXTERNAL). Luego iniciamos comunicaciones seriales con el PC.
Advertencia:
Esto es necesario ya que hemos conectado 3.3V al pin AREF del Arduino. Si utilizar la función analogReference (EXTERNAL), cortocircuitarás el voltaje de referencia activo generado internamente y el pin AREF, lo que podría causar daños a tu Arduino.
Puedes obtener más información sobre la función analogReference() en el sitio web oficial de Arduino .
analogReference(EXTERNAL);
Serial.begin(9600);
En la sección del loop(), leemos las salidas analógicas del sensor cada 200 ms. Ten en cuenta que estamos llamando a la función ReadAxis() en lugar de a la función analogRead(). Esta función simplemente toma diez muestras de conversión de ADC y devuelve el promedio.
//Read raw values
int xRaw = ReadAxis(xInput);
int yRaw = ReadAxis(yInput);
int zRaw = ReadAxis(zInput);
Conversión de salida ADXL335 a aceleración (g)
El siguiente fragmento de código es la parte más importante del programa. Mapea y convierte los voltajes de salida analógicos del sensor en aceleración gravitacional (G).
El mapeo es manejado por la función map() integrada del IDE. Cuando llamamos map(xRaw, RawMin, RawMax, -3000, 3000), el valor de RawMin se asigna a -3000, el valor de RawMax se asigna a 3000 y los valores intermedios se asignan a valores intermedios.
Los números -3000 y 3000 no son aleatorios. En realidad, representan la aceleración gravitacional medida por el sensor en mili-g, es decir, ±3 g (-3000 mili-g a 3000 mili-g).
Por ejemplo,
- Si el sensor emite 0 voltios en el eje x, es decir xRaw=0, la función map() devolverá -3000, que corresponde a -3g.
- Si el sensor emite 1,65 voltios en el eje x, es decir xRaw=511, la función map() devolverá 0, que corresponde a 0g.
- Si el sensor emite 3,3 voltios en el eje x, es decir xRaw=1023, la función map() devolverá 3000, que corresponde a +3g.
El término radiométrico tiene más sentido ahora que el voltaje de salida aumenta linealmente con la aceleración en todo el rango.
// Convert raw values to 'milli-Gs"
long xScaled = map(xRaw, RawMin, RawMax, -3000, 3000);
long yScaled = map(yRaw, RawMin, RawMax, -3000, 3000);
long zScaled = map(zRaw, RawMin, RawMax, -3000, 3000);
Finalmente, la salida del sensor se reduce a G fraccionarios dividiéndolo por 1000 y se muestra en el monitor en serie.
// re-scale to fractional Gs
float xAccel = xScaled / 1000.0;
float yAccel = yScaled / 1000.0;
float zAccel = zScaled / 1000.0;
Serial.print("X, Y, Z :: ");
Serial.print(xRaw);
Serial.print(", ");
Serial.print(yRaw);
Serial.print(", ");
Serial.print(zRaw);
Serial.print(" :: ");
Serial.print(xAccel,0);
Serial.print("G, ");
Serial.print(yAccel,0);
Serial.print("G, ");
Serial.print(zAccel,0);
Serial.println("G");
Función de autoprueba ADXL335
El acelerómetro ADXL335 tiene una función de autocomprobación que le permite probar la funcionalidad del sensor en la aplicación final. El pin ST (autoprueba) en el módulo controla esta característica.

Cuando el pin ST está conectado a 3,3 V, se ejerce una fuerza electrostática en el haz del acelerómetro internamente. El movimiento resultante del haz permite al usuario determinar si el acelerómetro funciona o no.
El cambio esperado en la salida es
- −1,08 g (−325 mV) en el eje X
- +1,08 g (+325 mV) en el eje Y
- +1,83 g (+550 mV) en el eje Z
El pin ST se puede dejar abierto o conectado a GND durante el funcionamiento normal.
Advertencia:
Exponer el pin ST a voltajes superiores a 3,6 V puede dañar permanentemente el acelerómetro.
How accelerometer Works? Interface ADXL335 with Arduino. Last Minute Engineers. https://lastminuteengineers.com/adxl335-accelerometer-arduino-tutorial/