119 lines
3.5 KiB
C++
119 lines
3.5 KiB
C++
/*! @file Adafruit_ICM20649.cpp
|
|
*/
|
|
#include "Arduino.h"
|
|
#include <Wire.h>
|
|
|
|
#include "Adafruit_ICM20649.h"
|
|
#include "Adafruit_ICM20X.h"
|
|
|
|
/*!
|
|
* @brief Instantiates a new ICM20649 class!
|
|
*/
|
|
Adafruit_ICM20649::Adafruit_ICM20649(void) {}
|
|
|
|
/*!
|
|
* @brief Sets up the hardware and initializes I2C
|
|
* @param i2c_address
|
|
* The I2C address to be used.
|
|
* @param wire
|
|
* The Wire object to be used for I2C connections.
|
|
* @param sensor_id
|
|
* An optional parameter to set the sensor ids to differentiate
|
|
* similar sensors The passed value is assigned to the accelerometer and the
|
|
* gyro get +1 and the temperature sensor +2.
|
|
* @return True if initialization was successful, otherwise false.
|
|
*/
|
|
bool Adafruit_ICM20649::begin_I2C(uint8_t i2c_address, TwoWire *wire,
|
|
int32_t sensor_id) {
|
|
|
|
if (i2c_dev) {
|
|
delete i2c_dev; // remove old interface
|
|
}
|
|
|
|
i2c_dev = new Adafruit_I2CDevice(i2c_address, wire);
|
|
|
|
if (!i2c_dev->begin()) {
|
|
Serial.println("I2C begin Failed");
|
|
return false;
|
|
}
|
|
|
|
return _init(sensor_id);
|
|
}
|
|
|
|
void Adafruit_ICM20649::scaleValues(void) {
|
|
|
|
icm20649_gyro_range_t gyro_range = (icm20649_gyro_range_t)current_gyro_range;
|
|
icm20649_accel_range_t accel_range =
|
|
(icm20649_accel_range_t)current_accel_range;
|
|
float accel_scale = 1.0;
|
|
float gyro_scale = 1.0;
|
|
|
|
if (gyro_range == ICM20649_GYRO_RANGE_500_DPS)
|
|
gyro_scale = 65.5;
|
|
if (gyro_range == ICM20649_GYRO_RANGE_1000_DPS)
|
|
gyro_scale = 32.8;
|
|
if (gyro_range == ICM20649_GYRO_RANGE_2000_DPS)
|
|
gyro_scale = 16.4;
|
|
if (gyro_range == ICM20649_GYRO_RANGE_4000_DPS)
|
|
gyro_scale = 8.2;
|
|
|
|
if (accel_range == ICM20649_ACCEL_RANGE_4_G)
|
|
accel_scale = 8192.0;
|
|
if (accel_range == ICM20649_ACCEL_RANGE_8_G)
|
|
accel_scale = 4096.0;
|
|
if (accel_range == ICM20649_ACCEL_RANGE_16_G)
|
|
accel_scale = 2048.0;
|
|
if (accel_range == ICM20649_ACCEL_RANGE_30_G)
|
|
accel_scale = 1024.0;
|
|
|
|
gyroX = rawGyroX / gyro_scale;
|
|
gyroY = rawGyroY / gyro_scale;
|
|
gyroZ = rawGyroZ / gyro_scale;
|
|
|
|
accX = rawAccX / accel_scale;
|
|
accY = rawAccY / accel_scale;
|
|
accZ = rawAccZ / accel_scale;
|
|
}
|
|
|
|
/**************************************************************************/
|
|
/*!
|
|
@brief Get the accelerometer's measurement range.
|
|
@returns The accelerometer's measurement range (`icm20649_accel_range_t`).
|
|
*/
|
|
icm20649_accel_range_t Adafruit_ICM20649::getAccelRange(void) {
|
|
return (icm20649_accel_range_t)readAccelRange();
|
|
}
|
|
|
|
/**************************************************************************/
|
|
/*!
|
|
|
|
@brief Sets the accelerometer's measurement range.
|
|
@param new_accel_range
|
|
Measurement range to be set. Must be an
|
|
`icm20649_accel_range_t`.
|
|
*/
|
|
void Adafruit_ICM20649::setAccelRange(icm20649_accel_range_t new_accel_range) {
|
|
writeAccelRange((uint8_t)new_accel_range);
|
|
}
|
|
|
|
/**************************************************************************/
|
|
/*!
|
|
@brief Get the gyro's measurement range.
|
|
@returns The gyro's measurement range (`icm20649_gyro_range_t`).
|
|
*/
|
|
icm20649_gyro_range_t Adafruit_ICM20649::getGyroRange(void) {
|
|
return (icm20649_gyro_range_t)readGyroRange();
|
|
}
|
|
|
|
/**************************************************************************/
|
|
/*!
|
|
|
|
@brief Sets the gyro's measurement range.
|
|
@param new_gyro_range
|
|
Measurement range to be set. Must be an
|
|
`icm20649_gyro_range_t`.
|
|
*/
|
|
void Adafruit_ICM20649::setGyroRange(icm20649_gyro_range_t new_gyro_range) {
|
|
writeGyroRange((uint8_t)new_gyro_range);
|
|
}
|