This commit is contained in:
Ladyada 2019-08-20 23:38:47 -04:00
parent 6198ecef39
commit 5e608243f4
2 changed files with 142 additions and 83 deletions

View file

@ -2,7 +2,6 @@
/*!
@file Adafruit_MSA301.cpp
@author Limor Fried (Adafruit Industries)
@license BSD (see license.txt)
This is a library for the Adafruit MSA301 Accel breakout board
----> https://www.adafruit.com
@ -11,6 +10,8 @@
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
@section license License
BSD license, all text here must be included in any redistribution.
*/
/**************************************************************************/
@ -89,6 +90,8 @@ bool Adafruit_MSA301::begin(uint8_t i2c_address, TwoWire *wire) {
/**************************************************************************/
/*!
@brief Sets the data rate for the MSA301 (controls power consumption)
from 1 Hz to 1000Hz
@param dataRate Enumerated msa301_dataRate_t
*/
/**************************************************************************/
void Adafruit_MSA301::setDataRate(msa301_dataRate_t dataRate) {
@ -101,7 +104,8 @@ void Adafruit_MSA301::setDataRate(msa301_dataRate_t dataRate) {
/**************************************************************************/
/*!
@brief Sets the data rate for the MSA301 (controls power consumption)
@brief Gets the data rate for the MSA301 (controls power consumption)
@return Enumerated msa301_dataRate_t from 1 Hz to 1000Hz
*/
/**************************************************************************/
msa301_dataRate_t Adafruit_MSA301::getDataRate(void) {
@ -112,6 +116,14 @@ msa301_dataRate_t Adafruit_MSA301::getDataRate(void) {
return (msa301_dataRate_t)dataratebits.read();
}
/**************************************************************************/
/*!
@brief What axes of the accelerometer we want enabled for reading
@param enableX True to enable X axis
@param enableY True to enable Y axis
@param enableZ True to enable Z axis
*/
/**************************************************************************/
void Adafruit_MSA301::enableAxes(bool enableX, bool enableY, bool enableZ) {
Adafruit_BusIO_Register ODR =
Adafruit_BusIO_Register(i2c_dev, MSA301_REG_ODR, 1);
@ -124,6 +136,13 @@ void Adafruit_MSA301::enableAxes(bool enableX, bool enableY, bool enableZ) {
z.write(!enableZ);
}
/**************************************************************************/
/*!
@brief Set the power mode, MSA301_NORMALMODE, MSA301_LOWPOWERMODE or
MSA301_SUSPENDMODE
@param mode Enumerated msa301_powermode_t
*/
/**************************************************************************/
void Adafruit_MSA301::setPowerMode(msa301_powermode_t mode) {
Adafruit_BusIO_Register PowerMode =
Adafruit_BusIO_Register(i2c_dev, MSA301_REG_POWERMODE, 1);
@ -132,6 +151,13 @@ void Adafruit_MSA301::setPowerMode(msa301_powermode_t mode) {
powermodebits.write((uint8_t)mode);
}
/**************************************************************************/
/*!
@brief Get the power mode
@returns Enumerated msa301_powermode_t, MSA301_NORMALMODE, MSA301_LOWPOWERMODE or
MSA301_SUSPENDMODE
*/
/**************************************************************************/
msa301_powermode_t Adafruit_MSA301::getPowerMode(void) {
Adafruit_BusIO_Register PowerMode =
Adafruit_BusIO_Register(i2c_dev, MSA301_REG_POWERMODE, 1);
@ -140,6 +166,13 @@ msa301_powermode_t Adafruit_MSA301::getPowerMode(void) {
return (msa301_powermode_t)powermodebits.read();
}
/**************************************************************************/
/*!
@brief Set the bandwidth, ranges from 1.95Hz to 500Hz
@param bandwidth Enumerated msa301_range_t
*/
/**************************************************************************/
void Adafruit_MSA301::setBandwidth(msa301_bandwidth_t bandwidth) {
Adafruit_BusIO_Register PowerMode =
Adafruit_BusIO_Register(i2c_dev, MSA301_REG_POWERMODE, 1);
@ -148,6 +181,13 @@ void Adafruit_MSA301::setBandwidth(msa301_bandwidth_t bandwidth) {
bandwidthbits.write((uint8_t)bandwidth);
}
/**************************************************************************/
/*!
@brief Get the bandwidth
@return Enumerated msa301_bandwidth_t, ranges from 1.95Hz to 500Hz
*/
/**************************************************************************/
msa301_bandwidth_t Adafruit_MSA301::getBandwidth(void) {
Adafruit_BusIO_Register PowerMode =
Adafruit_BusIO_Register(i2c_dev, MSA301_REG_POWERMODE, 1);
@ -158,7 +198,8 @@ msa301_bandwidth_t Adafruit_MSA301::getBandwidth(void) {
/**************************************************************************/
/*!
@brief Sets the g range for the accelerometer
@brief Set the resolution range: +-2g, 4g, 8g, or 16g.
@param range Enumerated msa301_range_t
*/
/**************************************************************************/
void Adafruit_MSA301::setRange(msa301_range_t range) {
@ -171,7 +212,8 @@ void Adafruit_MSA301::setRange(msa301_range_t range) {
/**************************************************************************/
/*!
@brief Gets the g range for the accelerometer
@brief Read the resolution range: +-2g, 4g, 8g, or 16g.
@returns Enumerated msa301_range_t
*/
/**************************************************************************/
msa301_range_t Adafruit_MSA301::getRange(void) {
@ -184,7 +226,8 @@ msa301_range_t Adafruit_MSA301::getRange(void) {
/**************************************************************************/
/*!
@brief
@brief Set the resolution - 8, 10, 12, or 14bits
@param resolution Enumerated msa301_resolution_t
*/
/**************************************************************************/
void Adafruit_MSA301::setResolution(msa301_resolution_t resolution) {
@ -197,7 +240,8 @@ void Adafruit_MSA301::setResolution(msa301_resolution_t resolution) {
/**************************************************************************/
/*!
@brief
@brief Read the resolution - 8, 10, 12, or 14bits
@returns Enumerated msa301_resolution_t
*/
/**************************************************************************/
msa301_resolution_t Adafruit_MSA301::getResolution(void) {
@ -208,6 +252,13 @@ msa301_resolution_t Adafruit_MSA301::getResolution(void) {
return (msa301_resolution_t)resbits.read();
}
/**************************************************************************/
/*!
@brief Read the XYZ data from the accelerometer and store in the internal
x, y and z (and x_g, y_g, z_g) member variables.
*/
/**************************************************************************/
void Adafruit_MSA301::read(void) {
uint8_t buffer[6];
@ -384,7 +435,8 @@ uint8_t Adafruit_MSA301::getDataInterruptStatus(void) {
/**************************************************************************/
/*!
@brief Gets the most recent sensor event, Adafruit Unified Sensor format
@param sensor Pointer to an Adafruit Unified sensor_event_t object that we'll fill in
@param event Pointer to an Adafruit Unified sensor_event_t object that we'll fill in
@returns True on successful read
*/
/**************************************************************************/
bool Adafruit_MSA301::getEvent(sensors_event_t *event) {

View file

@ -2,7 +2,6 @@
/*!
@file Adafruit_MSA301.h
@author Limor Fried (Adafruit Industries)
@license MIT (see license.txt)
This is a library for the Adafruit MSA301 Accel breakout board
----> https://www.adafruit.com/
@ -25,101 +24,109 @@
/*=========================================================================
I2C ADDRESS/BITS
-----------------------------------------------------------------------*/
#define MSA301_I2CADDR_DEFAULT (0x26)
#define MSA301_I2CADDR_DEFAULT (0x26) ///< Fixed I2C address
/*=========================================================================*/
#define MSA301_REG_PARTID 0x01
#define MSA301_REG_OUT_X_L 0x02
#define MSA301_REG_OUT_X_H 0x03
#define MSA301_REG_OUT_Y_L 0x04
#define MSA301_REG_OUT_Y_H 0x05
#define MSA301_REG_OUT_Z_L 0x06
#define MSA301_REG_OUT_Z_H 0x07
#define MSA301_REG_MOTIONINT 0x09
#define MSA301_REG_DATAINT 0x0A
#define MSA301_REG_CLICKSTATUS 0x0B
#define MSA301_REG_RESRANGE 0x0F
#define MSA301_REG_ODR 0x10
#define MSA301_REG_POWERMODE 0x11
#define MSA301_REG_INTSET0 0x16
#define MSA301_REG_INTSET1 0x17
#define MSA301_REG_INTMAP0 0x19
#define MSA301_REG_INTMAP1 0x1A
#define MSA301_REG_TAPDUR 0x2A
#define MSA301_REG_TAPTH 0x2B
#define MSA301_REG_PARTID 0x01 ///< Register that contains the part ID
#define MSA301_REG_OUT_X_L 0x02 ///< Register address for X axis lower byte
#define MSA301_REG_OUT_X_H 0x03 ///< Register address for X axis higher byte
#define MSA301_REG_OUT_Y_L 0x04 ///< Register address for Y axis lower byte
#define MSA301_REG_OUT_Y_H 0x05 ///< Register address for Y axis higher byte
#define MSA301_REG_OUT_Z_L 0x06 ///< Register address for Z axis lower byte
#define MSA301_REG_OUT_Z_H 0x07 ///< Register address for Z axis higher byte
#define MSA301_REG_MOTIONINT 0x09 ///< Register address for motion interrupt
#define MSA301_REG_DATAINT 0x0A ///< Register address for data interrupt
#define MSA301_REG_CLICKSTATUS 0x0B ///< Register address for click/doubleclick status
#define MSA301_REG_RESRANGE 0x0F ///< Register address for resolution range
#define MSA301_REG_ODR 0x10 ///< Register address for data rate setting
#define MSA301_REG_POWERMODE 0x11 ///< Register address for power mode setting
#define MSA301_REG_INTSET0 0x16 ///< Register address for interrupt setting #0
#define MSA301_REG_INTSET1 0x17 ///< Register address for interrupt setting #1
#define MSA301_REG_INTMAP0 0x19 ///< Register address for interrupt map #0
#define MSA301_REG_INTMAP1 0x1A ///< Register address for interrupt map #1
#define MSA301_REG_TAPDUR 0x2A ///< Register address for tap duration
#define MSA301_REG_TAPTH 0x2B ///< Register address for tap threshold
/** The accelerometer ranges */
typedef enum {
MSA301_RANGE_2_G = 0b00, // +/- 2g (default value)
MSA301_RANGE_4_G = 0b01, // +/- 4g
MSA301_RANGE_8_G = 0b10, // +/- 8g
MSA301_RANGE_16_G = 0b11, // +/- 16g
MSA301_RANGE_2_G = 0b00, ///< +/- 2g (default value)
MSA301_RANGE_4_G = 0b01, ///< +/- 4g
MSA301_RANGE_8_G = 0b10, ///< +/- 8g
MSA301_RANGE_16_G = 0b11, ///< +/- 16g
} msa301_range_t;
/** The accelerometer axes */
typedef enum {
MSA301_AXIS_X = 0x0,
MSA301_AXIS_Y = 0x1,
MSA301_AXIS_Z = 0x2,
MSA301_AXIS_X = 0x0, ///< X axis bit
MSA301_AXIS_Y = 0x1, ///< Y axis bit
MSA301_AXIS_Z = 0x2, ///< Z axis bit
} msa301_axis_t;
/* Used with register 0x10 (MSA301_REG_ODR) to set datarate */
/** The accelerometer data rate */
typedef enum {
MSA301_DATARATE_1_HZ = 0b0000, // 1 Hz
MSA301_DATARATE_1_95_HZ = 0b0001, // 1.95 Hz
MSA301_DATARATE_3_9_HZ = 0b0010, // 3.9 Hz
MSA301_DATARATE_7_81_HZ = 0b0011, // 7.81 Hz
MSA301_DATARATE_15_63_HZ = 0b0100, // 15.63 Hz
MSA301_DATARATE_31_25_HZ = 0b0101, // 31.25 Hz
MSA301_DATARATE_62_5_HZ = 0b0110, // 62.5 Hz
MSA301_DATARATE_125_HZ = 0b0111, // 125 Hz
MSA301_DATARATE_250_HZ = 0b1000, // 250 Hz
MSA301_DATARATE_500_HZ = 0b1001, // 500 Hz
MSA301_DATARATE_1000_HZ = 0b1010, // 1000 Hz
MSA301_DATARATE_1_HZ = 0b0000, ///< 1 Hz
MSA301_DATARATE_1_95_HZ = 0b0001, ///< 1.95 Hz
MSA301_DATARATE_3_9_HZ = 0b0010, ///< 3.9 Hz
MSA301_DATARATE_7_81_HZ = 0b0011, ///< 7.81 Hz
MSA301_DATARATE_15_63_HZ = 0b0100, ///< 15.63 Hz
MSA301_DATARATE_31_25_HZ = 0b0101, ///< 31.25 Hz
MSA301_DATARATE_62_5_HZ = 0b0110, ///< 62.5 Hz
MSA301_DATARATE_125_HZ = 0b0111, ///< 125 Hz
MSA301_DATARATE_250_HZ = 0b1000, ///< 250 Hz
MSA301_DATARATE_500_HZ = 0b1001, ///< 500 Hz
MSA301_DATARATE_1000_HZ = 0b1010, ///< 1000 Hz
} msa301_dataRate_t;
/** The accelerometer bandwidth */
typedef enum {
MSA301_BANDWIDTH_1_95_HZ = 0b0000, // 1.95 Hz
MSA301_BANDWIDTH_3_9_HZ = 0b0011, // 3.9 Hz
MSA301_BANDWIDTH_7_81_HZ = 0b0100, // 7.81 Hz
MSA301_BANDWIDTH_15_63_HZ = 0b0101, // 15.63 Hz
MSA301_BANDWIDTH_31_25_HZ = 0b0110, // 31.25 Hz
MSA301_BANDWIDTH_62_5_HZ = 0b0111, // 62.5 Hz
MSA301_BANDWIDTH_125_HZ = 0b1000, // 125 Hz
MSA301_BANDWIDTH_250_HZ = 0b1001, // 250 Hz
MSA301_BANDWIDTH_500_HZ = 0b1010, // 500 Hz
MSA301_BANDWIDTH_1_95_HZ = 0b0000, ///< 1.95 Hz
MSA301_BANDWIDTH_3_9_HZ = 0b0011, ///< 3.9 Hz
MSA301_BANDWIDTH_7_81_HZ = 0b0100, ///< 7.81 Hz
MSA301_BANDWIDTH_15_63_HZ = 0b0101, ///< 15.63 Hz
MSA301_BANDWIDTH_31_25_HZ = 0b0110, ///< 31.25 Hz
MSA301_BANDWIDTH_62_5_HZ = 0b0111, ///< 62.5 Hz
MSA301_BANDWIDTH_125_HZ = 0b1000, ///< 125 Hz
MSA301_BANDWIDTH_250_HZ = 0b1001, ///< 250 Hz
MSA301_BANDWIDTH_500_HZ = 0b1010, ///< 500 Hz
} msa301_bandwidth_t;
typedef enum {
MSA301_NORMALMODE = 0b00,
MSA301_LOWPOWERMODE = 0b01,
MSA301_SUSPENDMODE = 0b010,
} msa301_powermode_t;
/** The accelerometer power mode */
typedef enum {
MSA301_NORMALMODE = 0b00, ///< Normal (high speed) mode
MSA301_LOWPOWERMODE = 0b01, ///< Low power (slow speed) mode
MSA301_SUSPENDMODE = 0b010, ///< Suspend (sleep) mode
} msa301_powermode_t;
typedef enum {
MSA301_RESOLUTION_14 = 0b00,
MSA301_RESOLUTION_12 = 0b01,
MSA301_RESOLUTION_10 = 0b10,
MSA301_RESOLUTION_8 = 0b11,
} msa301_resolution_t;
/** The accelerometer read resolution */
typedef enum {
MSA301_RESOLUTION_14 = 0b00, ///< 14-bit resolution
MSA301_RESOLUTION_12 = 0b01, ///< 12-bit resolution
MSA301_RESOLUTION_10 = 0b10, ///< 10-bit resolution
MSA301_RESOLUTION_8 = 0b11, ///< 8-bit resolution
} msa301_resolution_t;
typedef enum {
MSA301_TAPDUR_50_MS = 0b000,
MSA301_TAPDUR_100_MS = 0b001,
MSA301_TAPDUR_150_MS = 0b010,
MSA301_TAPDUR_200_MS = 0b011,
MSA301_TAPDUR_250_MS = 0b100,
MSA301_TAPDUR_375_MS = 0b101,
MSA301_TAPDUR_500_MS = 0b110,
MSA301_TAPDUR_700_MS = 0b111,
} msa301_tapduration_t;
/** Tap duration parameter */
typedef enum {
MSA301_TAPDUR_50_MS = 0b000, ///< 50 millis
MSA301_TAPDUR_100_MS = 0b001, ///< 100 millis
MSA301_TAPDUR_150_MS = 0b010, ///< 150 millis
MSA301_TAPDUR_200_MS = 0b011, ///< 200 millis
MSA301_TAPDUR_250_MS = 0b100, ///< 250 millis
MSA301_TAPDUR_375_MS = 0b101, ///< 375 millis
MSA301_TAPDUR_500_MS = 0b110, ///< 500 millis
MSA301_TAPDUR_700_MS = 0b111, ///< 50 millis700 millis
} msa301_tapduration_t;
typedef enum {
MSA301_INT_ORIENT = 0b100000,
MSA301_INT_SINGLETAP,
MSA301_INT_DOUBLETAP,
MSA301_INT_ACTIVETAP,
MSA301_INT_NEWDATA,
/** Interrupts available */
typedef enum {
MSA301_INT_ORIENT = 0b100000, ///< Orientation change interrupt
MSA301_INT_SINGLETAP, ///< Single tap interrupt
MSA301_INT_DOUBLETAP, ///< Double tap interrupt
MSA301_INT_ACTIVE, ///< Active motion interrupt
MSA301_INT_NEWDATA, ///< New data interrupt
} msa301_interrupt_t;
/** Class for hardware interfacing with an MSA301 accelerometer */
class Adafruit_MSA301 : public Adafruit_Sensor {
public:
Adafruit_MSA301(void);