arduino-acelerometro-mma7455

Usar un acelerómetro MMA7455 con Arduino

¿Qué es un acelerómetro MMA7455?

El MMA7455L es un acelerómetro micromecanizado capacitivo de 3 ejes independientes (3 DOF) fabricado por Freescale Semiconductor, que puede ser fácilmente conectado a un autómata o procesador como Arduino.

Es un sensor micromecanizado (MEMS) capacitivo que detecta la aceleración en los ejes X, Y y Z. También es posible determinar la orientación del sensor, gracias a la acción de la fuerza de la gravedad.

El acelerómetro MMA7455 es un sensor muy extendido por ser una opción barata. El MMA7455 tiene un bajo consumo, de 0.5 a 3 mA cuando está activo y 26 µA en modo standby.

La comunicación puede realizarse tanto por bus SPI como por bus I2C, por lo que es sencillo obtener los datos medidos. La tensión de alimentación es de bajo voltaje entre 2.4 a 3.6V.

Frecuentemente se encuentran integrados en módulos que incorporan la electrónica necesaria para conectarla de forma sencilla a un Arduino. En la mayoría de los módulos, esto incluye un regulador de voltaje que permite alimentar directamente a 5V.

El MMA7455 tiene un conversor analógico digital (ADC), un filtro de paso bajo y compensación de la temperatura. La medición puede ajustarse a un rango de ±2g, ±4g, o ±8g en mediciones de 8bits, y un modo adicional de 10bits ±8g. La sensibilidad es de 1/64 el rango de medición (una precisión de 1.5%)

El MMA7455 dispone de dos pines de interrupciones que podemos configurar para responder a ciertos eventos. Estos eventos incluyen detección de movimientos rápidos golpes y vibraciones, en uno o dos pulsos, y detección de condiciones de caída libre 0-g.

Los acelerómetros son dispositivos ampliamente utilizados en todo tipo de dispositivos, desde determinar la orientación en móviles o tablets, detectar la caída libre, medir pasos en podómetros, estabilización de cámaras, alarmas y sensores de vibración, entre muchos otros.

Precio

El MMA7455 es un acelerómetro relativamente caro. Podemos encontrarlo en placas de montaje como la GY-291, que incorpora la electrónica necesaria para conectarlo de forma sencilla a Arduino, por 1.80€ en vendedores internacionales de eBay o AliExpress.

arduino-acelerometro-mma7455-componente

Para ser un acelerómetro simple de 3DOF es un poco caro. Tenemos acelerómetros más baratos como el ADXL345, e incluso IMU con características muy superiores como el MPU6050.

Esquema montaje

La conexión es sencilla, simplemente alimentamos el módulo desde Arduino mediante GND y 5V y conectamos el pin SDA y SCL de Arduino con los pines correspondientes del sensor.

arduino-acelerometro-mma7455-esquema

Mientras que la conexión vista desde el lado de Arduino quedaría así.

arduino-acelerometro-mma7455-conexion

En Arduino Uno, Nano y Mini Pro, SDA es el pin A4 y el SCK el pin A5. Para otros modelos de Arduino consultar el esquema patillaje correspondiente.

Verificar que vuestra placa es compatible con 5V antes de conectarla a Arduino. Si no, tendréis que usar un adaptador de nivel lógico.

Ejemplos de código

Para realizar la lectura del MMA7455 tenemos varias librerías disponibles, como la desarrollada por Alexandre Boni (eklex), disponible en este enlace. Esta librería proporciona métodos para comunicar tanto por I2C como por SPI, para configurar el ADXL345, y definir interrupciones para detección de actividad, inactividad, pulsaciones normales y dobles.

La librería proporciona ejemplos de código, que resulta aconsejable revisar. El siguiente ejemplo es una versión reducida a partir de los disponibles en la librería, que muestra los valores de aceleración en los tres ejes.

#include <Wire.h>
#include <MMA_7455.h>

MMA_7455 accel = MMA_7455(i2c_protocol);
float xg, yg, zg;

void setup()
{ 
  Serial.begin(9600);
  accel.begin();
  accel.setSensitivity(2);   //Definir el rango, valores 2, 4 o 8
  accel.setMode(measure);
  accel.setAxisOffset(0, 0, 0);
}

void loop()
{
  //leer los valores e imprimirlos
  xg  = accel.readAxis10g('x');
  yg  = accel.readAxis10g('y');
  zg  = accel.readAxis10g('z');

  Serial.print("\tXg: "); Serial.print(xg, DEC);
  Serial.print("\tYg: "); Serial.print(yg, DEC);
  Serial.print("\tZg: "); Serial.print(zg, DEC);
  Serial.println();
  delay(500);
}

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github. github-full