From b213be6618681f9223a9fcd3b9be207c5430ad1e Mon Sep 17 00:00:00 2001 From: tomas-fryza Date: Mon, 24 Feb 2025 13:00:46 +0100 Subject: [PATCH] mpu9250 (accel, gyro, magneto) classes added --- examples/03-mpu9250/LICENSE | 21 + examples/03-mpu9250/MPU9250_WE/LICENSE | 21 + .../List_of_public_functions_MPU9250_WE.pdf | Bin 0 -> 42231 bytes .../MPU9250__I2C_Arduino_Wiring.png | Bin 0 -> 127458 bytes .../MPU9250__SPI_Arduino_Wiring.png | Bin 0 -> 142581 bytes examples/03-mpu9250/MPU9250_WE/README.md | 51 ++ .../MPU6050_all_data/MPU6050_all_data.ino | 111 +++ .../MPU6500_SPI_all_data.ino | 89 ++ .../MPU6500_all_data/MPU6500_all_data.ino | 177 ++++ .../MPU9250_FIFO_continuous.ino | 296 +++++++ .../MPU9250_FIFO_stop_when_full.ino | 303 +++++++ .../MPU9250_SPI_all_data.ino | 103 +++ .../MPU9250_acceleration_data.ino | 164 ++++ .../MPU9250_all_data/MPU9250_all_data.ino | 198 +++++ .../MPU9250_angles_and_orientation.ino | 121 +++ .../MPU9250_blank_all_settings.ino | 262 ++++++ .../MPU9250_calibration.ino | 164 ++++ ...MPU9250_data_ready_interrupt_and_cycle.ino | 172 ++++ .../MPU9250_gyroscope_data.ino | 152 ++++ .../MPU9250_magnetometer_data.ino | 71 ++ .../MPU9250_pitch_and_roll.ino | 119 +++ .../MPU9250_reusing_autocalib_data.ino | 123 +++ .../examples/MPU9250_sleep/MPU9250_sleep.ino | 97 +++ .../MPU9250_wake_on_motion_interrupt.ino | 198 +++++ .../MPU9250_who_am_I/MPU9250_who_am_I.ino | 52 ++ examples/03-mpu9250/MPU9250_WE/keywords.txt | 286 ++++++ .../03-mpu9250/MPU9250_WE/library.properties | 10 + .../03-mpu9250/MPU9250_WE/src/MPU6050.cpp | 76 ++ .../03-mpu9250/MPU9250_WE/src/MPU6050_WE.h | 128 +++ .../03-mpu9250/MPU9250_WE/src/MPU6500_WE.cpp | 822 ++++++++++++++++++ .../03-mpu9250/MPU9250_WE/src/MPU6500_WE.h | 405 +++++++++ .../03-mpu9250/MPU9250_WE/src/MPU9250_WE.cpp | 229 +++++ .../03-mpu9250/MPU9250_WE/src/MPU9250_WE.h | 200 +++++ .../03-mpu9250/MPU9250_WE/src/xyzFloat.cpp | 90 ++ examples/03-mpu9250/MPU9250_WE/src/xyzFloat.h | 26 + examples/03-mpu9250/ak8963.py | 207 +++++ examples/03-mpu9250/mpu6500.py | 225 +++++ examples/03-mpu9250/mpu9250.py | 100 +++ 38 files changed, 5869 insertions(+) create mode 100644 examples/03-mpu9250/LICENSE create mode 100644 examples/03-mpu9250/MPU9250_WE/LICENSE create mode 100644 examples/03-mpu9250/MPU9250_WE/List_of_public_functions_MPU9250_WE.pdf create mode 100644 examples/03-mpu9250/MPU9250_WE/MPU9250__I2C_Arduino_Wiring.png create mode 100644 examples/03-mpu9250/MPU9250_WE/MPU9250__SPI_Arduino_Wiring.png create mode 100644 examples/03-mpu9250/MPU9250_WE/README.md create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU6050_all_data/MPU6050_all_data.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU6500_SPI_all_data/MPU6500_SPI_all_data.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU6500_all_data/MPU6500_all_data.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU9250_FIFO_continuous/MPU9250_FIFO_continuous.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU9250_FIFO_stop_when_full/MPU9250_FIFO_stop_when_full.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU9250_SPI_all_data/MPU9250_SPI_all_data.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU9250_acceleration_data/MPU9250_acceleration_data.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU9250_all_data/MPU9250_all_data.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU9250_angles_and_orientation/MPU9250_angles_and_orientation.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU9250_blank_all_settings/MPU9250_blank_all_settings.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU9250_calibration/MPU9250_calibration.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU9250_data_ready_interrupt_and_cycle/MPU9250_data_ready_interrupt_and_cycle.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU9250_gyroscope_data/MPU9250_gyroscope_data.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU9250_magnetometer_data/MPU9250_magnetometer_data.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU9250_pitch_and_roll/MPU9250_pitch_and_roll.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU9250_reusing_autocalib_data/MPU9250_reusing_autocalib_data.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU9250_sleep/MPU9250_sleep.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU9250_wake_on_motion_interrupt/MPU9250_wake_on_motion_interrupt.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/examples/MPU9250_who_am_I/MPU9250_who_am_I.ino create mode 100644 examples/03-mpu9250/MPU9250_WE/keywords.txt create mode 100644 examples/03-mpu9250/MPU9250_WE/library.properties create mode 100644 examples/03-mpu9250/MPU9250_WE/src/MPU6050.cpp create mode 100644 examples/03-mpu9250/MPU9250_WE/src/MPU6050_WE.h create mode 100644 examples/03-mpu9250/MPU9250_WE/src/MPU6500_WE.cpp create mode 100644 examples/03-mpu9250/MPU9250_WE/src/MPU6500_WE.h create mode 100644 examples/03-mpu9250/MPU9250_WE/src/MPU9250_WE.cpp create mode 100644 examples/03-mpu9250/MPU9250_WE/src/MPU9250_WE.h create mode 100644 examples/03-mpu9250/MPU9250_WE/src/xyzFloat.cpp create mode 100644 examples/03-mpu9250/MPU9250_WE/src/xyzFloat.h create mode 100644 examples/03-mpu9250/ak8963.py create mode 100644 examples/03-mpu9250/mpu6500.py create mode 100644 examples/03-mpu9250/mpu9250.py diff --git a/examples/03-mpu9250/LICENSE b/examples/03-mpu9250/LICENSE new file mode 100644 index 0000000..77ac895 --- /dev/null +++ b/examples/03-mpu9250/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018-2023 Mika Tuupola + +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. diff --git a/examples/03-mpu9250/MPU9250_WE/LICENSE b/examples/03-mpu9250/MPU9250_WE/LICENSE new file mode 100644 index 0000000..8be548e --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Wolfgang (Wolle) Ewald + +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. diff --git a/examples/03-mpu9250/MPU9250_WE/List_of_public_functions_MPU9250_WE.pdf b/examples/03-mpu9250/MPU9250_WE/List_of_public_functions_MPU9250_WE.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ebb663b5fb231b809c4f2872ffba1c9175cd323d GIT binary patch literal 42231 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 bAh7vPqr3alH;NQkApj%3cdwzPk>LLUM`?1I literal 0 HcmV?d00001 diff --git a/examples/03-mpu9250/MPU9250_WE/MPU9250__I2C_Arduino_Wiring.png b/examples/03-mpu9250/MPU9250_WE/MPU9250__I2C_Arduino_Wiring.png new file mode 100644 index 0000000000000000000000000000000000000000..96c59479536a6c1a802f1c3675b950e1853881d2 GIT binary patch literal 127458 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�%C2syfO^-TXQp7%r=CV$F8^>?|-oTzT5bMSlq}u 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 Ie>JZE1r`fEj{pDw literal 0 HcmV?d00001 diff --git a/examples/03-mpu9250/MPU9250_WE/MPU9250__SPI_Arduino_Wiring.png b/examples/03-mpu9250/MPU9250_WE/MPU9250__SPI_Arduino_Wiring.png new file mode 100644 index 0000000000000000000000000000000000000000..f62e91a3b183e3f844affb97a349e6c1cea0132c GIT binary patch literal 142581 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

eO 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

WD2w)>$U}|lcI{O(0Y3b8g1~$KS{&yQN$My?Y z<{-WL1un_|Je@1nM?pgCGg{1T{(d)*)2o0!_+|h9ZQga_qmj!F=S{TjqeTWA?r7{$ Jj`Qh+{{h@Q4NL$4 literal 0 HcmV?d00001 diff --git a/examples/03-mpu9250/MPU9250_WE/README.md b/examples/03-mpu9250/MPU9250_WE/README.md new file mode 100644 index 0000000..9c229e4 --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/README.md @@ -0,0 +1,51 @@ +# MPU9250_WE +An Arduino library for the 9-axis accelerometer, gyroscope and magnetometer MPU9250 and the MPU6500. In essence the MPU6500 is a MPU9250 without the magnetometer. The library also provides basic support for the MPU6050. + +The library contains many example sketches with lots of comments to make it easy to use. I have written them for the MPU9250 / I2C. You can "translate" them easily for the MPU6500. MPU6500_all_data.ino shows how to do this. The use of SPI is shown in MPU9250_SPI_all_data.ino and MPU6500_SPI_all_data.ino. + +For further information visit my blog: + +https://wolles-elektronikkiste.de/mpu9250-9-achsen-sensormodul-teil-1 (German) + +https://wolles-elektronikkiste.de/en/mpu9250-9-axis-sensor-module-part-1 (English) + +If you find bugs please inform me. If you like the library it would be great if you could give it a star. + +If you are not familiar with the MPU9250 I recommend to work through the example sketches in the following order: + +1. MPU9250_acceleration_data.ino +2. MPU9250_gyroscope_data.ino +3. MPU9250_calibration.ino +4. MPU9250_reusing_autocalib_data.ino +5. MPU9250_magnetometer_data.ino +6. MPU9250_all_data.ino +7. MPU9250_angles_and_orientation.ino +8. MPU9250_pitch_and_roll.ino +9. MPU9250_data_ready_interrupt_and_cycle.ino +10. MPU9250_wake_on_motion_interrupt.ino +11. MPU9250_FIFO_stop_when_full.ino +12. MPU9250_FIFO_continuous.ino +13. MPU6500_all_data.ino +14. MPU6050_all_data.ino + +The sketch MPU9250_blank_all_settings.ino can be used as a basis for your own sketches. It contains all setting options. + +

If the MPU9250 / MPU6500 does not respond

+ +There are various modules with different MPUxxxx ICs out there. Sometimes it's not clearly defined in online-shops what you will really get if you buy an MPU9250/MPU6500 module. It might be an MPU9250, it might be an MPU6500 or it might be something else, although the modules look the same. An indication is the label on the MPUxxxx IC: + +![MPU9250](https://user-images.githubusercontent.com/41305162/181456778-d3f69414-2627-445b-82b9-560dbfcbf982.jpg) + +The labels I am aware of are: + + - MP92: MPU9250 + - MP65: MPU6500 + - MP651: MPU6515 + +You can also run the example sketch MPU9250_who_am_I.ino to find out which device you have. + +I am using the "Who I am" registers of the MPU9250, MPU6500 and the magnetometer AK8963 to check if the modules are connected. If you create an MPU9250 object, but, for example, you are actually using an MPU6500, the init functions will return "false". However, the gyroscope and the accelerometer will work, because all related registers are the same. For other variants it might be similar. If the library works although you are using a different MPUxxxx, then just be happy, but you will have to live with the init function returning "false" - or find an alternative library. + +

Support of the MPU6050

+ +The library does support the MPU6050 only to a limited extent. You can query the accelaration, gyroscope and temperature values, and you can choose the range. But more advance functions like WOM interrupt, FIFO and others will no work properly. And I do not intend to work further on MPU6050 functions. diff --git a/examples/03-mpu9250/MPU9250_WE/examples/MPU6050_all_data/MPU6050_all_data.ino b/examples/03-mpu9250/MPU9250_WE/examples/MPU6050_all_data/MPU6050_all_data.ino new file mode 100644 index 0000000..a838f49 --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/examples/MPU6050_all_data/MPU6050_all_data.ino @@ -0,0 +1,111 @@ +/*************************************************************************** +* Example sketch for the MPU9250_WE library (MPU6050) +* +* This sketch shows how to get acceleration, gyroscocope and temperature +* data from the MPU6050. In essence, the MPU6050 is an older version of the +* MPU6500. Due to the poor register documentation, not all functions do work +* on the MPU6050 like they do on the MPU6500 or MPU9250. +* +* For further information visit my blog: +* +* https://wolles-elektronikkiste.de/mpu9250-9-achsen-sensormodul-teil-1 (German) +* https://wolles-elektronikkiste.de/en/mpu9250-9-axis-sensor-module-part-1 (English) +* +***************************************************************************/ +#include +#include +#define MPU6050_ADDR 0x68 + +/* There are several ways to create your MPU6050 object: + * MPU6050_WE myMPU6050 = MPU6050_WE() -> uses Wire / I2C Address = 0x68 + * MPU6050_WE myMPU6050 = MPU6050_WE(MPU6050_ADDR) -> uses Wire / MPU6050_ADDR + * MPU6050_WE myMPU6050 = MPU6050_WE(&wire2) -> uses the TwoWire object wire2 / MPU6050_ADDR + * MPU6050_WE myMPU6050 = MPU6050_WE(&wire2, MPU6050_ADDR) -> all together + * Successfully tested with two I2C busses on an ESP32 + */ +MPU6050_WE myMPU6050 = MPU6050_WE(MPU6050_ADDR); + +void setup() { + Serial.begin(115200); + Wire.begin(); + if(!myMPU6050.init()){ + Serial.println("MPU6050 does not respond"); + } + else{ + Serial.println("MPU6050 is connected"); + } + + /* The slope of the curve of acceleration vs measured values fits quite well to the theoretical + * values, e.g. 16384 units/g in the +/- 2g range. But the starting point, if you position the + * MPU6050 flat, is not necessarily 0g/0g/1g for x/y/z. The autoOffset function measures offset + * values. It assumes your MPU6050 is positioned flat with its x,y-plane. The more you deviate + * from this, the less accurate will be your results. + * The function also measures the offset of the gyroscope data. The gyroscope offset does not + * depend on the positioning. + * This function needs to be called at the beginning since it can overwrite your settings! + */ + Serial.println("Position you MPU6050 flat and don't move it - calibrating..."); + delay(1000); + myMPU6050.autoOffsets(); + Serial.println("Done!"); + + /* This is a more accurate method for calibration. You have to determine the minimum and maximum + * raw acceleration values of the axes determined in the range +/- 2 g. + * You call the function as follows: setAccOffsets(xMin,xMax,yMin,yMax,zMin,zMax); + * Use either autoOffset or setAccOffsets, not both. + */ + //myMPU6050.setAccOffsets(-14240.0, 18220.0, -17280.0, 15590.0, -20930.0, 12080.0); + + /* The gyroscope data is not zero, even if you don't move the MPU6050. + * To start at zero, you can apply offset values. These are the gyroscope raw values you obtain + * using the +/- 250 degrees/s range. + * Use either autoOffset or setGyrOffsets, not both. + */ + //myMPU6050.setGyrOffsets(45.0, 145.0, -105.0); + + /* MPU6050_GYRO_RANGE_250 250 degrees per second (default) + * MPU6050_GYRO_RANGE_500 500 degrees per second + * MPU6050_GYRO_RANGE_1000 1000 degrees per second + * MPU6050_GYRO_RANGE_2000 2000 degrees per second + */ + myMPU6050.setGyrRange(MPU6050_GYRO_RANGE_250); + + /* MPU6050_ACC_RANGE_2G 2 g (default) + * MPU6050_ACC_RANGE_4G 4 g + * MPU6050_ACC_RANGE_8G 8 g + * MPU6050_ACC_RANGE_16G 16 g + */ + myMPU6050.setAccRange(MPU6050_ACC_RANGE_2G); + + delay(200); +} + +void loop() { + xyzFloat gValue = myMPU6050.getGValues(); + xyzFloat gyr = myMPU6050.getGyrValues(); + float temp = myMPU6050.getTemperature(); + float resultantG = myMPU6050.getResultantG(gValue); + + Serial.println("Acceleration in g (x,y,z):"); + Serial.print(gValue.x); + Serial.print(" "); + Serial.print(gValue.y); + Serial.print(" "); + Serial.println(gValue.z); + Serial.print("Resultant g: "); + Serial.println(resultantG); + + Serial.println("Gyroscope data in degrees/s: "); + Serial.print(gyr.x); + Serial.print(" "); + Serial.print(gyr.y); + Serial.print(" "); + Serial.println(gyr.z); + + Serial.print("Temperature in °C: "); + Serial.println(temp); + + Serial.println("********************************************"); + + delay(1000); +} diff --git a/examples/03-mpu9250/MPU9250_WE/examples/MPU6500_SPI_all_data/MPU6500_SPI_all_data.ino b/examples/03-mpu9250/MPU9250_WE/examples/MPU6500_SPI_all_data/MPU6500_SPI_all_data.ino new file mode 100644 index 0000000..8e18a3c --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/examples/MPU6500_SPI_all_data/MPU6500_SPI_all_data.ino @@ -0,0 +1,89 @@ +/*************************************************************************** +* Example sketch for the MPU6500_WE library +* +* This sketch shows how to get acceleration, gyroscocope and temperature +* data from the MPU6500 using SPI. +* +* For further information visit my blog: +* +* https://wolles-elektronikkiste.de/mpu9250-9-achsen-sensormodul-teil-1 (German) +* https://wolles-elektronikkiste.de/en/mpu9250-9-axis-sensor-module-part-1 (English) +* +***************************************************************************/ + +#include +const int csPin = 10; // Chip Select Pin +// const int mosiPin = 22; // "MOSI" Pin +// const int misoPin = 21; // "MISO" Pin +// const int sckPin = 16; // SCK Pin +bool useSPI = true; // SPI use flag + + +/* There are two constructors for SPI: */ +MPU6500_WE myMPU6500 = MPU6500_WE(&SPI, csPin, useSPI); + +/* Use this one if you want to change the default SPI pins (only for ESP32 so far): */ +// MPU6500_WE myMPU6500 = MPU6500_WE(&SPI, csPin, mosiPin, misoPin, sckPin, useSPI); + +void setup() { + Serial.begin(115200); + Wire.begin(); + if(!myMPU6500.init()){ + Serial.println("MPU6500 does not respond"); + } + else{ + Serial.println("MPU6500 is connected"); + } + + /* Choose the SPI clock speed, default is 8 MHz + This function must be used only after init(), not before */ + //myMPU9250.setSPIClockSpeed(4000000); + + Serial.println("Position you MPU6500 flat and don't move it - calibrating..."); + delay(1000); + myMPU6500.autoOffsets(); + Serial.println("Done!"); + + //myMPU6500.setAccOffsets(-14240.0, 18220.0, -17280.0, 15590.0, -20930.0, 12080.0); + //myMPU6500.setGyrOffsets(45.0, 145.0, -105.0); + myMPU6500.enableGyrDLPF(); + //myMPU6500.disableGyrDLPF(MPU6500_BW_WO_DLPF_8800); // bandwdith without DLPF + myMPU6500.setGyrDLPF(MPU6500_DLPF_6); + myMPU6500.setSampleRateDivider(5); + myMPU6500.setGyrRange(MPU6500_GYRO_RANGE_250); + myMPU6500.setAccRange(MPU6500_ACC_RANGE_2G); + myMPU6500.enableAccDLPF(true); + myMPU6500.setAccDLPF(MPU6500_DLPF_6); + //myMPU6500.enableAccAxes(MPU6500_ENABLE_XYZ); + //myMPU6500.enableGyrAxes(MPU6500_ENABLE_XYZ); +} + +void loop() { + xyzFloat gValue = myMPU6500.getGValues(); + xyzFloat gyr = myMPU6500.getGyrValues(); + float temp = myMPU6500.getTemperature(); + float resultantG = myMPU6500.getResultantG(gValue); + + Serial.println("Acceleration in g (x,y,z):"); + Serial.print(gValue.x); + Serial.print(" "); + Serial.print(gValue.y); + Serial.print(" "); + Serial.println(gValue.z); + Serial.print("Resultant g: "); + Serial.println(resultantG); + + Serial.println("Gyroscope data in degrees/s: "); + Serial.print(gyr.x); + Serial.print(" "); + Serial.print(gyr.y); + Serial.print(" "); + Serial.println(gyr.z); + + Serial.print("Temperature in °C: "); + Serial.println(temp); + + Serial.println("********************************************"); + + delay(1000); +} diff --git a/examples/03-mpu9250/MPU9250_WE/examples/MPU6500_all_data/MPU6500_all_data.ino b/examples/03-mpu9250/MPU9250_WE/examples/MPU6500_all_data/MPU6500_all_data.ino new file mode 100644 index 0000000..2a58274 --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/examples/MPU6500_all_data/MPU6500_all_data.ino @@ -0,0 +1,177 @@ +/*************************************************************************** +* Example sketch for the MPU6500_WE library +* +* This sketch shows how to get acceleration, gyroscocope and temperature +* data from the MPU6500. In essence, the difference to the MPU9250 is the +* missing magnetometer. The shall only show how to "translate" all other +* MPU9250 example sketches for use of the MPU6500 +* +* For further information visit my blog: +* +* https://wolles-elektronikkiste.de/mpu9250-9-achsen-sensormodul-teil-1 (German) +* https://wolles-elektronikkiste.de/en/mpu9250-9-axis-sensor-module-part-1 (English) +* +***************************************************************************/ + +#include +#include +#define MPU6500_ADDR 0x68 + +/* There are several ways to create your MPU6500 object: + * MPU6500_WE myMPU6500 = MPU6500_WE() -> uses Wire / I2C Address = 0x68 + * MPU6500_WE myMPU6500 = MPU6500_WE(MPU6500_ADDR) -> uses Wire / MPU6500_ADDR + * MPU6500_WE myMPU6500 = MPU6500_WE(&wire2) -> uses the TwoWire object wire2 / MPU6500_ADDR + * MPU6500_WE myMPU6500 = MPU6500_WE(&wire2, MPU6500_ADDR) -> all together + * Successfully tested with two I2C busses on an ESP32 + */ +MPU6500_WE myMPU6500 = MPU6500_WE(MPU6500_ADDR); + +void setup() { + Serial.begin(115200); + Wire.begin(); + if(!myMPU6500.init()){ + Serial.println("MPU6500 does not respond"); + } + else{ + Serial.println("MPU6500 is connected"); + } + + /* The slope of the curve of acceleration vs measured values fits quite well to the theoretical + * values, e.g. 16384 units/g in the +/- 2g range. But the starting point, if you position the + * MPU6500 flat, is not necessarily 0g/0g/1g for x/y/z. The autoOffset function measures offset + * values. It assumes your MPU6500 is positioned flat with its x,y-plane. The more you deviate + * from this, the less accurate will be your results. + * The function also measures the offset of the gyroscope data. The gyroscope offset does not + * depend on the positioning. + * This function needs to be called at the beginning since it can overwrite your settings! + */ + Serial.println("Position you MPU6500 flat and don't move it - calibrating..."); + delay(1000); + myMPU6500.autoOffsets(); + Serial.println("Done!"); + + /* This is a more accurate method for calibration. You have to determine the minimum and maximum + * raw acceleration values of the axes determined in the range +/- 2 g. + * You call the function as follows: setAccOffsets(xMin,xMax,yMin,yMax,zMin,zMax); + * Use either autoOffset or setAccOffsets, not both. + */ + //myMPU6500.setAccOffsets(-14240.0, 18220.0, -17280.0, 15590.0, -20930.0, 12080.0); + + /* The gyroscope data is not zero, even if you don't move the MPU6500. + * To start at zero, you can apply offset values. These are the gyroscope raw values you obtain + * using the +/- 250 degrees/s range. + * Use either autoOffset or setGyrOffsets, not both. + */ + //myMPU6500.setGyrOffsets(45.0, 145.0, -105.0); + + /* You can enable or disable the digital low pass filter (DLPF). If you disable the DLPF, you + * need to select the bandwdith, which can be either 8800 or 3600 Hz. 8800 Hz has a shorter delay, + * but higher noise level. If DLPF is disabled, the output rate is 32 kHz. + * MPU6500_BW_WO_DLPF_3600 + * MPU6500_BW_WO_DLPF_8800 + */ + myMPU6500.enableGyrDLPF(); + //myMPU6500.disableGyrDLPF(MPU6500_BW_WO_DLPF_8800); // bandwdith without DLPF + + /* Digital Low Pass Filter for the gyroscope must be enabled to choose the level. + * MPU6500_DPLF_0, MPU6500_DPLF_2, ...... MPU6500_DPLF_7 + * + * DLPF Bandwidth [Hz] Delay [ms] Output Rate [kHz] + * 0 250 0.97 8 + * 1 184 2.9 1 + * 2 92 3.9 1 + * 3 41 5.9 1 + * 4 20 9.9 1 + * 5 10 17.85 1 + * 6 5 33.48 1 + * 7 3600 0.17 8 + * + * You achieve lowest noise using level 6 + */ + myMPU6500.setGyrDLPF(MPU6500_DLPF_6); + + /* Sample rate divider divides the output rate of the gyroscope and accelerometer. + * Sample rate = Internal sample rate / (1 + divider) + * It can only be applied if the corresponding DLPF is enabled and 0 +#include +#define MPU9250_ADDR 0x68 + +const int intPin = 2; +volatile bool womEvent = false; + +/* There are several ways to create your MPU9250 object: + * MPU9250_WE myMPU9250 = MPU9250_WE() -> uses Wire / I2C Address = 0x68 + * MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR) -> uses Wire / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2) -> uses the TwoWire object wire2 / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2, MPU9250_ADDR) -> all together + * Successfully tested with two I2C busses on an ESP32 + */ +MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR); + +void setup() { + Serial.begin(115200); + Wire.begin(); + if(!myMPU9250.init()){ + Serial.println("MPU9250 does not respond"); + } + else{ + Serial.println("MPU9250 is connected"); + } + + /* The slope of the curve of acceleration vs measured values fits quite well to the theoretical + * values, e.g. 16384 units/g in the +/- 2g range. But the starting point, if you position the + * MPU9250 flat, is not necessarily 0g/0g/1g for x/y/z. The autoOffset function measures offset + * values. It assumes your MPU9250 is positioned flat with its x,y-plane. The more you deviate + * from this, the less accurate will be your results. + * The function also measures the offset of the gyroscope data. The gyroscope offset does not + * depend on the positioning. + * This function needs to be called at the beginning since it can overwrite your settings! + */ + Serial.println("Position you MPU9250 flat and don't move it - calibrating..."); + delay(1000); + myMPU9250.autoOffsets(); + Serial.println("Done!"); + + /* This is a more accurate method for calibration. You have to determine the minimum and maximum + * raw acceleration values of the axes determined in the range +/- 2 g. + * You call the function as follows: setAccOffsets(xMin,xMax,yMin,yMax,zMin,zMax); + * Use either autoOffset or setAccOffsets, not both. + */ + //myMPU9250.setAccOffsets(-14240.0, 18220.0, -17280.0, 15590.0, -20930.0, 12080.0); + + /* The gyroscope data is not zero, even if you don't move the MPU9250. + * To start at zero, you can apply offset values. These are the gyroscope raw values you obtain + * using the +/- 250 degrees/s range. + * Use either autoOffset or setGyrOffsets, not both. + */ + //myMPU9250.setGyrOffsets(45.0, 145.0, -105.0); + + /* You can enable or disable the digital low pass filter (DLPF). If you disable the DLPF, you + * need to select the bandwidth, which can be either 8800 or 3600 Hz. 8800 Hz has a shorter delay, + * but higher noise level. If DLPF is disabled, the output rate is 32 kHz. + * MPU9250_BW_WO_DLPF_3600 + * MPU9250_BW_WO_DLPF_8800 + */ + myMPU9250.enableGyrDLPF(); + //myMPU9250.disableGyrDLPF(MPU9250_BW_WO_DLPF_8800); // bandwidth without DLPF + + /* Digital Low Pass Filter for the gyroscope must be enabled to choose the level. + * MPU9250_DPLF_0, MPU9250_DPLF_2, ...... MPU9250_DPLF_7 + * + * DLPF Bandwidth [Hz] Delay [ms] Output Rate [kHz] + * 0 250 0.97 8 + * 1 184 2.9 1 + * 2 92 3.9 1 + * 3 41 5.9 1 + * 4 20 9.9 1 + * 5 10 17.85 1 + * 6 5 33.48 1 + * 7 3600 0.17 8 + * + * You achieve lowest noise using level 6 + */ + myMPU9250.setGyrDLPF(MPU9250_DLPF_5); + + /* Sample rate divider divides the output rate of the gyroscope and accelerometer. + * Sample rate = Internal sample rate / (1 + divider) + * It can only be applied if the corresponding DLPF is enabled and 0 samples are continuously stored in FIFO. If FIFO is full + * new data will replace the oldest. + * MPU9250_STOP_WHEN_FULL --> self-explaining + */ + //myMPU9250.setFifoMode(MPU9250_STOP_WHEN_FULL); // used below, but explained here + + /* The argument of startFifo defines the data stored in the FIFO + * MPU9250_FIFO_ACC --> Acceleration Data ist stored in FIFO + * MPU9250_FIFO_GYR --> Gyroscope data is stored in FIFO + * MPU9250_FIFO_ACC_GYR --> Acceleration and Gyroscope Data is stored in FIFO + * The library does not (yet) support storing single gyroscope axes data, temperature + * or data from slaves. + */ + //myMPU9250.startFifo(MPU9250_FIFO_ACC); // used below, but explained here + + /* stopFifo(): + * - stops additional writes into Fifo + * - clears the data type written into Fifo (acceleration and/or gyroscope + */ + //myMPU9250.stopFifo(); // used below, but explained here + + /* sets the Fifo counter to zero */ + //myMPU9250.resetFifo(); // used below, but explained here + + + /* sleep() sends the MPU9250 to sleep or wakes it up. + * Please note that the gyroscope needs 35 milliseconds to wake up. + */ + //myMPU9250.sleep(true); + + /* If cycle is set, and standby or sleep are not set, the module will cycle between + * sleep and taking a sample at a rate determined by setLowPowerAccDataRate(). + */ + //myMPU9250.enableCycle(true); + + /* This is a low power standby mode for the gyro function, which allows quick enabling. + * (see data sheet for further information) + */ + //myMPU9250.enableGyrStandby(true); + + + /* You can enable or disable the axes for gyroscope and/or accelerometer measurements. + * By default all axes are enabled. Parameters are: + * MPU9250_ENABLE_XYZ //all axes are enabled (default) + * MPU9250_ENABLE_XY0 // X, Y enabled, Z disabled + * MPU9250_ENABLE_X0Z + * MPU9250_ENABLE_X00 + * MPU9250_ENABLE_0YZ + * MPU9250_ENABLE_0Y0 + * MPU9250_ENABLE_00Z + * MPU9250_ENABLE_000 // all axes disabled + */ + //myMPU9250.enableAccAxes(MPU9250_ENABLE_X0Z); + //myMPU9250.enableGyrAxes(MPU9250_ENABLE_XY0); + + attachInterrupt(digitalPinToInterrupt(intPin), eventISR, RISING); + myMPU9250.setFifoMode(MPU9250_CONTINUOUS); + myMPU9250.enableFifo(true); + delay(100); // in some cases a delay after enabling Fifo makes sense + myMPU9250.startFifo(MPU9250_FIFO_ACC_GYR); + + Serial.println("Turn your MPU9250 around the x or y axis."); + Serial.println("Waiting for wake-on-motion event..."); +} + +void loop() { + if(womEvent){ + myMPU9250.stopFifo(); + printFifo(); + myMPU9250.resetFifo(); + myMPU9250.startFifo(MPU9250_FIFO_ACC_GYR); + + Serial.println("For another series of measurements, enter any key and send"); + + while(!(Serial.available())){} + Serial.read(); + Serial.println(); + myMPU9250.readAndClearInterrupts(); + womEvent = false; + } +} + +void printFifo(){ + myMPU9250.findFifoBegin(); /* this is needed for continuous Fifo mode. The Fifo buffer ends with a + complete data set, but the start is within a data set. 512/6 or 512/12 */ + int count = myMPU9250.getFifoCount(); + int dataSets = myMPU9250.getNumberOfFifoDataSets(); + Serial.print("Bytes in Fifo: "); + Serial.println(count); + Serial.print("Data Sets: "); + Serial.println(dataSets); + + for(int i=0; i +#include +#define MPU9250_ADDR 0x68 + +const int intPin = 2; +volatile bool fifoFull = false; + +/* There are several ways to create your MPU9250 object: + * MPU9250_WE myMPU9250 = MPU9250_WE() -> uses Wire / I2C Address = 0x68 + * MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR) -> uses Wire / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2) -> uses the TwoWire object wire2 / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2, MPU9250_ADDR) -> all together + * Successfully tested with two I2C busses on an ESP32 + */ +MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR); + +void setup() { + Serial.begin(115200); + Wire.begin(); + if(!myMPU9250.init()){ + Serial.println("MPU9250 does not respond"); + } + else{ + Serial.println("MPU9250 is connected"); + } + + /* The slope of the curve of acceleration vs measured values fits quite well to the theoretical + * values, e.g. 16384 units/g in the +/- 2g range. But the starting point, if you position the + * MPU9250 flat, is not necessarily 0g/0g/1g for x/y/z. The autoOffset function measures offset + * values. It assumes your MPU9250 is positioned flat with its x,y-plane. The more you deviate + * from this, the less accurate will be your results. + * The function also measures the offset of the gyroscope data. The gyroscope offset does not + * depend on the positioning. + * This function needs to be called at the beginning since it can overwrite your settings! + */ + Serial.println("Position you MPU9250 flat and don't move it - calibrating..."); + delay(1000); + myMPU9250.autoOffsets(); + Serial.println("Done!"); + + /* This is a more accurate method for calibration. You have to determine the minimum and maximum + * raw acceleration values of the axes determined in the range +/- 2 g. + * You call the function as follows: setAccOffsets(xMin,xMax,yMin,yMax,zMin,zMax); + * Use either autoOffset or setAccOffsets, not both. + */ + //myMPU9250.setAccOffsets(-14240.0, 18220.0, -17280.0, 15590.0, -20930.0, 12080.0); + + /* The gyroscope data is not zero, even if you don't move the MPU9250. + * To start at zero, you can apply offset values. These are the gyroscope raw values you obtain + * using the +/- 250 degrees/s range. + * Use either autoOffset or setGyrOffsets, not both. + */ + //myMPU9250.setGyrOffsets(45.0, 145.0, -105.0); + + /* You can enable or disable the digital low pass filter (DLPF). If you disable the DLPF, you + * need to select the bandwidth, which can be either 8800 or 3600 Hz. 8800 Hz has a shorter delay, + * but higher noise level. If DLPF is disabled, the output rate is 32 kHz. + * MPU9250_BW_WO_DLPF_3600 + * MPU9250_BW_WO_DLPF_8800 + */ + myMPU9250.enableGyrDLPF(); + //myMPU9250.disableGyrDLPF(MPU9250_BW_WO_DLPF_8800); // bandwidth without DLPF + + /* Digital Low Pass Filter for the gyroscope must be enabled to choose the level. + * MPU9250_DPLF_0, MPU9250_DPLF_2, ...... MPU9250_DPLF_7 + * + * DLPF Bandwidth [Hz] Delay [ms] Output Rate [kHz] + * 0 250 0.97 8 + * 1 184 2.9 1 + * 2 92 3.9 1 + * 3 41 5.9 1 + * 4 20 9.9 1 + * 5 10 17.85 1 + * 6 5 33.48 1 + * 7 3600 0.17 8 + * + * You achieve lowest noise using level 6 + */ + myMPU9250.setGyrDLPF(MPU9250_DLPF_5); + + /* Sample rate divider divides the output rate of the gyroscope and accelerometer. + * Sample rate = Internal sample rate / (1 + divider) + * It can only be applied if the corresponding DLPF is enabled and 0 samples are continuously stored in FIFO. If FIFO is full + * new data will replace the oldest. + * MPU9250_STOP_WHEN_FULL --> self-explaining + */ + //myMPU9250.setFifoMode(MPU9250_STOP_WHEN_FULL); // used below, but explained here + + /* The argument of startFifo defines the data stored in the FIFO + * MPU9250_FIFO_ACC --> Acceleration Data ist stored in FIFO + * MPU9250_FIFO_GYR --> Gyroscope data is stored in FIFO + * MPU9250_FIFO_ACC_GYR --> Acceleration and Gyroscope Data is stored in FIFO + * The library does not (yet) support storing single gyroscope axes data, temperature + * or data from slaves. + */ + //myMPU9250.startFifo(MPU9250_FIFO_ACC); // used below, but explained here + + /* stopFifo(): + * - stops additional writes into Fifo + * - clears the data type written into Fifo (acceleration and/or gyroscope + */ + //myMPU9250.stopFifo(); // used below, but explained here + + /* sets the Fifo counter to zero */ + //myMPU9250.resetFifo(); // used below, but explained here + + + /* sleep() sends the MPU9250 to sleep or wakes it up. + * Please note that the gyroscope needs 35 milliseconds to wake up. + */ + //myMPU9250.sleep(true); + + /* If cycle is set, and standby or sleep are not set, the module will cycle between + * sleep and taking a sample at a rate determined by setLowPowerAccDataRate(). + */ + //myMPU9250.enableCycle(true); + + /* This is a low power standby mode for the gyro function, which allows quick enabling. + * (see data sheet for further information) + */ + //myMPU9250.enableGyrStandby(true); + + + /* You can enable or disable the axes for gyroscope and/or accelerometer measurements. + * By default all axes are enabled. Parameters are: + * MPU9250_ENABLE_XYZ //all axes are enabled (default) + * MPU9250_ENABLE_XY0 // X, Y enabled, Z disabled + * MPU9250_ENABLE_X0Z + * MPU9250_ENABLE_X00 + * MPU9250_ENABLE_0YZ + * MPU9250_ENABLE_0Y0 + * MPU9250_ENABLE_00Z + * MPU9250_ENABLE_000 // all axes disabled + */ + //myMPU9250.enableAccAxes(MPU9250_ENABLE_X0Z); + //myMPU9250.enableGyrAxes(MPU9250_ENABLE_XY0); + + attachInterrupt(digitalPinToInterrupt(intPin), eventISR, RISING); + myMPU9250.setFifoMode(MPU9250_STOP_WHEN_FULL); + myMPU9250.enableFifo(true); + delay(100); // in some cases a delay after enabling Fifo makes sense +} + +void loop() { + + countDown(); + myMPU9250.readAndClearInterrupts(); + fifoFull = false; + myMPU9250.startFifo(MPU9250_FIFO_ACC_GYR); + + while(!fifoFull){} + myMPU9250.stopFifo(); + printFifo(); + myMPU9250.resetFifo(); + + Serial.println("For another series of measurements, enter any key and send"); + + while(!(Serial.available())){} + Serial.read(); + Serial.println(); + } + +void printFifo(){ + int count = myMPU9250.getFifoCount(); + int dataSets = myMPU9250.getNumberOfFifoDataSets(); + Serial.print("Bytes in Fifo: "); + Serial.println(count); + Serial.print("Data Sets: "); + Serial.println(dataSets); + + for(int i=0; i +const int csPin = 10; // Chip Select Pin +// const int mosiPin = 22; // "MOSI" Pin +// const int misoPin = 21; // "MISO" Pin +// const int sckPin = 16; // SCK Pin +bool useSPI = true; // SPI use flag + +/* There are two constructors for SPI: */ +MPU9250_WE myMPU9250 = MPU9250_WE(&SPI, csPin, useSPI); + +/* Use this one if you want to change the default SPI pins (only for ESP32 so far): */ +// MPU9250_WE myMPU9250 = MPU9250_WE(&SPI, csPin, mosiPin, misoPin, sckPin, useSPI); + +void setup() { + Serial.begin(115200); + if(!myMPU9250.init()){ + Serial.println("MPU9250 does not respond"); + } + else{ + Serial.println("MPU9250 is connected"); + } + if(!myMPU9250.initMagnetometer()){ + Serial.println("Magnetometer does not respond"); + } + else{ + Serial.println("Magnetometer is connected"); + } + + /* Choose the SPI clock speed, default is 8 MHz + This function must be used only after init(), not before */ + //myMPU9250.setSPIClockSpeed(4000000); + + Serial.println("Position you MPU9250 flat and don't move it - calibrating..."); + delay(1000); + myMPU9250.autoOffsets(); + Serial.println("Done!"); + + //myMPU9250.setAccOffsets(-14240.0, 18220.0, -17280.0, 15590.0, -20930.0, 12080.0); + //myMPU9250.setGyrOffsets(45.0, 145.0, -105.0); + myMPU9250.enableGyrDLPF(); + //myMPU9250.disableGyrDLPF(MPU9250_BW_WO_DLPF_8800); // bandwdith without DLPF + myMPU9250.setGyrDLPF(MPU9250_DLPF_6); + myMPU9250.setSampleRateDivider(5); + myMPU9250.setGyrRange(MPU9250_GYRO_RANGE_250); + myMPU9250.setAccRange(MPU9250_ACC_RANGE_2G); + myMPU9250.enableAccDLPF(true); + myMPU9250.setAccDLPF(MPU9250_DLPF_6); + //myMPU9250.enableAccAxes(MPU9250_ENABLE_XYZ); + //myMPU9250.enableGyrAxes(MPU9250_ENABLE_XYZ); + myMPU9250.setMagOpMode(AK8963_CONT_MODE_100HZ); + delay(200); +} + +void loop() { + xyzFloat gValue = myMPU9250.getGValues(); + xyzFloat gyr = myMPU9250.getGyrValues(); + xyzFloat magValue = myMPU9250.getMagValues(); + float temp = myMPU9250.getTemperature(); + float resultantG = myMPU9250.getResultantG(gValue); + + Serial.println("Acceleration in g (x,y,z):"); + Serial.print(gValue.x); + Serial.print(" "); + Serial.print(gValue.y); + Serial.print(" "); + Serial.println(gValue.z); + Serial.print("Resultant g: "); + Serial.println(resultantG); + + Serial.println("Gyroscope data in degrees/s: "); + Serial.print(gyr.x); + Serial.print(" "); + Serial.print(gyr.y); + Serial.print(" "); + Serial.println(gyr.z); + + Serial.println("Magnetometer Data in µTesla: "); + Serial.print(magValue.x); + Serial.print(" "); + Serial.print(magValue.y); + Serial.print(" "); + Serial.println(magValue.z); + + Serial.print("Temperature in °C: "); + Serial.println(temp); + + Serial.println("********************************************"); + + delay(1000); +} diff --git a/examples/03-mpu9250/MPU9250_WE/examples/MPU9250_acceleration_data/MPU9250_acceleration_data.ino b/examples/03-mpu9250/MPU9250_WE/examples/MPU9250_acceleration_data/MPU9250_acceleration_data.ino new file mode 100644 index 0000000..2e5ff9f --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/examples/MPU9250_acceleration_data/MPU9250_acceleration_data.ino @@ -0,0 +1,164 @@ +/*************************************************************************** +* Example sketch for the MPU9250_WE library +* +* This sketch shows how to obtain raw accleration data and g values from +* the MPU9250. +* +* For further information visit my blog: +* +* https://wolles-elektronikkiste.de/mpu9250-9-achsen-sensormodul-teil-1 (German) +* https://wolles-elektronikkiste.de/en/mpu9250-9-axis-sensor-module-part-1 (English) +* +***************************************************************************/ + +#include +#include +#define MPU9250_ADDR 0x68 + +/* There are several ways to create your MPU9250 object: + * MPU9250_WE myMPU9250 = MPU9250_WE() -> uses Wire / I2C Address = 0x68 + * MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR) -> uses Wire / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2) -> uses the TwoWire object wire2 / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2, MPU9250_ADDR) -> all together + * Successfully tested with two I2C busses on an ESP32 + */ +MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR); + +void setup() { + Serial.begin(115200); + Wire.begin(); + if(!myMPU9250.init()){ + Serial.println("MPU9250 does not respond"); + } + else{ + Serial.println("MPU9250 is connected"); + } + + /* The slope of the curve of acceleration vs measured values fits quite well to the theoretical + * values, e.g. 16384 units/g in the +/- 2g range. But the starting point, if you position the + * MPU9250 flat, is not necessarily 0g/0g/1g for x/y/z. The autoOffset function measures offset + * values. It assumes your MPU9250 is positioned flat with its x,y-plane. The more you deviate + * from this, the less accurate will be your results. + * The function also measures the offset of the gyroscope data. The gyroscope offset does not + * depend on the positioning. + * This function needs to be called at the beginning since it can overwrite your settings! + */ + Serial.println("Position you MPU9250 flat and don't move it - calibrating..."); + delay(1000); + myMPU9250.autoOffsets(); + Serial.println("Done!"); + + /* This is a more accurate method for calibration. You have to determine the minimum and maximum + * raw acceleration values of the axes determined in the range +/- 2 g. + * You call the function as follows: setAccOffsets(xMin,xMax,yMin,yMax,zMin,zMax); + * Use either autoOffset or setAccOffsets, not both. + */ + //myMPU9250.setAccOffsets(-14240.0, 18220.0, -17280.0, 15590.0, -20930.0, 12080.0); + + /* Sample rate divider divides the output rate of the gyroscope and accelerometer. + * Sample rate = Internal sample rate / (1 + divider) + * It can only be applied if the corresponding DLPF is enabled and 0 +#include +#define MPU9250_ADDR 0x68 + +/* There are several ways to create your MPU9250 object: + * MPU9250_WE myMPU9250 = MPU9250_WE() -> uses Wire / I2C Address = 0x68 + * MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR) -> uses Wire / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2) -> uses the TwoWire object wire2 / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2, MPU9250_ADDR) -> all together + * Successfully tested with two I2C busses on an ESP32 + */ +MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR); + +void setup() { + Serial.begin(115200); + Wire.begin(); + if(!myMPU9250.init()){ + Serial.println("MPU9250 does not respond"); + } + else{ + Serial.println("MPU9250 is connected"); + } + if(!myMPU9250.initMagnetometer()){ + Serial.println("Magnetometer does not respond"); + } + else{ + Serial.println("Magnetometer is connected"); + } + + /* The slope of the curve of acceleration vs measured values fits quite well to the theoretical + * values, e.g. 16384 units/g in the +/- 2g range. But the starting point, if you position the + * MPU9250 flat, is not necessarily 0g/0g/1g for x/y/z. The autoOffset function measures offset + * values. It assumes your MPU9250 is positioned flat with its x,y-plane. The more you deviate + * from this, the less accurate will be your results. + * The function also measures the offset of the gyroscope data. The gyroscope offset does not + * depend on the positioning. + * This function needs to be called at the beginning since it can overwrite your settings! + */ + Serial.println("Position you MPU9250 flat and don't move it - calibrating..."); + delay(1000); + myMPU9250.autoOffsets(); + Serial.println("Done!"); + + /* This is a more accurate method for calibration. You have to determine the minimum and maximum + * raw acceleration values of the axes determined in the range +/- 2 g. + * You call the function as follows: setAccOffsets(xMin,xMax,yMin,yMax,zMin,zMax); + * Use either autoOffset or setAccOffsets, not both. + */ + //myMPU9250.setAccOffsets(-14240.0, 18220.0, -17280.0, 15590.0, -20930.0, 12080.0); + + /* The gyroscope data is not zero, even if you don't move the MPU9250. + * To start at zero, you can apply offset values. These are the gyroscope raw values you obtain + * using the +/- 250 degrees/s range. + * Use either autoOffset or setGyrOffsets, not both. + */ + //myMPU9250.setGyrOffsets(45.0, 145.0, -105.0); + + /* You can enable or disable the digital low pass filter (DLPF). If you disable the DLPF, you + * need to select the bandwdith, which can be either 8800 or 3600 Hz. 8800 Hz has a shorter delay, + * but higher noise level. If DLPF is disabled, the output rate is 32 kHz. + * MPU9250_BW_WO_DLPF_3600 + * MPU9250_BW_WO_DLPF_8800 + */ + myMPU9250.enableGyrDLPF(); + //myMPU9250.disableGyrDLPF(MPU9250_BW_WO_DLPF_8800); // bandwdith without DLPF + + /* Digital Low Pass Filter for the gyroscope must be enabled to choose the level. + * MPU9250_DPLF_0, MPU9250_DPLF_2, ...... MPU9250_DPLF_7 + * + * DLPF Bandwidth [Hz] Delay [ms] Output Rate [kHz] + * 0 250 0.97 8 + * 1 184 2.9 1 + * 2 92 3.9 1 + * 3 41 5.9 1 + * 4 20 9.9 1 + * 5 10 17.85 1 + * 6 5 33.48 1 + * 7 3600 0.17 8 + * + * You achieve lowest noise using level 6 + */ + myMPU9250.setGyrDLPF(MPU9250_DLPF_6); + + /* Sample rate divider divides the output rate of the gyroscope and accelerometer. + * Sample rate = Internal sample rate / (1 + divider) + * It can only be applied if the corresponding DLPF is enabled and 0 +#include +#define MPU9250_ADDR 0x68 + +/* There are several ways to create your MPU9250 object: + * MPU9250_WE myMPU9250 = MPU9250_WE() -> uses Wire / I2C Address = 0x68 + * MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR) -> uses Wire / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2) -> uses the TwoWire object wire2 / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2, MPU9250_ADDR) -> all together + * Successfully tested with two I2C busses on an ESP32 + */ +MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR); + +void setup() { + Serial.begin(115200); + Wire.begin(); + if(!myMPU9250.init()){ + Serial.println("MPU9250 does not respond"); + } + else{ + Serial.println("MPU9250 is connected"); + } + + /* The slope of the curve of acceleration vs measured values fits quite well to the theoretical + * values, e.g. 16384 units/g in the +/- 2g range. But the starting point, if you position the + * MPU9250 flat, is not necessarily 0g/0g/1g for x/y/z. The autoOffset function measures offset + * values. It assumes your MPU9250 is positioned flat with its x,y-plane. The more you deviate + * from this, the less accurate will be your results. + * The function also measures the offset of the gyroscope data. The gyroscope offset does not + * depend on the positioning. + * This function needs to be called at the beginning since it can overwrite your settings! + */ + Serial.println("Position you MPU9250 flat and don't move it - calibrating..."); + delay(1000); + myMPU9250.autoOffsets(); + Serial.println("Done!"); + + /* This is a more accurate method for calibration. You have to determine the minimum and maximum + * raw acceleration values of the axes determined in the range +/- 2 g. + * You call the function as follows: setAccOffsets(xMin,xMax,yMin,yMax,zMin,zMax); + * Use either autoOffset or setAccOffsets, not both. + */ + //myMPU9250.setAccOffsets(-14240.0, 18220.0, -17280.0, 15590.0, -20930.0, 12080.0); + + /* Sample rate divider divides the output rate of the gyroscope and accelerometer. + * Sample rate = Internal sample rate / (1 + divider) + * It can only be applied if the corresponding DLPF is enabled and 0 +#include +#define MPU9250_ADDR 0x68 + +/* There are several ways to create your MPU9250 object: + * MPU9250_WE myMPU9250 = MPU9250_WE() -> uses Wire / I2C Address = 0x68 + * MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR) -> uses Wire / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2) -> uses the TwoWire object wire2 / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2, MPU9250_ADDR) -> all together + * Successfully tested with two I2C busses on an ESP32 + */ +MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR); + +void setup() { + Serial.begin(115200); + Wire.begin(); + if(!myMPU9250.init()){ + Serial.println("MPU9250 does not respond"); + } + else{ + Serial.println("MPU9250 is connected"); + } + if(!myMPU9250.initMagnetometer()){ + Serial.println("Magnetometer does not respond"); + } + else{ + Serial.println("Magnetometer is connected"); + } + + /* The slope of the curve of acceleration vs measured values fits quite well to the theoretical + * values, e.g. 16384 units/g in the +/- 2g range. But the starting point, if you position the + * MPU9250 flat, is not necessarily 0g/0g/1g for x/y/z. The autoOffset function measures offset + * values. It assumes your MPU9250 is positioned flat with its x,y-plane. The more you deviate + * from this, the less accurate will be your results. + * The function also measures the offset of the gyroscope data. The gyroscope offset does not + * depend on the positioning. + * This function needs to be called at the beginning since it can overwrite your settings! + */ + Serial.println("Position you MPU9250 flat and don't move it - calibrating..."); + delay(1000); + myMPU9250.autoOffsets(); + Serial.println("Done!"); + + /* This is a more accurate method for calibration. You have to determine the minimum and maximum + * raw acceleration values of the axes determined in the range +/- 2 g. + * You call the function as follows: setAccOffsets(xMin,xMax,yMin,yMax,zMin,zMax); + * Use either autoOffset or setAccOffsets, not both. + */ + //myMPU9250.setAccOffsets(-14240.0, 18220.0, -17280.0, 15590.0, -20930.0, 12080.0); + + /* The gyroscope data is not zero, even if you don't move the MPU9250. + * To start at zero, you can apply offset values. These are the gyroscope raw values you obtain + * using the +/- 250 degrees/s range. + * Use either autoOffset or setGyrOffsets, not both. + */ + //myMPU9250.setGyrOffsets(45.0, 145.0, -105.0); + + /* You can enable or disable the digital low pass filter (DLPF). If you disable the DLPF, you + * need to select the bandwidth, which can be either 8800 or 3600 Hz. 8800 Hz has a shorter delay, + * but higher noise level. If DLPF is disabled, the output rate is 32 kHz. + * MPU9250_BW_WO_DLPF_3600 + * MPU9250_BW_WO_DLPF_8800 + */ + myMPU9250.enableGyrDLPF(); + //myMPU9250.disableGyrDLPF(MPU9250_BW_WO_DLPF_8800); // bandwidth without DLPF + + /* Digital Low Pass Filter for the gyroscope must be enabled to choose the level. + * MPU9250_DPLF_0, MPU9250_DPLF_2, ...... MPU9250_DPLF_7 + * + * DLPF Bandwidth [Hz] Delay [ms] Output Rate [kHz] + * 0 250 0.97 8 + * 1 184 2.9 1 + * 2 92 3.9 1 + * 3 41 5.9 1 + * 4 20 9.9 1 + * 5 10 17.85 1 + * 6 5 33.48 1 + * 7 3600 0.17 8 + * + * You achieve lowest noise using level 6 + */ + myMPU9250.setGyrDLPF(MPU9250_DLPF_6); + + /* Sample rate divider divides the output rate of the gyroscope and accelerometer. + * Sample rate = Internal sample rate / (1 + divider) + * It can only be applied if the corresponding DLPF is enabled and 0 samples are continuously stored in FIFO. If FIFO is full + * new data will replace the oldest. + * MPU9250_STOP_WHEN_FULL --> self-explaining + */ + //myMPU9250.setFifoMode(MPU9250_STOP_WHEN_FULL); // used below, but explained here + + /* The argument of startFifo defines the data stored in the FIFO + * MPU9250_FIFO_ACC --> Acceleration Data ist stored in FIFO + * MPU9250_FIFO_GYR --> Gyroscope data is stored in FIFO + * MPU9250_FIFO_ACC_GYR --> Acceleration and Gyroscope Data is stored in FIFO + * The library does not (yet) support storing single gyroscope axes data, temperature + * or data from slaves. + */ + //myMPU9250.startFifo(MPU9250_FIFO_ACC); // used below, but explained here + + /* stopFifo(): + * - stops additional writes into Fifo + * - clears the data type written into Fifo (acceleration and/or gyroscope + */ + //myMPU9250.stopFifo(); // used below, but explained here + + /* sets the Fifo counter to zero */ + //myMPU9250.resetFifo(); // used below, but explained here + + + /* sleep() sends the MPU9250 to sleep or wakes it up. + * Please note that the gyroscope needs 35 milliseconds to wake up. + */ + //myMPU9250.sleep(true); + + /* If cycle is set, and standby or sleep are not set, the module will cycle between + * sleep and taking a sample at a rate determined by setLowPowerAccDataRate(). + */ + //myMPU9250.enableCycle(true); + + /* This is a low power standby mode for the gyro function, which allows quick enabling. + * (see data sheet for further information) + */ + //myMPU9250.enableGyrStandby(true); + + + /* You can enable or disable the axes for gyroscope and/or accelerometer measurements. + * By default all axes are enabled. Parameters are: + * MPU9250_ENABLE_XYZ //all axes are enabled (default) + * MPU9250_ENABLE_XY0 // X, Y enabled, Z disabled + * MPU9250_ENABLE_X0Z + * MPU9250_ENABLE_X00 + * MPU9250_ENABLE_0YZ + * MPU9250_ENABLE_0Y0 + * MPU9250_ENABLE_00Z + * MPU9250_ENABLE_000 // all axes disabled + */ + //myMPU9250.enableAccAxes(MPU9250_ENABLE_XYZ); + //myMPU9250.enableGyrAxes(MPU9250_ENABLE_XYZ); + + /* You can choose the following operational modes + * AK8963_PWR_DOWN power down (default) + * AK8963_CONT_MODE_8HZ continuous at 8Hz sample rate + * AK8963_CONT_MODE_100HZ continuous at 100Hz sample rate + * + * In trigger mode the AK8963 goes into power down after the measurement + */ + myMPU9250.setMagOpMode(AK8963_CONT_MODE_8HZ); + delay(100); +} + +void loop() { + +} diff --git a/examples/03-mpu9250/MPU9250_WE/examples/MPU9250_calibration/MPU9250_calibration.ino b/examples/03-mpu9250/MPU9250_WE/examples/MPU9250_calibration/MPU9250_calibration.ino new file mode 100644 index 0000000..adf4e8e --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/examples/MPU9250_calibration/MPU9250_calibration.ino @@ -0,0 +1,164 @@ +/*************************************************************************** +* Example sketch for the MPU9250_WE library +* +* This sketch can be used to determine the (non-auto) offsets for the MPU9250. +* It does not use the internal offset registers. +* +* For the gyroscope offsets just use the raw values you obtain when the module is +* not moved. +* +* For the accelerometer offsets turn the MPU9250 slowly(!) in all directions and find the +* minimum and maximum raw values for all axes. +* +* Insert the values in the corresponding setxxxOffsets() functions. +* +* For further information visit my blog: +* +* https://wolles-elektronikkiste.de/mpu9250-9-achsen-sensormodul-teil-1 (German) +* https://wolles-elektronikkiste.de/en/mpu9250-9-axis-sensor-module-part-1 (English) +* +***************************************************************************/ + +#include +#include +#define MPU9250_ADDR 0x68 + +/* There are several ways to create your MPU9250 object: + * MPU9250_WE myMPU9250 = MPU9250_WE() -> uses Wire / I2C Address = 0x68 + * MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR) -> uses Wire / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2) -> uses the TwoWire object wire2 / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2, MPU9250_ADDR) -> all together + * Successfully tested with two I2C busses on an ESP32 + */ +MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR); + +void setup() { + Serial.begin(115200); + Wire.begin(); + if(!myMPU9250.init()){ + Serial.println("MPU9250 does not respond"); + } + else{ + Serial.println("MPU9250 is connected"); + } + + /* This is a more accurate method for calibration than the autoOffset. You have to + * determine the minimum and maximum raw acceleration values of the axes determined + * in the range +/- 2 g. + * You call the function as follows: setAccOffsets(xMin,xMax,yMin,yMax,zMin,zMax); + * Use either autoOffset or setAccOffsets, not both. + */ + //myMPU9250.setAccOffsets(-14240.0, 18220.0, -17280.0, 15590.0, -20930.0, 12080.0); + + /* The gyroscope data is not zero, even if don't move the MPU9250. + * To start at zero, you can apply offset values. These are the gyroscope raw values you obtain + * using the +/- 250 degrees/s range. + * Use either autoOffset or setGyrOffsets, not both. + */ + //myMPU9250.setGyrOffsets(45.0, 145.0, -105.0); + + /* You can enable or disable the digital low pass filter (DLPF). If you disable the DLPF, you + * need to select the bandwidth, which can be either 8800 or 3600 Hz. 8800 Hz has a shorter delay, + * but higher noise level. If DLPF is disabled, the output rate is 32 kHz. + * MPU9250_BW_WO_DLPF_3600 + * MPU9250_BW_WO_DLPF_8800 + */ + myMPU9250.enableGyrDLPF(); + //myMPU9250.disableGyrDLPF(MPU9250_BW_WO_DLPF_8800); // bandwidth without DLPF + + /* Digital Low Pass Filter for the gyroscope must be enabled to choose the level. + * MPU9250_DPLF_0, MPU9250_DPLF_2, ...... MPU9250_DPLF_7 + * + * DLPF Bandwidth [Hz] Delay [ms] Output Rate [kHz] + * 0 250 0.97 8 + * 1 184 2.9 1 + * 2 92 3.9 1 + * 3 41 5.9 1 + * 4 20 9.9 1 + * 5 10 17.85 1 + * 6 5 33.48 1 + * 7 3600 0.17 8 + * + * You achieve lowest noise using level 6 + */ + myMPU9250.setGyrDLPF(MPU9250_DLPF_6); // lowest noise + + /* MPU9250_GYRO_RANGE_250 250 degrees per second (default) + * MPU9250_GYRO_RANGE_500 500 degrees per second + * MPU9250_GYRO_RANGE_1000 1000 degrees per second + * MPU9250_GYRO_RANGE_2000 2000 degrees per second + */ + myMPU9250.setGyrRange(MPU9250_GYRO_RANGE_250); + + /* MPU9250_ACC_RANGE_2G 2 g + * MPU9250_ACC_RANGE_4G 4 g + * MPU9250_ACC_RANGE_8G 8 g + * MPU9250_ACC_RANGE_16G 16 g + */ + myMPU9250.setAccRange(MPU9250_ACC_RANGE_2G); + + /* Enable/disable the digital low pass filter for the accelerometer + * If disabled the bandwidth is 1.13 kHz, delay is 0.75 ms, output rate is 4 kHz + */ + myMPU9250.enableAccDLPF(true); + + /* Digital low pass filter (DLPF) for the accelerometer, if enabled + * MPU9250_DPLF_0, MPU9250_DPLF_2, ...... MPU9250_DPLF_7 + * DLPF Bandwidth [Hz] Delay [ms] Output rate [kHz] + * 0 460 1.94 1 + * 1 184 5.80 1 + * 2 92 7.80 1 + * 3 41 11.80 1 + * 4 20 19.80 1 + * 5 10 35.70 1 + * 6 5 66.96 1 + * 7 460 1.94 1 + */ + myMPU9250.setAccDLPF(MPU9250_DLPF_6); // lowest noise + + Serial.print("Turn your MPU9250 slowly(!) in all directions to determine "); + Serial.println(" the min/max raw acceleration values."); + Serial.println("For the gyroscope offsets just note the gyro raw values for the unmoved sensor"); + delay(1000); +} + +void loop() { + xyzFloat accRaw; + xyzFloat gyrRaw; + xyzFloat corrAccRaw; + xyzFloat corrGyrRaw; + accRaw = myMPU9250.getAccRawValues(); + gyrRaw = myMPU9250.getGyrRawValues(); + corrAccRaw = myMPU9250.getCorrectedAccRawValues(); + corrGyrRaw = myMPU9250.getCorrectedGyrRawValues(); + + Serial.println("Acceleration raw values without offset:"); + Serial.print(accRaw.x); + Serial.print(" "); + Serial.print(accRaw.y); + Serial.print(" "); + Serial.println(accRaw.z); + + Serial.println("Gyroscope raw values without offset:"); + Serial.print(gyrRaw.x); + Serial.print(" "); + Serial.print(gyrRaw.y); + Serial.print(" "); + Serial.println(gyrRaw.z); + + Serial.println("Acceleration raw values with offset:"); + Serial.print(corrAccRaw.x); + Serial.print(" "); + Serial.print(corrAccRaw.y); + Serial.print(" "); + Serial.println(corrAccRaw.z); + + Serial.println("Gyroscope raw values with offset:"); + Serial.print(corrGyrRaw.x); + Serial.print(" "); + Serial.print(corrGyrRaw.y); + Serial.print(" "); + Serial.println(corrGyrRaw.z); + + delay(2000); +} diff --git a/examples/03-mpu9250/MPU9250_WE/examples/MPU9250_data_ready_interrupt_and_cycle/MPU9250_data_ready_interrupt_and_cycle.ino b/examples/03-mpu9250/MPU9250_WE/examples/MPU9250_data_ready_interrupt_and_cycle/MPU9250_data_ready_interrupt_and_cycle.ino new file mode 100644 index 0000000..1b150a9 --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/examples/MPU9250_data_ready_interrupt_and_cycle/MPU9250_data_ready_interrupt_and_cycle.ino @@ -0,0 +1,172 @@ +/*************************************************************************** +* Example sketch for the MPU9250_WE library +* +* This sketch shows how use the data ready interrupt and the cycle function. +* In cycle function the MPU9250 awakes periodically from power down mode, takes +* a sample and goes back into sleep mode again. The data ready interrupt informs +* new data is available. You see there is no delay in the main loop. The output +* rate is cycle controlled. +* +* For further information visit my blog: +* +* https://wolles-elektronikkiste.de/mpu9250-9-achsen-sensormodul-teil-1 (German) +* https://wolles-elektronikkiste.de/en/mpu9250-9-axis-sensor-module-part-1 (English) +* +***************************************************************************/ + +#include +#include +#define MPU9250_ADDR 0x68 + +const int intPin = 2; +volatile bool dataReady = false; + +/* There are several ways to create your MPU9250 object: + * MPU9250_WE myMPU9250 = MPU9250_WE() -> uses Wire / I2C Address = 0x68 + * MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR) -> uses Wire / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2) -> uses the TwoWire object wire2 / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2, MPU9250_ADDR) -> all together + * Successfully tested with two I2C busses on an ESP32 + */ +MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR); + +void setup() { + Serial.begin(115200); + Wire.begin(); + if(!myMPU9250.init()){ + Serial.println("MPU9250 does not respond"); + } + else{ + Serial.println("MPU9250 is connected"); + } + + /* The slope of the curve of acceleration vs measured values fits quite well to the theoretical + * values, e.g. 16384 units/g in the +/- 2g range. But the starting point, if you position the + * MPU9250 flat, is not necessarily 0g/0g/1g for x/y/z. The autoOffset function measures offset + * values. It assumes your MPU9250 is positioned flat with its x,y-plane. The more you deviate + * from this, the less accurate will be your results. + * The function also measures the offset of the gyroscope data. The gyroscope offset does not + * depend on the positioning. + * This function needs to be called at the beginning since it can overwrite your settings! + */ + Serial.println("Position you MPU9250 flat and don't move it - calibrating..."); + delay(1000); + myMPU9250.autoOffsets(); + Serial.println("Done!"); + + /* This is a more accurate method for calibration. You have to determine the minimum and maximum + * raw acceleration values of the axes determined in the range +/- 2 g. + * You call the function as follows: setAccOffsets(xMin,xMax,yMin,yMax,zMin,zMax); + * Use either autoOffset or setAccOffsets, not both. + */ + //myMPU9250.setAccOffsets(-14240.0, 18220.0, -17280.0, 15590.0, -20930.0, 12080.0); + + /* Sample rate divider divides the output rate of the gyroscope and accelerometer. + * Sample rate = Internal sample rate / (1 + divider) + * It can only be applied if the corresponding DLPF is enabled and 0 +#include +#define MPU9250_ADDR 0x68 + +/* There are several ways to create your MPU9250 object: + * MPU9250_WE myMPU9250 = MPU9250_WE() -> uses Wire / I2C Address = 0x68 + * MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR) -> uses Wire / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2) -> uses the TwoWire object wire2 / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2, MPU9250_ADDR) -> all together + * Successfully tested with two I2C busses on an ESP32 + */ +MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR); + +void setup() { + Serial.begin(115200); + Wire.begin(); + if(!myMPU9250.init()){ + Serial.println("MPU9250 does not respond"); + } + else{ + Serial.println("MPU9250 is connected"); + } + + /* The slope of the curve of acceleration vs measured values fits quite well to the theoretical + * values, e.g. 16384 units/g in the +/- 2g range. But the starting point, if you position the + * MPU9250 flat, is not necessarily 0g/0g/1g for x/y/z. The autoOffset function measures offset + * values. It assumes your MPU9250 is positioned flat with its x,y-plane. The more you deviate + * from this, the less accurate will be your results. + * The function also measures the offset of the gyroscope data. The gyroscope offset does not + * depend on the positioning. + * This function needs to be called at the beginning since it can overwrite your settings! + */ + Serial.println("Position you MPU9250 flat and don't move it - calibrating..."); + delay(1000); + myMPU9250.autoOffsets(); + Serial.println("Done!"); + + /* The gyroscope data is not zero, even if you don't move the MPU9250. + * To start at zero, you can apply offset values. These are the gyroscope raw values you obtain + * using the +/- 250 degrees/s range. + * Use either autoOffset or setGyrOffsets, not both. + */ + //myMPU9250.setGyrOffsets(45.0, 145.0, -105.0); + + /* You can enable or disable the digital low pass filter (DLPF). If you disable the DLPF, you + * need to select the bandwidth, which can be either 8800 or 3600 Hz. 8800 Hz has a shorter delay, + * but higher noise level. If DLPF is disabled, the output rate is 32 kHz. + * MPU9250_BW_WO_DLPF_3600 + * MPU9250_BW_WO_DLPF_8800 + */ + myMPU9250.enableGyrDLPF(); + //myMPU9250.disableGyrDLPF(MPU9250_BW_WO_DLPF_8800); // bandwidth without DLPF + + /* Digital Low Pass Filter for the gyroscope must be enabled to choose the level. + * MPU9250_DPLF_0, MPU9250_DPLF_2, ...... MPU9250_DPLF_7 + * + * DLPF Bandwidth [Hz] Delay [ms] Output Rate [kHz] + * 0 250 0.97 8 + * 1 184 2.9 1 + * 2 92 3.9 1 + * 3 41 5.9 1 + * 4 20 9.9 1 + * 5 10 17.85 1 + * 6 5 33.48 1 + * 7 3600 0.17 8 + * + * You achieve lowest noise using level 6 + */ + myMPU9250.setGyrDLPF(MPU9250_DLPF_6); + + /* Sample rate divider divides the output rate of the gyroscope and accelerometer. + * Sample rate = Internal sample rate / (1 + divider) + * It can only be applied if the corresponding DLPF is enabled and 0 +#include +#define MPU9250_ADDR 0x68 + +/* There are several ways to create your MPU9250 object: + * MPU9250_WE myMPU9250 = MPU9250_WE() -> uses Wire / I2C Address = 0x68 + * MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR) -> uses Wire / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2) -> uses the TwoWire object wire2 / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2, MPU9250_ADDR) -> all together + * Successfully tested with two I2C busses on an ESP32 + */ +MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR); + +void setup() { + Serial.begin(115200); + Wire.begin(); + if(!myMPU9250.init()){ + Serial.println("MPU9250 does not respond"); + } + else{ + Serial.println("MPU9250 is connected"); + } + if(!myMPU9250.initMagnetometer()){ + Serial.println("Magnetometer does not respond"); + } + else{ + Serial.println("Magnetometer is connected"); + } + + /* You can choose the following operational modes + * AK8963_PWR_DOWN power down (default) + * AK8963_CONT_MODE_8HZ continuous at 8Hz sample rate + * AK8963_CONT_MODE_100HZ continuous at 100Hz sample rate + * + * In trigger mode the AK8963 goes into power down after the measurement + */ + myMPU9250.setMagOpMode(AK8963_CONT_MODE_100HZ); + + /* In continuous mode you need to wait for the first data to be available. If you + * comment the line below you will probably obtain zero. + */ + delay(200); +} + +void loop() { + xyzFloat magValue = myMPU9250.getMagValues(); // returns magnetic flux density [µT] + + Serial.println("Magnetometer Data in µTesla: "); + Serial.print(magValue.x); + Serial.print(" "); + Serial.print(magValue.y); + Serial.print(" "); + Serial.println(magValue.z); + + delay(1000); +} diff --git a/examples/03-mpu9250/MPU9250_WE/examples/MPU9250_pitch_and_roll/MPU9250_pitch_and_roll.ino b/examples/03-mpu9250/MPU9250_WE/examples/MPU9250_pitch_and_roll/MPU9250_pitch_and_roll.ino new file mode 100644 index 0000000..7628ba8 --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/examples/MPU9250_pitch_and_roll/MPU9250_pitch_and_roll.ino @@ -0,0 +1,119 @@ +/*************************************************************************** +* Example sketch for the MPU9250_WE library +* +* This sketch shows how to measure pitch and roll angles from the MPU9250. +* I have also included the corrected angle method for comparison. +* +* For further information visit my blog: +* +* https://wolles-elektronikkiste.de/mpu9250-9-achsen-sensormodul-teil-1 (German) +* https://wolles-elektronikkiste.de/en/mpu9250-9-axis-sensor-module-part-1 (English) +* +***************************************************************************/ + +#include +#include +#define MPU9250_ADDR 0x68 + +/* There are several ways to create your MPU9250 object: + * MPU9250_WE myMPU9250 = MPU9250_WE() -> uses Wire / I2C Address = 0x68 + * MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR) -> uses Wire / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2) -> uses the TwoWire object wire2 / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2, MPU9250_ADDR) -> all together + * Successfully tested with two I2C busses on an ESP32 + */ +MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR); + +void setup() { + Serial.begin(115200); + Wire.begin(); + if(!myMPU9250.init()){ + Serial.println("MPU9250 does not respond"); + } + else{ + Serial.println("MPU9250 is connected"); + } + + /* The slope of the curve of acceleration vs measured values fits quite well to the theoretical + * values, e.g. 16384 units/g in the +/- 2g range. But the starting point, if you position the + * MPU9250 flat, is not necessarily 0g/0g/1g for x/y/z. The autoOffset function measures offset + * values. It assumes your MPU9250 is positioned flat with its x,y-plane. The more you deviate + * from this, the less accurate will be your results. + * The function also measures the offset of the gyroscope data. The gyroscope offset does not + * depend on the positioning. + * This function needs to be called at the beginning since it can overwrite your settings! + */ + Serial.println("Position you MPU9250 flat and don't move it - calibrating..."); + delay(1000); + myMPU9250.autoOffsets(); + Serial.println("Done!"); + + /* This is a more accurate method for calibration. You have to determine the minimum and maximum + * raw acceleration values of the axes determined in the range +/- 2 g. + * You call the function as follows: setAccOffsets(xMin,xMax,yMin,yMax,zMin,zMax); + * Use either autoOffset or setAccOffsets, not both. + */ + //myMPU9250.setAccOffsets(-14240.0, 18220.0, -17280.0, 15590.0, -20930.0, 12080.0); + + /* Sample rate divider divides the output rate of the gyroscope and accelerometer. + * Sample rate = Internal sample rate / (1 + divider) + * It can only be applied if the corresponding DLPF is enabled and 0 +#include +#define MPU9250_ADDR 0x68 + +MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR); + +void setup() { + Serial.begin(115200); + Wire.begin(); + if(!myMPU9250.init()){ + Serial.println("MPU9250 does not respond"); + } + else{ + Serial.println("MPU9250 is connected"); + } + if(!myMPU9250.initMagnetometer()){ + Serial.println("Magnetometer does not respond"); + } + else{ + Serial.println("Magnetometer is connected"); + } + + Serial.println("Position you MPU9250 flat and don't move it - calibrating..."); + delay(1000); + myMPU9250.autoOffsets(); + Serial.println("Done!"); + + myMPU9250.enableGyrDLPF(); + myMPU9250.setGyrDLPF(MPU9250_DLPF_6); + myMPU9250.setSampleRateDivider(5); + myMPU9250.setGyrRange(MPU9250_GYRO_RANGE_250); + myMPU9250.setAccRange(MPU9250_ACC_RANGE_2G); + myMPU9250.enableAccDLPF(true); + myMPU9250.setAccDLPF(MPU9250_DLPF_6); + myMPU9250.setMagOpMode(AK8963_CONT_MODE_100HZ); + delay(200); +} + +void loop() { + xyzFloat gValue = myMPU9250.getGValues(); + xyzFloat gyr = myMPU9250.getGyrValues(); + xyzFloat magValue = myMPU9250.getMagValues(); + float temp = myMPU9250.getTemperature(); + float resultantG = myMPU9250.getResultantG(gValue); + + Serial.println("Acceleration in g (x,y,z):"); + Serial.print(gValue.x); + Serial.print(" "); + Serial.print(gValue.y); + Serial.print(" "); + Serial.println(gValue.z); + Serial.print("Resultant g: "); + Serial.println(resultantG); + + Serial.println("Gyroscope data in degrees/s: "); + Serial.print(gyr.x); + Serial.print(" "); + Serial.print(gyr.y); + Serial.print(" "); + Serial.println(gyr.z); + + Serial.println("Magnetometer Data in µTesla: "); + Serial.print(magValue.x); + Serial.print(" "); + Serial.print(magValue.y); + Serial.print(" "); + Serial.println(magValue.z); + + Serial.print("Temperature in °C: "); + Serial.println(temp); + + Serial.println("********************************************"); + +/* Since the MPU9250 controls the AK8963 it is important to first set the + * magnetometer to sleep mode and then the MPU9250. For the wake up + * procedure it is the other way round. + */ + myMPU9250.setMagOpMode(AK8963_PWR_DOWN); // set the magnetometer to sleep mode + myMPU9250.sleep(true); // set the MPU9250 to sleep mode + delay(10000); + myMPU9250.sleep(false); // wake up the MPU9250 + myMPU9250.setMagOpMode(AK8963_CONT_MODE_100HZ); // wake up the magnetometer + delay(200); // give it a bit of time + +} diff --git a/examples/03-mpu9250/MPU9250_WE/examples/MPU9250_wake_on_motion_interrupt/MPU9250_wake_on_motion_interrupt.ino b/examples/03-mpu9250/MPU9250_WE/examples/MPU9250_wake_on_motion_interrupt/MPU9250_wake_on_motion_interrupt.ino new file mode 100644 index 0000000..3f72c79 --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/examples/MPU9250_wake_on_motion_interrupt/MPU9250_wake_on_motion_interrupt.ino @@ -0,0 +1,198 @@ +/*************************************************************************** +* Example sketch for the MPU9250_WE library +* +* This sketch shows how to use the wake-on-motion interrupt. +* Interestingly, the MPU9250 does not seem to wake up from power down mode even +* when the wake-on-motion conditions are met. To me the name "wake on motion" is +* a bit misleading. It's just an acceleration controlled interrupt. +* +* For further information visit my blog: +* +* https://wolles-elektronikkiste.de/mpu9250-9-achsen-sensormodul-teil-1 (German) +* https://wolles-elektronikkiste.de/en/mpu9250-9-axis-sensor-module-part-1 (English) +* +***************************************************************************/ + +#include +#include +#define MPU9250_ADDR 0x68 + +const int intPin = 2; +volatile bool motion = false; + +/* There are several ways to create your MPU9250 object: + * MPU9250_WE myMPU9250 = MPU9250_WE() -> uses Wire / I2C Address = 0x68 + * MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR) -> uses Wire / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2) -> uses the TwoWire object wire2 / MPU9250_ADDR + * MPU9250_WE myMPU9250 = MPU9250_WE(&wire2, MPU9250_ADDR) -> all together + * Successfully tested with two I2C busses on an ESP32 + */ +MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR); + +void setup() { + Serial.begin(115200); + Wire.begin(); + if(!myMPU9250.init()){ + Serial.println("MPU9250 does not respond"); + } + else{ + Serial.println("MPU9250 is connected"); + } + + /* The slope of the curve of acceleration vs measured values fits quite well to the theoretical + * values, e.g. 16384 units/g in the +/- 2g range. But the starting point, if you position the + * MPU9250 flat, is not necessarily 0g/0g/1g for x/y/z. The autoOffset function measures offset + * values. It assumes your MPU9250 is positioned flat with its x,y-plane. The more you deviate + * from this, the less accurate will be your results. + * The function also measures the offset of the gyroscope data. The gyroscope offset does not + * depend on the positioning. + * This function needs to be called at the beginning since it can overwrite your settings! + */ + Serial.println("Position you MPU9250 flat and don't move it - calibrating..."); + delay(1000); + myMPU9250.autoOffsets(); + Serial.println("Done!"); + + /* This is a more accurate method for calibration. You have to determine the minimum and maximum + * raw acceleration values of the axes determined in the range +/- 2 g. + * You call the function as follows: setAccOffsets(xMin,xMax,yMin,yMax,zMin,zMax); + * Use either autoOffset or setAccOffsets, not both. + */ + //myMPU9250.setAccOffsets(-14240.0, 18220.0, -17280.0, 15590.0, -20930.0, 12080.0); + + /* Sample rate divider divides the output rate of the gyroscope and accelerometer. + * Sample rate = Internal sample rate / (1 + divider) + * It can only be applied if the corresponding DLPF is enabled and 0 +#include +#define MPU9250_ADDR 0x68 +MPU9250_WE myMPU9250 = MPU9250_WE(MPU9250_ADDR); + +void setup() { + byte whoAmICode = 0x00; + Serial.begin(115200); + Wire.begin(); + myMPU9250.init(); + + whoAmICode = myMPU9250.whoAmI(); + Serial.print("WhoAmI Register: 0x"); + Serial.println(whoAmICode, HEX); + switch(whoAmICode){ + case(0x70): + Serial.println("Your device is an MPU6500."); + Serial.println("The MPU6500 does not have a magnetometer."); + break; + case(0x71): + Serial.println("Your device is an MPU9250"); + break; + case(0x73): + Serial.println("Your device is an MPU9255"); + Serial.println("Not sure if it works with this library, just try"); + break; + case(0x75): + Serial.println("Your device is probably an MPU6515"); + Serial.println("Not sure if it works with this library, just try"); + break; + case(0x00): + Serial.println("Can't connect to your device. Check all connections."); + break; + default: + Serial.println("Unknown device - it may work with this library or not, just try"); + } +} + +void loop() { +} diff --git a/examples/03-mpu9250/MPU9250_WE/keywords.txt b/examples/03-mpu9250/MPU9250_WE/keywords.txt new file mode 100644 index 0000000..20d85ea --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/keywords.txt @@ -0,0 +1,286 @@ +####################################### +# Syntax Coloring Map For ADXL345_WE +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +MPU9250_WE KEYWORD1 +MPU6500_WE KEYWORD1 +MPU6050_WE KEYWORD1 + +# ENUM TYPES +MPU9250_bw_wo_dlpf KEYWORD1 +MPU9250_dlpf KEYWORD1 +MPU9250_gyroRange KEYWORD1 +MPU9250_accRange KEYWORD1 +MPU9250_lpAccODR KEYWORD1 +MPU9250_intPinPol KEYWORD1 +MPU9250_intType KEYWORD1 +MPU9250_womEn KEYWORD1 +MPU9250_womCompEn KEYWORD1 +MPU9250_xyzEn KEYWORD1 +MPU9250_orientation KEYWORD1 +MPU9250_fifoMode KEYWORD1 +MPU9250_fifo_type KEYWORD1 +AK8963_opMode KEYWORD1 + +# STRUCT TYPES +xyzFloat KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +init KEYWORD2 +autoOffsets KEYWORD2 +setAccOffsets KEYWORD2 +getAccOffsets KEYWORD2 +setGyrOffsets KEYWORD2 +getGyrOffsets KEYWORD2 +setGyrDLPF KEYWORD2 +setSampleRateDivider KEYWORD2 +setGyrRange KEYWORD2 +enableGyrDLPF KEYWORD2 +disableGyrDLPF KEYWORD2 +setAccRange KEYWORD2 +enableAccDLPF KEYWORD2 +setAccDLPF KEYWORD2 +setLowPowerAccDataRate KEYWORD2 +enableAccAxes KEYWORD2 +enableGyrAxes KEYWORD2 +setSPIClockSpeed KEYWORD2 +getAccRawValues KEYWORD2 +getCorrectedAccRawValues KEYWORD2 +getGValues KEYWORD2 +getAccRawValuesFromFifo KEYWORD2 +getCorrectedAccRawValuesFromFifo KEYWORD2 +getGValuesFromFifo KEYWORD2 +getResultantG KEYWORD2 +getTemperature KEYWORD2 +getGyrRawValues KEYWORD2 +getCorrectedGyrRawValues KEYWORD2 +getGyrValues KEYWORD2 +getGyrValuesFromFifo KEYWORD2 +getMagValues KEYWORD2 +getAngles KEYWORD2 +getOrientation KEYWORD2 +getOrientationAsString KEYWORD2 +getPitch KEYWORD2 +getRoll KEYWORD2 +sleep KEYWORD2 +enableCycle KEYWORD2 +enableGyrStandby KEYWORD2 +setIntPinPolarity KEYWORD2 +enableIntLatch KEYWORD2 +enableClearIntByAnyRead KEYWORD2 +enableInterrupt KEYWORD2 +disableInterrupt KEYWORD2 +checkInterrupt KEYWORD2 +readAndClearInterrupts KEYWORD2 +setWakeOnMotionThreshold KEYWORD2 +enableWakeOnMotion KEYWORD2 +startFifo KEYWORD2 +stopFifo KEYWORD2 +enableFifo KEYWORD2 +resetFifo KEYWORD2 +getFifoCount KEYWORD2 +setFifoMode KEYWORD2 +getNumberOfFifoDataSets KEYWORD2 +findFifoBegin KEYWORD2 +initMagnetometer KEYWORD2 +setMagnetometer16Bit KEYWORD2 +setMagOpMode KEYWORD2 +isMagOverflow KEYWORD2 +getStatus2Register KEYWORD2 +startMagMeasurement KEYWORD2 +isMagDataReady KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### + +# ENUM VALUES +MPU9250_BW_WO_DLPF_3600 LITERAL1 +MPU9250_BW_WO_DLPF_8800 LITERAL1 +MPU9250_DLPF_0 LITERAL1 +MPU9250_DLPF_1 LITERAL1 +MPU9250_DLPF_2 LITERAL1 +MPU9250_DLPF_3 LITERAL1 +MPU9250_DLPF_4 LITERAL1 +MPU9250_DLPF_5 LITERAL1 +MPU9250_DLPF_6 LITERAL1 +MPU9250_DLPF_7 LITERAL1 +MPU9250_GYRO_RANGE_250 LITERAL1 +MPU9250_GYRO_RANGE_500 LITERAL1 +MPU9250_GYRO_RANGE_1000 LITERAL1 +MPU9250_GYRO_RANGE_2000 LITERAL1 +MPU9250_ACC_RANGE_2G LITERAL1 +MPU9250_ACC_RANGE_4G LITERAL1 +MPU9250_ACC_RANGE_8G LITERAL1 +MPU9250_ACC_RANGE_16G LITERAL1 +MPU9250_LP_ACC_ODR_0_24 LITERAL1 +MPU9250_LP_ACC_ODR_0_49 LITERAL1 +MPU9250_LP_ACC_ODR_0_98 LITERAL1 +MPU9250_LP_ACC_ODR_1_95 LITERAL1 +MPU9250_LP_ACC_ODR_3_91 LITERAL1 +MPU9250_LP_ACC_ODR_7_81 LITERAL1 +MPU9250_LP_ACC_ODR_15_63 LITERAL1 +MPU9250_LP_ACC_ODR_31_25 +MPU9250_LP_ACC_ODR_62_5 LITERAL1 +MPU9250_LP_ACC_ODR_125 LITERAL1 +MPU9250_LP_ACC_ODR_250 LITERAL1 +MPU9250_LP_ACC_ODR_500 LITERAL1 +MPU9250_ACT_HIGH LITERAL1 +MPU9250_ACT_LOW LITERAL1 +MPU9250_DATA_READY LITERAL1 +MPU9250_FIFO_OVF LITERAL1 +MPU9250_WOM_INT LITERAL1 +MPU9250_WOM_DISABLE LITERAL1 +MPU9250_WOM_ENABLE LITERAL1 +MPU9250_WOM_COMP_DISABLE LITERAL1 +MPU9250_WOM_COMP_ENABLE LITERAL1 +MPU9250_ENABLE_XYZ LITERAL1 +MPU9250_ENABLE_XY0 LITERAL1 +MPU9250_ENABLE_X0Z LITERAL1 +MPU9250_ENABLE_X00 LITERAL1 +MPU9250_ENABLE_0YZ LITERAL1 +MPU9250_ENABLE_0Y0 LITERAL1 +MPU9250_ENABLE_00Z LITERAL1 +MPU9250_ENABLE_000 LITERAL1 +MPU9250_FLAT LITERAL1 +MPU9250_FLAT_1 LITERAL1 +MPU9250_XY LITERAL1 +MPU9250_XY_1 LITERAL1 +MPU9250_YX LITERAL1 +MPU9250_YX_1 LITERAL1 +MPU9250_CONTINUOUS LITERAL1 +MPU9250_STOP_WHEN_FULL LITERAL1 +MPU9250_FIFO_ACC LITERAL1 +MPU9250_FIFO_GYR LITERAL1 +MPU9250_FIFO_ACC_GYR LITERAL1 + +MPU6500_BW_WO_DLPF_3600 LITERAL1 +MPU6500_BW_WO_DLPF_8800 LITERAL1 +MPU6500_DLPF_0 LITERAL1 +MPU6500_DLPF_1 LITERAL1 +MPU6500_DLPF_2 LITERAL1 +MPU6500_DLPF_3 LITERAL1 +MPU6500_DLPF_4 LITERAL1 +MPU6500_DLPF_5 LITERAL1 +MPU6500_DLPF_6 LITERAL1 +MPU6500_DLPF_7 LITERAL1 +MPU6500_GYRO_RANGE_250 LITERAL1 +MPU6500_GYRO_RANGE_500 LITERAL1 +MPU6500_GYRO_RANGE_1000 LITERAL1 +MPU6500_GYRO_RANGE_2000 LITERAL1 +MPU6500_ACC_RANGE_2G LITERAL1 +MPU6500_ACC_RANGE_4G LITERAL1 +MPU6500_ACC_RANGE_8G LITERAL1 +MPU6500_ACC_RANGE_16G LITERAL1 +MPU6500_LP_ACC_ODR_0_24 LITERAL1 +MPU6500_LP_ACC_ODR_0_49 LITERAL1 +MPU6500_LP_ACC_ODR_0_98 LITERAL1 +MPU6500_LP_ACC_ODR_1_95 LITERAL1 +MPU6500_LP_ACC_ODR_3_91 LITERAL1 +MPU6500_LP_ACC_ODR_7_81 LITERAL1 +MPU6500_LP_ACC_ODR_15_63 LITERAL1 +MPU6500_LP_ACC_ODR_31_25 +MPU6500_LP_ACC_ODR_62_5 LITERAL1 +MPU6500_LP_ACC_ODR_125 LITERAL1 +MPU6500_LP_ACC_ODR_250 LITERAL1 +MPU6500_LP_ACC_ODR_500 LITERAL1 +MPU6500_ACT_HIGH LITERAL1 +MPU6500_ACT_LOW LITERAL1 +MPU6500_DATA_READY LITERAL1 +MPU6500_FIFO_OVF LITERAL1 +MPU6500_WOM_INT LITERAL1 +MPU6500_WOM_DISABLE LITERAL1 +MPU6500_WOM_ENABLE LITERAL1 +MPU6500_WOM_COMP_DISABLE LITERAL1 +MPU6500_WOM_COMP_ENABLE LITERAL1 +MPU6500_ENABLE_XYZ LITERAL1 +MPU6500_ENABLE_XY0 LITERAL1 +MPU6500_ENABLE_X0Z LITERAL1 +MPU6500_ENABLE_X00 LITERAL1 +MPU6500_ENABLE_0YZ LITERAL1 +MPU6500_ENABLE_0Y0 LITERAL1 +MPU6500_ENABLE_00Z LITERAL1 +MPU6500_ENABLE_000 LITERAL1 +MPU6500_FLAT LITERAL1 +MPU6500_FLAT_1 LITERAL1 +MPU6500_XY LITERAL1 +MPU6500_XY_1 LITERAL1 +MPU6500_YX LITERAL1 +MPU6500_YX_1 LITERAL1 +MPU6500_CONTINUOUS LITERAL1 +MPU6500_STOP_WHEN_FULL LITERAL1 +MPU6500_FIFO_ACC LITERAL1 +MPU6500_FIFO_GYR LITERAL1 +MPU6500_FIFO_ACC_GYR LITERAL1 + +MPU6050_BW_WO_DLPF_3600 LITERAL1 +MPU6050_BW_WO_DLPF_8800 LITERAL1 +MPU6050_DLPF_0 LITERAL1 +MPU6050_DLPF_1 LITERAL1 +MPU6050_DLPF_2 LITERAL1 +MPU6050_DLPF_3 LITERAL1 +MPU6050_DLPF_4 LITERAL1 +MPU6050_DLPF_5 LITERAL1 +MPU6050_DLPF_6 LITERAL1 +MPU6050_DLPF_7 LITERAL1 +MPU6050_GYRO_RANGE_250 LITERAL1 +MPU6050_GYRO_RANGE_500 LITERAL1 +MPU6050_GYRO_RANGE_1000 LITERAL1 +MPU6050_GYRO_RANGE_2000 LITERAL1 +MPU6050_ACC_RANGE_2G LITERAL1 +MPU6050_ACC_RANGE_4G LITERAL1 +MPU6050_ACC_RANGE_8G LITERAL1 +MPU6050_ACC_RANGE_16G LITERAL1 +MPU6050_LP_ACC_ODR_0_24 LITERAL1 +MPU6050_LP_ACC_ODR_0_49 LITERAL1 +MPU6050_LP_ACC_ODR_0_98 LITERAL1 +MPU6050_LP_ACC_ODR_1_95 LITERAL1 +MPU6050_LP_ACC_ODR_3_91 LITERAL1 +MPU6050_LP_ACC_ODR_7_81 LITERAL1 +MPU6050_LP_ACC_ODR_15_63 LITERAL1 +MPU6050_LP_ACC_ODR_31_25 +MPU6050_LP_ACC_ODR_62_5 LITERAL1 +MPU6050_LP_ACC_ODR_125 LITERAL1 +MPU6050_LP_ACC_ODR_250 LITERAL1 +MPU6050_LP_ACC_ODR_500 LITERAL1 +MPU6050_ACT_HIGH LITERAL1 +MPU6050_ACT_LOW LITERAL1 +MPU6050_DATA_READY LITERAL1 +MPU6050_FIFO_OVF LITERAL1 +MPU6050_WOM_INT LITERAL1 +MPU6050_WOM_DISABLE LITERAL1 +MPU6050_WOM_ENABLE LITERAL1 +MPU6050_WOM_COMP_DISABLE LITERAL1 +MPU6050_WOM_COMP_ENABLE LITERAL1 +MPU6050_ENABLE_XYZ LITERAL1 +MPU6050_ENABLE_XY0 LITERAL1 +MPU6050_ENABLE_X0Z LITERAL1 +MPU6050_ENABLE_X00 LITERAL1 +MPU6050_ENABLE_0YZ LITERAL1 +MPU6050_ENABLE_0Y0 LITERAL1 +MPU6050_ENABLE_00Z LITERAL1 +MPU6050_ENABLE_000 LITERAL1 +MPU6050_FLAT LITERAL1 +MPU6050_FLAT_1 LITERAL1 +MPU6050_XY LITERAL1 +MPU6050_XY_1 LITERAL1 +MPU6050_YX LITERAL1 +MPU6050_YX_1 LITERAL1 +MPU6050_CONTINUOUS LITERAL1 +MPU6050_STOP_WHEN_FULL LITERAL1 +MPU6050_FIFO_ACC LITERAL1 +MPU6050_FIFO_GYR LITERAL1 +MPU6050_FIFO_ACC_GYR LITERAL1 + +AK8963_PWR_DOWN LITERAL1 +AK8963_TRIGGER_MODE LITERAL1 +AK8963_CONT_MODE_8HZ LITERAL1 +AK8963_CONT_MODE_100HZ LITERAL1 +AK8963_FUSE_ROM_ACC_MODE LITERAL1 \ No newline at end of file diff --git a/examples/03-mpu9250/MPU9250_WE/library.properties b/examples/03-mpu9250/MPU9250_WE/library.properties new file mode 100644 index 0000000..cfb0d0f --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/library.properties @@ -0,0 +1,10 @@ +name=MPU9250_WE +version=1.2.12 +author=Wolfgang Ewald +maintainer=Wolfgang Ewald +sentence=A library for the 9-axis accelerometer, gyrometer and magnetometer MPU9250 and the MPU6500 +paragraph=An easy-to-use library with lots of example sketches. It allows to use most of the features of the MPU9250 including FIFO. I2C and SPI are implemented. +category=Sensors +url=https://github.com/wollewald/MPU9250_WE +architectures=* +includes=MPU9250_WE.h diff --git a/examples/03-mpu9250/MPU9250_WE/src/MPU6050.cpp b/examples/03-mpu9250/MPU9250_WE/src/MPU6050.cpp new file mode 100644 index 0000000..2188614 --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/src/MPU6050.cpp @@ -0,0 +1,76 @@ +/******************************************************************** +* This is a library for the 9-axis gyroscope, accelerometer and magnetometer MPU9250. +* +* You'll find an example which should enable you to use the library. +* +* You are free to use it, change it or build on it. In case you like +* it, it would be cool if you give it a star. +* +* If you find bugs, please inform me! +* +* Written by Wolfgang (Wolle) Ewald +* +* For further information visit my blog: +* +* https://wolles-elektronikkiste.de/mpu9250-9-achsen-sensormodul-teil-1 (German) +* https://wolles-elektronikkiste.de/en/mpu9250-9-axis-sensor-module-part-1 (English) +* +*********************************************************************/ + +#include "MPU6050_WE.h" + +/* Others */ +uint8_t constexpr MPU6050_WE::WHO_AM_I_CODE; + +/************ Constructors ************/ + +MPU6050_WE::MPU6050_WE(uint8_t addr) + : MPU6500_WE(addr) +{ + // intentionally empty +} + +MPU6050_WE::MPU6050_WE() + : MPU6500_WE() +{ + // intentionally empty +} + +MPU6050_WE::MPU6050_WE(TwoWire *w, uint8_t addr) + : MPU6500_WE(w, addr) +{ + // intentionally empty +} + +MPU6050_WE::MPU6050_WE(TwoWire *w) + : MPU6500_WE(w) +{ + // intentionally empty +} + +MPU6050_WE::MPU6050_WE(SPIClass *s, int cs, bool spi, bool pc) + : MPU6500_WE(s, cs, spi, pc) +{ + // intentionally empty +} + +MPU6050_WE::MPU6050_WE(SPIClass *s, int cs, int mosi, int miso, int scl, bool spi, bool pc) + : MPU6500_WE(s, cs, mosi, miso, scl, spi, pc) +{ + // intentionally empty +} + +/************ Init ************/ + +bool MPU6050_WE::init(){ + return MPU6500_WE::init(WHO_AM_I_CODE); +} + +/********* Temperature *********/ +/* replaces the method of MPU6500 / 9250 */ + +float MPU6050_WE::getTemperature(){ + int16_t regVal16 = readMPU9250Register16(REGISTER_TEMP_OUT); + float tmp = (regVal16/340.0 + 36.53); + return tmp; +} diff --git a/examples/03-mpu9250/MPU9250_WE/src/MPU6050_WE.h b/examples/03-mpu9250/MPU9250_WE/src/MPU6050_WE.h new file mode 100644 index 0000000..ca4e257 --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/src/MPU6050_WE.h @@ -0,0 +1,128 @@ +/****************************************************************************** + * + * This is a library for the 6-axis gyroscope, accelerometer and magnetometer MPU6050. + * + * Please note: the library is primarily written for the MPU6500 and the MPU9250. The + * support for the MPU6050 is limited. + * + * You are free to use it, change it or build on it. In case you like it, it would + * be cool if you give it a star. + * + * If you find bugs, please inform me! + * + * Written by Wolfgang (Wolle) Ewald + * + * For further information visit my blog: + * + * https://wolles-elektronikkiste.de/mpu9250-9-achsen-sensormodul-teil-1 (German) + * https://wolles-elektronikkiste.de/en/mpu9250-9-axis-sensor-module-part-1 (English) + * + * + ******************************************************************************/ + +#ifndef MPU6050_WE_H_ +#define MPU6050_WE_H_ + +#include "MPU6500_WE.h" + +/* + * Please note that the following '#define's are only kept for backward-compatibility. + * They do only reference correctly typed and static [i.e. uniquely instantiated] + * values defined in the respective class. + * If you do want to change a value, do not change any of these '#define's but + * instead the actual referenced value. + * + */ + +/* Registers MPU6050 */ +#define MPU6050_SELF_TEST_X_GYRO MPU6500_WE::REGISTER_SELF_TEST_X_GYRO +#define MPU6050_SELF_TEST_Y_GYRO MPU6500_WE::REGISTER_SELF_TEST_Y_GYRO +#define MPU6050_SELF_TEST_Z_GYRO MPU6500_WE::REGISTER_SELF_TEST_Z_GYRO +#define MPU6050_SELF_TEST_X_ACCEL MPU6500_WE::REGISTER_SELF_TEST_X_ACCEL +#define MPU6050_SELF_TEST_Y_ACCEL MPU6500_WE::REGISTER_SELF_TEST_Y_ACCEL +#define MPU6050_SELF_TEST_Z_ACCEL MPU6500_WE::REGISTER_SELF_TEST_Z_ACCEL +#define MPU6050_XG_OFFSET_H MPU6500_WE::REGISTER_XG_OFFSET_H +#define MPU6050_XG_OFFSET_L MPU6500_WE::REGISTER_XG_OFFSET_L +#define MPU6050_YG_OFFSET_H MPU6500_WE::REGISTER_YG_OFFSET_H +#define MPU6050_YG_OFFSET_L MPU6500_WE::REGISTER_YG_OFFSET_L +#define MPU6050_ZG_OFFSET_H MPU6500_WE::REGISTER_ZG_OFFSET_H +#define MPU6050_ZG_OFFSET_L MPU6500_WE::REGISTER_ZG_OFFSET_L +#define MPU6050_SMPLRT_DIV MPU6500_WE::REGISTER_SMPLRT_DIV +#define MPU6050_CONFIG MPU6500_WE::REGISTER_CONFIG +#define MPU6050_GYRO_CONFIG MPU6500_WE::REGISTER_GYRO_CONFIG +#define MPU6050_ACCEL_CONFIG MPU6500_WE::REGISTER_ACCEL_CONFIG +#define MPU6050_ACCEL_CONFIG_2 MPU6500_WE::REGISTER_ACCEL_CONFIG_2 +#define MPU6050_LP_ACCEL_ODR MPU6500_WE::REGISTER_LP_ACCEL_ODR +#define MPU6050_WOM_THR MPU6500_WE::REGISTER_WOM_THR +#define MPU6050_FIFO_EN MPU6500_WE::REGISTER_FIFO_EN +#define MPU6050_I2C_MST_CTRL MPU6500_WE::REGISTER_I2C_MST_CTRL +#define MPU6050_I2C_SLV0_ADDR MPU6500_WE::REGISTER_I2C_SLV0_ADDR +#define MPU6050_I2C_SLV0_REG MPU6500_WE::REGISTER_I2C_SLV0_REG +#define MPU6050_I2C_SLV0_CTRL MPU6500_WE::REGISTER_I2C_SLV0_CTRL +#define MPU6050_I2C_MST_STATUS MPU6500_WE::REGISTER_I2C_MST_STATUS +#define MPU6050_INT_PIN_CFG MPU6500_WE::REGISTER_INT_PIN_CFG +#define MPU6050_INT_ENABLE MPU6500_WE::REGISTER_INT_ENABLE +#define MPU6050_INT_STATUS MPU6500_WE::REGISTER_INT_STATUS +#define MPU6050_ACCEL_OUT MPU6500_WE::REGISTER_ACCEL_OUT +#define MPU6050_TEMP_OUT MPU6500_WE::REGISTER_TEMP_OUT +#define MPU6050_GYRO_OUT MPU6500_WE::REGISTER_GYRO_OUT +#define MPU6050_EXT_SLV_SENS_DATA_00 MPU6500_WE::REGISTER_EXT_SLV_SENS_DATA_00 +#define MPU6050_I2C_SLV0_DO MPU6500_WE::REGISTER_I2C_SLV0_DO +#define MPU6050_I2C_MST_DELAY_CTRL MPU6500_WE::REGISTER_I2C_MST_DELAY_CTRL +#define MPU6050_SIGNAL_PATH_RESET MPU6500_WE::REGISTER_SIGNAL_PATH_RESET +#define MPU6050_MOT_DET_CTRL MPU6500_WE::REGISTER_MOT_DET_CTRL +#define MPU6050_USER_CTRL MPU6500_WE::REGISTER_USER_CTRL +#define MPU6050_PWR_MGMT_1 MPU6500_WE::REGISTER_PWR_MGMT_1 +#define MPU6050_PWR_MGMT_2 MPU6500_WE::REGISTER_PWR_MGMT_2 +#define MPU6050_FIFO_COUNT MPU6500_WE::REGISTER_FIFO_COUNT +#define MPU6050_FIFO_R_W MPU6500_WE::REGISTER_FIFO_R_W +#define MPU6050_WHO_AM_I MPU6500_WE::REGISTER_WHO_AM_I +#define MPU6050_XA_OFFSET_H MPU6500_WE::REGISTER_XA_OFFSET_H +#define MPU6050_XA_OFFSET_L MPU6500_WE::REGISTER_XA_OFFSET_L +#define MPU6050_YA_OFFSET_H MPU6500_WE::REGISTER_YA_OFFSET_H +#define MPU6050_YA_OFFSET_L MPU6500_WE::REGISTER_YA_OFFSET_L +#define MPU6050_ZA_OFFSET_H MPU6500_WE::REGISTER_ZA_OFFSET_H +#define MPU6050_ZA_OFFSET_L MPU6500_WE::REGISTER_ZA_OFFSET_L + +/* Register Values */ +#define MPU6050_RESET MPU6500_WE::REGISTER_VALUE_RESET +#define MPU6050_BYPASS_EN MPU6500_WE::REGISTER_VALUE_BYPASS_EN +#define MPU6050_I2C_MST_EN MPU6500_WE::REGISTER_VALUE_I2C_MST_EN +#define MPU6050_CLK_SEL_PLL MPU6500_WE::REGISTER_VALUE_CLK_SEL_PLL + +/* Others */ +#define MPU6050_ROOM_TEMP_OFFSET MPU6500_WE::ROOM_TEMPERATURE_OFFSET +#define MPU6050_T_SENSITIVITY MPU6500_WE::TEMPERATURE_SENSITIVITY +#define MPU6050_WHO_AM_I_CODE MPU9250_WE::WHO_AM_I_CODE + +class MPU6050_WE : public MPU6500_WE +{ +public: + + /* Who Am I */ + static uint8_t constexpr WHO_AM_I_CODE = 0x68; + static uint8_t constexpr REGISTER_MOT_DUR = 0x20; + + /* Constructors */ + + MPU6050_WE(uint8_t addr); + MPU6050_WE(); + MPU6050_WE(TwoWire *w, uint8_t addr); + MPU6050_WE(TwoWire *w); + MPU6050_WE(SPIClass *s, int cs, bool spi, bool pc = false); + MPU6050_WE(SPIClass *s, int cs, int mosi, int miso, int scl, bool spi, bool pc = true); + + /* Basic settings */ + + bool init(); + + float getTemperature(); + +protected: + /* none */ +private: + /* none */ + +}; + +#endif diff --git a/examples/03-mpu9250/MPU9250_WE/src/MPU6500_WE.cpp b/examples/03-mpu9250/MPU9250_WE/src/MPU6500_WE.cpp new file mode 100644 index 0000000..62fd1b0 --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/src/MPU6500_WE.cpp @@ -0,0 +1,822 @@ +/******************************************************************** +* +* This is a library for the 6-axis gyroscope and accelerometer MPU6500. +* +* You'll find an example which should enable you to use the library. +* +* You are free to use it, change it or build on it. In case you like +* it, it would be cool if you give it a star. +* +* If you find bugs, please inform me! +* +* Written by Wolfgang (Wolle) Ewald +* +* For further information visit my blog: +* +* https://wolles-elektronikkiste.de/mpu9250-9-achsen-sensormodul-teil-1 (German) +* https://wolles-elektronikkiste.de/en/mpu9250-9-axis-sensor-module-part-1 (English) +* +*********************************************************************/ + +#include "MPU6500_WE.h" + +/* Registers MPU6500 */ +uint8_t constexpr MPU6500_WE::REGISTER_SELF_TEST_X_GYRO ; +uint8_t constexpr MPU6500_WE::REGISTER_SELF_TEST_Y_GYRO ; +uint8_t constexpr MPU6500_WE::REGISTER_SELF_TEST_Z_GYRO ; +uint8_t constexpr MPU6500_WE::REGISTER_SELF_TEST_X_ACCEL ; +uint8_t constexpr MPU6500_WE::REGISTER_SELF_TEST_Y_ACCEL ; +uint8_t constexpr MPU6500_WE::REGISTER_SELF_TEST_Z_ACCEL ; +uint8_t constexpr MPU6500_WE::REGISTER_XG_OFFSET_H ; +uint8_t constexpr MPU6500_WE::REGISTER_XG_OFFSET_L ; +uint8_t constexpr MPU6500_WE::REGISTER_YG_OFFSET_H ; +uint8_t constexpr MPU6500_WE::REGISTER_YG_OFFSET_L ; +uint8_t constexpr MPU6500_WE::REGISTER_ZG_OFFSET_H ; +uint8_t constexpr MPU6500_WE::REGISTER_ZG_OFFSET_L ; +uint8_t constexpr MPU6500_WE::REGISTER_SMPLRT_DIV ; +uint8_t constexpr MPU6500_WE::REGISTER_CONFIG ; +uint8_t constexpr MPU6500_WE::REGISTER_GYRO_CONFIG ; +uint8_t constexpr MPU6500_WE::REGISTER_ACCEL_CONFIG ; +uint8_t constexpr MPU6500_WE::REGISTER_ACCEL_CONFIG_2 ; +uint8_t constexpr MPU6500_WE::REGISTER_LP_ACCEL_ODR ; +uint8_t constexpr MPU6500_WE::REGISTER_WOM_THR ; +uint8_t constexpr MPU6500_WE::REGISTER_FIFO_EN ; +uint8_t constexpr MPU6500_WE::REGISTER_I2C_MST_CTRL ; +uint8_t constexpr MPU6500_WE::REGISTER_I2C_SLV0_ADDR ; +uint8_t constexpr MPU6500_WE::REGISTER_I2C_SLV0_REG ; +uint8_t constexpr MPU6500_WE::REGISTER_I2C_SLV0_CTRL ; +uint8_t constexpr MPU6500_WE::REGISTER_I2C_MST_STATUS ; +uint8_t constexpr MPU6500_WE::REGISTER_INT_PIN_CFG ; +uint8_t constexpr MPU6500_WE::REGISTER_INT_ENABLE ; +uint8_t constexpr MPU6500_WE::REGISTER_INT_STATUS ; +uint8_t constexpr MPU6500_WE::REGISTER_ACCEL_OUT ; +uint8_t constexpr MPU6500_WE::REGISTER_TEMP_OUT ; +uint8_t constexpr MPU6500_WE::REGISTER_GYRO_OUT ; +uint8_t constexpr MPU6500_WE::REGISTER_EXT_SLV_SENS_DATA_00 ; +uint8_t constexpr MPU6500_WE::REGISTER_I2C_SLV0_DO ; +uint8_t constexpr MPU6500_WE::REGISTER_I2C_MST_DELAY_CTRL ; +uint8_t constexpr MPU6500_WE::REGISTER_SIGNAL_PATH_RESET ; +uint8_t constexpr MPU6500_WE::REGISTER_MOT_DET_CTRL ; +uint8_t constexpr MPU6500_WE::REGISTER_USER_CTRL ; +uint8_t constexpr MPU6500_WE::REGISTER_PWR_MGMT_1 ; +uint8_t constexpr MPU6500_WE::REGISTER_PWR_MGMT_2 ; +uint8_t constexpr MPU6500_WE::REGISTER_FIFO_COUNT ; +uint8_t constexpr MPU6500_WE::REGISTER_FIFO_R_W ; +uint8_t constexpr MPU6500_WE::REGISTER_WHO_AM_I ; +uint8_t constexpr MPU6500_WE::REGISTER_XA_OFFSET_H ; +uint8_t constexpr MPU6500_WE::REGISTER_XA_OFFSET_L ; +uint8_t constexpr MPU6500_WE::REGISTER_YA_OFFSET_H ; +uint8_t constexpr MPU6500_WE::REGISTER_YA_OFFSET_L ; +uint8_t constexpr MPU6500_WE::REGISTER_ZA_OFFSET_H ; +uint8_t constexpr MPU6500_WE::REGISTER_ZA_OFFSET_L ; + +/* Register Values */ +uint8_t constexpr MPU6500_WE::REGISTER_VALUE_RESET ; +uint8_t constexpr MPU6500_WE::REGISTER_VALUE_BYPASS_EN ; +uint8_t constexpr MPU6500_WE::REGISTER_VALUE_I2C_MST_EN ; +uint8_t constexpr MPU6500_WE::REGISTER_VALUE_CLK_SEL_PLL ; + +/* Others */ +float constexpr MPU6500_WE::ROOM_TEMPERATURE_OFFSET ; +float constexpr MPU6500_WE::TEMPERATURE_SENSITIVITY ; +float constexpr MPU6500_WE::WHO_AM_I_CODE ; + +/************ Constructors ************/ + +MPU6500_WE::MPU6500_WE(uint8_t addr) + : MPU6500_WE(&Wire, addr) +{ + // intentionally empty +} + +MPU6500_WE::MPU6500_WE(TwoWire *w, uint8_t addr) + : _wire(w) + , i2cAddress(addr) +{ + // intentionally empty +} + +MPU6500_WE::MPU6500_WE(SPIClass *s, int cs, bool spi, bool pc) + : _spi(s) + , csPin(cs) + , useSPI(spi) + , spiPinsChanged(pc) +{ + // intentionally empty +} + +MPU6500_WE::MPU6500_WE(SPIClass * const s, int const cs, int mosi, int miso, int scl, bool spi, bool pc) + : _spi(s) + , csPin(cs) + , mosiPin(mosi) + , misoPin(miso) + , sclPin(scl) + , useSPI(spi) + , spiPinsChanged(pc) +{ + // intentionally empty +} + +/************ Basic Settings ************/ + +bool MPU6500_WE::init(uint8_t const expectedValue){ + if(useSPI){ + pinMode(csPin, OUTPUT); + digitalWrite(csPin, HIGH); +#if defined(ESP32) + if(spiPinsChanged){ + _spi->begin(sclPin, misoPin, mosiPin, csPin); + } + else{ + _spi->begin(); + } +#else + _spi->begin(); +#endif + mySPISettings = SPISettings(8000000, MSBFIRST, SPI_MODE0); + } + reset_MPU9250(); + delay(10); + writeMPU9250Register(REGISTER_INT_PIN_CFG, REGISTER_VALUE_BYPASS_EN); // Bypass Enable + delay(10); + if(whoAmI() != expectedValue){ + return false; + } + + accOffsetVal.x = 0.0; + accOffsetVal.y = 0.0; + accOffsetVal.z = 0.0; + accRangeFactor = 1; + gyrOffsetVal.x = 0.0; + gyrOffsetVal.y = 0.0; + gyrOffsetVal.z = 0.0; + gyrRangeFactor = 1; + fifoType = MPU9250_FIFO_ACC; + sleep(false); + + return true; +} + + +bool MPU6500_WE::init(){ + return init(WHO_AM_I_CODE); +} + +uint8_t MPU6500_WE::whoAmI(){ + return readMPU9250Register8(REGISTER_WHO_AM_I); +} + +void MPU6500_WE::autoOffsets(){ + enableGyrDLPF(); + setGyrDLPF(MPU9250_DLPF_6); // lowest noise + setGyrRange(MPU9250_GYRO_RANGE_250); // highest resolution + setAccRange(MPU9250_ACC_RANGE_2G); + enableAccDLPF(true); + setAccDLPF(MPU9250_DLPF_6); + delay(100); + + xyzFloat accelerationOffsetAccumulator{0.f, 0.f, 0.f}; + xyzFloat gyroOffsetAccumulator{0.f, 0.f, 0.f}; + for(int i=0; i<50; i++){ + // acceleration + accelerationOffsetAccumulator += getAccRawValues(); + // gyro + gyroOffsetAccumulator += getGyrRawValues(); + delay(1); + } + + // acceleration + accelerationOffsetAccumulator /= 50.f; + accelerationOffsetAccumulator.z -= 16384.0f; + accOffsetVal = accelerationOffsetAccumulator; + // gyro + gyrOffsetVal = gyroOffsetAccumulator / 50.f; + +} + +void MPU6500_WE::setAccOffsets(float xMin, float xMax, float yMin, float yMax, float zMin, float zMax){ + accOffsetVal.x = (xMax + xMin) * 0.5; + accOffsetVal.y = (yMax + yMin) * 0.5; + accOffsetVal.z = (zMax + zMin) * 0.5; +} + +void MPU6500_WE::setAccOffsets(xyzFloat offset){ + accOffsetVal = offset; +} + +void MPU6500_WE::setGyrOffsets(float xOffset, float yOffset, float zOffset){ + gyrOffsetVal.x = xOffset; + gyrOffsetVal.y = yOffset; + gyrOffsetVal.z = zOffset; +} + +void MPU6500_WE::setGyrOffsets(xyzFloat offset){ + gyrOffsetVal = offset; +} + +xyzFloat MPU6500_WE::getAccOffsets(){ + return accOffsetVal; +} + +xyzFloat MPU6500_WE::getGyrOffsets(){ + return gyrOffsetVal; +} + +void MPU6500_WE::setGyrDLPF(MPU9250_dlpf dlpf){ + uint8_t regVal = readMPU9250Register8(REGISTER_CONFIG); + regVal &= 0xF8; + regVal |= dlpf; + writeMPU9250Register(REGISTER_CONFIG, regVal); +} + +void MPU6500_WE::setSampleRateDivider(uint8_t splRateDiv){ + writeMPU9250Register(REGISTER_SMPLRT_DIV, splRateDiv); +} + +void MPU6500_WE::setGyrRange(MPU9250_gyroRange gyroRange){ + uint8_t regVal = readMPU9250Register8(REGISTER_GYRO_CONFIG); + regVal &= 0xE7; + regVal |= (gyroRange<<3); + writeMPU9250Register(REGISTER_GYRO_CONFIG, regVal); + gyrRangeFactor = (1<((rawData[0] << 8) | rawData[1]); + int16_t const yRaw = static_cast((rawData[2] << 8) | rawData[3]); + int16_t const zRaw = static_cast((rawData[4] << 8) | rawData[5]); + return xyzFloat{static_cast(xRaw), static_cast(yRaw), static_cast(zRaw)}; +} + +xyzFloat MPU6500_WE::getCorrectedAccRawValues(){ + xyzFloat rawValue = getAccRawValues(); + correctAccRawValues(rawValue); + return rawValue; +} + +xyzFloat MPU6500_WE::getGValues(){ + xyzFloat const acceleration = getCorrectedAccRawValues(); + return acceleration * (static_cast(accRangeFactor) / 16384.0f); +} + +xyzFloat MPU6500_WE::getAccRawValuesFromFifo(){ + xyzFloat accRawVal = readMPU9250xyzValFromFifo(); + return accRawVal; +} + +xyzFloat MPU6500_WE::getCorrectedAccRawValuesFromFifo(){ + xyzFloat accRawVal = getAccRawValuesFromFifo(); + correctAccRawValues(accRawVal); + return accRawVal; +} + +xyzFloat MPU6500_WE::getGValuesFromFifo(){ + xyzFloat accRawVal = getCorrectedAccRawValuesFromFifo(); + return accRawVal * (static_cast(accRangeFactor) / 16384.0f); +} + +float MPU6500_WE::getResultantG(xyzFloat gVal){ + float resultant = 0.0; + resultant = sqrt(sq(gVal.x) + sq(gVal.y) + sq(gVal.z)); + + return resultant; +} + +float MPU6500_WE::getTemperature(){ + int16_t regVal16 = readMPU9250Register16(REGISTER_TEMP_OUT); + float tmp = (regVal16*1.0 - ROOM_TEMPERATURE_OFFSET)/TEMPERATURE_SENSITIVITY + 21.0; + return tmp; +} + +xyzFloat MPU6500_WE::getGyrRawValues(){ + uint8_t rawData[6]; + readMPU9250Register3x16(REGISTER_GYRO_OUT, rawData); + int16_t const xRaw = static_cast((rawData[0] << 8) | rawData[1]); + int16_t const yRaw = static_cast((rawData[2] << 8) | rawData[3]); + int16_t const zRaw = static_cast((rawData[4] << 8) | rawData[5]); + return xyzFloat{static_cast(xRaw), static_cast(yRaw), static_cast(zRaw)}; +} + +xyzFloat MPU6500_WE::getCorrectedGyrRawValues(){ + xyzFloat gyrRawVal = getGyrRawValues(); + correctGyrRawValues(gyrRawVal); + return gyrRawVal; +} + +xyzFloat MPU6500_WE::getGyrValues(){ + xyzFloat const gyroValues = getCorrectedGyrRawValues(); + return gyroValues * (static_cast(gyrRangeFactor) * 250.f / 32768.0f); +} + +xyzFloat MPU6500_WE::getGyrValuesFromFifo(){ + xyzFloat gyroValues = readMPU9250xyzValFromFifo(); + correctGyrRawValues(gyroValues); + return gyroValues * (static_cast(gyrRangeFactor) * 250.f / 32768.0f); +} + +/********* Power, Sleep, Standby *********/ + +void MPU6500_WE::sleep(bool sleep){ + uint8_t regVal = readMPU9250Register8(REGISTER_PWR_MGMT_1); + if(sleep){ + regVal |= 0x40; + } + else{ + regVal &= ~(0x40); + } + writeMPU9250Register(REGISTER_PWR_MGMT_1, regVal); +} + +void MPU6500_WE::enableCycle(bool cycle){ + uint8_t regVal = readMPU9250Register8(REGISTER_PWR_MGMT_1); + if(cycle){ + regVal |= 0x20; + } + else{ + regVal &= ~(0x20); + } + writeMPU9250Register(REGISTER_PWR_MGMT_1, regVal); +} + +void MPU6500_WE::enableGyrStandby(bool gyroStandby){ + uint8_t regVal = readMPU9250Register8(REGISTER_PWR_MGMT_1); + if(gyroStandby){ + regVal |= 0x10; + } + else{ + regVal &= ~(0x10); + } + writeMPU9250Register(REGISTER_PWR_MGMT_1, regVal); +} + + +/******** Angles and Orientation *********/ + +xyzFloat MPU6500_WE::getAngles(){ + xyzFloat angleVal; + xyzFloat gVal = getGValues(); + if(gVal.x > 1.0){ + gVal.x = 1.0; + } + else if(gVal.x < -1.0){ + gVal.x = -1.0; + } + angleVal.x = (asin(gVal.x)) * 57.296; + + if(gVal.y > 1.0){ + gVal.y = 1.0; + } + else if(gVal.y < -1.0){ + gVal.y = -1.0; + } + angleVal.y = (asin(gVal.y)) * 57.296; + + if(gVal.z > 1.0){ + gVal.z = 1.0; + } + else if(gVal.z < -1.0){ + gVal.z = -1.0; + } + angleVal.z = (asin(gVal.z)) * 57.296; + + return angleVal; +} + +MPU9250_orientation MPU6500_WE::getOrientation(){ + xyzFloat angleVal = getAngles(); + MPU9250_orientation orientation = MPU9250_FLAT; + if(abs(angleVal.x) < 45){ // |x| < 45 + if(abs(angleVal.y) < 45){ // |y| < 45 + if(angleVal.z > 0){ // z > 0 + orientation = MPU9250_FLAT; + } + else{ // z < 0 + orientation = MPU9250_FLAT_1; + } + } + else{ // |y| > 45 + if(angleVal.y > 0){ // y > 0 + orientation = MPU9250_XY; + } + else{ // y < 0 + orientation = MPU9250_XY_1; + } + } + } + else{ // |x| >= 45 + if(angleVal.x > 0){ // x > 0 + orientation = MPU9250_YX; + } + else{ // x < 0 + orientation = MPU9250_YX_1; + } + } + return orientation; +} + +String MPU6500_WE::getOrientationAsString(){ + MPU9250_orientation orientation = getOrientation(); + String orientationAsString = ""; + switch(orientation){ + case MPU9250_FLAT: orientationAsString = "z up"; break; + case MPU9250_FLAT_1: orientationAsString = "z down"; break; + case MPU9250_XY: orientationAsString = "y up"; break; + case MPU9250_XY_1: orientationAsString = "y down"; break; + case MPU9250_YX: orientationAsString = "x up"; break; + case MPU9250_YX_1: orientationAsString = "x down"; break; + } + return orientationAsString; +} + +float MPU6500_WE::getPitch(){ + xyzFloat angleVal = getAngles(); + float pitch = (atan2(-angleVal.x, sqrt(abs((angleVal.y*angleVal.y + angleVal.z*angleVal.z))))*180.0)/M_PI; + return pitch; +} + + +float MPU6500_WE::getRoll(){ + xyzFloat angleVal = getAngles(); + float roll = (atan2(angleVal.y, angleVal.z)*180.0)/M_PI; + return roll; +} + + +/************** Interrupts ***************/ + +void MPU6500_WE::setIntPinPolarity(MPU9250_intPinPol pol){ + uint8_t regVal = readMPU9250Register8(REGISTER_INT_PIN_CFG); + if(pol){ + regVal |= 0x80; + } + else{ + regVal &= ~(0x80); + } + writeMPU9250Register(REGISTER_INT_PIN_CFG, regVal); +} + +void MPU6500_WE::enableIntLatch(bool latch){ + uint8_t regVal = readMPU9250Register8(REGISTER_INT_PIN_CFG); + if(latch){ + regVal |= 0x20; + } + else{ + regVal &= ~(0x20); + } + writeMPU9250Register(REGISTER_INT_PIN_CFG, regVal); +} + +void MPU6500_WE::enableClearIntByAnyRead(bool clearByAnyRead){ + uint8_t regVal = readMPU9250Register8(REGISTER_INT_PIN_CFG); + if(clearByAnyRead){ + regVal |= 0x10; + } + else{ + regVal &= ~(0x10); + } + writeMPU9250Register(REGISTER_INT_PIN_CFG, regVal); +} + +void MPU6500_WE::enableInterrupt(MPU9250_intType intType){ + uint8_t regVal = readMPU9250Register8(REGISTER_INT_ENABLE); + regVal |= intType; + writeMPU9250Register(REGISTER_INT_ENABLE, regVal); +} + +void MPU6500_WE::disableInterrupt(MPU9250_intType intType){ + uint8_t regVal = readMPU9250Register8(REGISTER_INT_ENABLE); + regVal &= ~intType; + writeMPU9250Register(REGISTER_INT_ENABLE, regVal); +} + +bool MPU6500_WE::checkInterrupt(uint8_t source, MPU9250_intType type){ + source &= type; + return source; +} + +uint8_t MPU6500_WE::readAndClearInterrupts(){ + uint8_t regVal = readMPU9250Register8(REGISTER_INT_STATUS); + return regVal; +} + +void MPU6500_WE::setWakeOnMotionThreshold(uint8_t womthresh){ + writeMPU9250Register(REGISTER_WOM_THR, womthresh); +} + +void MPU6500_WE::enableWakeOnMotion(MPU9250_womEn womEn, MPU9250_womCompEn womCompEn){ + uint8_t regVal = 0; + if(womEn){ + regVal |= 0x80; + } + if(womCompEn){ + regVal |= 0x40; + } + writeMPU9250Register(REGISTER_MOT_DET_CTRL, regVal); +} + +/***************** FIFO ******************/ + +/* fifo is a byte which defines the data stored in the FIFO + * It is structured as: + * Bit 7 = TEMP, Bit 6 = GYRO_X, Bit 5 = GYRO_Y Bit 4 = GYRO_Z, + * Bit 3 = ACCEL (all axes), Bit 2 = SLAVE_2, Bit 1 = SLAVE_1, Bit 0 = SLAVE_0; + * e.g. 0b11001001 => TEMP, GYRO_X, ACCEL, SLAVE0 are enabled + */ +void MPU6500_WE::startFifo(MPU9250_fifo_type fifo){ + fifoType = fifo; + writeMPU9250Register(REGISTER_FIFO_EN, fifoType); +} + +void MPU6500_WE::stopFifo(){ + writeMPU9250Register(REGISTER_FIFO_EN, 0); +} + +void MPU6500_WE::enableFifo(bool fifo){ + uint8_t regVal = readMPU9250Register8(REGISTER_USER_CTRL); + if(fifo){ + regVal |= 0x40; + } + else{ + regVal &= ~(0x40); + } + writeMPU9250Register(REGISTER_USER_CTRL, regVal); +} + +void MPU6500_WE::resetFifo(){ + uint8_t regVal = readMPU9250Register8(REGISTER_USER_CTRL); + regVal |= 0x04; + writeMPU9250Register(REGISTER_USER_CTRL, regVal); +} + +int16_t MPU6500_WE::getFifoCount(){ + uint16_t regVal16 = (uint16_t) readMPU9250Register16(REGISTER_FIFO_COUNT); + return regVal16; +} + +void MPU6500_WE::setFifoMode(MPU9250_fifoMode mode){ + uint8_t regVal = readMPU9250Register8(REGISTER_CONFIG); + if(mode){ + regVal |= 0x40; + } + else{ + regVal &= ~(0x40); + } + writeMPU9250Register(REGISTER_CONFIG, regVal); + +} + +int16_t MPU6500_WE::getNumberOfFifoDataSets(){ + int16_t numberOfSets = getFifoCount(); + + if((fifoType == MPU9250_FIFO_ACC) || (fifoType == MPU9250_FIFO_GYR)){ + numberOfSets /= 6; + } + else if(fifoType==MPU9250_FIFO_ACC_GYR){ + numberOfSets /= 12; + } + + return numberOfSets; +} + +void MPU6500_WE::findFifoBegin(){ + int16_t count = getFifoCount(); + + if((fifoType == MPU9250_FIFO_ACC) || (fifoType == MPU9250_FIFO_GYR)){ + if(count > 510){ + for(int i=0; i<2; i++){ + readMPU9250Register8(REGISTER_FIFO_R_W); + } + } + } + else if(fifoType==MPU9250_FIFO_ACC_GYR){ + if(count > 504){ + for(int i=0; i<8; i++){ + readMPU9250Register8(REGISTER_FIFO_R_W); + } + } + } +} + +/************************************************ + Private Functions +*************************************************/ + +void MPU6500_WE::correctAccRawValues(xyzFloat & rawValues){ + rawValues.x -= (accOffsetVal.x / accRangeFactor); + rawValues.y -= (accOffsetVal.y / accRangeFactor); + rawValues.z -= (accOffsetVal.z / accRangeFactor); +} + +void MPU6500_WE::correctGyrRawValues(xyzFloat & rawValues){ + rawValues.x -= (gyrOffsetVal.x / gyrRangeFactor); + rawValues.y -= (gyrOffsetVal.y / gyrRangeFactor); + rawValues.z -= (gyrOffsetVal.z / gyrRangeFactor); +} + +void MPU6500_WE::reset_MPU9250(){ + writeMPU9250Register(REGISTER_PWR_MGMT_1, REGISTER_VALUE_RESET); + delay(10); // wait for registers to reset +} + +void MPU6500_WE::enableI2CMaster(){ + uint8_t regVal = readMPU9250Register8(REGISTER_USER_CTRL); + regVal |= REGISTER_VALUE_I2C_MST_EN; + writeMPU9250Register(REGISTER_USER_CTRL, regVal); //enable I2C master + writeMPU9250Register(REGISTER_I2C_MST_CTRL, 0x00); // set I2C clock to 400 kHz + delay(10); +} + +void MPU6500_WE::writeMPU9250Register(uint8_t reg, uint8_t val){ + if(!useSPI){ + _wire->beginTransmission(i2cAddress); + _wire->write(reg); + _wire->write(val); + _wire->endTransmission(); + } + else{ + _spi->beginTransaction(mySPISettings); + digitalWrite(csPin, LOW); + _spi->transfer(reg); + _spi->transfer(val); + digitalWrite(csPin, HIGH); + _spi->endTransaction(); + } +} + +uint8_t MPU6500_WE::readMPU9250Register8(uint8_t reg){ + uint8_t regValue = 0; + + if(!useSPI){ + _wire->beginTransmission(i2cAddress); + _wire->write(reg); + _wire->endTransmission(false); + _wire->requestFrom(i2cAddress,(uint8_t)1); + if(_wire->available()){ + regValue = _wire->read(); + } + } + else{ + reg |= 0x80; + _spi->beginTransaction(mySPISettings); + digitalWrite(csPin, LOW); + _spi->transfer(reg); + regValue = _spi->transfer(0x00); + digitalWrite(csPin, HIGH); + _spi->endTransaction(); + } + return regValue; +} + +int16_t MPU6500_WE::readMPU9250Register16(uint8_t reg){ + uint8_t MSByte = 0, LSByte = 0; + int16_t regValue = 0; + + if(!useSPI){ + _wire->beginTransmission(i2cAddress); + _wire->write(reg); + _wire->endTransmission(false); + _wire->requestFrom(i2cAddress,(uint8_t)2); + if(_wire->available()){ + MSByte = _wire->read(); + LSByte = _wire->read(); + } + } + else{ + reg |= 0x80; + _spi->beginTransaction(mySPISettings); + digitalWrite(csPin, LOW); + _spi->transfer(reg); + MSByte = _spi->transfer(0x00); + LSByte = _spi->transfer(0x00); + digitalWrite(csPin, HIGH); + _spi->endTransaction(); + } + regValue = (MSByte<<8) + LSByte; + return regValue; +} + +void MPU6500_WE::readMPU9250Register3x16(uint8_t reg, uint8_t *buf){ + if(!useSPI){ + _wire->beginTransmission(i2cAddress); + _wire->write(reg); + _wire->endTransmission(false); + _wire->requestFrom(i2cAddress,(uint8_t)6); + if(_wire->available()){ + for(int i=0; i<6; i++){ + buf[i] = _wire->read(); + } + } + } + else{ + reg |= 0x80; + _spi->beginTransaction(mySPISettings); + digitalWrite(csPin, LOW); + _spi->transfer(reg); + for(int i=0; i<6; i++){ + buf[i] = _spi->transfer(0x00); + } + digitalWrite(csPin, HIGH); + _spi->endTransaction(); + } +} + +xyzFloat MPU6500_WE::readMPU9250xyzValFromFifo(){ + uint8_t fifoTriple[6]; + + if(!useSPI){ + _wire->beginTransmission(i2cAddress); + _wire->write(REGISTER_FIFO_R_W); + _wire->endTransmission(false); + _wire->requestFrom(i2cAddress,(uint8_t)6); + if(_wire->available()){ + for(int i=0; i<6; i++){ + fifoTriple[i] = _wire->read(); + } + } + } + else{ + uint8_t reg = REGISTER_FIFO_R_W | 0x80; + _spi->beginTransaction(mySPISettings); + digitalWrite(csPin, LOW); + _spi->transfer(reg); + for(int i=0; i<6; i++){ + fifoTriple[i] = _spi->transfer(0x00); + } + digitalWrite(csPin, HIGH); + _spi->endTransaction(); + } + + xyzFloat xyzResult = {0.0, 0.0, 0.0}; + xyzResult.x = static_cast((int16_t)((fifoTriple[0]<<8) + fifoTriple[1])); + xyzResult.y = static_cast((int16_t)((fifoTriple[2]<<8) + fifoTriple[3])); + xyzResult.z = static_cast((int16_t)((fifoTriple[4]<<8) + fifoTriple[5])); + + return xyzResult; +} + +/************ end ************/ diff --git a/examples/03-mpu9250/MPU9250_WE/src/MPU6500_WE.h b/examples/03-mpu9250/MPU9250_WE/src/MPU6500_WE.h new file mode 100644 index 0000000..826d367 --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/src/MPU6500_WE.h @@ -0,0 +1,405 @@ +/******************************************************************** +* +* This is a library for the 6-axis gyroscope and accelerometer MPU6500. +* +* You'll find an example which should enable you to use the library. +* +* You are free to use it, change it or build on it. In case you like +* it, it would be cool if you give it a star. +* +* If you find bugs, please inform me! +* +* Written by Wolfgang (Wolle) Ewald +* +* For further information visit my blog: +* +* https://wolles-elektronikkiste.de/mpu9250-9-achsen-sensormodul-teil-1 (German) +* https://wolles-elektronikkiste.de/en/mpu9250-9-axis-sensor-module-part-1 (English) +* +*********************************************************************/ + +#ifndef MPU6500_WE_H_ +#define MPU6500_WE_H_ + +#if (ARDUINO >= 100) + #include "Arduino.h" +#else + #include "WProgram.h" +#endif + +#include +#include + +#include "xyzFloat.h" + + + +/* Enums */ + +typedef enum MPU9250_BW_WO_DLPF { + MPU9250_BW_WO_DLPF_3600 = 0x02, + MPU9250_BW_WO_DLPF_8800 = 0x01, + MPU6500_BW_WO_DLPF_3600 = MPU9250_BW_WO_DLPF_3600, + MPU6500_BW_WO_DLPF_8800 = MPU9250_BW_WO_DLPF_8800, + MPU6050_BW_WO_DLPF_3600 = MPU9250_BW_WO_DLPF_3600, + MPU6050_BW_WO_DLPF_8800 = MPU9250_BW_WO_DLPF_8800 +} MPU9250_bw_wo_dlpf; + +typedef enum MPU9250_DLPF { + MPU9250_DLPF_0, MPU9250_DLPF_1, MPU9250_DLPF_2, MPU9250_DLPF_3, MPU9250_DLPF_4, MPU9250_DLPF_5, + MPU9250_DLPF_6, MPU9250_DLPF_7, + MPU6500_DLPF_0 = MPU9250_DLPF_0, + MPU6500_DLPF_1 = MPU9250_DLPF_1, + MPU6500_DLPF_2 = MPU9250_DLPF_2, + MPU6500_DLPF_3 = MPU9250_DLPF_3, + MPU6500_DLPF_4 = MPU9250_DLPF_4, + MPU6500_DLPF_5 = MPU9250_DLPF_5, + MPU6500_DLPF_6 = MPU9250_DLPF_6, + MPU6500_DLPF_7 = MPU9250_DLPF_7, + MPU6050_DLPF_0 = MPU9250_DLPF_0, + MPU6050_DLPF_1 = MPU9250_DLPF_1, + MPU6050_DLPF_2 = MPU9250_DLPF_2, + MPU6050_DLPF_3 = MPU9250_DLPF_3, + MPU6050_DLPF_4 = MPU9250_DLPF_4, + MPU6050_DLPF_5 = MPU9250_DLPF_5, + MPU6050_DLPF_6 = MPU9250_DLPF_6, + MPU6050_DLPF_7 = MPU9250_DLPF_7 +} MPU9250_dlpf; + +typedef enum MPU9250_GYRO_RANGE { + MPU9250_GYRO_RANGE_250, MPU9250_GYRO_RANGE_500, MPU9250_GYRO_RANGE_1000, MPU9250_GYRO_RANGE_2000, + MPU6500_GYRO_RANGE_250 = MPU9250_GYRO_RANGE_250, + MPU6500_GYRO_RANGE_500 = MPU9250_GYRO_RANGE_500, + MPU6500_GYRO_RANGE_1000 = MPU9250_GYRO_RANGE_1000, + MPU6500_GYRO_RANGE_2000 = MPU9250_GYRO_RANGE_2000, + MPU6050_GYRO_RANGE_250 = MPU9250_GYRO_RANGE_250, + MPU6050_GYRO_RANGE_500 = MPU9250_GYRO_RANGE_500, + MPU6050_GYRO_RANGE_1000 = MPU9250_GYRO_RANGE_1000, + MPU6050_GYRO_RANGE_2000 = MPU9250_GYRO_RANGE_2000 +} MPU9250_gyroRange; + +typedef enum MPU9250_ACC_RANGE { + MPU9250_ACC_RANGE_2G, MPU9250_ACC_RANGE_4G, MPU9250_ACC_RANGE_8G, MPU9250_ACC_RANGE_16G, + MPU6500_ACC_RANGE_2G = MPU9250_ACC_RANGE_2G, + MPU6500_ACC_RANGE_4G = MPU9250_ACC_RANGE_4G, + MPU6500_ACC_RANGE_8G = MPU9250_ACC_RANGE_8G, + MPU6500_ACC_RANGE_16G = MPU9250_ACC_RANGE_16G, + MPU6050_ACC_RANGE_2G = MPU9250_ACC_RANGE_2G, + MPU6050_ACC_RANGE_4G = MPU9250_ACC_RANGE_4G, + MPU6050_ACC_RANGE_8G = MPU9250_ACC_RANGE_8G, + MPU6050_ACC_RANGE_16G = MPU9250_ACC_RANGE_16G +} MPU9250_accRange; + +typedef enum MPU9250_LOW_PWR_ACC_ODR { + MPU9250_LP_ACC_ODR_0_24, MPU9250_LP_ACC_ODR_0_49, MPU9250_LP_ACC_ODR_0_98, MPU9250_LP_ACC_ODR_1_95, + MPU9250_LP_ACC_ODR_3_91, MPU9250_LP_ACC_ODR_7_81, MPU9250_LP_ACC_ODR_15_63, MPU9250_LP_ACC_ODR_31_25, + MPU9250_LP_ACC_ODR_62_5, MPU9250_LP_ACC_ODR_125, MPU9250_LP_ACC_ODR_250, MPU9250_LP_ACC_ODR_500, + MPU6500_LP_ACC_ODR_0_24 = MPU9250_LP_ACC_ODR_0_24, + MPU6500_LP_ACC_ODR_0_49 = MPU9250_LP_ACC_ODR_0_49, + MPU6500_LP_ACC_ODR_0_98 = MPU9250_LP_ACC_ODR_0_98, + MPU6500_LP_ACC_ODR_1_95 = MPU9250_LP_ACC_ODR_1_95, + MPU6500_LP_ACC_ODR_3_91 = MPU9250_LP_ACC_ODR_3_91, + MPU6500_LP_ACC_ODR_7_81 = MPU9250_LP_ACC_ODR_7_81, + MPU6500_LP_ACC_ODR_15_63 = MPU9250_LP_ACC_ODR_15_63, + MPU6500_LP_ACC_ODR_31_25 = MPU9250_LP_ACC_ODR_31_25, + MPU6500_LP_ACC_ODR_62_5 = MPU9250_LP_ACC_ODR_62_5, + MPU6500_LP_ACC_ODR_125 = MPU9250_LP_ACC_ODR_125, + MPU6500_LP_ACC_ODR_250 = MPU9250_LP_ACC_ODR_250, + MPU6500_LP_ACC_ODR_500 = MPU9250_LP_ACC_ODR_500, + MPU6050_LP_ACC_ODR_0_24 = MPU9250_LP_ACC_ODR_0_24, + MPU6050_LP_ACC_ODR_0_49 = MPU9250_LP_ACC_ODR_0_49, + MPU6050_LP_ACC_ODR_0_98 = MPU9250_LP_ACC_ODR_0_98, + MPU6050_LP_ACC_ODR_1_95 = MPU9250_LP_ACC_ODR_1_95, + MPU6050_LP_ACC_ODR_3_91 = MPU9250_LP_ACC_ODR_3_91, + MPU6050_LP_ACC_ODR_7_81 = MPU9250_LP_ACC_ODR_7_81, + MPU6050_LP_ACC_ODR_15_63 = MPU9250_LP_ACC_ODR_15_63, + MPU6050_LP_ACC_ODR_31_25 = MPU9250_LP_ACC_ODR_31_25, + MPU6050_LP_ACC_ODR_62_5 = MPU9250_LP_ACC_ODR_62_5, + MPU6050_LP_ACC_ODR_125 = MPU9250_LP_ACC_ODR_125, + MPU6050_LP_ACC_ODR_250 = MPU9250_LP_ACC_ODR_250, + MPU6050_LP_ACC_ODR_500 = MPU9250_LP_ACC_ODR_500 +} MPU9250_lpAccODR; + +typedef enum MPU9250_INT_PIN_POL { + MPU9250_ACT_HIGH, MPU9250_ACT_LOW, + MPU6500_ACT_HIGH = MPU9250_ACT_HIGH, + MPU6500_ACT_LOW = MPU9250_ACT_LOW, + MPU6050_ACT_HIGH = MPU9250_ACT_HIGH, + MPU6050_ACT_LOW = MPU9250_ACT_LOW +} MPU9250_intPinPol; + +typedef enum MPU9250_INT_TYPE { + MPU9250_DATA_READY = 0x01, + MPU9250_FIFO_OVF = 0x10, + MPU9250_WOM_INT = 0x40, + MPU6500_DATA_READY = MPU9250_DATA_READY, + MPU6500_FIFO_OVF = MPU9250_FIFO_OVF, + MPU6500_WOM_INT = MPU9250_WOM_INT, + MPU6050_DATA_READY = MPU9250_DATA_READY, + MPU6050_FIFO_OVF = MPU9250_FIFO_OVF, + MPU6050_WOM_INT = MPU9250_WOM_INT +} MPU9250_intType; + +typedef enum MPU9250_WOM_EN { + MPU9250_WOM_DISABLE, MPU9250_WOM_ENABLE, + MPU6500_WOM_DISABLE = MPU9250_WOM_DISABLE, + MPU6500_WOM_ENABLE = MPU9250_WOM_ENABLE, + MPU6050_WOM_DISABLE = MPU9250_WOM_DISABLE, + MPU6050_WOM_ENABLE = MPU9250_WOM_ENABLE +} MPU9250_womEn; + +typedef enum MPU9250_WOM_COMP { + MPU9250_WOM_COMP_DISABLE, MPU9250_WOM_COMP_ENABLE, + MPU6500_WOM_COMP_DISABLE = MPU9250_WOM_COMP_DISABLE, + MPU6500_WOM_COMP_ENABLE = MPU9250_WOM_COMP_ENABLE, + MPU6050_WOM_COMP_DISABLE = MPU9250_WOM_COMP_DISABLE, + MPU6050_WOM_COMP_ENABLE = MPU9250_WOM_COMP_ENABLE +} MPU9250_womCompEn; + +typedef enum MPU9250_XYZ_ENABLE { + MPU9250_ENABLE_XYZ, //all axes are enabled (default) + MPU9250_ENABLE_XY0, // x, y enabled, z disabled + MPU9250_ENABLE_X0Z, + MPU9250_ENABLE_X00, + MPU9250_ENABLE_0YZ, + MPU9250_ENABLE_0Y0, + MPU9250_ENABLE_00Z, + MPU9250_ENABLE_000, // all axes disabled + MPU6500_ENABLE_XYZ = MPU9250_ENABLE_XYZ, + MPU6500_ENABLE_XY0 = MPU9250_ENABLE_XY0, + MPU6500_ENABLE_X0Z = MPU9250_ENABLE_X0Z, + MPU6500_ENABLE_X00 = MPU9250_ENABLE_X00, + MPU6500_ENABLE_0YZ = MPU9250_ENABLE_0YZ, + MPU6500_ENABLE_0Y0 = MPU9250_ENABLE_0Y0, + MPU6500_ENABLE_00Z = MPU9250_ENABLE_00Z, + MPU6500_ENABLE_000 = MPU9250_ENABLE_000, + MPU6050_ENABLE_XYZ = MPU9250_ENABLE_XYZ, + MPU6050_ENABLE_XY0 = MPU9250_ENABLE_XY0, + MPU6050_ENABLE_X0Z = MPU9250_ENABLE_X0Z, + MPU6050_ENABLE_X00 = MPU9250_ENABLE_X00, + MPU6050_ENABLE_0YZ = MPU9250_ENABLE_0YZ, + MPU6050_ENABLE_0Y0 = MPU9250_ENABLE_0Y0, + MPU6050_ENABLE_00Z = MPU9250_ENABLE_00Z, + MPU6050_ENABLE_000 = MPU9250_ENABLE_000 +} MPU9250_xyzEn; + +typedef enum MPU9250_ORIENTATION { + MPU9250_FLAT, MPU9250_FLAT_1, MPU9250_XY, MPU9250_XY_1, MPU9250_YX, MPU9250_YX_1, + MPU6500_FLAT = MPU9250_FLAT, + MPU6500_FLAT_1 = MPU9250_FLAT_1, + MPU6500_XY = MPU9250_XY, + MPU6500_XY_1 = MPU9250_XY_1, + MPU6500_YX = MPU9250_YX, + MPU6500_YX_1 = MPU9250_YX_1, + MPU6050_FLAT = MPU9250_FLAT, + MPU6050_FLAT_1 = MPU9250_FLAT_1, + MPU6050_XY = MPU9250_XY, + MPU6050_XY_1 = MPU9250_XY_1, + MPU6050_YX = MPU9250_YX, + MPU6050_YX_1 = MPU9250_YX_1 +} MPU9250_orientation; + +typedef enum MPU9250_FIFO_MODE { + MPU9250_CONTINUOUS, MPU9250_STOP_WHEN_FULL, + MPU6500_CONTINUOUS = MPU9250_CONTINUOUS, + MPU6500_STOP_WHEN_FULL = MPU9250_STOP_WHEN_FULL, + MPU6050_CONTINUOUS = MPU9250_CONTINUOUS, + MPU6050_STOP_WHEN_FULL = MPU9250_STOP_WHEN_FULL +} MPU9250_fifoMode; + +typedef enum MPU9250_FIFO_TYPE { + MPU9250_FIFO_ACC = 0x08, + MPU9250_FIFO_GYR = 0x70, + MPU9250_FIFO_ACC_GYR = 0x78, + MPU6500_FIFO_ACC = MPU9250_FIFO_ACC, + MPU6500_FIFO_GYR = MPU9250_FIFO_GYR, + MPU6500_FIFO_ACC_GYR = MPU9250_FIFO_ACC_GYR, + MPU6050_FIFO_ACC = MPU9250_FIFO_ACC, + MPU6050_FIFO_GYR = MPU9250_FIFO_GYR, + MPU6050_FIFO_ACC_GYR = MPU9250_FIFO_ACC_GYR +} MPU9250_fifo_type; + +class MPU6500_WE +{ +public: + /* Registers MPU6500 */ + static uint8_t constexpr REGISTER_SELF_TEST_X_GYRO = 0x00; + static uint8_t constexpr REGISTER_SELF_TEST_Y_GYRO = 0x01; + static uint8_t constexpr REGISTER_SELF_TEST_Z_GYRO = 0x02; + static uint8_t constexpr REGISTER_SELF_TEST_X_ACCEL = 0x0D; + static uint8_t constexpr REGISTER_SELF_TEST_Y_ACCEL = 0x0E; + static uint8_t constexpr REGISTER_SELF_TEST_Z_ACCEL = 0x0F; + static uint8_t constexpr REGISTER_XG_OFFSET_H = 0x13; + static uint8_t constexpr REGISTER_XG_OFFSET_L = 0x14; + static uint8_t constexpr REGISTER_YG_OFFSET_H = 0x15; + static uint8_t constexpr REGISTER_YG_OFFSET_L = 0x16; + static uint8_t constexpr REGISTER_ZG_OFFSET_H = 0x17; + static uint8_t constexpr REGISTER_ZG_OFFSET_L = 0x18; + static uint8_t constexpr REGISTER_SMPLRT_DIV = 0x19; + static uint8_t constexpr REGISTER_CONFIG = 0x1A; + static uint8_t constexpr REGISTER_GYRO_CONFIG = 0x1B; + static uint8_t constexpr REGISTER_ACCEL_CONFIG = 0x1C; + static uint8_t constexpr REGISTER_ACCEL_CONFIG_2 = 0x1D; + static uint8_t constexpr REGISTER_LP_ACCEL_ODR = 0x1E; + static uint8_t constexpr REGISTER_WOM_THR = 0x1F; + static uint8_t constexpr REGISTER_FIFO_EN = 0x23; + static uint8_t constexpr REGISTER_I2C_MST_CTRL = 0x24; + static uint8_t constexpr REGISTER_I2C_SLV0_ADDR = 0x25; + static uint8_t constexpr REGISTER_I2C_SLV0_REG = 0x26; + static uint8_t constexpr REGISTER_I2C_SLV0_CTRL = 0x27; + static uint8_t constexpr REGISTER_I2C_MST_STATUS = 0x36; + static uint8_t constexpr REGISTER_INT_PIN_CFG = 0x37; + static uint8_t constexpr REGISTER_INT_ENABLE = 0x38; + static uint8_t constexpr REGISTER_INT_STATUS = 0x3A; + static uint8_t constexpr REGISTER_ACCEL_OUT = 0x3B; // accel data registers begin + static uint8_t constexpr REGISTER_TEMP_OUT = 0x41; + static uint8_t constexpr REGISTER_GYRO_OUT = 0x43; // gyro data registers begin + static uint8_t constexpr REGISTER_EXT_SLV_SENS_DATA_00 = 0x49; + static uint8_t constexpr REGISTER_I2C_SLV0_DO = 0x63; + static uint8_t constexpr REGISTER_I2C_MST_DELAY_CTRL = 0x67; + static uint8_t constexpr REGISTER_SIGNAL_PATH_RESET = 0x68; + static uint8_t constexpr REGISTER_MOT_DET_CTRL = 0x69; + static uint8_t constexpr REGISTER_USER_CTRL = 0x6A; + static uint8_t constexpr REGISTER_PWR_MGMT_1 = 0x6B; + static uint8_t constexpr REGISTER_PWR_MGMT_2 = 0x6C; + static uint8_t constexpr REGISTER_FIFO_COUNT = 0x72; // 0x72 is COUNT_H + static uint8_t constexpr REGISTER_FIFO_R_W = 0x74; + static uint8_t constexpr REGISTER_WHO_AM_I = 0x75; + static uint8_t constexpr REGISTER_XA_OFFSET_H = 0x77; + static uint8_t constexpr REGISTER_XA_OFFSET_L = 0x78; + static uint8_t constexpr REGISTER_YA_OFFSET_H = 0x7A; + static uint8_t constexpr REGISTER_YA_OFFSET_L = 0x7B; + static uint8_t constexpr REGISTER_ZA_OFFSET_H = 0x7D; + static uint8_t constexpr REGISTER_ZA_OFFSET_L = 0x7E; + + /* Register Values */ + static uint8_t constexpr REGISTER_VALUE_RESET = 0x80; + static uint8_t constexpr REGISTER_VALUE_BYPASS_EN = 0x02; + static uint8_t constexpr REGISTER_VALUE_I2C_MST_EN = 0x20; + static uint8_t constexpr REGISTER_VALUE_CLK_SEL_PLL = 0x01; + + /* Others */ + static float constexpr ROOM_TEMPERATURE_OFFSET = 0.0f; + static float constexpr TEMPERATURE_SENSITIVITY = 333.87f; + static float constexpr WHO_AM_I_CODE = 0x70; + + + /* Constructors */ + + MPU6500_WE(uint8_t const addr); + MPU6500_WE(TwoWire * const w = &Wire, uint8_t const addr = 0x68); + /* MPU6500_WE(int const cs, bool spi); */ + MPU6500_WE(SPIClass * const s, int const cs, bool spi, bool pc = false); + MPU6500_WE(SPIClass * const s, int const cs, int mosi, int miso, int scl, bool spi, bool pc = true); + + /* Basic settings */ + + bool init(); + uint8_t whoAmI(); + void autoOffsets(); + void setAccOffsets(float xMin, float xMax, float yMin, float yMax, float zMin, float zMax); + void setAccOffsets(xyzFloat offset); // for writing back previous offsets + void setGyrOffsets(float xOffset, float yOffset, float zOffset); + void setGyrOffsets(xyzFloat offset); // for writing back previous offsets + xyzFloat getAccOffsets(); + xyzFloat getGyrOffsets(); + void setGyrDLPF(MPU9250_dlpf dlpf); + void setSampleRateDivider(uint8_t splRateDiv); + void setGyrRange(MPU9250_gyroRange gyroRange); + void enableGyrDLPF(); + void disableGyrDLPF(MPU9250_bw_wo_dlpf bw); + void setAccRange(MPU9250_accRange accRange); + void enableAccDLPF(bool enable); + void setAccDLPF(MPU9250_dlpf dlpf); + void setLowPowerAccDataRate(MPU9250_lpAccODR lpaodr); + void enableAccAxes(MPU9250_xyzEn enable); + void enableGyrAxes(MPU9250_xyzEn enable); + void setSPIClockSpeed(unsigned long clock); + + /* x,y,z results */ + + xyzFloat getAccRawValues(); + xyzFloat getCorrectedAccRawValues(); + xyzFloat getGValues(); + xyzFloat getAccRawValuesFromFifo(); + xyzFloat getCorrectedAccRawValuesFromFifo(); + xyzFloat getGValuesFromFifo(); + float getResultantG(xyzFloat gVal); + float getTemperature(); + xyzFloat getGyrRawValues(); + xyzFloat getCorrectedGyrRawValues(); + xyzFloat getGyrValues(); + xyzFloat getGyrValuesFromFifo(); + + + /* Angles and Orientation */ + + xyzFloat getAngles(); + MPU9250_orientation getOrientation(); + String getOrientationAsString(); + float getPitch(); + float getRoll(); + + /* Power, Sleep, Standby */ + + void sleep(bool sleep); + void enableCycle(bool cycle); + void enableGyrStandby(bool gyroStandby); + + /* Interrupts */ + + void setIntPinPolarity(MPU9250_intPinPol pol); + void enableIntLatch(bool latch); + void enableClearIntByAnyRead(bool clearByAnyRead); + void enableInterrupt(MPU9250_intType intType); + void disableInterrupt(MPU9250_intType intType); + bool checkInterrupt(uint8_t source, MPU9250_intType type); + uint8_t readAndClearInterrupts(); + void setWakeOnMotionThreshold(uint8_t womthresh); + void enableWakeOnMotion(MPU9250_womEn womEn, MPU9250_womCompEn womCompEn); + + /* FIFO */ + + void startFifo(MPU9250_fifo_type fifo); + void stopFifo(); + void enableFifo(bool fifo); + void resetFifo(); + int16_t getFifoCount(); + void setFifoMode(MPU9250_fifoMode mode); + int16_t getNumberOfFifoDataSets(); + void findFifoBegin(); + +protected: + + bool init(uint8_t const expectedValue); + + void correctAccRawValues(xyzFloat & rawValues); + void correctGyrRawValues(xyzFloat & rawValues); + void getAsaVals(); + void reset_MPU9250(); + void enableI2CMaster(); + void writeMPU9250Register(uint8_t reg, uint8_t val); + uint8_t readMPU9250Register8(uint8_t reg); + int16_t readMPU9250Register16(uint8_t reg); + void readMPU9250Register3x16(uint8_t reg, uint8_t *buf); + xyzFloat readMPU9250xyzValFromFifo(); + + TwoWire * const _wire = &Wire; + SPIClass * const _spi = &SPI; + SPISettings mySPISettings; + uint8_t const i2cAddress = 0x68; + int const csPin = 10; + int mosiPin, misoPin, sclPin; + bool useSPI = false; + bool spiPinsChanged; + +private: + xyzFloat accOffsetVal; + xyzFloat gyrOffsetVal; + uint8_t accRangeFactor; + uint8_t gyrRangeFactor; + MPU9250_fifo_type fifoType; + +}; + +#endif // MPU6500_WE_H_ diff --git a/examples/03-mpu9250/MPU9250_WE/src/MPU9250_WE.cpp b/examples/03-mpu9250/MPU9250_WE/src/MPU9250_WE.cpp new file mode 100644 index 0000000..a8c437c --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/src/MPU9250_WE.cpp @@ -0,0 +1,229 @@ +/******************************************************************** +* This is a library for the 9-axis gyroscope, accelerometer and magnetometer MPU9250. +* +* You'll find an example which should enable you to use the library. +* +* You are free to use it, change it or build on it. In case you like +* it, it would be cool if you give it a star. +* +* If you find bugs, please inform me! +* +* Written by Wolfgang (Wolle) Ewald +* +* For further information visit my blog: +* +* https://wolles-elektronikkiste.de/mpu9250-9-achsen-sensormodul-teil-1 (German) +* https://wolles-elektronikkiste.de/en/mpu9250-9-axis-sensor-module-part-1 (English) +* +*********************************************************************/ + +#include "MPU9250_WE.h" + + +/* Registers AK8963 */ +uint8_t constexpr MPU9250_WE::REGISTER_AK8963_WIA ; +uint8_t constexpr MPU9250_WE::REGISTER_AK8963_INFO ; +uint8_t constexpr MPU9250_WE::REGISTER_AK8963_STATUS_1 ; +uint8_t constexpr MPU9250_WE::REGISTER_AK8963_HXL ; +uint8_t constexpr MPU9250_WE::REGISTER_AK8963_HYL ; +uint8_t constexpr MPU9250_WE::REGISTER_AK8963_HZL ; +uint8_t constexpr MPU9250_WE::REGISTER_AK8963_STATUS_2 ; +uint8_t constexpr MPU9250_WE::REGISTER_AK8963_CNTL_1 ; +uint8_t constexpr MPU9250_WE::REGISTER_AK8963_CNTL_2 ; +uint8_t constexpr MPU9250_WE::REGISTER_AK8963_ASTC ; +uint8_t constexpr MPU9250_WE::REGISTER_AK8963_I2CDIS ; +uint8_t constexpr MPU9250_WE::REGISTER_AK8963_ASAX ; +uint8_t constexpr MPU9250_WE::REGISTER_AK8963_ASAY ; +uint8_t constexpr MPU9250_WE::REGISTER_AK8963_ASAZ ; + +/* Register Values */ +uint8_t constexpr MPU9250_WE::REGISTER_VALUE_AK8963_16_BIT; +uint8_t constexpr MPU9250_WE::REGISTER_VALUE_AK8963_OVF ; +uint8_t constexpr MPU9250_WE::REGISTER_VALUE_AK8963_READ ; + +/* Others */ +uint8_t constexpr MPU9250_WE::WHO_AM_I_CODE ; +uint8_t constexpr MPU9250_WE::MAGNETOMETER_I2C_ADDRESS ; +uint8_t constexpr MPU9250_WE::MAGNETOMETER_WHO_AM_I_CODE ; + + +/************ Constructors ************/ + +MPU9250_WE::MPU9250_WE(uint8_t addr) + : MPU6500_WE(addr) +{ + // intentionally empty +} + +MPU9250_WE::MPU9250_WE() + : MPU6500_WE() +{ + // intentionally empty +} + +MPU9250_WE::MPU9250_WE(TwoWire *w, uint8_t addr) + : MPU6500_WE(w, addr) +{ + // intentionally empty +} + +MPU9250_WE::MPU9250_WE(TwoWire *w) + : MPU6500_WE(w) +{ + // intentionally empty +} + +MPU9250_WE::MPU9250_WE(SPIClass *s, int cs, bool spi, bool pc) + : MPU6500_WE(s, cs, spi, pc) +{ + // intentionally empty +} + +MPU9250_WE::MPU9250_WE(SPIClass *s, int cs, int mosi, int miso, int scl, bool spi, bool pc) + : MPU6500_WE(s, cs, mosi, miso, scl, spi, pc) +{ + // intentionally empty +} + +/************ Basic Settings ************/ + +bool MPU9250_WE::init(){ + return MPU6500_WE::init(WHO_AM_I_CODE); +} + +/************* x,y,z results *************/ + +xyzFloat MPU9250_WE::getMagValues(){ + xyzFloat magVal = {0.0, 0.0, 0.0}; + uint8_t rawData[6]; + readAK8963Data(rawData); + int16_t xRaw = (int16_t)((rawData[1] << 8) | rawData[0]); + int16_t yRaw = (int16_t)((rawData[3] << 8) | rawData[2]); + int16_t zRaw = (int16_t)((rawData[5] << 8) | rawData[4]); + + float constexpr scaleFactor = 4912.0 / 32760.0; + + magVal.x = xRaw * scaleFactor * magCorrFactor.x; + magVal.y = yRaw * scaleFactor * magCorrFactor.y; + magVal.z = zRaw * scaleFactor * magCorrFactor.z; + + return magVal; +} + +/************** Magnetometer **************/ + +bool MPU9250_WE::initMagnetometer(){ + enableI2CMaster(); + resetMagnetometer(); + + if(!(whoAmIMag() == MAGNETOMETER_WHO_AM_I_CODE)){ + return false; + } + setMagOpMode(AK8963_FUSE_ROM_ACC_MODE); + delay(10); + getAsaVals(); + delay(10); + setMagnetometer16Bit(); + delay(10); + setMagOpMode(AK8963_CONT_MODE_8HZ); + delay(10); + + return true; +} + +uint8_t MPU9250_WE::whoAmIMag(){ + return readAK8963Register8(REGISTER_AK8963_WIA); +} + +void MPU9250_WE::setMagOpMode(AK8963_opMode opMode){ + uint8_t regVal = readAK8963Register8(REGISTER_AK8963_CNTL_1); + regVal &= 0xF0; + regVal |= opMode; + writeAK8963Register(REGISTER_AK8963_CNTL_1, regVal); + delay(10); + if(opMode!=AK8963_PWR_DOWN){ + enableMagDataRead(REGISTER_AK8963_HXL, 0x08); + } +} + +void MPU9250_WE::startMagMeasurement(){ + setMagOpMode(AK8963_TRIGGER_MODE); + delay(200); +} + +/************************************************ + Private Functions +*************************************************/ + +void MPU9250_WE::enableMagDataRead(uint8_t reg, uint8_t bytes){ + writeMPU9250Register(REGISTER_I2C_SLV0_ADDR, MAGNETOMETER_I2C_ADDRESS | REGISTER_VALUE_AK8963_READ); // read AK8963 + writeMPU9250Register(REGISTER_I2C_SLV0_REG, reg); // define AK8963 register to be read + writeMPU9250Register(REGISTER_I2C_SLV0_CTRL, 0x80 | bytes); //enable read | number of byte + delay(10); +} + +void MPU9250_WE::resetMagnetometer(){ + writeAK8963Register(REGISTER_AK8963_CNTL_2, 0x01); + delay(100); +} + +void MPU9250_WE::getAsaVals(){ + byte rawCorr = 0; + rawCorr = readAK8963Register8(REGISTER_AK8963_ASAX); + magCorrFactor.x = (0.5 * (rawCorr-128)/128.0) + 1.0; + rawCorr = readAK8963Register8(REGISTER_AK8963_ASAY); + magCorrFactor.y = (0.5 * (rawCorr-128)/128.0) + 1.0; + rawCorr = readAK8963Register8(REGISTER_AK8963_ASAZ); + magCorrFactor.z = (0.5 * (rawCorr-128)/128.0) + 1.0; +} + +void MPU9250_WE::writeAK8963Register(uint8_t reg, uint8_t val){ + writeMPU9250Register(REGISTER_I2C_SLV0_ADDR, MAGNETOMETER_I2C_ADDRESS); // write AK8963 + writeMPU9250Register(REGISTER_I2C_SLV0_REG, reg); // define AK8963 register to be written to + writeMPU9250Register(REGISTER_I2C_SLV0_DO, val); +} + +uint8_t MPU9250_WE::readAK8963Register8(uint8_t reg){ + enableMagDataRead(reg, 0x01); + uint8_t const regVal = readMPU9250Register8(REGISTER_EXT_SLV_SENS_DATA_00); + enableMagDataRead(REGISTER_AK8963_HXL, 0x08); + + return regVal; +} + +void MPU9250_WE::readAK8963Data(uint8_t *buf){ + if(!useSPI){ + _wire->beginTransmission(i2cAddress); + _wire->write(MPU9250_EXT_SLV_SENS_DATA_00); + _wire->endTransmission(false); + _wire->requestFrom(i2cAddress,(uint8_t)6); + if(_wire->available()){ + for(int i=0; i<6; i++){ + buf[i] = _wire->read(); + } + } + } + else{ + uint8_t reg = MPU9250_EXT_SLV_SENS_DATA_00 | 0x80; + _spi->beginTransaction(mySPISettings); + digitalWrite(csPin, LOW); + _spi->transfer(reg); + for(int i=0; i<6; i++){ + buf[i] = _spi->transfer(0x00); + } + digitalWrite(csPin, HIGH); + _spi->endTransaction(); + } +} + +void MPU9250_WE::setMagnetometer16Bit(){ + uint8_t regVal = readAK8963Register8(REGISTER_AK8963_CNTL_1); + regVal |= REGISTER_VALUE_AK8963_16_BIT; + writeAK8963Register(REGISTER_AK8963_CNTL_1, regVal); +} + +uint8_t MPU9250_WE::getStatus2Register(){ + return readAK8963Register8(REGISTER_AK8963_STATUS_2); +} + + diff --git a/examples/03-mpu9250/MPU9250_WE/src/MPU9250_WE.h b/examples/03-mpu9250/MPU9250_WE/src/MPU9250_WE.h new file mode 100644 index 0000000..37843f5 --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/src/MPU9250_WE.h @@ -0,0 +1,200 @@ +/****************************************************************************** + * + * This is a library for the 9-axis gyroscope, accelerometer and magnetometer MPU9250. + * + * You'll find several example sketches which should enable you to use the library. + * + * You are free to use it, change it or build on it. In case you like it, it would + * be cool if you give it a star. + * + * If you find bugs, please inform me! + * + * Written by Wolfgang (Wolle) Ewald + * + * For further information visit my blog: + * + * https://wolles-elektronikkiste.de/mpu9250-9-achsen-sensormodul-teil-1 (German) + * https://wolles-elektronikkiste.de/en/mpu9250-9-axis-sensor-module-part-1 (English) + * + * + ******************************************************************************/ + +#ifndef MPU9250_WE_H_ +#define MPU9250_WE_H_ + +#include "MPU6500_WE.h" + +#define AK8963_ADDRESS MPU9250_WE::MAGNETOMETER_I2C_ADDRESS + +/* + * Please note that the following '#define's are only kept for backward-compatibility. + * They do only reference correctly typed and static [i.e. uniquely instantiated] + * values defined in the respective class. + * If you do want to change a value, do not change any of these '#define's but + * instead the actual referenced value. + * + */ + +/* Registers MPU9250 */ +#define MPU9250_SELF_TEST_X_GYRO MPU6500_WE::REGISTER_SELF_TEST_X_GYRO +#define MPU9250_SELF_TEST_Y_GYRO MPU6500_WE::REGISTER_SELF_TEST_Y_GYRO +#define MPU9250_SELF_TEST_Z_GYRO MPU6500_WE::REGISTER_SELF_TEST_Z_GYRO +#define MPU9250_SELF_TEST_X_ACCEL MPU6500_WE::REGISTER_SELF_TEST_X_ACCEL +#define MPU9250_SELF_TEST_Y_ACCEL MPU6500_WE::REGISTER_SELF_TEST_Y_ACCEL +#define MPU9250_SELF_TEST_Z_ACCEL MPU6500_WE::REGISTER_SELF_TEST_Z_ACCEL +#define MPU9250_XG_OFFSET_H MPU6500_WE::REGISTER_XG_OFFSET_H +#define MPU9250_XG_OFFSET_L MPU6500_WE::REGISTER_XG_OFFSET_L +#define MPU9250_YG_OFFSET_H MPU6500_WE::REGISTER_YG_OFFSET_H +#define MPU9250_YG_OFFSET_L MPU6500_WE::REGISTER_YG_OFFSET_L +#define MPU9250_ZG_OFFSET_H MPU6500_WE::REGISTER_ZG_OFFSET_H +#define MPU9250_ZG_OFFSET_L MPU6500_WE::REGISTER_ZG_OFFSET_L +#define MPU9250_SMPLRT_DIV MPU6500_WE::REGISTER_SMPLRT_DIV +#define MPU9250_CONFIG MPU6500_WE::REGISTER_CONFIG +#define MPU9250_GYRO_CONFIG MPU6500_WE::REGISTER_GYRO_CONFIG +#define MPU9250_ACCEL_CONFIG MPU6500_WE::REGISTER_ACCEL_CONFIG +#define MPU9250_ACCEL_CONFIG_2 MPU6500_WE::REGISTER_ACCEL_CONFIG_2 +#define MPU9250_LP_ACCEL_ODR MPU6500_WE::REGISTER_LP_ACCEL_ODR +#define MPU9250_WOM_THR MPU6500_WE::REGISTER_WOM_THR +#define MPU9250_FIFO_EN MPU6500_WE::REGISTER_FIFO_EN +#define MPU9250_I2C_MST_CTRL MPU6500_WE::REGISTER_I2C_MST_CTRL +#define MPU9250_I2C_SLV0_ADDR MPU6500_WE::REGISTER_I2C_SLV0_ADDR +#define MPU9250_I2C_SLV0_REG MPU6500_WE::REGISTER_I2C_SLV0_REG +#define MPU9250_I2C_SLV0_CTRL MPU6500_WE::REGISTER_I2C_SLV0_CTRL +#define MPU9250_I2C_MST_STATUS MPU6500_WE::REGISTER_I2C_MST_STATUS +#define MPU9250_INT_PIN_CFG MPU6500_WE::REGISTER_INT_PIN_CFG +#define MPU9250_INT_ENABLE MPU6500_WE::REGISTER_INT_ENABLE +#define MPU9250_INT_STATUS MPU6500_WE::REGISTER_INT_STATUS +#define MPU9250_ACCEL_OUT MPU6500_WE::REGISTER_ACCEL_OUT +#define MPU9250_TEMP_OUT MPU6500_WE::REGISTER_TEMP_OUT +#define MPU9250_GYRO_OUT MPU6500_WE::REGISTER_GYRO_OUT +#define MPU9250_EXT_SLV_SENS_DATA_00 MPU6500_WE::REGISTER_EXT_SLV_SENS_DATA_00 +#define MPU9250_I2C_SLV0_DO MPU6500_WE::REGISTER_I2C_SLV0_DO +#define MPU9250_I2C_MST_DELAY_CTRL MPU6500_WE::REGISTER_I2C_MST_DELAY_CTRL +#define MPU9250_SIGNAL_PATH_RESET MPU6500_WE::REGISTER_SIGNAL_PATH_RESET +#define MPU9250_MOT_DET_CTRL MPU6500_WE::REGISTER_MOT_DET_CTRL +#define MPU9250_USER_CTRL MPU6500_WE::REGISTER_USER_CTRL +#define MPU9250_PWR_MGMT_1 MPU6500_WE::REGISTER_PWR_MGMT_1 +#define MPU9250_PWR_MGMT_2 MPU6500_WE::REGISTER_PWR_MGMT_2 +#define MPU9250_FIFO_COUNT MPU6500_WE::REGISTER_FIFO_COUNT +#define MPU9250_FIFO_R_W MPU6500_WE::REGISTER_FIFO_R_W +#define MPU9250_WHO_AM_I MPU6500_WE::REGISTER_WHO_AM_I +#define MPU9250_XA_OFFSET_H MPU6500_WE::REGISTER_XA_OFFSET_H +#define MPU9250_XA_OFFSET_L MPU6500_WE::REGISTER_XA_OFFSET_L +#define MPU9250_YA_OFFSET_H MPU6500_WE::REGISTER_YA_OFFSET_H +#define MPU9250_YA_OFFSET_L MPU6500_WE::REGISTER_YA_OFFSET_L +#define MPU9250_ZA_OFFSET_H MPU6500_WE::REGISTER_ZA_OFFSET_H +#define MPU9250_ZA_OFFSET_L MPU6500_WE::REGISTER_ZA_OFFSET_L + +/* Registers AK8963 */ +#define AK8963_WIA MPU9250_WE::REGISTER_AK8963_WIA // Who am I +#define AK8963_INFO MPU9250_WE::REGISTER_AK8963_INFO +#define AK8963_STATUS_1 MPU9250_WE::REGISTER_AK8963_STATUS_1 +#define AK8963_HXL MPU9250_WE::REGISTER_AK8963_HXL +#define AK8963_HYL MPU9250_WE::REGISTER_AK8963_HYL +#define AK8963_HZL MPU9250_WE::REGISTER_AK8963_HZL +#define AK8963_STATUS_2 MPU9250_WE::REGISTER_AK8963_STATUS_2 +#define AK8963_CNTL_1 MPU9250_WE::REGISTER_AK8963_CNTL_1 +#define AK8963_CNTL_2 MPU9250_WE::REGISTER_AK8963_CNTL_2 +#define AK8963_ASTC MPU9250_WE::REGISTER_AK8963_ASTC // Self Test +#define AK8963_I2CDIS MPU9250_WE::REGISTER_AK8963_I2CDIS +#define AK8963_ASAX MPU9250_WE::REGISTER_AK8963_ASAX +#define AK8963_ASAY MPU9250_WE::REGISTER_AK8963_ASAY +#define AK8963_ASAZ MPU9250_WE::REGISTER_AK8963_ASAZ + +/* Register Values */ +#define MPU9250_RESET MPU6500_WE::REGISTER_VALUE_RESET +#define MPU9250_BYPASS_EN MPU6500_WE::REGISTER_VALUE_BYPASS_EN +#define MPU9250_I2C_MST_EN MPU6500_WE::REGISTER_VALUE_I2C_MST_EN +#define MPU9250_CLK_SEL_PLL MPU6500_WE::REGISTER_VALUE_CLK_SEL_PLL +#define AK8963_16_BIT MPU9250_WE::REGISTER_VALUE_AK8963_16_BIT +#define AK8963_OVF MPU9250_WE::REGISTER_VALUE_AK8963_OVF +#define AK8963_READ MPU9250_WE::REGISTER_VALUE_AK8963_READ + +/* Others */ +#define MPU9250_ROOM_TEMP_OFFSET MPU6500_WE::ROOM_TEMPERATURE_OFFSET +#define MPU9250_T_SENSITIVITY MPU6500_WE::TEMPERATURE_SENSITIVITY +#define MPU9250_WHO_AM_I_CODE MPU9250_WE::WHO_AM_I_CODE +#define AK8963_WHO_AM_I_CODE MPU9250_WE::MAGNETOMETER_WHO_AM_I_CODE + + +/* Enums */ +typedef enum AK8963_OP_MODE { + AK8963_PWR_DOWN = 0x00, + AK8963_TRIGGER_MODE = 0x01, + AK8963_CONT_MODE_8HZ = 0x02, + AK8963_CONT_MODE_100HZ = 0x06, + AK8963_FUSE_ROM_ACC_MODE = 0x0F +} AK8963_opMode; + + +class MPU9250_WE : public MPU6500_WE +{ +public: + + + /* Registers AK8963 */ + static uint8_t constexpr REGISTER_AK8963_WIA = 0x00; // Who am I + static uint8_t constexpr REGISTER_AK8963_INFO = 0x01; + static uint8_t constexpr REGISTER_AK8963_STATUS_1 = 0x02; + static uint8_t constexpr REGISTER_AK8963_HXL = 0x03; + static uint8_t constexpr REGISTER_AK8963_HYL = 0x05; + static uint8_t constexpr REGISTER_AK8963_HZL = 0x07; + static uint8_t constexpr REGISTER_AK8963_STATUS_2 = 0x09; + static uint8_t constexpr REGISTER_AK8963_CNTL_1 = 0x0A; + static uint8_t constexpr REGISTER_AK8963_CNTL_2 = 0x0B; + static uint8_t constexpr REGISTER_AK8963_ASTC = 0x0C; // Self Test + static uint8_t constexpr REGISTER_AK8963_I2CDIS = 0x0F; + static uint8_t constexpr REGISTER_AK8963_ASAX = 0x10; + static uint8_t constexpr REGISTER_AK8963_ASAY = 0x11; + static uint8_t constexpr REGISTER_AK8963_ASAZ = 0x12; + + /* Register Values */ + static uint8_t constexpr REGISTER_VALUE_AK8963_16_BIT = 0x10; + static uint8_t constexpr REGISTER_VALUE_AK8963_OVF = 0x08; + static uint8_t constexpr REGISTER_VALUE_AK8963_READ = 0x80; + + /* Others */ + static uint8_t constexpr WHO_AM_I_CODE = 0x71; + static uint8_t constexpr MAGNETOMETER_I2C_ADDRESS = 0x0C; + static uint8_t constexpr MAGNETOMETER_WHO_AM_I_CODE = 0x48; + + /* Constructors */ + + MPU9250_WE(uint8_t addr); + MPU9250_WE(); + MPU9250_WE(TwoWire *w, uint8_t addr); + MPU9250_WE(TwoWire *w); + MPU9250_WE(SPIClass *s, int cs, bool spi, bool pc = false); + MPU9250_WE(SPIClass *s, int cs, int mosi, int miso, int scl, bool spi, bool pc = true); + + /* Basic settings */ + + bool init(); + + /* x,y,z results */ + + xyzFloat getMagValues(); + + /* Magnetometer */ + + bool initMagnetometer(); + uint8_t whoAmIMag(); + void setMagOpMode(AK8963_opMode opMode); + void startMagMeasurement(); + +protected: + void getAsaVals(); + void enableMagDataRead(uint8_t reg, uint8_t bytes); + void resetMagnetometer(); + void writeAK8963Register(uint8_t reg, uint8_t val); + uint8_t readAK8963Register8(uint8_t reg); + void readAK8963Data(uint8_t *buf); + void setMagnetometer16Bit(); + uint8_t getStatus2Register(); + +private: + xyzFloat magCorrFactor; + +}; + +#endif diff --git a/examples/03-mpu9250/MPU9250_WE/src/xyzFloat.cpp b/examples/03-mpu9250/MPU9250_WE/src/xyzFloat.cpp new file mode 100644 index 0000000..be7f892 --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/src/xyzFloat.cpp @@ -0,0 +1,90 @@ +/* defines the structure xyzFloat which is used for gyroscopes, accelerometers and + magnetometers such as ICM20948, MPU9250, ADXL345, etc. */ + +#include "xyzFloat.h" + +xyzFloat::xyzFloat() + : xyzFloat(0.f, 0.f, 0.f) +{ + // intentionally empty +} + +xyzFloat::xyzFloat(float const x, float const y, float const z) + : x(x) + , y(y) + , z(z) +{ + // intentionally empty +} + +xyzFloat xyzFloat::operator+() const +{ + return *this; +} + +xyzFloat xyzFloat::operator-() const +{ + return xyzFloat{-x, + -y, + -z}; +} + +xyzFloat xyzFloat::operator+(xyzFloat const & summand) const +{ + return xyzFloat{x + summand.x, + y + summand.y, + z + summand.z}; +} + +xyzFloat xyzFloat::operator-(xyzFloat const & subtrahend) const +{ + return xyzFloat{x - subtrahend.x, + y - subtrahend.y, + z - subtrahend.z}; +} + +xyzFloat xyzFloat::operator*(float const operand) const +{ + return xyzFloat{x * operand, + y * operand, + z * operand}; +} + +xyzFloat xyzFloat::operator/(float const divisor) const +{ + return xyzFloat{x / divisor, + y / divisor, + z / divisor}; +} + +xyzFloat & xyzFloat::operator+=(xyzFloat const & summand) +{ + x += summand.x; + y += summand.y; + z += summand.z; + return *this; +} + +xyzFloat & xyzFloat::operator-=(xyzFloat const & subtrahend) +{ + x -= subtrahend.x; + y -= subtrahend.y; + z -= subtrahend.z; + return *this; +} + +xyzFloat & xyzFloat::operator*=(float const operand) +{ + x *= operand; + y *= operand; + z *= operand; + return *this; +} + +xyzFloat & xyzFloat::operator/=(float const divisor) +{ + x /= divisor; + y /= divisor; + z /= divisor; + return *this; +} diff --git a/examples/03-mpu9250/MPU9250_WE/src/xyzFloat.h b/examples/03-mpu9250/MPU9250_WE/src/xyzFloat.h new file mode 100644 index 0000000..79f3848 --- /dev/null +++ b/examples/03-mpu9250/MPU9250_WE/src/xyzFloat.h @@ -0,0 +1,26 @@ +/* defines the structure xyzFloat which is used for gyroscopes, accelerometers and + magnetometers such as ICM209468, MPU9250, ADXL345, etc. */ + +#ifndef XYZ_FLOAT_H_ +#define XYZ_FLOAT_H_ +#include +struct xyzFloat { + float x; + float y; + float z; + + xyzFloat(); + xyzFloat(float const x, float const y, float const z); + + xyzFloat operator+() const; + xyzFloat operator-() const; + xyzFloat operator+(xyzFloat const & summand) const; + xyzFloat operator-(xyzFloat const & subtrahend) const; + xyzFloat operator*(float const operand) const; + xyzFloat operator/(float const divisor) const; + xyzFloat & operator+=(xyzFloat const & summand); + xyzFloat & operator-=(xyzFloat const & subtrahend); + xyzFloat & operator*=(float const operand); + xyzFloat & operator/=(float const divisor); +}; +#endif \ No newline at end of file diff --git a/examples/03-mpu9250/ak8963.py b/examples/03-mpu9250/ak8963.py new file mode 100644 index 0000000..ef5a606 --- /dev/null +++ b/examples/03-mpu9250/ak8963.py @@ -0,0 +1,207 @@ +# Copyright (c) 2018-2023 Mika Tuupola +# +# 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 copied 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. + +# https://github.com/tuupola/micropython-mpu9250 +# https://www.akm.com/akm/en/file/datasheet/AK8963C.pdf + +""" +MicroPython I2C driver for AK8963 magnetometer +""" + +__version__ = "0.4.0" + +# pylint: disable=import-error +import ustruct +import utime +from machine import I2C, Pin +from micropython import const +# pylint: enable=import-error + +_WIA = const(0x00) +_HXL = const(0x03) +_HXH = const(0x04) +_HYL = const(0x05) +_HYH = const(0x06) +_HZL = const(0x07) +_HZH = const(0x08) +_ST2 = const(0x09) +_CNTL1 = const(0x0a) +_ASAX = const(0x10) +_ASAY = const(0x11) +_ASAZ = const(0x12) + +_MODE_POWER_DOWN = 0b00000000 +MODE_SINGLE_MEASURE = 0b00000001 +MODE_CONTINOUS_MEASURE_1 = 0b00000010 # 8Hz +MODE_CONTINOUS_MEASURE_2 = 0b00000110 # 100Hz +MODE_EXTERNAL_TRIGGER_MEASURE = 0b00000100 +_MODE_SELF_TEST = 0b00001000 +_MODE_FUSE_ROM_ACCESS = 0b00001111 + +OUTPUT_14_BIT = 0b00000000 +OUTPUT_16_BIT = 0b00010000 + +_SO_14BIT = 0.6 # μT per digit when 14bit mode +_SO_16BIT = 0.15 # μT per digit when 16bit mode + +class AK8963: + """Class which provides interface to AK8963 magnetometer.""" + def __init__( + self, i2c, address=0x0c, + mode=MODE_CONTINOUS_MEASURE_1, output=OUTPUT_16_BIT, + offset=(0, 0, 0), scale=(1, 1, 1) + ): + self.i2c = i2c + self.address = address + self._offset = offset + self._scale = scale + + if 0x48 != self.whoami: + raise RuntimeError("AK8963 not found in I2C bus.") + + # Sensitivity adjustement values + self._register_char(_CNTL1, _MODE_FUSE_ROM_ACCESS) + asax = self._register_char(_ASAX) + asay = self._register_char(_ASAY) + asaz = self._register_char(_ASAZ) + self._register_char(_CNTL1, _MODE_POWER_DOWN) + + # Should wait atleast 100us before next mode + self._adjustement = ( + (0.5 * (asax - 128)) / 128 + 1, + (0.5 * (asay - 128)) / 128 + 1, + (0.5 * (asaz - 128)) / 128 + 1 + ) + + # Power on + self._register_char(_CNTL1, (mode | output)) + + if output is OUTPUT_16_BIT: + self._so = _SO_16BIT + else: + self._so = _SO_14BIT + + @property + def magnetic(self): + """ + X, Y, Z axis micro-Tesla (uT) as floats. + """ + xyz = list(self._register_three_shorts(_HXL)) + self._register_char(_ST2) # Enable updating readings again + + # Apply factory axial sensitivy adjustements + xyz[0] *= self._adjustement[0] + xyz[1] *= self._adjustement[1] + xyz[2] *= self._adjustement[2] + + # Apply output scale determined in constructor + so = self._so + xyz[0] *= so + xyz[1] *= so + xyz[2] *= so + + # Apply hard iron ie. offset bias from calibration + xyz[0] -= self._offset[0] + xyz[1] -= self._offset[1] + xyz[2] -= self._offset[2] + + # Apply soft iron ie. scale bias from calibration + xyz[0] *= self._scale[0] + xyz[1] *= self._scale[1] + xyz[2] *= self._scale[2] + + return tuple(xyz) + + @property + def adjustement(self): + return self._adjustement + + @property + def whoami(self): + """ Value of the whoami register. """ + return self._register_char(_WIA) + + def calibrate(self, count=256, delay=200): + self._offset = (0, 0, 0) + self._scale = (1, 1, 1) + + reading = self.magnetic + minx = maxx = reading[0] + miny = maxy = reading[1] + minz = maxz = reading[2] + + while count: + utime.sleep_ms(delay) + reading = self.magnetic + minx = min(minx, reading[0]) + maxx = max(maxx, reading[0]) + miny = min(miny, reading[1]) + maxy = max(maxy, reading[1]) + minz = min(minz, reading[2]) + maxz = max(maxz, reading[2]) + count -= 1 + + # Hard iron correction + offset_x = (maxx + minx) / 2 + offset_y = (maxy + miny) / 2 + offset_z = (maxz + minz) / 2 + + self._offset = (offset_x, offset_y, offset_z) + + # Soft iron correction + avg_delta_x = (maxx - minx) / 2 + avg_delta_y = (maxy - miny) / 2 + avg_delta_z = (maxz - minz) / 2 + + avg_delta = (avg_delta_x + avg_delta_y + avg_delta_z) / 3 + + scale_x = avg_delta / avg_delta_x + scale_y = avg_delta / avg_delta_y + scale_z = avg_delta / avg_delta_z + + self._scale = (scale_x, scale_y, scale_z) + + return self._offset, self._scale + + def _register_short(self, register, value=None, buf=bytearray(2)): + if value is None: + self.i2c.readfrom_mem_into(self.address, register, buf) + return ustruct.unpack("h", buf)[0] + + ustruct.pack_into(">h", buf, 0, value) + return self.i2c.writeto_mem(self.address, register, buf) + + def _register_three_shorts(self, register, buf=bytearray(6)): + self.i2c.readfrom_mem_into(self.address, register, buf) + return ustruct.unpack(">hhh", buf) + + def _register_char(self, register, value=None, buf=bytearray(1)): + if value is None: + self.i2c.readfrom_mem_into(self.address, register, buf) + return buf[0] + + ustruct.pack_into("