2

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
2
  • are you saying that nothing prints in the serial monitor? Commented Apr 28, 2023 at 0:42
  • @jsotola The serial monitor works fine, and it prints "MPU9250 does not respond" Commented Apr 28, 2023 at 10:18

0

Know someone who can answer? Share a link to this question via email, Twitter, or Facebook.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.