初始化提交
This commit is contained in:
18
arduino-cli/libraries/MPU9250_asukiaaa/.travis.yml
Normal file
18
arduino-cli/libraries/MPU9250_asukiaaa/.travis.yml
Normal 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
|
||||
20
arduino-cli/libraries/MPU9250_asukiaaa/LICENSE
Normal file
20
arduino-cli/libraries/MPU9250_asukiaaa/LICENSE
Normal 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.
|
||||
165
arduino-cli/libraries/MPU9250_asukiaaa/README.md
Normal file
165
arduino-cli/libraries/MPU9250_asukiaaa/README.md
Normal file
@@ -0,0 +1,165 @@
|
||||
# MPU9250_asukiaaa [](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/)
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
58
arduino-cli/libraries/MPU9250_asukiaaa/keywords.txt
Normal file
58
arduino-cli/libraries/MPU9250_asukiaaa/keywords.txt
Normal 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
|
||||
@@ -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=*
|
||||
230
arduino-cli/libraries/MPU9250_asukiaaa/src/MPU9250_asukiaaa.cpp
Normal file
230
arduino-cli/libraries/MPU9250_asukiaaa/src/MPU9250_asukiaaa.cpp
Normal 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);
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user