2 programmes parallèles qui se bloquent

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

ça veut dire quoi concrètement ?

Quand je lance les deux programmes en même temps, le programme pour récupérer les accélérations (le premier) s'arrête au bout de moins d'une seconde. Il est donc impossible pour moi de récupérer des données exploitables pour étudier le mouvement que je donne en entrée et celui qu'il y a en sortie.

Quand je lance le premier programme sans que les servo-moteur tournent, il fonctionne très bien sur plusieurs secondes.

voilà ce que je comprends

  • vous avez 2 ordinateurs
  • vous avez 2 Arduino nanos, chacun connecté à un des ordinateurs
  • le premier arduino (Nano1) porte un MPU et fait tourner le premier code
  • le deuxième arduino (Nano2) pilote 2 servo moteurs et un MPU est accroché quelque part (ou?) et fait tourner le second code

Vous dites que si vous lancez Nano1 tout fonctionne, si vous lancez Nano2 ça fonctionne mais si vous lancez (sur 2 ordis séparés) Nano1 et Nano2 alors ça ne fonctionne plus ??

j'ai dû rater un truc car ça n'est pas très sensé...

au passage, comment sont alimentés les servos ?

Ou j'ai mal lu ton code ou c'est de la magie noire.
Il n'y a aucun lien entre les 2 applications, il me semble.
Tu pourrais nous faire un petit croquis de la manip. Avec en particulier des détails sur l'alimentation des sous-ensembles.

Là, il y a un truc qui a du m'échapper en première lecture. Deux possibilités:

  1. il y a 3 MPU
  2. il y a 2 MPU et l'un des deux et lu par les 2 nano?

Si on est dans le cas (1) ta description du montage n'est pas très claire
Si on est dans le cas (2) ta description du montage n'est pas très claire mais en plus il y a un conflit lors de l'accès au MPU qui est partagé car les 2 systèmes étant asynchrones rien n'empêche les 2 nano de vouloir lire le MPU au même moment.

J'ai réussi à faire un code qui utilise une seule carte nano pour contrôler les servo-moteur et récupérer les valeurs grâce au post "Utiliser deux MPU6050 simultanément grace à la communication I2C" (Utiliser deux MPU6050 simultanément grace à la communication I2C). Mon système ressemble un peu au sien.

Désolé d'avoir mal expliqué mon montage et merci beaucoup d'avoir répondu J-M-L et fdufnews.

OK donc les 2 cartes essayaient d'accéder à un MPU partagé, c'est ça ?

Oui c'est ça, les 2 programmes partageaient un des MPU.

OK - oui c'est un souci

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.