Today we will be working with the MPU-6050 IMU, and we will use it to build an electronic level with an Arduino.
Article with libraries and code - https://dbot.ws/mpu6050
Today we will be working with the MPU-6050, a low-cost Inertial Measurement Unit, or IMU. This device has a lot of different applications in many fields including robotics, gaming, quadcopters, and IoT devices.
The MPU-6050 has an internal gyroscope and accelerometer. It's an inexpensive device, available in several packages and modules. The module I am using is very common and has a built-0in voltage regulator so it can work with 5-volt logic.
We will start by looking at the MPU-6050 internals, as well as at the pinout of the module I am using.
Next, we will load a couple of libraries into our Arduino IDE and ruins some sample code to display Pitch, Yaw, and Roll.
After that, we will build a small project, an electronic level. Our level will display on an LCD and will also use 5 LEDs to give a good visual indication of how level the surface is.
Here are the contents for today's video:
00:00 - Introduction
02:53 - MPU-6050 Intro
11:20 - MPU-6050 Arduino Experiments
20:29 - Electronic Level
You can get the sketch and the two libraries used in the experiments on the DroneBot Workshop website.
"Never trust a computer you can’t throw out a window." — Steve Wozniak
I wanted to see if I could use a MPU-6050 module for a robot arm I'm working on. I don't think anybody has mentioned yet that the New LiquidCrystal library has moved from https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/ to https://github.com/fmalpartida/New-LiquidCrystal
I installed the version from the GitHub repo, and it works fine (after setting the right I2C address for the board I ended up with). Thank goodness for that i2c_scanner example.
I built the Electronic Level as designed, with the omission of the LEDs. My results were pretty much the same as shown in the video. However, I'm seeing a problem that has persisted for me every time I've used any MPU-6050 board (with or without the LCD hooked up). When left still, the sensor will output slightly varying values indefinitely, but if I move the sensor with even the most modest acceleration, the Arduino locks up. Or at least that's what seems to happen. I didn't put a scope on the I2C bus to watch. The same behavior exists with MPU-6050 boards from two different manufacturers, each of which have slightly different hardware designs.
This is perplexing. Is it possible that the accelerometer and gyroscope hardware gets overwhelmed by too much change per tick? I'm going to assume this part isn't robust enough for my intended use. I bought some AS5147 Rotary Sensor boards to see if that's a better fit for my application -- sensing the position of a shaft between 0 and 90 degrees.
@jlamoree I just downloaded the github lib and it doesn't work. Also I see .pde samples so it's very old. POSITIVE isn't declared.
First computer 1959. Retired from my own computer company 2004.
Hardware - Expert in 1401, 360, fairly knowledge in PC plus numerous MPU's & MCU's
Major Languages - Machine language, 360 Macro Assembler, Intel Assembler, PL/I and PL1, Pascal, Basic, C plus numerous job control and scripting languages.
My personal scorecard is now 1 PC hardware fix (circa 1982), 1 open source fix (at age 82), and 2 zero day bugs in a major OS.
Hi All Esp32'ers,
Has anyone modified this "Electronic Level" sketch (& its Interrupt Pin configuration) to work with an ESP32 Dev board? Without attaching the the correct interrupt pin, the MPU6050 seems to hang @ sketch line ~284...
...and I don't see where the interrupt I/O Pin number for the microcontroller is declarer within the sketch; so that I may change the wiring of Arduino Pin I/O pin 2, to ESP32 Pin (#?)...
I'd experiment with the ESP i/o's, but I don't wish to brick the board until by backup arrives.
THX! Mac
ref:
Build a Digital Level with MPU-6050 and Arduino | DroneBot Workshop
If it is broken, anyway; then just take it completely apart and try to fix it.
you may learn something valuable from the ancient efforts of industrious others. /hms
@mac-in-memphis As far as I know that sketch does not compile. I will download Bill's code and try it but I have helped several people with the LCD portion that has some minor errors. I know one of the MPU6050 sketches is badly messed up but not sure if it is this one.
That said, maybe you are a great debugger so I hope I didn't insult you. I am tied up at the moment but will download all of the code Bill used and see what happens.
I quickly looked at the code and did not see any interrupts being used, it appears to be I2C bus.
Did you compile with All errors, maybe that is needed to point out the other errors.
First computer 1959. Retired from my own computer company 2004.
Hardware - Expert in 1401, 360, fairly knowledge in PC plus numerous MPU's & MCU's
Major Languages - Machine language, 360 Macro Assembler, Intel Assembler, PL/I and PL1, Pascal, Basic, C plus numerous job control and scripting languages.
My personal scorecard is now 1 PC hardware fix (circa 1982), 1 open source fix (at age 82), and 2 zero day bugs in a major OS.
@mac-in-memphis Here is the compile error I get I expect this as the LCD setup is now different and easily fixed. How did you deal with it? The only mention of Interrupt in Bill's blog is to do with the UNO, not the esp32
We are also using the interrupt output from the MPU-6050. This connects to pin 2 on the Arduino Uno, which is interrupt number 0.
Compilation error: 'POSITIVE' was not declared in this scope
First computer 1959. Retired from my own computer company 2004.
Hardware - Expert in 1401, 360, fairly knowledge in PC plus numerous MPU's & MCU's
Major Languages - Machine language, 360 Macro Assembler, Intel Assembler, PL/I and PL1, Pascal, Basic, C plus numerous job control and scripting languages.
My personal scorecard is now 1 PC hardware fix (circa 1982), 1 open source fix (at age 82), and 2 zero day bugs in a major OS.
@mac-in-memphis The board Bill used is an Arduino UNO, not an esp32. It fails on compile the same way.
First computer 1959. Retired from my own computer company 2004.
Hardware - Expert in 1401, 360, fairly knowledge in PC plus numerous MPU's & MCU's
Major Languages - Machine language, 360 Macro Assembler, Intel Assembler, PL/I and PL1, Pascal, Basic, C plus numerous job control and scripting languages.
My personal scorecard is now 1 PC hardware fix (circa 1982), 1 open source fix (at age 82), and 2 zero day bugs in a major OS.
@zander Thanks Ron, for investigating!
Apparently the Arduino UNO sketch uses the one interrupt IO pin (2)?... And it's Interrupt Routine might work easily, fetching in the background.
However, the ESP32 has more than a dozen or so pins that each can be programmed to be interrupts; but the coding to define the available pin that one wants to select as the interrupt, becomes a bit more complicated! Then, getting the routine to watch for the correct trigger pulse, is even more complex (at least it is to me).
I'm working thru a simpler example found on another website* that may be helpful in adding the code, and then debug, so stay tuned. Perhaps I can yield back something useful to the Arduino sketch :/
I have a lot of other modules loaded on my breadboard, so there is a lot going on. Power drain? crossover cross-talk emf? cross-eyed wiring? 😉
Man, I always learn something great on Bill's eloquent videos and his superior web site!
Kind Regards,
Mac
* Does Bill mind if other websites are referenced/posted on the forum?
...I realize that any, such nacho hyperlinks could go stale at any moment...
If it is broken, anyway; then just take it completely apart and try to fix it.
you may learn something valuable from the ancient efforts of industrious others. /hms
@mac-in-memphis The problem is the UNO based sketch does NOT have an ISR routine. This is the first time i have seen this type of use and do not understand how it is working. Perhaps Bill @dronebot-workshop can answer how the UNO pin 2 INTR0 is used since there is NO mention of an ISR in the sketch.
You didn't say how you got past the compile error.
First computer 1959. Retired from my own computer company 2004.
Hardware - Expert in 1401, 360, fairly knowledge in PC plus numerous MPU's & MCU's
Major Languages - Machine language, 360 Macro Assembler, Intel Assembler, PL/I and PL1, Pascal, Basic, C plus numerous job control and scripting languages.
My personal scorecard is now 1 PC hardware fix (circa 1982), 1 open source fix (at age 82), and 2 zero day bugs in a major OS.
@zander, Well the Arduino's Pin(2) trigger w/no ISR method has me curious, too!
I just 'assumed' that there must be some internal hardware magic that is unique to the UNO board series?
Since my project mainly needed to use of the MPU6050 accelerometer, I chopped a lot of the 'extraneous' LCD code and focused on trying to get the Esp32's fetching ISR to work. Had to mish-mash with other examples in order to try to pull-in the data from the registers,,, It compiled, though it had a lot of red flags.
So far I'm ready to drop back and punt with a fresh ESP & without the overhead of my overloaded breadboard.
Someday, I would like to see Bill's 'Electronic Level" sketch data output, while using the Serial Plotter tool. 😉
Mac
If it is broken, anyway; then just take it completely apart and try to fix it.
you may learn something valuable from the ancient efforts of industrious others. /hms
@mac-in-memphis As you know there is NO interrupt code in Bill's sketch or yours. Pin 2 on the UNO does not mean pin 2 on the esp32. It's interrupt 0 but since it doesn't appear to be used it's irrelevant. I even had a quick look at the wire library code and did not see any normal interrupt code although there is a hint of something. Your code which is a copy of Bill's does NOT use interrupts just look at your main loop, it is simple polling code. Both work, interrupts are used for certain cases but this case is not one of them. You can't just take a UNO sketch and expect it to run on an esp32.
First computer 1959. Retired from my own computer company 2004.
Hardware - Expert in 1401, 360, fairly knowledge in PC plus numerous MPU's & MCU's
Major Languages - Machine language, 360 Macro Assembler, Intel Assembler, PL/I and PL1, Pascal, Basic, C plus numerous job control and scripting languages.
My personal scorecard is now 1 PC hardware fix (circa 1982), 1 open source fix (at age 82), and 2 zero day bugs in a major OS.