Hello all,
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 fro just a single imu. Any help and recommendations would 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- Arduino Wiring & Test | Adafruit TCA9548A 1-to-8 I2C Multiplexer Breakout | Adafruit Learning System
MPU Sensor- Arduino Playground - MPU-6050
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);
}
NassarTCA.ino (3.29 KB)