multiple mpu6050 with S function

51 ビュー (過去 30 日間)
Adib Ahmadi
Adib Ahmadi 2019 年 8 月 8 日
回答済み: Gayatri Menon 2022 年 1 月 7 日
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

採用された回答

Adib Ahmadi
Adib Ahmadi 2019 年 8 月 10 日
編集済み: Adib Ahmadi 2019 年 8 月 10 日
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
  1 件のコメント
AKASH WAITAGE
AKASH WAITAGE 2020 年 12 月 13 日
its not working for me ...scope doesnt showing any result....plzz help

サインインしてコメントする。

その他の回答 (4 件)

ayman dhafer
ayman dhafer 2019 年 12 月 31 日
I have used the function with matlab 2018a but it didnot work can you sent the you havr developed with matlab 2018a. thank you
  2 件のコメント
Brandon vico
Brandon vico 2020 年 6 月 13 日
Did u work on it already? I used matlab 2018a as well.
ayman dhafer
ayman dhafer 2020 年 6 月 13 日
I have used another approach with simulink I have edit a simulink model to read from two accelerometer.

サインインしてコメントする。


fatima zohra soussi
fatima zohra soussi 2020 年 9 月 30 日
i have in result just 0 can you help me (i use matlab 2020a)
  3 件のコメント
fatima zohra soussi
fatima zohra soussi 2020 年 10 月 6 日
Yes i do it thanks you please you have any information how command motor dc with MPU6050 in simulink?
BAPTISTE SALAUN
BAPTISTE SALAUN 2021 年 3 月 18 日
Where can we find .slx files with a mpu6050 block exemple ?

サインインしてコメントする。


AKASH WAITAGE
AKASH WAITAGE 2020 年 12 月 13 日
i want use 7 mpu6050 sensors for my project in simulink model ..i unable to find any source for help...can u help me with this..

Gayatri Menon
Gayatri Menon 2022 年 1 月 7 日
Hi,
You can connect to MPU6050 on Arduino using MPU6050 block .
To connect 2 MPU6050s on the same Arduino I2C bus by changing the I2C Address of one of the sensor.
This can be done by connecting AD0 pin on one of the sensor to high, making the I2C Address of the sensor 0x69 and connect the AD0 of the other sensor to Low, making the I2C Address of the sensor 0x68.
Now in the model you can add 2 MPU6050 blocks. Specify I2C Address of one block as 0x69 and other as 0x68.
Hope this helps
Thanks
Gayatri

カテゴリ

Help Center および File ExchangeArduino Hardware についてさらに検索

製品


リリース

R2018b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by