I am trying to use an MPU6050 with my SAMD21-based board (a LightAPRS W-2), but it doesn't work.
The sensor definitely works, as I can get data from another 3.3 Vlogic-level board, and the sensor works with a level shifter with an Arduino Uno.
I do not know what is wrong. My SAMD21 board I2C works fine with other devices, but both the MPU6050 and the MPU9250 don't work. Here is the code I use:
/***************************************************************************
* 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 <MPU9250_WE.h>
#include <Wire.h>
#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<DLPF<7!
* Divider is a number 0...255
*/
myMPU9250.setSampleRateDivider(5);
/* MPU9250_ACC_RANGE_2G 2 g (default)
* 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);
}
void loop() {
xyzFloat angles = myMPU9250.getAngles();
/* This method provides quite precise values for x/y
angles up 60°. */
Serial.print("Angle x = ");
Serial.print(angles.x);
Serial.print(" | Angle y = ");
Serial.print(angles.y);
Serial.print(" | Angle z = ");
Serial.println(angles.z);
/* Pitch and roll consider all axes for calculation. According to my experience
it provides more reliable results at higher angles (>60°) */
float pitch = myMPU9250.getPitch();
float roll = myMPU9250.getRoll();
Serial.print("Pitch = ");
Serial.print(pitch);
Serial.print(" | Roll = ");
Serial.println(roll);
Serial.println();
delay(1000);
}
ocrdu
1,7953 gold badges12 silver badges24 bronze badges
asked Apr 27, 2023 at 23:22
-
are you saying that nothing prints in the serial monitor?jsotola– jsotola2023年04月28日 00:42:55 +00:00Commented Apr 28, 2023 at 0:42
-
@jsotola The serial monitor works fine, and it prints "MPU9250 does not respond"Charlie Nicholson– Charlie Nicholson2023年04月28日 10:18:45 +00:00Commented Apr 28, 2023 at 10:18