Home » MMA7660FC accelerometer and Raspberry pi example

MMA7660FC accelerometer and Raspberry pi example

by shedboy71

In this example we look at the MMA7660FC accelerometer connected to a Raspberry pi

The MMA7660FC is a digital output I²C, very low-power, low-profile capacitive micro-machined accelerometer featuring a low pass filter, compensation for zero-g offset and gain errors and conversion to six-bit digital values at a user configurable output data rate. The device can be used for sensor data changes, product orientation and gesture detection through an interrupt pin (INT).

Features

  • Digital output I²C
  • 3 mm x 3 mm x 0.9 mm DFN package
  • Low-power current consumption
    • Off mode: 0.4 µA
    • Standby mode: 2 µA
    • Active mode: Configurable down to 47 µA
  • Low-voltage operation: 2.4 – 3.6-volts
  • 3-axis ±1.5 g MEMS sensor and CMOS interface controller built into one package
  • Configurable output data rate from one to 120 samples a second
  • Auto wake/sleep feature for low-power consumption
  • Tilt orientation detection for portrait/landscape capability
  • Gesture detection including shake and pulse detection

Parts List

Part Link
raspberry Pi 2018 new original Raspberry Pi 3 Model B+ (plug) Built-in Broadcom 1.4GHz quad-core 64 bit processor Wifi Bluetooth and USB Port
MMA7660 IIC I2C MMA7660 Triaxial Acceleration Sensor Module For Arduino
Connecting wire Free shipping Dupont line 120pcs 20cm male to male + male to female and female to female jumper wire

Connection

Raspberry Pi MMA7660
3v3 Vcc
Gnd Gnd
GPIO2 (SDA) SDA
GPIO3 (SCL) SCL

Code

This is an example from controleverything called MMA7660FC.py

# Distributed with a free-will license.
# Use it any way you want, profit or free, provided it fits in the licenses of its associated works.
# MMA7660FC
# This code is designed to work with the MMA7660FC_I2CS I2C Mini Module available from ControlEverything.com.
# https://www.controleverything.com/content/Accelorometer?sku=MMA7660FC_I2CS#tabs-0-product_tabset-2

import smbus
import time

# Get I2C bus
bus = smbus.SMBus(1)

# I2C address of the device
MMA7660FC_DEFAULT_ADDRESS			= 0x4C

# MMA7660FC Register Map
MMA7660FC_XOUT						= 0x00 # Output Value X
MMA7660FC_YOUT						= 0x01 # Output Value Y
MMA7660FC_ZOUT						= 0x02 # Output Value Z
MMA7660FC_TILT						= 0x03 # Tilt Status
MMA7660FC_SRST						= 0x04 # Sampling Rate Status
MMA7660FC_SPCNT						= 0x05 # Sleep Count
MMA7660FC_INTSU						= 0x06 # Interrupt Status
MMA7660FC_MODE						= 0x07 # Mode Register
MMA7660FC_SR						= 0x08 # Sample Rate Register
MMA7660FC_PDET						= 0x09 # Tap/Pulse Detection Register
MMA7660FC_PD						= 0x0A # Tap/Pulse Debounce Count Register

# MMA7660FC Mode Register
MMA7660FC_MODE_STANDBY				= 0x00 # Standby Mode
MMA7660FC_MODE_TEST					= 0x04 # Test Mode
MMA7660FC_MODE_ACTIVE				= 0x01 # Active Mode
MMA7660FC_AWE_EN					= 0x08 # Auto-Wake Enabled
MMA7660FC_AWE_DS					= 0x00 # Auto-Wake Disabled
MMA7660FC_ASE_EN					= 0x10 # Auto-Sleep Enabled
MMA7660FC_ASE_DS					= 0x00 # Auto-Sleep Disabled
MMA7660FC_SCPS_16					= 0x20 # Prescaler is divide by 16
MMA7660FC_SCPS_1					= 0x00 # Prescaler is divide by 1
MMA7660FC_IPP_OPEN					= 0x00 # Interrupt output INT is open-drain
MMA7660FC_IPP_PUSH					= 0x40 # Interrupt output INT is push-pull
MMA7660FC_IAH_LOW					= 0x00 # Interrupt output INT is active low
MMA7660FC_IAH_HIGH					= 0x80 # Interrupt output INT is active high

