Multiple I2C sensors with the same address
If you're using MPU6050 IMUs, there's an easy trick: put them all on the I2C bus, and connect each IMU's AD0
pin to a separate digital pin on the Arduino[*]. When you want to read from a specific IMU, set all AD0
s to HIGH
, except the one you want to read to LOW
. All the IMUs with AD0
set to HIGH
with have an I2C address of 0x69, whereas the only one on LOW
will have an address of 0x68.
If you want to read them all, you just go through a loop and set the one you want to LOW
, the others to HIGH
, and you're set.
[*] If you want 20 IMUs, you'd better get a Mega, or, even better, a Maple. Small form factor, quite a bit of oomph, lots of pins and flash, and some clones cost next to nothing; eg Itead sells Maple clones for 6 bucks. ElecFreaks sells them for 9 bucks. You could use the 16 pins at the bottom for the AD0
s.
This trick works with any kind of I2C device that has a customizable address scheme through one or more pins. I do that with AT24Cxx EEPROMS, which have a 0x50-57 address range. When you want to have more than eight chips, setting all but one to 0x50 and one to 0x51 solves the problem pronto.
Reference: https://github.com/PaulStoffregen/FreeIMU_original/blob/master/documents/PS-MPU-6000A-00v3.4.pdf
You can also get I2C Multiplexers such as the TCA9545A that can split one I2C line into 4 buses. I have connected up to 9 MPU9150 on one line with that.