Bonjour,
Je souhaite étudier avec des MPU-6050 les variations d'un système que j'ai crée. J'ai un MPU qui est fixé à la board pour avoir les accélérations de départ, et une MPU au boût de deux servo-moteur pour avoir les accélérations de sortie (les servo-moteur ont pour but de compenser le mouvement de la board donc le deuxième MPU va être plus stable que le premier).
Pour réaliser cela, j'ai deux cartes nano. Une première qui prend les valeurs des deux MPU avec le code ci-dessous :
#include <Wire.h>
const int MPU2 = 0x69, MPU1=0x68;
long accelX, accelY, accelZ;
float gForceX, gForceY, gForceZ, gyroX, gyroY, gyroZ,rotX, rotY, rotZ;
long accelX2, accelY2, accelZ2;
float gForceX2, gForceY2, gForceZ2;
int currentTime;
void setup(){
Wire.begin();
Wire.beginTransmission(MPU1);
Wire.write(0x6B);
Wire.write(0b00000000);
Wire.endTransmission();
Wire.beginTransmission(MPU1);
Wire.write(0x1B);
Wire.write(0x00000000);
Wire.endTransmission();
Wire.beginTransmission(MPU1);
Wire.write(0x1C);
Wire.write(0b00000000);
Wire.endTransmission();
Wire.begin();
Wire.beginTransmission(MPU2);
Wire.write(0x6B);
Wire.write(0b00000000);
Wire.endTransmission();
Wire.beginTransmission(MPU2);
Wire.write(0x1B);
Wire.write(0x00000000);
Wire.endTransmission();
Wire.beginTransmission(MPU2);
Wire.write(0x1C);
Wire.write(0b00000000);
Wire.endTransmission();
Serial.begin(38400);
}
void loop(){
GetMpuValue(MPU1);
Serial.print("////");
GetMpuValue(MPU2);
Serial.println("");
}
void GetMpuValue(const int MPU){
Wire.beginTransmission(MPU);
Wire.write(0x3B);
Wire.endTransmission();
Wire.requestFrom(MPU,6);
while(Wire.available() < 6);
accelX = Wire.read()<<8|Wire.read();
accelY = Wire.read()<<8|Wire.read();
accelZ = Wire.read()<<8|Wire.read();
Wire.beginTransmission(MPU);
Wire.write(0x43);
Wire.endTransmission();
Wire.requestFrom(MPU,6);
while(Wire.available() < 6);
gyroX = Wire.read()<<8|Wire.read();
gyroY = Wire.read()<<8|Wire.read();
gyroZ = Wire.read()<<8|Wire.read();
gForceX = accelX / 16384.0;
gForceY = accelY / 16384.0;
gForceZ = accelZ / 16384.0;
rotX = gyroX / 131.0;
rotY = gyroY / 131.0;
rotZ = gyroZ / 131.0;
currentTime = millis();
Serial.print(currentTime);
Serial.print("//");
Serial.print(rotX);
Serial.print("/");
Serial.print(rotY);
Serial.print("/");
Serial.print(rotZ);
Serial.print("//");
Serial.print(gForceX);
Serial.print("/");
Serial.print(gForceY);
Serial.print("/");
Serial.print(gForceZ);
delay(0);
}
Et une deuxième qui asservit les servo-moteur avec les valeurs du MPU d'entrée, avec le code ci-dessous :
#include "Wire.h"
#include "MPU6050.h"
#include "Servo.h"
MPU6050 mpu; //Déclaration variables : accéléromètre/gyroscope MPU6050
int16_t ax, ay, az;
int16_t gx, gy, gz;
Servo servo1; //servomoteur 1
Servo servo2;
int valr; //valeur actuelle
int valp;
int prevValr; //valeur précédente
int prevValp;
void setup() {
Wire.begin();
Serial.begin(115200);
Serial.println("Initialize MPU");
mpu.initialize();
Serial.println(mpu.testConnection() ? "Connected" : "Connection failed"); // savoir si MPU6050 est conncecté ou non
servo1.attach(6); //port d'attache du servomoteur (D6)(axe ay)
servo2.attach(7);
}
void loop() {
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); //récupère les valeurs du MPU6050
valr = map(-ay, -17000, 17000, 0, 179); //-ay dans la fonc map car on cherche à contrer l'angle détecté -> - valeur
valp= map(-ax, -17000, 17000, 0 , 179);
if (valr != prevValr && valp != prevValp) //si la valeur lue est différente de celle lue précédemment
{
servo1.write(valr);//envoie l'angle à effectuer au servo 1
servo2.write(valp);//envoie l'angle à effectuer au servo 2
prevValr = valr; //la valeur précédente devient notre valeur actuelle
prevValp = valp;
}
delay(0);
}
Les deux programmes sont gérés par deux ordi différents pour chaque carte nano, mais ils semblent interférer entre eux car ils fonctionnent bien individuellement mais pas ensembles.
Est-ce que quelqu'un aurait une idée de l'origine du problème ?
Merci d'avance,
Emma