# MMA7660FC Sample Rate Register
MMA7660FC_AMSR_120					= 0x00 # 120 Samples/Second Active and Auto-Sleep Mode
MMA7660FC_AMSR_64					= 0x01 # 64 Samples/Second Active and Auto-Sleep Mode
MMA7660FC_AMSR_32					= 0x02 # 32 Samples/Second Active and Auto-Sleep Mode
MMA7660FC_AMSR_16					= 0x03 # 16 Samples/Second Active and Auto-Sleep Mode
MMA7660FC_AMSR_8					= 0x04 # 8 Samples/Second Active and Auto-Sleep Mode
MMA7660FC_AMSR_4					= 0x05 # 4 Samples/Second Active and Auto-Sleep Mode
MMA7660FC_AMSR_2					= 0x06 # 2 Samples/Second Active and Auto-Sleep Mode
MMA7660FC_AMSR_1					= 0x07 # 1 Samples/Second Active and Auto-Sleep Mode
MMA7660FC_AWSR_32					= 0x00 # 32 Samples/Second Auto-Wake Mode
MMA7660FC_AWSR_16					= 0x08 # 16 Samples/Second Auto-Wake Mode
MMA7660FC_AWSR_8					= 0x10 # 8 Samples/Second Auto-Wake Mode
MMA7660FC_AWSR_1					= 0x18 # 1 Samples/Second Auto-Wake Mode

class MMA7660FC():
	def __init__(self):
		self.mode_config()
		self.sample_rate_config()
	
	def mode_config(self):
		"""Select the mode control register of the accelerometer from the given provided values"""
		MODE_CONTROL = (MMA7660FC_MODE_ACTIVE | MMA7660FC_AWE_DS | MMA7660FC_ASE_DS | MMA7660FC_SCPS_1 | MMA7660FC_IAH_LOW)
		bus.write_byte_data(MMA7660FC_DEFAULT_ADDRESS, MMA7660FC_MODE, MODE_CONTROL)
	
	def sample_rate_config(self):
		"""Select the sample rate register of the accelerometer from the given provided values"""
		SAMPLE_RATE = (MMA7660FC_AMSR_2)
		bus.write_byte_data(MMA7660FC_DEFAULT_ADDRESS, MMA7660FC_SR, SAMPLE_RATE)
	
	def read_accl(self):
		"""Read data back from MMA7660FC_XOUT(0x00), 3 bytes
		X-Axis Accl, Y-Axis Accl, Z-Axis Accl"""
		data = bus.read_i2c_block_data(MMA7660FC_DEFAULT_ADDRESS, MMA7660FC_XOUT, 3)
		
		# Convert the data to 6-bits
		xAccl = data[0] & 0x3F
		if xAccl > 31 :
			xAccl -= 64
		
		yAccl = data[1] & 0x3F
		if yAccl > 31 :
			yAccl -= 64
		
		zAccl = data[2] & 0x3F
		if zAccl > 31 :
			zAccl -= 64
		
		return {'x' : xAccl, 'y' : yAccl, 'z' : zAccl}

from MMA7660FC import MMA7660FC
mma7660fc = MMA7660FC()

while True :
	mma7660fc.mode_config()
	mma7660fc.sample_rate_config()
	time.sleep(0.1)
	accl = mma7660fc.read_accl()
	print "Acceleration in X-Axis : %d"%(accl['x'])
	print "Acceleration in Y-Axis : %d"%(accl['y'])
	print "Acceleration in Z-Axis : %d"%(accl['z'])
	print " ************************************* "
	time.sleep(1)

Output

run this by typing in

sudo python MMA7660FC.py

MMA7660 output

MMA7660 output

Link

https://www.nxp.com/docs/en/data-sheet/MMA7660FC.pdf

You may also like

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More