185 lines
7.1 KiB
C++
185 lines
7.1 KiB
C++
/*!
|
|
* @file Adafruit_MSA301.h
|
|
*/
|
|
|
|
#ifndef ADAFRUIT_MSA301_H
|
|
#define ADAFRUIT_MSA301_H
|
|
|
|
#include <Adafruit_BusIO_Register.h>
|
|
#include <Adafruit_I2CDevice.h>
|
|
#include <Adafruit_Sensor.h>
|
|
#include <Wire.h>
|
|
|
|
/*=========================================================================
|
|
I2C ADDRESS/BITS
|
|
-----------------------------------------------------------------------*/
|
|
#define MSA301_I2CADDR_DEFAULT (0x26) ///< Fixed I2C address
|
|
#define MSA311_I2CADDR_DEFAULT (0x62) ///< Fixed I2C address
|
|
/*=========================================================================*/
|
|
|
|
#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_t;
|
|
|
|
/** The accelerometer axes */
|
|
typedef enum {
|
|
MSA301_AXIS_X = 0x0, ///< X axis bit
|
|
MSA301_AXIS_Y = 0x1, ///< Y axis bit
|
|
MSA301_AXIS_Z = 0x2, ///< Z axis bit
|
|
} msa301_axis_t;
|
|
|
|
/** 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_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_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;
|
|
|
|
/** 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;
|
|
|
|
/** 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;
|
|
|
|
/** 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);
|
|
bool begin(uint8_t i2c_addr = MSA301_I2CADDR_DEFAULT, TwoWire *wire = &Wire);
|
|
|
|
void setDataRate(msa301_dataRate_t dataRate);
|
|
msa301_dataRate_t getDataRate(void);
|
|
void enableAxes(bool x, bool y, bool z);
|
|
|
|
void setPowerMode(msa301_powermode_t mode);
|
|
msa301_powermode_t getPowerMode(void);
|
|
void setBandwidth(msa301_bandwidth_t bandwidth);
|
|
msa301_bandwidth_t getBandwidth(void);
|
|
void setRange(msa301_range_t range);
|
|
msa301_range_t getRange(void);
|
|
void setResolution(msa301_resolution_t resolution);
|
|
msa301_resolution_t getResolution(void);
|
|
|
|
void read();
|
|
bool getEvent(sensors_event_t *event);
|
|
void getSensor(sensor_t *sensor);
|
|
|
|
void enableInterrupts(bool singletap = false, bool doubletap = false,
|
|
bool activeX = false, bool activeY = false,
|
|
bool activeZ = false, bool newData = false,
|
|
bool freefall = false, bool orient = false);
|
|
void mapInterruptPin(bool singletap = false, bool doubletap = false,
|
|
bool activity = false, bool newData = false,
|
|
bool freefall = false, bool orient = false);
|
|
|
|
uint8_t getClick(void);
|
|
uint8_t getMotionInterruptStatus(void);
|
|
uint8_t getDataInterruptStatus(void);
|
|
|
|
void setClick(bool tap_quiet, bool tap_shock,
|
|
msa301_tapduration_t tapduration, uint8_t tapthresh);
|
|
|
|
/*
|
|
|
|
uint8_t getOrientation(void);
|
|
|
|
*/
|
|
|
|
int16_t x, ///< The last read X acceleration in raw units
|
|
y, ///< The last read Y acceleration in raw units
|
|
z; ///< The last read Z acceleration in raw units
|
|
float x_g, ///< The last read X acceleration in 'g'
|
|
y_g, ///< The last read Y acceleration in 'g'
|
|
z_g; ///< The last read X acceleration in 'g'
|
|
|
|
private:
|
|
Adafruit_I2CDevice *i2c_dev;
|
|
|
|
int32_t _sensorID;
|
|
};
|
|
|
|
|
|
/** Class for hardware interfacing with an MSA311 accelerometer */
|
|
class Adafruit_MSA311 : public Adafruit_MSA301 {
|
|
public:
|
|
Adafruit_MSA311(void);
|
|
bool begin(uint8_t i2c_addr = MSA311_I2CADDR_DEFAULT, TwoWire *wire = &Wire);
|
|
};
|
|
|
|
#endif
|