SparkFun Forums 

Where electronics enthusiasts find answers.

Questions &/or issues related to products in the Movement & IMU category should be posted in this forum.
User avatar
By sevPuch
#207293
Hello,
I'm working on a VR project in Unity and I will need up to 14 IMU's in the final project to get the whole body's limbs rotations (3-4 IMU's to start with on a prototype).

I read the different hookup guides, and I'm hesitating between a few models :
- Qwiic VR IMU (BNO080)
- 9DoF Razor IMU M0 (if I understood this is a MPU-9250 + SAMD21 Mini Breakout? I see I can buy them seperately too.)

Is there a model more suitable for a multiple IMU setup? It seems none of the guides describe a way to do it and web searches were inconclusive.

I can manage to get the data I need with Arduino, but not being a hardware specialist I'm not sure about the circuit setup (for instance if I get 3 MPU9250 do I need a SAMD21 Mini Breakout processor for each one of them etc.).
I'm sorry if my question might be trivial, but I'm a MD and trying my best :)

Thank you for your time,
Severin Puchalski
User avatar
By liquid.soulder
#207295
Hi Severin, you are spot on with your research so far. I'll just chime in with my opinion here. With 14 sensors in the end product you'll want to use a SPI interface for two reasons: 1) because most IMUs will only support 1 or 2 I2C addresses, so you would need at least 7 individual I2C busses but I don't know of any microcontrollers that could do that job. SPI, on the other hand, uses an additional control line to select the sensors and most microcontrollers will have the ~ 17 pins that you will need. 2) because of data throughput. In high-speed mode I2C transfers data at 400 kHz. Divide that by 14*8 and each sensor is facing an ~ 3.5 kB/s bottleneck even in ideal conditions. SPI will allows transfers up to 10MHz.

One more consideration, however. Depending on your comfort with sensor fusion (e.g. using a kalman filter to compute orientation from a time-history of IMU data) you may value a sensor that can perform the sensor fusion internally. This saves computation time on your host microcontroller.

Both the ICM-20948 (https://www.sparkfun.com/products/15335) and the Bosch BNO080 (https://www.sparkfun.com/products/14686) have these capabilities (SPI and internal sensor fusion) HOWEVER we don't currently have example code for the ICM-20948 that makes use of the internal sensor fusion capabilities. (One customer suggested looking at this source code for an example, but i haven't been able to yet: https://github.com/OneMillionDolar/libIDD)

The Razor IMU indeed puts a SAMD21 in between you and the MPU-9250 (the predecessor of the ICM-20948) and *im not sure but I think the only output interface is asynchronous serial* which is even slower than I2C.

I hope that can help you make a decision!

Also as an aside, I have personally been interested in trying to finish supporting the ICM-20948's internal sensor fusion capabilities. If that's something you want to discuss more we could start a new topic about it or discuss in direct messages.

Regards,
LS
User avatar
By sevPuch
#207345
Hi LS, thank you for your thorough answer.
Do we have an example for the Bosch BNO080 internal fusion?
I'm definitely on board for cracking down ICM-20948 sensor fusion, but I'd need a prototype in a near future though.
So I think I would go for the Bosch BNO080 as it has I²C and SPI - another source advised me this component for branching up to 8 IMU's : https://www.sparkfun.com/products/14685
What do you think about this setup?
The performance impact would still be acceptable for now I guess.
It is overwhelming but exciting, I hope I can make it work.

Severin
User avatar
By liquid.soulder
#207361
If you are not worried about the performance impact of using I2C then using the multiplexer that you linked to would be a great option! Here's a link to an example that gets quaternion output from the BNO080: https://github.com/sparkfun/SparkFun_BN ... Vector.ino

You can also find the Arduino library at: https://github.com/sparkfun/SparkFun_BN ... no_Library
or by searching for "SparkFun BNO080" in the Arduino Library Manager

I hope it goes well!