eCycling et MPU6050
miralant
2 Messages
Le jeudi 29 décembre 2022 à 16:38:29
Bonjour,
Je travaille sur un projet perso lié à l'application d'eCycling ZWIFT.
Le projet se découpe en 2 blocs :
Une consigne de pente (-10% à +15%). Cette consigne de pente pilote un actionneur linéaire (+12v à -12v via un pont en H) qui est asservi via un MPU6050 pour mesurer la pente. Et c'est là que j'ai un soucis.
Ci-dessous une vidéo du bazard
Vidéo 5
Vous pouvez constater que le MPU6050 est sous l'afficheur OLED qui est fixé au guidon du vélo).
Mon problème : J'ai trouvé du code pour récupérer la pente mais l'asservissement, n'est pas "bon" car la mesure est "instable". J'ai l'impression que la mesure n'est pas assez précise car d'un coup à l'autre, je ne reviens pas à la même position pour la même consigne...C'est très variable et ça marche, ça se dégrade, ça remarche...ça va et ça vient.
Les 2 sub qui font acquisition et asservissement :
Je mesure y, je le repasse sur +/- 180° (#Slope) et je compare à ma consigne après voir transformer ma pente en ° (Consignedeg).
J'ai essayé d'implémenter le code du site avec les mesure de pitch, ... mais j'avoue que je ne comprends pas comment l'utiliser dans mon projet.
Merci d'avance pour le coup de pouce.
Je travaille sur un projet perso lié à l'application d'eCycling ZWIFT.
Le projet se découpe en 2 blocs :
- Une application C# .NET 6 qui tourne en parallèle du logiciel d'eCycling et récupère la fréquence cardiaque (d'une ceinture cardio portée par le cycliste en BT BLE) et la pente en % (affichée sur le logciel d'Ecycling) pour ensuite les envoyer en USB à un Arduino Nano.
- L'arduino nano reçoit donc 2 types d'état en USB
Une consigne de pente (-10% à +15%). Cette consigne de pente pilote un actionneur linéaire (+12v à -12v via un pont en H) qui est asservi via un MPU6050 pour mesurer la pente. Et c'est là que j'ai un soucis.
Ci-dessous une vidéo du bazard
Vidéo 5
Vous pouvez constater que le MPU6050 est sous l'afficheur OLED qui est fixé au guidon du vélo).
Mon problème : J'ai trouvé du code pour récupérer la pente mais l'asservissement, n'est pas "bon" car la mesure est "instable". J'ai l'impression que la mesure n'est pas assez précise car d'un coup à l'autre, je ne reviens pas à la même position pour la même consigne...C'est très variable et ça marche, ça se dégrade, ça remarche...ça va et ça vient.
Les 2 sub qui font acquisition et asservissement :
void ReadMPU6050() {
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr, 14, true);
AcX = Wire.read() << 8 | Wire.read();
AcY = Wire.read() << 8 | Wire.read();
AcZ = Wire.read() << 8 | Wire.read();
int xAng = map(AcX, minVal, maxVal, -90, 90);
int yAng = map(AcY, minVal, maxVal, -90, 90);
int zAng = map(AcZ, minVal, maxVal, -90, 90);
x = RAD_TO_DEG * (atan2(-yAng, -zAng) + PI);
y = RAD_TO_DEG * (atan2(-xAng, -zAng) + PI);
z = RAD_TO_DEG * (atan2(-yAng, -xAng) + PI);
Serial.println("*************************");
Serial.println("AcX : " + String(AcX));
Serial.println("AcY : " + String(AcY));
Serial.println("AcZ : " + String(AcZ));
Serial.println("x : " + String(x));
Serial.println("y : " + String(y));
Serial.println("z : " + String(z));
ClimbConsigneDeg = RAD_TO_DEG * atan(ClimbConsigne.toInt() / 100.0);
if (y > 180) {
Slope = (360 - y) * -1;
} else {
Slope = y;
}
Serial.println("*************************");
}
void CommandeClimb(void) {
//int ConsigneDeg = ClimbConsigne.toInt();
float ConsigneDeg = ClimbConsigneDeg;
float difference = Slope - ConsigneDeg; // Find the difference
float absDifference = abs(difference); // Find the absolute (like rms)
Serial.println("Slope : " + String(Slope));
Serial.println("ConsigneDeg : " + String(ConsigneDeg));
Serial.println("absDifference : " + String(absDifference));
Serial.println("difference : " + String(difference));
if (difference < 0.75 && difference > -0.75) {
Serial.println(">>>CONSIGNE<<<");
Moteur_CouperAlimentation();
ClimbSet = 1;
}
if (ClimbSet == 0) {
if (Slope > ConsigneDeg) {
Serial.println(">>>Descendre<<<");
Moteur_Descendre();
} else if (Slope < ConsigneDeg) {
Serial.println(">>>Monter<<<");
Moteur_Monter();
}
EcrireEcranClimbAsserv();
}
}
Je mesure y, je le repasse sur +/- 180° (#Slope) et je compare à ma consigne après voir transformer ma pente en ° (Consignedeg).
J'ai essayé d'implémenter le code du site avec les mesure de pitch, ... mais j'avoue que je ne comprends pas comment l'utiliser dans mon projet.
Merci d'avance pour le coup de pouce.
Le jeudi 29 décembre 2022 à 17:34:06
Salut @miralant et bienvenue chez les makers !
Super projet !
Je ne suis pas sûr d'avoir compris l'histoire avec l'actionneur linéaire. Le but est d'incliner le cadre du vélo en fonction de la pente qu'on a dans le jeu, c'est ça ?
Dans ton cas, je ne pense pas que tu aies besoin d'une fréquence d'échantillonnage de malade, donc je t'invite à regarder du côté de la lib MPU : https://www.arduino.cc/reference/en/libraries/mpu6050/
Super projet !
Je ne suis pas sûr d'avoir compris l'histoire avec l'actionneur linéaire. Le but est d'incliner le cadre du vélo en fonction de la pente qu'on a dans le jeu, c'est ça ?
Dans ton cas, je ne pense pas que tu aies besoin d'une fréquence d'échantillonnage de malade, donc je t'invite à regarder du côté de la lib MPU : https://www.arduino.cc/reference/en/libraries/mpu6050/
miralant
2 Messages
Le jeudi 29 décembre 2022 à 19:41:03
Merci pour l'accueil.
Oui, c'est exactement ça. L'actionneur linéaire est positionné à la place de la roue avant et par conséquent simule la pente en fonction de la pente dans le jeux. Regardes dans mon 1er post, j'ai mis un lien vers une vidéo.
Penses tu que cette lib va résoudre le problème de stabilité de la mesure ? Pourquoi ne l'a tu pas implémentée dans ton projet de drone ?
Merci
Oui, c'est exactement ça. L'actionneur linéaire est positionné à la place de la roue avant et par conséquent simule la pente en fonction de la pente dans le jeux. Regardes dans mon 1er post, j'ai mis un lien vers une vidéo.
Penses tu que cette lib va résoudre le problème de stabilité de la mesure ? Pourquoi ne l'a tu pas implémentée dans ton projet de drone ?
Merci
Le mercredi 4 janvier 2023 à 09:21:06
Oui je pense que ça va résoudre ton problème de stabilité.
Dans mon cas, j'avais besoin d'une fréquence d'échantillonnage de 250Hz, chose impossible avec la lib en question (limite à 50Hz).
Dans ton cas je ne pense pas que ce soit un problème.
Dans mon cas, j'avais besoin d'une fréquence d'échantillonnage de 250Hz, chose impossible avec la lib en question (limite à 50Hz).
Dans ton cas je ne pense pas que ce soit un problème.
Anonyme
-1 Messages
Le vendredi 5 mai 2023 à 11:36:59
Message modéré par un admin. Motif :
Message spam
Message spam