Uncategorized

mpu9250 microprogramming problems

Asked 
Active today
Viewed 14 times
0

so I’ve recently set up my raspberry pi. Am following a tutorial for the MPU9250, from https://github.com/tuupola/micropython-mpu9250.

I have did a install of the micropython-mpu9250, and tried the sample code in the readme to get my readings. However, i have encountered that error and cannot run my program.

I have made sure that i2c exists and is enabled using i2cdetect -y 1

Any solutions?

 New contributor
  • Welcome @GGenesis, Nice to meet you. I have drafted an answer for you. Please feel free to ask any newbie questions. Happy microPython programming and cheers! 🙂 – tlfong01 41 mins ago    

2 Answers

0

Question

Setup

(1) I have installed micropython-mpu9250.

(2) I have detected the i2c bus using “i2cdetect -y 1”.

Problem

How come my program don’t run?


Answer

(1) What does the command “i2cdetect …” do?

The commend “i2cdetect -y 1” is used to detect if there is any working I2C devices connected to the bus, and display the devices’ address as two hexadecimal digits.

For example, if you have a device “ABC” with address “0x66”. So i2cdetect -y 1 should display at the “60” (7th row) row two digits “66”.

If you have installed a driver for the device ABC, for example, by using the text editor “nano” editing the file /boot/config.txt by adding a line like this:

dtoverlay=i2c ... 

then i2cdetect might display “UU” instead of “66”.

And even i2cdect detects the device, it does not mean the device should work correctly. It only means i2cdetect “pings” (say hello to) the device, and the device replies “I am here”. In other words, ABC only says he is present, not guaranteeing that he is OK to work.


(2) Importing micropython python modules

First you need to import the correct python modules. Below are the example statements from the microPython MPU9250 I2C Driver Git HubGitHub:

import micropython
import utime
from machine import I2C, Pin, Timer
from mpu9250 import MPU9250

Note that the example is not using the Rpi default I2C pins GPIO 2, 3 (40 pin header physical pin numbers 3, 5). This implies the usual import command “import smbus” won’t work. You must import first import “micropython”, then from “machine import I2C …”


(3) Setting up an I2C bus and give it a name, eg “i2c123”

Then you need to setup the i2c bus, like the following example in gitHub:

i2c123 = I2C(scl=Pin(22), sda=Pin(21))

(4) Creating an object (instance) of the micropython class for device MPU9250

Now the time has come to “give birth” of a new mpu9050 “baby”,and give him a name, eg “mpu9250BabyJonathan”:

mpu925BabyJonathan = MPU9250(i2c123)

Now you can “teach” Jonathan to do something!

(5) Other possible I2C programming problems

I have been using Rpi3B+ stretch playing with I2C 3/6/9 DOF sensors and found a big program, ie, for Rpi3B+, I2C speed is a flat rate of 100kHz and cannot be changed (though “official” instructions says otherwise!). Furthermore, the python I2C (smbus) module does not entertain “bus stretching” which is required in some cases. A get around is to lower I2C speed, but not for Rpi3B+.

To solve the problem, you need to use Rpi4B buster, which allows lower I2C speed to as low as 10kHz, and problem solved. See Reference 4 below for more details.

(6) MPU9250 make easy for newbies

There is not that many tutorials for 9-DOF MPU9250. For newbies I would recommend to try 6-DOF MPU6500, or even 3-DOF sensors. MPU9250 actually has MPU6500 and another 3-DOF magneto sensor glued together inside (Ref 3). So the knowledge and skills acquired in MPU6500 can directly transfer to MPI9250.

In other words, eat the big 9-DOF elephant bite by bite, in three 3-DOF bites. This way, the very steep MPU9250 learning curve becomes three shallow ones.


References

(1) MicroPython MPU-9250 (MPU-6500 + AK8963) I2C driver GitHub

(2) MPU9250 Datasheet – Invensense

(3) MPU9250/MPU6250 Newbie Advice – tlfong01 2018nov

(4) Rpi4B buster BNO055 9-DOF Sensor and 16 Channel PWM Driver CircuitPython Programming Problem – tlfong01 2019jun


End of answer

0

It’s preferable that the code listing is in your question and that the error message is cut&pasted into your question.

At a guess you should be importing I2C not i2c.

Categories: Uncategorized

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: