BeagleBone with Accelerometer MM8452

Simple article for BeagleBone and Sparkfun MM8452 accelerometer. Python code is used.

Categories: Beginner

This article describes how to start with BeagleBone  and Sparkfun MMA8452 accelerometer.

 For this example you need:

  • BeagleBone
  • MikroBUS Cape
  • Sparkfun MMA8452 accelerometer

To prepare BeagleBone you need to install python-smbus package. Adafruit_I2C library use this package.

SparkFun MMA8452 Accelerometer

SparkFun MMA8452

This breakout board makes it easy to use the tiny MMA8452Q accelerometer in your project. The MMA8452Q is a smart low-power, three-axis, capacitive MEMS accelerometer with 12 bits of resolution. This accelerometer is packed with embedded functions with flexible user programmable options, configurable to two interrupt pins. Embedded interrupt functions allow for overall power savings relieving the host processor from continuously polling data.

Code explanation

  • Standby and active mode

Accelerometer should be in standby mode before you change configuration. Library provide two methods for setting state. 

def standby(self):

    reg_val = self.i2C.readU8(self.CTRL_REG1)

    reg_val = reg_val & 0xFE # clear the active bit



def active(self):

    reg_val = self.i2C.readU8(self.CTRL_REG1)

    reg_val = reg_val | 0x01 # set the active bit


  • Scale

The MMA8452Q has user selectable full scales of ±2g/±4g/±8g. 

def setScale(self, scale):

# must be in standby mode

    reg_val = self.i2C.readU8(self.XYZ_DATA_CFG)

    reg_val = reg_val & 0xFC

    scale = scale >> 2

    reg_val = reg_val | scale


  • Output data rate

Output Data Rates (ODR) from 1.56 Hz to 800 Hz

def setODR(self,odr):

    reg_val = self.i2C.readU8(self.CTRL_REG1)

    reg_val = reg_val & 0xCF # clear the active bit

    odr = odr << 3

    reg_val = reg_val | odr


  • Configuration method 

In configuration method, first put MMA8452 in standby mode. Two parameters should be defined : scale & output data rate. Last command is putting accelerometer in active state.

def config(self, fsr = 2, odr = 0):

    self.scale = fsr




  • Reading data

There is two point of interest : availability and reading registers. You should check if any new data is available before reading data. For every axis, data are stored in two register (MSB, LSB). MMA8452 provide 12-bit resolution in two’s complement format. 

def available(self):

    reg_val = self.i2C.readU8(self.STATUS)

    reg_val = reg_val & 0x08

    reg_val = reg_val >> 3

    return reg_val

def readX(self):

    reg_XH = self.i2C.readU8(self.OUT_X_MSB)

    reg_XL = self.i2C.readU8(self.OUT_X_LSB)

    reg_x = (reg_XH << 8) | (reg_XL)

    res = reg_x >> 4

    res = twos_comp(res,12)

    return res

For testing you can play with several combinations. The most important option is scale. Change scale parameter from SCALE_2G to SCALE_8G to see effect. Next you can try to change reading methods for x,y,z axis. You have 12-bit resolution, but you could decrease that with shifting with more bits ( >>4 to >>6) and change second parameters in twos_comp function to 10. Do it in readX,Y,Z methods.

Let’s play with acceloremeter!

Comments are not currently available for this post.