初始化提交

This commit is contained in:
王立帮
2024-07-20 22:09:06 +08:00
commit c247dd07a6
6876 changed files with 2743096 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
language: c
before_install:
- "/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16"
- sleep 3
- export DISPLAY=:1.0
- wget http://downloads.arduino.cc/arduino-1.8.8-linux64.tar.xz
- tar xf arduino-1.8.8-linux64.tar.xz
- sudo mv arduino-1.8.8 /usr/local/share/arduino
- sudo ln -s /usr/local/share/arduino/arduino /usr/local/bin/arduino
install:
- ln -s $PWD /usr/local/share/arduino/libraries/MPU9250_asukiaaa
script:
- arduino --verify --board arduino:avr:uno $PWD/examples/GetData/GetData.ino
- arduino --verify --board arduino:avr:uno $PWD/examples/GetMagOffset/GetMagOffset.ino
notifications:
email:
on_success: change
on_failure: change

View File

@@ -0,0 +1,20 @@
The MIT License (MIT)
Copyright (c) <YEAR> <OWNER>
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -0,0 +1,165 @@
# MPU9250_asukiaaa [![Build Status](https://travis-ci.org/asukiaaa/MPU9250_asukiaaa.svg?branch=master)](https://travis-ci.org/asukiaaa/MPU9250_asukiaaa)
A library to read values from MPU9250.
# Installation
You can install to Arduino IDE with using library manager.
1. Select [Sketch -> Include Library -> Manage Libraries] to open library manager.
2. Search MPU9250 in library manager.
3. Select and install this project.
# Connection
For uno, nano and so on.
| Arduino | MPU9250 |
|---------|---------|
| 3.3 | VCC |
| A4(SDA) | SDA |
| A5(SCL) | SCL |
| GND | GND |
For other boards, please check [i2c pin assign](https://www.arduino.cc/en/Reference/Wire).
# Usage
You can see all function on [example project](https://github.com/asukiaaa/MPU9250_asukiaaa/blob/master/examples/GetData/GetData.ino).
## Accelerometer
```c
#include <MPU9250_asukiaaa.h>
MPU9250_asukiaaa mySensor;
float aX, aY, aZ, aSqrt;
void setup() {
Wire.begin();
mySensor.setWire(&Wire);
mySensor.beginAccel();
}
void loop() {
mySensor.accelUpdate();
aX = mySensor.accelX();
aY = mySensor.accelY();
aZ = mySensor.accelZ();
aSqrt = mySensor.accelSqrt();
// Do what you want
}
```
## Gyrometer
```c
#include <MPU9250_asukiaaa.h>
MPU9250_asukiaaa mySensor;
float gX, gY, gZ;
void setup() {
Wire.begin();
mySensor.setWire(&Wire);
mySensor.beginGyro();
}
void loop() {
mySensor.gyroUpdate();
gX = mySensor.gyroX();
gY = mySensor.gyroY();
gZ = mySensor.gyroZ();
// Do what you want
}
```
## Magnetometer
```c
#include <MPU9250_asukiaaa.h>
MPU9250_asukiaaa mySensor;
float mDirection;
uint16_t mX, mY, mZ;
void setup() {
Wire.begin();
mySensor.setWire(&Wire);
mySensor.beginMag();
}
void loop() {
Serial.begin(115200);
mySensor.magUpdate();
mX = mySensor.magX();
mY = mySensor.magY();
mZ = mySensor.magZ();
mDirection = mySensor.magHorizDirection();
// Do what you want
}
```
If you get values of sensor like this..
Name | Max | Min
-----|----:|----:
magX | 70 | -30
maxY | 110 | 10
You can calcurate offset values like this.
```
maxXOffset = - (magXMax + magXMin) / 2
= - (70 - 30) / 2
= - 40 / 2
= -20
```
```
magYOffset = - (magYMax + magYMin) / 2
= - (110 + 10) / 2
= - 120 / 2
= -60
```
Then set the offset values like this.
```c
void setup() {
mySensor.magXOffset = -20;
mySensor.magYOffset = -60;
}
```
Then you can get like this.
Name | Max | Min
-----|----:|----:
magX | 50 | -50
maxY | 50 | -50
After setting offset value, you can get `magHorizDirection` as you expected.
Warning: Offset value changes by temperature or some reason. If you want to get high accuracy value, you should recheck the offset value.
Example about auto calibration (calculating offset values) is [here](https://github.com/asukiaaa/MPU9250_asukiaaa/blob/master/examples/GetMagOffset/GetMagOffset.ino).
## With customizable Wire
For ESP32 and so on.
```c
#define SDA_PIN 21
#define SCL_PIN 22
void setup() {
Wire.begin(SDA_PIN, SCL_PIN);
mySensor.setWire(&Wire);
}
```
# License
MIT
# References
- [ArduinoでMPU9250加速度センサ、磁気センサを使う方法](http://asukiaaa.blogspot.jp/2017/07/arduinompu9250.html)
- [MPU-9250 | TDK](https://www.invensense.com/products/motion-tracking/9-axis/mpu-9250/)
- [MPU-9250Product SpecificationRevision 1.1](http://www.invensense.com/wp-content/uploads/2015/02/PS-MPU-9250A-01-v1.1.pdf)
- [MPU-9250Register Map and DescriptionsRevision 1.6](http://www.invensense.com/wp-content/uploads/2017/11/RM-MPU-9250A-00-v1.6.pdf)
- [HaLakeKit-Library](https://github.com/nyampass/HaLakeKit-Library)
- [Aliexpress MPU9250](https://www.aliexpress.com/wholesale?catId=0&initiative_id=AS_20170706234529&SearchText=MPU9250)
- [AK8963 datasheet](https://www.akm.com/akm/en/file/datasheet/AK8963C.pdf)
- [jrowberg/i2cdevlib/Arduino/AK8963](https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/AK8963)
- [SparkFun_MPU-9250](https://github.com/sparkfun/SparkFun_MPU-9250_Breakout_Arduino_Library/blob/master/src/MPU9250.cpp)
- [「MPU-9250 9軸センサモジュール (メーカー品番MPU-9250)」を使う](https://qiita.com/boyaki_machine/items/915f7730c737f2a5cc79)
- [【PSoC】MPU-9250のデータを取得加速度、ジャイロ編](http://amamitokachi.com/2017/04/12/post-71/)

View File

@@ -0,0 +1,79 @@
#include <MPU9250_asukiaaa.h>
#ifdef _ESP32_HAL_I2C_H_
#define SDA_PIN 21
#define SCL_PIN 22
#endif
MPU9250_asukiaaa mySensor;
float aX, aY, aZ, aSqrt, gX, gY, gZ, mDirection, mX, mY, mZ;
void setup() {
Serial.begin(115200);
while(!Serial);
Serial.println("started");
#ifdef _ESP32_HAL_I2C_H_ // For ESP32
Wire.begin(SDA_PIN, SCL_PIN);
mySensor.setWire(&Wire);
#endif
mySensor.beginAccel();
mySensor.beginGyro();
mySensor.beginMag();
// You can set your own offset for mag values
// mySensor.magXOffset = -50;
// mySensor.magYOffset = -55;
// mySensor.magZOffset = -10;
}
void loop() {
uint8_t sensorId;
if (mySensor.readId(&sensorId) == 0) {
Serial.println("sensorId: " + String(sensorId));
} else {
Serial.println("Cannot read sensorId");
}
if (mySensor.accelUpdate() == 0) {
aX = mySensor.accelX();
aY = mySensor.accelY();
aZ = mySensor.accelZ();
aSqrt = mySensor.accelSqrt();
Serial.println("accelX: " + String(aX));
Serial.println("accelY: " + String(aY));
Serial.println("accelZ: " + String(aZ));
Serial.println("accelSqrt: " + String(aSqrt));
} else {
Serial.println("Cannod read accel values");
}
if (mySensor.gyroUpdate() == 0) {
gX = mySensor.gyroX();
gY = mySensor.gyroY();
gZ = mySensor.gyroZ();
Serial.println("gyroX: " + String(gX));
Serial.println("gyroY: " + String(gY));
Serial.println("gyroZ: " + String(gZ));
} else {
Serial.println("Cannot read gyro values");
}
if (mySensor.magUpdate() == 0) {
mX = mySensor.magX();
mY = mySensor.magY();
mZ = mySensor.magZ();
mDirection = mySensor.magHorizDirection();
Serial.println("magX: " + String(mX));
Serial.println("maxY: " + String(mY));
Serial.println("magZ: " + String(mZ));
Serial.println("horizontal direction: " + String(mDirection));
} else {
Serial.println("Cannot read mag values");
}
Serial.println("at " + String(millis()) + "ms");
Serial.println(""); // Add an empty line
delay(500);
}

View File

@@ -0,0 +1,88 @@
#include <MPU9250_asukiaaa.h>
#ifdef _ESP32_HAL_I2C_H_
#define SDA_PIN 21
#define SCL_PIN 22
#endif
#define CALIB_SEC 20
MPU9250_asukiaaa mySensor;
uint8_t sensorId;
float mDirection, mX, mY, mZ;
void setup() {
Serial.begin(115200);
while(!Serial);
Serial.println("started");
#ifdef _ESP32_HAL_I2C_H_ // For ESP32
Wire.begin(SDA_PIN, SCL_PIN); // SDA, SCL
#else
Wire.begin();
#endif
mySensor.setWire(&Wire);
while (mySensor.readId(&sensorId) != 0) {
Serial.println("Cannot find device to read sensorId");
delay(2000);
}
mySensor.beginMag();
float magXMin, magXMax, magYMin, magYMax, magZ, magZMin, magZMax;
Serial.println("Start scanning values of magnetometer to get offset values.");
Serial.println("Rotate your device for " + String(CALIB_SEC) + " seconds.");
setMagMinMaxAndSetOffset(&mySensor, CALIB_SEC);
Serial.println("Finished setting offset values.");
}
void setMagMinMaxAndSetOffset(MPU9250_asukiaaa* sensor, int seconds) {
unsigned long calibStartAt = millis();
float magX, magXMin, magXMax, magY, magYMin, magYMax, magZ, magZMin, magZMax;
sensor->magUpdate();
magXMin = magXMax = sensor->magX();
magYMin = magYMax = sensor->magY();
magZMin = magZMax = sensor->magZ();
while(millis() - calibStartAt < (unsigned long) seconds * 1000) {
delay(100);
sensor->magUpdate();
magX = sensor->magX();
magY = sensor->magY();
magZ = sensor->magZ();
if (magX > magXMax) magXMax = magX;
if (magY > magYMax) magYMax = magY;
if (magZ > magZMax) magZMax = magZ;
if (magX < magXMin) magXMin = magX;
if (magY < magYMin) magYMin = magY;
if (magZ < magZMin) magZMin = magZ;
}
sensor->magXOffset = - (magXMax + magXMin) / 2;
sensor->magYOffset = - (magYMax + magYMin) / 2;
sensor->magZOffset = - (magZMax + magZMin) / 2;
}
void loop() {
Serial.println("sensorId: " + String(sensorId));
mySensor.magUpdate();
mX = mySensor.magX();
mY = mySensor.magY();
mZ = mySensor.magZ();
mDirection = mySensor.magHorizDirection();
Serial.println("mySensor.magXOffset = " + String(mySensor.magXOffset) + ";");
Serial.println("mySensor.maxYOffset = " + String(mySensor.magYOffset) + ";");
Serial.println("mySensor.magZOffset = " + String(mySensor.magZOffset) + ";");
Serial.println("magX: " + String(mX));
Serial.println("maxY: " + String(mY));
Serial.println("magZ: " + String(mZ));
Serial.println("horizontal direction: " + String(mDirection));
Serial.println("at " + String(millis()) + "ms");
Serial.println(""); // Add an empty line
delay(500);
}

View File

@@ -0,0 +1,58 @@
#######################################
# Syntax Coloring Map
#######################################
#######################################
# Datatypes (KEYWORD1)
#######################################
MPU9250_asukiaaa KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
setWire KEYWORD2
readId KEYWORD2
beginAccel KEYWORD2
accelUpdate KEYWORD2
accelX KEYWORD2
accelY KEYWORD2
accelZ KEYWORD2
accelSqrt KEYWORD2
beginGyro KEYWORD2
gyroUpdate KEYWORD2
gyroX KEYWORD2
gyroY KEYWORD2
gyroZ KEYWORD2
beginMag KEYWORD2
magSetMode KEYWORD2
magUpdate KEYWORD2
magX KEYWORD2
magY KEYWORD2
magZ KEYWORD2
magHorizDirection KEYWORD2
#######################################
# Constants (LITERAL1)
#######################################
MPU9250_ADDRESS_AD0_LOW KEYWORD3
MPU9250_ADDRESS_AD0_HIGH KEYWORD3
ACC_FULL_SCALE_2_G KEYWORD3
ACC_FULL_SCALE_4_G KEYWORD3
ACC_FULL_SCALE_8_G KEYWORD3
ACC_FULL_SCALE_16_G KEYWORD3
GYRO_FULL_SCALE_250_DPS KEYWORD3
GYRO_FULL_SCALE_500_DPS KEYWORD3
GYRO_FULL_SCALE_1000_DPS KEYWORD3
GYRO_FULL_SCALE_2000_DPS KEYWORD3
MAG_MODE_POWERDOWN KEYWORD3
MAG_MODE_SINGLE KEYWORD3
MAG_MODE_CONTINUOUS_8HZ KEYWORD3
MAG_MODE_EXTERNAL KEYWORD3
MAG_MODE_CONTINUOUS_100HZ KEYWORD3
MAG_MODE_SELFTEST KEYWORD3
MAG_MODE_FUSEROM KEYWORD3

View File

@@ -0,0 +1,9 @@
name=MPU9250_asukiaaa
version=1.5.11
author=Asuki Kono
maintainer=Asuki Kono
sentence=It manages MPU9250
paragraph=It can get sensor values about accelerometer, gyrometer and magnetometer.
category=Sensors
url=https://github.com/asukiaaa/MPU9250_asukiaaa
architectures=*

View File

@@ -0,0 +1,230 @@
#include "MPU9250_asukiaaa.h"
#include <math.h>
#define AK8963_ADDRESS 0x0C
#define AK8963_RA_HXL 0x03
#define AK8963_RA_CNTL1 0x0A
#define AK8963_RA_ASAX 0x10
#define MPU9250_ADDR_ACCELCONFIG 0x1C
#define MPU9250_ADDR_INT_PIN_CFG 0x37
#define MPU9250_ADDR_ACCEL_XOUT_H 0x3B
#define MPU9250_ADDR_GYRO_XOUT_H 0x43
#define MPU9250_ADDR_PWR_MGMT_1 0x6B
#define MPU9250_ADDR_WHOAMI 0x75
uint8_t MPU9250_asukiaaa::i2cRead(uint8_t Address, uint8_t Register, uint8_t Nbytes, uint8_t* Data) {
myWire->beginTransmission(Address);
myWire->write(Register);
uint8_t result = myWire->endTransmission();
if (result != 0) {
return result;
}
myWire->requestFrom(Address, Nbytes);
uint8_t index = 0;
while (myWire->available()) {
uint8_t d = myWire->read();
if (index < Nbytes) {
Data[index++] = d;
}
}
return 0;
}
uint8_t MPU9250_asukiaaa::i2cWriteByte(uint8_t Address, uint8_t Register, uint8_t Data) {
myWire->beginTransmission(Address);
myWire->write(Register);
myWire->write(Data);
return myWire->endTransmission();
}
MPU9250_asukiaaa::MPU9250_asukiaaa(uint8_t address):
address(address) {
accelRange = 0;
gyroRange = 0;
magXOffset = 0;
magYOffset = 0;
magZOffset = 0;
myWire = NULL;
}
void MPU9250_asukiaaa::setWire(TwoWire* wire) {
myWire = wire;
}
uint8_t MPU9250_asukiaaa::readId(uint8_t *id) {
beginWireIfNull();
return i2cRead(address, MPU9250_ADDR_WHOAMI, 1, id);
}
void MPU9250_asukiaaa::beginWireIfNull() {
if (myWire == NULL) {
myWire = &Wire;
myWire->begin();
}
}
void MPU9250_asukiaaa::beginAccel(uint8_t mode) {
beginWireIfNull();
switch(mode) {
case ACC_FULL_SCALE_2_G:
accelRange = 2.0;
break;
case ACC_FULL_SCALE_4_G:
accelRange = 4.0;
break;
case ACC_FULL_SCALE_8_G:
accelRange = 8.0;
break;
case ACC_FULL_SCALE_16_G:
accelRange = 16.0;
break;
default:
return; // Return without writing invalid mode
}
i2cWriteByte(address, MPU9250_ADDR_ACCELCONFIG, mode);
delay(10);
}
void MPU9250_asukiaaa::magReadAdjustValues() {
magSetMode(MAG_MODE_POWERDOWN);
magSetMode(MAG_MODE_FUSEROM);
uint8_t buff[3];
i2cRead(AK8963_ADDRESS, AK8963_RA_ASAX, 3, buff);
magXAdjust = buff[0];
magYAdjust = buff[1];
magZAdjust = buff[2];
}
void MPU9250_asukiaaa::beginMag(uint8_t mode) {
beginWireIfNull();
magWakeup();
magEnableSlaveMode();
magReadAdjustValues();
magSetMode(MAG_MODE_POWERDOWN);
magSetMode(mode);
delay(10);
}
void MPU9250_asukiaaa::magSetMode(uint8_t mode) {
i2cWriteByte(AK8963_ADDRESS, AK8963_RA_CNTL1, mode);
delay(10);
}
void MPU9250_asukiaaa::magWakeup() {
unsigned char bits;
i2cRead(address, MPU9250_ADDR_PWR_MGMT_1, 1, &bits);
bits &= ~B01110000; // Turn off SLEEP, STANDBY, CYCLE
i2cWriteByte(address, MPU9250_ADDR_PWR_MGMT_1, bits);
delay(10);
}
void MPU9250_asukiaaa::magEnableSlaveMode() {
unsigned char bits;
i2cRead(address, MPU9250_ADDR_INT_PIN_CFG, 1, &bits);
bits |= B00000010; // Activate BYPASS_EN
i2cWriteByte(address, MPU9250_ADDR_INT_PIN_CFG, bits);
delay(10);
}
const float Pi = 3.14159;
float MPU9250_asukiaaa::magHorizDirection() {
return atan2(magX(), magY()) * 180 / Pi;
}
uint8_t MPU9250_asukiaaa::magUpdate() {
return i2cRead(AK8963_ADDRESS, AK8963_RA_HXL, 7, magBuff);
}
int16_t MPU9250_asukiaaa::magGet(uint8_t highIndex, uint8_t lowIndex) {
return (((int16_t) magBuff[highIndex]) << 8) | magBuff[lowIndex];
}
float adjustMagValue(int16_t value, uint8_t adjust) {
return ((float) value * (((((float) adjust - 128) * 0.5) / 128) + 1));
}
float MPU9250_asukiaaa::magX() {
return adjustMagValue(magGet(1, 0), magXAdjust) + magXOffset;
}
float MPU9250_asukiaaa::magY() {
return adjustMagValue(magGet(3, 2), magYAdjust) + magYOffset;
}
float MPU9250_asukiaaa::magZ() {
return adjustMagValue(magGet(5, 4), magZAdjust) + magZOffset;
}
uint8_t MPU9250_asukiaaa::accelUpdate() {
return i2cRead(address, MPU9250_ADDR_ACCEL_XOUT_H, 6, accelBuff);
}
float MPU9250_asukiaaa::accelGet(uint8_t highIndex, uint8_t lowIndex) {
int16_t v = ((int16_t) accelBuff[highIndex]) << 8 | accelBuff[lowIndex];
return ((float) -v) * accelRange / (float) 0x8000; // (float) 0x8000 == 32768.0
}
float MPU9250_asukiaaa::accelX() {
return accelGet(0, 1);
}
float MPU9250_asukiaaa::accelY() {
return accelGet(2, 3);
}
float MPU9250_asukiaaa::accelZ() {
return accelGet(4, 5);
}
float MPU9250_asukiaaa::accelSqrt() {
return sqrt(pow(accelGet(0, 1), 2) +
pow(accelGet(2, 3), 2) +
pow(accelGet(4, 5), 2));
}
void MPU9250_asukiaaa::beginGyro(uint8_t mode) {
beginWireIfNull();
switch (mode) {
case GYRO_FULL_SCALE_250_DPS:
gyroRange = 250.0;
break;
case GYRO_FULL_SCALE_500_DPS:
gyroRange = 500.0;
break;
case GYRO_FULL_SCALE_1000_DPS:
gyroRange = 1000.0;
break;
case GYRO_FULL_SCALE_2000_DPS:
gyroRange = 2000.0;
break;
default:
return; // Return without writing invalid mode
}
i2cWriteByte(address, 27, mode);
delay(10);
}
uint8_t MPU9250_asukiaaa::gyroUpdate() {
return i2cRead(address, MPU9250_ADDR_GYRO_XOUT_H, 6, gyroBuff);
}
float MPU9250_asukiaaa::gyroGet(uint8_t highIndex, uint8_t lowIndex) {
int16_t v = ((int16_t) gyroBuff[highIndex]) << 8 | gyroBuff[lowIndex];
return ((float) -v) * gyroRange / (float) 0x8000;
}
float MPU9250_asukiaaa::gyroX() {
return gyroGet(0, 1);
}
float MPU9250_asukiaaa::gyroY() {
return gyroGet(2, 3);
}
float MPU9250_asukiaaa::gyroZ() {
return gyroGet(4, 5);
}

View File

@@ -0,0 +1,80 @@
#ifndef MPU9250_ASUKIAAA_H
#define MPU9250_ASUKIAAA_H
#include <Arduino.h>
#include <Wire.h>
#define MPU9250_ADDRESS_AD0_LOW 0x68
#define MPU9250_ADDRESS_AD0_HIGH 0x69
#define ACC_FULL_SCALE_2_G 0x00
#define ACC_FULL_SCALE_4_G 0x08
#define ACC_FULL_SCALE_8_G 0x10
#define ACC_FULL_SCALE_16_G 0x18
#define GYRO_FULL_SCALE_250_DPS 0x00
#define GYRO_FULL_SCALE_500_DPS 0x08
#define GYRO_FULL_SCALE_1000_DPS 0x10
#define GYRO_FULL_SCALE_2000_DPS 0x18
#define MAG_MODE_POWERDOWN 0x0
#define MAG_MODE_SINGLE 0x1
#define MAG_MODE_CONTINUOUS_8HZ 0x2
#define MAG_MODE_EXTERNAL 0x4
#define MAG_MODE_CONTINUOUS_100HZ 0x6
#define MAG_MODE_SELFTEST 0x8
#define MAG_MODE_FUSEROM 0xF
#define MPU9250_BUFF_LEN_ACCEL 6
#define MPU9250_BUFF_LEN_GYRO 6
#define MPU9250_BUFF_LEN_MAG 7
class MPU9250_asukiaaa {
public:
const uint8_t address;
int16_t magXOffset, magYOffset, magZOffset;
uint8_t accelBuff[MPU9250_BUFF_LEN_ACCEL];
uint8_t gyroBuff[MPU9250_BUFF_LEN_GYRO];
uint8_t magBuff[MPU9250_BUFF_LEN_MAG];
MPU9250_asukiaaa(uint8_t address = MPU9250_ADDRESS_AD0_LOW);
void setWire(TwoWire *wire);
uint8_t readId(uint8_t *id);
void beginAccel(uint8_t mode = ACC_FULL_SCALE_16_G);
uint8_t accelUpdate();
float accelX();
float accelY();
float accelZ();
float accelSqrt();
void beginGyro(uint8_t mode = GYRO_FULL_SCALE_2000_DPS);
uint8_t gyroUpdate();
float gyroX();
float gyroY();
float gyroZ();
void beginMag(uint8_t mode = MAG_MODE_CONTINUOUS_8HZ);
void magSetMode(uint8_t mode);
uint8_t magUpdate();
float magX();
float magY();
float magZ();
float magHorizDirection();
private:
TwoWire* myWire;
float accelRange;
float gyroRange;
uint8_t magXAdjust, magYAdjust, magZAdjust;
void beginWireIfNull();
float accelGet(uint8_t highIndex, uint8_t lowIndex);
float gyroGet(uint8_t highIndex, uint8_t lowIndex);
int16_t magGet(uint8_t highIndex, uint8_t lowIndex);
void magEnableSlaveMode();
void magReadAdjustValues();
void magWakeup();
uint8_t i2cRead(uint8_t Address, uint8_t Register, uint8_t Nbytes, uint8_t* Data);
uint8_t i2cWriteByte(uint8_t Address, uint8_t Register, uint8_t Data);
};
#endif