I am working on a project that will use multiple imu 9150s (very similar to mpu 6150, a combination of a gyroscope, accelerometer and magnetometer) to measure lower body angles. Because I require communication between multiple devices simultaneously, I ordered a device from Adafruit called an I2C multiplexer (TCA9548A.) I went down this route because each imu device has the same i2c address. Using the multiplexer, one can ideally communicate with each imu device through the multiplexer in order receive all of the values from each individual imu. I am having trouble getting the code to work for just a single imu. Any help and recommendations would be greatly appreciated. Attached is my best effort at a successful code for a single imu, along with a picture of the setup. Below are the links to both the code for imu sensor which works individually, and the multiplexer which also works individually.
Thanks for all the help!
Geoffrey
Adafruit Sensor- https://learn.adafruit.com/adafruit-tca9548a-1-to-8-i2c-multiplexer-breakout/wiring-and-test
MPU Sensor- Code to sensor in arduino Mpu6050 library.
Code-
#include "Wire.h"
extern "C" {
#include "utility/twi.h" // from Wire library, so we can do bus scanning
}
#define TCAADDR 0x70
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
void tcaselect(uint8_t i) {
if (i > 7) return;
Wire.beginTransmission(TCAADDR);
Wire.write(1 << i);
Wire.endTransmission();
}
void setup(){
Wire.begin();
tcaselect(1);
Wire.beginTransmission(TCAADDR); //***was previously
//Wire.beginTransmission(MPU_addr);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
Serial.begin(9600);
}
void loop(){
tcaselect(1);
Wire.beginTransmission(TCAADDR); //***was previously
//Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(TCAADDR,14,true); // ***was previously MPU_addr instead of
//TCAADDR; request a total of 14 registers
AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
Tmp=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
GyY=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
GyZ=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
Serial.print("AcX = "); Serial.print(AcX);
Serial.print(" | AcY = "); Serial.print(AcY);
Serial.print(" | AcZ = "); Serial.print(AcZ);
Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53); //equation for
//temperature in degrees C from datasheet
Serial.print(" | GyX = "); Serial.print(GyX);
Serial.print(" | GyY = "); Serial.print(GyY);
Serial.print(" | GyZ = "); Serial.println(GyZ);
delay(333);
}