MATLAB: Multiple mpu6050 with S function

accelerometeraduinogy-521MATLABmpu6050multiple mpu6050s-functionsimulink

I have my mpu6050 (GY-521) connected to Arduino uno and run S function perfectly but now i want to use two sensors at the same time.
After wiring both mpu6050s i can change the library in S function to read 0x68 or 0x69 and respected sensor will send data to simulink but i can't get both of them at the same time
I tried copying the S function for the other sensor and change the library (one of them is 0x68 and the other is 0x69) and run it, but i get some errors.
Then I tried to change outputs in S function to read both sensor data simultaneously but i again get error messages.
Has somebody done it?
How can i solve it?
my S function is like this:
libraries:
#ifndef MATLAB_MEX_FILE
#define ARDUINO 100
#include <Arduino.h>
#include <Wire.h>
#include <Wire.cpp>
#include <twi.h>
#include <twi.c>
#define MPU 0x68
#endif
Outputs:
#ifndef MATLAB_MEX_FILE
Wire.beginTransmission(MPU);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU, 14, true);
int raw = Wire.read() << 8;
raw = raw | Wire.read();
ax[0] = (float)raw / 2048.0f;
raw = Wire.read() << 8;
raw = raw | Wire.read();
ay[0] = (float)raw / 2048.0f;
raw = Wire.read() << 8;
raw = raw | Wire.read();
az[0] = (float)raw / 2048.0f;
raw = Wire.read() << 8;
raw = raw | Wire.read();
temp[0] = (float)raw / 340.0f + 36.53f;
raw = Wire.read() << 8;
raw = raw | Wire.read();
gx[0] = (float)raw / 131.0f;
raw = Wire.read() << 8;
raw = raw | Wire.read();
gy[0] = (float)raw / 131.0f;
raw = Wire.read() << 8;
raw = raw | Wire.read();
gz[0] = (float)raw / 131.0f;
#endif
Update:
#ifndef MATLAB_MEX_FILE
if (xD[0] != 1) {
Wire.begin();
/* Do not sleep */
Wire.beginTransmission(MPU);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
/* Gyroscope full scale range: 250 degs/s */
Wire.beginTransmission(MPU);
Wire.write(0x1B);
Wire.write(0);
Wire.endTransmission(true);
/* Accelerometer full scale range: 4g */
Wire.beginTransmission(MPU);
Wire.write(0x1C);
Wire.endTransmission();
Wire.requestFrom(MPU, 1);
byte x = Wire.read(); //the value of Register-28 is in x
x = x | 0b00011000; //appending values of Bit4 and Bit3
Wire.beginTransmission(MPU);
Wire.write(0x1C); //pointing Register-28
Wire.write(x); //value for Register-28; Full-scale range is now +/- 16g
Wire.endTransmission();
xD[0] = 1;
}
#endif
sf.jpg
this is my folder with all files inside that for one sensor works fine:
i just want to use it for both sensors
btw my wiring is fine (i think) beacuse i tested it with arduino IDE and it is ok. also i can read data with simulink when im just using one of them :
hqdefault.jpg
these two pictures below did not work for me. i tried to change the code in libraries, output and update, but i couldnt get it working:
2sf.jpg
1sfdouble.jpg

Best Answer

i figured it out:
libraries:
#ifndef MATLAB_MEX_FILE
#define ARDUINO 100
#include <Arduino.h>
#include <Wire.h>
#include <Wire.cpp>
#include <twi.h>
#include <twi.c>
#define MPU01 0x68
#define MPU02 0x69
#define MPU
#endif
Outputs:
#ifndef MATLAB_MEX_FILE
Wire.beginTransmission(MPU01);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU01, 14, true);
int raw = Wire.read() << 8;
raw = raw | Wire.read();
ax68[0] = (float)raw / 2048.0f;
raw = Wire.read() << 8;
raw = raw | Wire.read();
ay68[0] = (float)raw / 2048.0f;
raw = Wire.read() << 8;
raw = raw | Wire.read();
az68[0] = (float)raw / 2048.0f;
raw = Wire.read() << 8;
raw = raw | Wire.read();
gx68[0] = (float)raw / 131.0f;
raw = Wire.read() << 8;
raw = raw | Wire.read();
gy68[0] = (float)raw / 131.0f;
raw = Wire.read() << 8;
raw = raw | Wire.read();
gz68[0] = (float)raw / 131.0f;
Wire.beginTransmission(MPU02);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU02, 14, true);
raw = Wire.read() << 8;
raw = raw | Wire.read();
ax69[0] = (float)raw / 2048.0f;
raw = Wire.read() << 8;
raw = raw | Wire.read();
ay69[0] = (float)raw / 2048.0f;
raw = Wire.read() << 8;
raw = raw | Wire.read();
az69[0] = (float)raw / 2048.0f;
raw = Wire.read() << 8;
raw = raw | Wire.read();
gx69[0] = (float)raw / 131.0f;
raw = Wire.read() << 8;
raw = raw | Wire.read();
gy69[0] = (float)raw / 131.0f;
raw = Wire.read() << 8;
raw = raw | Wire.read();
gz69[0] = (float)raw / 131.0f;
#endif
Update:
#ifndef MATLAB_MEX_FILE
if (xD[0] != 1) {
Wire.begin();
/* Do not sleep */
Wire.beginTransmission(MPU01);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
/* Gyroscope full scale range: 250 degs/s */
Wire.beginTransmission(MPU01);
Wire.write(0x1B);
Wire.write(0);
Wire.endTransmission(true);
/* Accelerometer full scale range: 4g */
Wire.beginTransmission(MPU01);
Wire.write(0x1C);
Wire.endTransmission();
Wire.requestFrom(MPU01, 1);
byte x = Wire.read(); //the value of Register-28 is in x
x = x | 0b00011000; //appending values of Bit4 and Bit3
Wire.beginTransmission(MPU01);
Wire.write(0x1C); //pointing Register-28
Wire.write(x); //value for Register-28; Full-scale range is now +/- 16g
Wire.endTransmission();
/* Do not sleep */
Wire.beginTransmission(MPU02);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
/* Gyroscope full scale range: 250 degs/s */
Wire.beginTransmission(MPU02);
Wire.write(0x1B);
Wire.write(0);
Wire.endTransmission(true);
/* Accelerometer full scale range: 4g */
Wire.beginTransmission(MPU02);
Wire.write(0x1C);
Wire.endTransmission();
Wire.requestFrom(MPU02, 1);
byte y = Wire.read(); //the value of Register-28 is in x
y = y | 0b00011000; //appending values of Bit4 and Bit3
Wire.beginTransmission(MPU02);
Wire.write(0x1C); //pointing Register-28
Wire.write(y); //value for Register-28; Full-scale range is now +/- 16g
Wire.endTransmission();
xD[0] = 1;
}
#endif
I just removed temp in Outputs cuz whatever i did it gave me errors. i didnt need temp anyway.
I hope this helps others
Related Question