MPU6050 i2c example expanded into library
I refactored and expanded the mpu6050_i2c example. This adds new functions for MPU6050 features and clarifies existing ones. It also refactors the example into an MPU6050_i2c library and main.c. There are C and C++ versions of the library. I've been using the C++ library in another project for around a year.
I realize that this is a pretty drastic change, and moves the code away from its original intent as a pico code example. I plan on separating this into a dedicated mpu6050_i2c pico library. However, some of these changes could be useful for the pico-examples repo. Some possibilities are:
- Adding only certain features like mpu6050_power and the scale functions
- Using only the refactor that defines constants for the register addresses
- Removing the C++ part, or moving it to another directory
- Refactoring out the library, so it's one .c and one .h file again
I'm happy to include any suggestions you have.
Thanks. I have a so far untested MPU6050, I'll give it a go.
Presumably this also fixes / supersedes the issues identified with the current example code? https://github.com/raspberrypi/pico-examples/issues?q=is%3Aopen+MPU6050
@lurch ,
Several issues are related to the DEVICE_RESET value. The original example used 0x6B 0x00 in mpu6050_reset(). The register map says to set DEVICE_RESET =1 (0x6B 0x80) to reset the registers, so https://github.com/raspberrypi/pico-examples/pull/319 implemented that. However, https://github.com/raspberrypi/pico-examples/issues/352 and https://github.com/raspberrypi/pico-examples/pull/494 reported that the example didn't work after https://github.com/raspberrypi/pico-examples/pull/319 was merged. The discussion in 319 eventually determined that 0x80 is resetting the MPU6050, which causes the MPU6050 to enter sleep mode, which explains why the example stopped working.
Several commenters in https://github.com/raspberrypi/pico-examples/pull/319 suggest writing DEVICE_RESET =1, waiting, then setting the register to 0x00 again. That works because DEVICE_RESET and SLEEP are in the same register, so sleep mode is disabled.
I added a mpu6050_power() function after mpu6050_reset() to exit sleep mode.
I've pushed some changes to improve it, including adding a test that demonstrates scaling with the C++ library. Unfortunately, my pico has stopped working, so I can't test it myself.
fixed my pico, then fixed the code.
@peterharperuk thanks for waiting, I've marked this PR as ready. I'm still unsure of the best way to integrate this into the repo. Should I wrap the C++ section to check for compilers without C++?
Resolves #352 , #494 , and #557
Can you please squash all your change into one commit? For some reason I can't seem to checkout your changes.
@peterharperuk I rebased and squashed. The develop_rebased branch has the commit history if that becomes easier to checkout.
@peterharperuk figured it out, my editor had been adding CRLF instead of LF. Sorry about that! I've rebased my master branch, that should be usable now.
@NirajPatelRobots This PR has ballooned back up to 12 separate commits again :confused:
@lurch sorry about that, I've re-squashed it.