Files
Arduino/libraries/Adafruit_ADXL343/Adafruit_ADXL343.h
Jérôme Delacotte 7b30d6e298 first commit
2025-03-06 11:15:32 +01:00

205 lines
8.7 KiB
C++

/**************************************************************************/
/*!
@file Adafruit_ADXL343.h
@author Bryan Siepert and K. Townsend (Adafruit Industries)
BSD license (see license.txt)
This is a library for the Adafruit ADS1015 breakout board
----> https://www.adafruit.com/products/???
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
v1.0 - First release
*/
/**************************************************************************/
#ifndef _ADAFRUIT_SENSOR_ADXL343_H
#define _ADAFRUIT_SENSOR_ADXL343_H
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include <Adafruit_BusIO_Register.h>
#include <Adafruit_I2CDevice.h>
#include <Adafruit_SPIDevice.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
/*=========================================================================
I2C ADDRESS/BITS
-----------------------------------------------------------------------*/
#define ADXL343_ADDRESS (0x53) /**< Assumes ALT address pin low */
/*=========================================================================*/
/*=========================================================================
REGISTERS
-----------------------------------------------------------------------*/
#define ADXL3XX_REG_DEVID (0x00) /**< Device ID */
#define ADXL3XX_REG_THRESH_TAP (0x1D) /**< Tap threshold */
#define ADXL3XX_REG_OFSX (0x1E) /**< X-axis offset */
#define ADXL3XX_REG_OFSY (0x1F) /**< Y-axis offset */
#define ADXL3XX_REG_OFSZ (0x20) /**< Z-axis offset */
#define ADXL3XX_REG_DUR (0x21) /**< Tap duration */
#define ADXL3XX_REG_LATENT (0x22) /**< Tap latency */
#define ADXL3XX_REG_WINDOW (0x23) /**< Tap window */
#define ADXL3XX_REG_THRESH_ACT (0x24) /**< Activity threshold */
#define ADXL3XX_REG_THRESH_INACT (0x25) /**< Inactivity threshold */
#define ADXL3XX_REG_TIME_INACT (0x26) /**< Inactivity time */
#define ADXL3XX_REG_ACT_INACT_CTL \
(0x27) /**< Axis enable control for activity and inactivity detection */
#define ADXL3XX_REG_THRESH_FF (0x28) /**< Free-fall threshold */
#define ADXL3XX_REG_TIME_FF (0x29) /**< Free-fall time */
#define ADXL3XX_REG_TAP_AXES (0x2A) /**< Axis control for single/double tap */
#define ADXL3XX_REG_ACT_TAP_STATUS (0x2B) /**< Source for single/double tap */
#define ADXL3XX_REG_BW_RATE (0x2C) /**< Data rate and power mode control */
#define ADXL3XX_REG_POWER_CTL (0x2D) /**< Power-saving features control */
#define ADXL3XX_REG_INT_ENABLE (0x2E) /**< Interrupt enable control */
#define ADXL3XX_REG_INT_MAP (0x2F) /**< Interrupt mapping control */
#define ADXL3XX_REG_INT_SOURCE (0x30) /**< Source of interrupts */
#define ADXL3XX_REG_DATA_FORMAT (0x31) /**< Data format control */
#define ADXL3XX_REG_DATAX0 (0x32) /**< X-axis data 0 */
#define ADXL3XX_REG_DATAX1 (0x33) /**< X-axis data 1 */
#define ADXL3XX_REG_DATAY0 (0x34) /**< Y-axis data 0 */
#define ADXL3XX_REG_DATAY1 (0x35) /**< Y-axis data 1 */
#define ADXL3XX_REG_DATAZ0 (0x36) /**< Z-axis data 0 */
#define ADXL3XX_REG_DATAZ1 (0x37) /**< Z-axis data 1 */
#define ADXL3XX_REG_FIFO_CTL (0x38) /**< FIFO control */
#define ADXL3XX_REG_FIFO_STATUS (0x39) /**< FIFO status */
/*=========================================================================*/
/*=========================================================================
REGISTERS
-----------------------------------------------------------------------*/
#define ADXL343_MG2G_MULTIPLIER (0.004) /**< 4mg per lsb */
/*=========================================================================*/
/** Used with register 0x2C (ADXL3XX_REG_BW_RATE) to set bandwidth */
typedef enum {
ADXL343_DATARATE_3200_HZ = 0b1111, /**< 3200Hz Bandwidth */
ADXL343_DATARATE_1600_HZ = 0b1110, /**< 1600Hz Bandwidth */
ADXL343_DATARATE_800_HZ = 0b1101, /**< 800Hz Bandwidth */
ADXL343_DATARATE_400_HZ = 0b1100, /**< 400Hz Bandwidth */
ADXL343_DATARATE_200_HZ = 0b1011, /**< 200Hz Bandwidth */
ADXL343_DATARATE_100_HZ = 0b1010, /**< 100Hz Bandwidth */
ADXL343_DATARATE_50_HZ = 0b1001, /**< 50Hz Bandwidth */
ADXL343_DATARATE_25_HZ = 0b1000, /**< 25Hz Bandwidth */
ADXL343_DATARATE_12_5_HZ = 0b0111, /**< 12.5Hz Bandwidth */
ADXL343_DATARATE_6_25HZ = 0b0110, /**< 6.25Hz Bandwidth */
ADXL343_DATARATE_3_13_HZ = 0b0101, /**< 3.13Hz Bandwidth */
ADXL343_DATARATE_1_56_HZ = 0b0100, /**< 1.56Hz Bandwidth */
ADXL343_DATARATE_0_78_HZ = 0b0011, /**< 0.78Hz Bandwidth */
ADXL343_DATARATE_0_39_HZ = 0b0010, /**< 0.39Hz Bandwidth */
ADXL343_DATARATE_0_20_HZ = 0b0001, /**< 0.20Hz Bandwidth */
ADXL343_DATARATE_0_10_HZ = 0b0000, /**< 0.10Hz Bandwidth (default value) */
ADXL3XX_DATARATE_3200_HZ = 0b1111, /**< 3200Hz Bandwidth */
ADXL3XX_DATARATE_1600_HZ = 0b1110, /**< 1600Hz Bandwidth */
ADXL3XX_DATARATE_800_HZ = 0b1101, /**< 800Hz Bandwidth */
ADXL3XX_DATARATE_400_HZ = 0b1100, /**< 400Hz Bandwidth */
ADXL3XX_DATARATE_200_HZ = 0b1011, /**< 200Hz Bandwidth */
ADXL3XX_DATARATE_100_HZ = 0b1010, /**< 100Hz Bandwidth */
ADXL3XX_DATARATE_50_HZ = 0b1001, /**< 50Hz Bandwidth */
ADXL3XX_DATARATE_25_HZ = 0b1000, /**< 25Hz Bandwidth */
ADXL3XX_DATARATE_12_5_HZ = 0b0111, /**< 12.5Hz Bandwidth */
ADXL3XX_DATARATE_6_25HZ = 0b0110, /**< 6.25Hz Bandwidth */
ADXL3XX_DATARATE_3_13_HZ = 0b0101, /**< 3.13Hz Bandwidth */
ADXL3XX_DATARATE_1_56_HZ = 0b0100, /**< 1.56Hz Bandwidth */
ADXL3XX_DATARATE_0_78_HZ = 0b0011, /**< 0.78Hz Bandwidth */
ADXL3XX_DATARATE_0_39_HZ = 0b0010, /**< 0.39Hz Bandwidth */
ADXL3XX_DATARATE_0_20_HZ = 0b0001, /**< 0.20Hz Bandwidth */
ADXL3XX_DATARATE_0_10_HZ = 0b0000 /**< 0.10Hz Bandwidth (default value) */
} adxl3xx_dataRate_t;
/** Used with register 0x31 (ADXL3XX_REG_DATA_FORMAT) to set g range */
typedef enum {
ADXL343_RANGE_16_G = 0b11, /**< +/- 16g */
ADXL343_RANGE_8_G = 0b10, /**< +/- 8g */
ADXL343_RANGE_4_G = 0b01, /**< +/- 4g */
ADXL343_RANGE_2_G = 0b00, /**< +/- 2g (default value) */
ADXL34X_RANGE_16_G = 0b11, /**< +/- 16g */
ADXL34X_RANGE_8_G = 0b10, /**< +/- 8g */
ADXL34X_RANGE_4_G = 0b01, /**< +/- 4g */
ADXL34X_RANGE_2_G = 0b00 /**< +/- 2g (default value) */
} adxl34x_range_t;
/** Possible interrupts sources on the ADXL343. */
union int_config {
uint8_t value; /**< Composite 8-bit value of the bitfield.*/
struct {
uint8_t overrun : 1; /**< Bit 0 */
uint8_t watermark : 1; /**< Bit 1 */
uint8_t freefall : 1; /**< Bit 2 */
uint8_t inactivity : 1; /**< Bit 3 */
uint8_t activity : 1; /**< Bit 4 */
uint8_t double_tap : 1; /**< Bit 5 */
uint8_t single_tap : 1; /**< Bit 6 */
uint8_t data_ready : 1; /**< Bit 7 */
} bits; /**< Individual bits in the bitfield. */
};
/** Possible interrupt pin outputs on the ADXL343. */
typedef enum {
ADXL343_INT1 = 0,
ADXL343_INT2 = 1,
ADXL3XX_INT1 = 0,
ADXL3XX_INT2 = 1,
} adxl3xx_int_pin;
/**
* Driver for the Adafruit ADXL343 breakout.
*/
class Adafruit_ADXL343 : public Adafruit_Sensor {
public:
Adafruit_ADXL343(int32_t sensorID);
Adafruit_ADXL343(int32_t sensorID, TwoWire *wireBus);
Adafruit_ADXL343(uint8_t clock, uint8_t miso, uint8_t mosi, uint8_t cs,
int32_t sensorID = -1);
Adafruit_ADXL343(uint8_t cs, SPIClass *theSPI, int32_t sensorID = -1);
bool begin(uint8_t i2caddr = ADXL343_ADDRESS);
void setRange(adxl34x_range_t range);
adxl34x_range_t getRange(void);
void setDataRate(adxl3xx_dataRate_t dataRate);
adxl3xx_dataRate_t getDataRate(void);
bool getEvent(sensors_event_t *);
void getSensor(sensor_t *);
uint8_t getDeviceID(void);
void writeRegister(uint8_t reg, uint8_t value);
uint8_t readRegister(uint8_t reg);
int16_t read16(uint8_t reg);
bool enableInterrupts(int_config cfg);
bool mapInterrupts(int_config cfg);
uint8_t checkInterrupts(void);
void getTrimOffsets(int8_t *x, int8_t *y, int8_t *z);
void setTrimOffsets(int8_t x, int8_t y, int8_t z);
int16_t getX(void);
int16_t getY(void);
int16_t getZ(void);
bool getXYZ(int16_t &x, int16_t &y, int16_t &z);
protected:
Adafruit_SPIDevice *spi_dev = NULL; ///< BusIO SPI device
Adafruit_I2CDevice *i2c_dev = NULL; ///< BusIO I2C device
TwoWire *_wire = NULL; ///< I2C hardware interface
SPIClass *_spi = NULL; ///< SPI hardware interface
int32_t _sensorID; ///< User-set sensor identifier
adxl34x_range_t _range; ///< cache of range
uint8_t _clk, ///< SPI software clock
_do, ///< SPI software data out
_di, ///< SPI software data in
_cs; ///< SPI software chip select
};
#endif