The MMA8451 is a low-power accelerometer with 14 bits of resolution, with the following features:
- Embedded functions with flexible user-programmable options, configurable to two interrupt pins
- Embedded interrupt functions for overall power savings relieving the host processor from continuously polling data
- Access to both low-pass filtered data as well as high-pass filtered data, which minimizes the data analysis required for jolt detection and faster transitions
- Inertial wake-up interrupt signals from any combination of the configurable embedded functions allowing the MMA8451Q to monitor events and remain in a low-power mode during periods of inactivity
Features
- 1.95 to 3.6-volt supply voltage
- 1.6 to 3.6-volt interface voltage
- ±2g/±4g/±8g dynamically selectable full-scale
- Output data rates (ODR) from 1.56 Hz to 800 Hz
- 99 μg/√Hz noise
- 14-bit and 8-bit digital output
- I²C digital output interface (operates to 2.25 MHz with 4.7 kΩ pull-up)
- Two programmable interrupt pins for seven interrupt sources
- Three embedded channels of motion detection
- Freefall or motion detection: one channel
- Pulse detection: one channel
- Jolt detection: one channel
- Orientation (portrait/landscape) detection with programmable hysteresis
- Automatic ODR change for auto-wake and return to sleep
- 32 sample FIFO
- High pass filter data available per sample and through the FIFO
- Self-test
Again due to the size and package of the module its easier to buy a module, here is one that I purchased.
Connection and layout
I used the following connection from the module above to my Linkit One
Linkit one Connection | Module Connection |
3v3 | VCC_IN |
Gnd | Gnd |
SDA | SDA |
SCL | SCL |
Here is the layout
Code
This requires the Adafruit library from https://github.com/adafruit/Adafruit_MMA8451_Library/archive/master.zip
I had to edit the Adafruit header file called Adafruit_MMA8451.h as my device was address 0x1c (28), I discovered this using an I2C scanner, the line is
#define MMA8451_DEFAULT_ADDRESS (0x1C)
[codesyntax lang=”cpp”]
#include <Wire.h> #include "Adafruit_MMA8451.h" #include <Adafruit_Sensor.h> Adafruit_MMA8451 mma = Adafruit_MMA8451(); void setup(void) { Serial.begin(9600); Serial.println("Adafruit MMA8451 test!"); if (! mma.begin()) { Serial.println("Couldnt start"); while (1); } Serial.println("MMA8451 found!"); mma.setRange(MMA8451_RANGE_2_G); Serial.print("Range = "); Serial.print(2 << mma.getRange()); Serial.println("G"); } void loop() { // Read the 'raw' data in 14-bit counts mma.read(); Serial.print("X:\t"); Serial.print(mma.x); Serial.print("\tY:\t"); Serial.print(mma.y); Serial.print("\tZ:\t"); Serial.print(mma.z); Serial.println(); /* Get a new sensor event */ sensors_event_t event; mma.getEvent(&event); /* Display the results (acceleration is measured in m/s^2) */ Serial.print("X: \t"); Serial.print(event.acceleration.x); Serial.print("\t"); Serial.print("Y: \t"); Serial.print(event.acceleration.y); Serial.print("\t"); Serial.print("Z: \t"); Serial.print(event.acceleration.z); Serial.print("\t"); Serial.println("m/s^2 "); /* Get the orientation of the sensor */ uint8_t o = mma.getOrientation(); switch (o) { case MMA8451_PL_PUF: Serial.println("Portrait Up Front"); break; case MMA8451_PL_PUB: Serial.println("Portrait Up Back"); break; case MMA8451_PL_PDF: Serial.println("Portrait Down Front"); break; case MMA8451_PL_PDB: Serial.println("Portrait Down Back"); break; case MMA8451_PL_LRF: Serial.println("Landscape Right Front"); break; case MMA8451_PL_LRB: Serial.println("Landscape Right Back"); break; case MMA8451_PL_LLF: Serial.println("Landscape Left Front"); break; case MMA8451_PL_LLB: Serial.println("Landscape Left Back"); break; } Serial.println(); delay(500); }
[/codesyntax]
Testing
Serial monitor again, this was moving the module about
X: -1528 Y: -1548 Z: 3536
X: -0.37 Y: -0.38 Z: 0.86 m/s^2
Landscape Left Front
X: -3120 Y: -1620 Z: 3494
X: -0.46 Y: -0.50 Z: 0.75 m/s^2
Landscape Left Front
X: 2000 Y: -1412 Z: -8192
X: -0.77 Y: -0.61 Z: 1.55 m/s^2
Landscape Left Back
X: 3596 Y: 1148 Z: 1220
X: 1.33 Y: -0.13 Z: 0.54 m/s^2
Landscape Right Front
X: -14 Y: -1748 Z: -3448
X: 0.09 Y: -0.34 Z: -0.48 m/s^2
Portrait Up Back
Links
Here is a link to the module
GY-45 MMA8451 Module Digital Triaxial Accelerometer High-precision Inclination Module