Arduino n'est pas assez rapide ??!

Bonjour à tous.
Aujourd’hui, je m’occupe de mon projet de drone et je décide de faire les commandes à l’aide de 2 Joysticks.
Comme vous le savez déjà sûrement, il faut + ou - faire tourner les moteurs pour se diriger.
Pour monter → 4 moteurs + vite
descente → 4 moteurs - vite
droite → 2 moteurs à gauche + vite et 2 moteurs à droite - vite

Etc, etc…

Donc je fais mon programme, et là, en affichant les variables sur le Serial, je me prends compte qu’elles ne sont pas du tout précises ! Quand j’affiche le analogRead directement, c’est juste, quand c’est la valeur qui est remap, c’est juste, mais quand j’affiche la puissance qui doit etre donnée aux moteurs, là c’est le drame …

Voici le programme:

////|A|//|B|////
//////I//I/////
///////II//////
////////o//////
///////II//////
//////I//I/////
////|C|//|D|///

#include <Servo.h>

Servo motA, motB, motC, motD;

int VRx1, VRy1, VRx2, VRy2;
byte xFin1, yFin1, xFin2, yFin2;
byte valMotA, valMotB, valMotC, valMotD;

int DeltaVit = 20;

void setup() {
  motA.attach(4, 1000, 2000); // 1000 and 2000 are very important ! Values can be different with other ESCs.
  motB.attach(5, 1000, 2000);
  motC.attach(6, 1000, 2000);
  motD.attach(7, 1000, 2000);
  
  Serial.begin(9600);
}

void loop() {

  VRx1 = analogRead(A0);
  VRy1 = 1023 - analogRead(A1); // L'axe y va vers le bas et non vers le haut
  VRx2 = analogRead(A2);
  VRy2 = 1023 - analogRead(A3); // L'axe y va vers le bas et non vers le haut
  
  xFin1 = map(VRx1, 0, 1023, 0, 180);
  yFin1 = map(VRy1, 0, 1023, 0, 180);
  xFin2 = map(VRx2, 0, 1023, 0, 180);
  yFin2 = map(VRy2, 0, 1023, 0, 180);
  
  //Activer ou non le PID
  if (yFin2 <= 100 && yFin2 >= 80 && xFin2 <= 100 && xFin2 >= 80) {
  }
  //Monter ou descendre
  if (yFin1 > 100 || yFin1 < 80) {
    valMotA = yFin1;
    valMotB = yFin1; 
    valMotC = yFin1; 
    valMotD = yFin1;
  }
  //Aller en avant
  if (yFin2 > 100) {
    valMotA = yFin2 - DeltaVit;
    valMotB = yFin2 - DeltaVit;
    valMotC = yFin2;
    valMotD = yFin2;
  }
  //Aller en arrière
  if (yFin2 < 80) {
    valMotA = yFin2;
    valMotB = yFin2;
    valMotC = yFin2 - DeltaVit;
    valMotD = yFin2 - DeltaVit;
  }
  //Aller à droite
  if (xFin2 > 100) {
    valMotA = xFin2;
    valMotC = xFin2;
    valMotB = xFin2 - DeltaVit;
    valMotD = xFin2 - DeltaVit;
  }
  //Aller à gauche
  if (xFin2 < 80) {
    valMotA = xFin2 - DeltaVit;
    valMotC = xFin2 - DeltaVit;
    valMotB = xFin2;
    valMotD = xFin2;
  }
  
  if (valMotA > 180) {
    valMotA = 180;
  }
  if (valMotB > 180) {
    valMotB = 180;
  }
  if (valMotC > 180) {
    valMotC = 180;
  }
  if (valMotD > 180) {
    valMotD = 180;
  }
  if (valMotA < 0) {
    valMotA = 0;
  }
  if (valMotB < 0) {
    valMotB = 0;
  }
  if (valMotC < 0) {
    valMotC = 0;
  }
  if (valMotD < 0) {
    valMotD = 0;
  }
  
  motA.write(valMotA);
  motB.write(valMotB);
  motC.write(valMotC);
  motD.write(valMotD);
    
  Serial.print("Mot A: "); Serial.print(valMotA); Serial.print(" | Mot B: "); Serial.print(valMotB); Serial.print(" | Mot C: "); Serial.print(valMotC); Serial.print(" | Mot D: "); Serial.println(valMotD); 
  
}

Alors déjà, au début, j’ai une valeur de 180 pour tous les moteurs
Ensuite, quand je vais à 0 et à 180, c’est aussi bon, mais les valeurs se retrouvent très très peu précises quand on bouge rapidement le joystick, le calcul ne “suit” pas …

Comment optimiser tout ça ?? (à cause des “if” qui sont moches ?)
Merci beaucoup !

Bien évidemment, quand je dis que la valeur est pour tous les moteurs, je parle de "motA-D" mais je ne branche pas encore les moteurs par peur de les casser

Déjà, si tu veux aller plus vite supprime le Serial.print ou alors passe-le à 115200.

Tu peux gagner une soustraction

  VRy1 = 1023 - analogRead(A1); // L'axe y va vers le bas et non vers le haut
 
  yFin1 = map(VRy1, 0, 1023, 0, 180);

en faisant ça

  VRy1 = analogRead(A1); // L'axe y va vers le bas et non vers le haut
 
  yFin1 = map(VRy1, 0, 1023, 180, 0);

Pareil pour l'autre axe bien sur

Tu ferais bien aussi de revoir tes tests parce que les if dans ton code laisse une grosse partie de la fourchette 0 à 100 inutilisée
Qu’est-ce qui se passe en dehors de cette fourchette??if (yFin1 > 100 || yFin1 < 80) {
La même chose dans les tests sur l’autre axe

Bonjour fdufnews

fdufnews:
Déjà, si tu veux aller plus vite supprime le Serial.print ou alors passe-le à 115200.

Pourquoi pas 1 000 000 bauds ?
C'est encore plus rapide.

Cordialement,
bidouilleelec

fdufnews:
Tu ferais bien aussi de revoir tes tests parce que les if dans ton code laisse une grosse partie de la fourchette 0 à 100 inutilisée
Qu’est-ce qui se passe en dehors de cette fourchette??if (yFin1 > 100 || yFin1 < 80) {
La même chose dans les tests sur l’autre axe

C’est pour dire que le joystick n’est pas en position du milieu, donc le drone change d’altitude (monter ou descendre). Mais c’est vrai que c’est pas utile (J’avais mis un “à supprimer d’ailleurs que j’ai enlevé paradoxalement :D”

fdufnews:
Déjà, si tu veux aller plus vite supprime le Serial.print ou alors passe-le à 115200.

Tu peux gagner une soustraction

  VRy1 = 1023 - analogRead(A1); // L'axe y va vers le bas et non vers le haut

yFin1 = map(VRy1, 0, 1023, 0, 180);


en faisant ça

VRy1 = analogRead(A1); // L'axe y va vers le bas et non vers le haut

yFin1 = map(VRy1, 0, 1023, 180, 0);


Pareil pour l'autre axe bien sur

bidouilleelec:
Bonjour fdufnews
Pourquoi pas 1 000 000 bauds ?
C'est encore plus rapide.

Cordialement,
bidouilleelec

Merci beaucoup ! :slight_smile:

PS: Désolé pour les réponses tardives, je me suis endormi cette soirée, j'ai du avoir une semaine éprouvante !

fdufnews:
Tu ferais bien aussi de revoir tes tests parce que les if dans ton code laisse une grosse partie de la fourchette 0 à 100 inutilisée
Qu’est-ce qui se passe en dehors de cette fourchette??if (yFin1 > 100 || yFin1 < 80) {
La même chose dans les tests sur l’autre axe

Ah oui, tu as mis le doigt sur le problème, en fait c’est pas que le joystick n’est pas précis ou quoi, c’est juste que dans cette fourchette, c’est pas utilisé donc on aura jamais les valeurs intermédiaires. Je vais essayer le contraire "si la valeur est entre 80 et 100, sinon mot=vrY

C'est bon, c'est réglé ! Merci à tous :slight_smile:

Dernier truc, lorsque mon joystick de gauche (VRx1 et VRy1, en gros les gaz) est en position du milieu, les moteurs font des "à coups" (orthographe ??!) je pense que c'est pas super bon pour ces derniers, mais en même temps j'ai testé en Serial et je ne vois pas de spéciale oscillation (ou très faible, +-1 sur 180).
Vous pensez que ça peut provenir de là ? Et sinon comment régler ça ?

Ça vaut le coup de souder des condo entre le + et le - des Joysticks ?

Bonjour,
fais un essai en doublant les lectures analogiques :
VRx1 = analogRead(A0);
VRx1 = analogRead(A0);
pareil pour les autres

Bon bah simplement, c’est du à des problèmes de câblage de joystick (pas bien branché avec mes câbles male femelle) ce qui fait que ça donnait parfois une valeur de 180.
Faudra donc pas oublier un système qui fait que le drone se pose tout seul, voir un arrêt complet !
Merci beaucoup

trimarco232:
Bonjour,
fais un essai en doublant les lectures analogiques :
VRx1 = analogRead(A0);
VRx1 = analogRead(A0);
pareil pour les autres

Merci, c'est réglé !
Ça sera bien mieux soudé une fois sur la "breadboard flottante"

bravo !

Faudra donc pas oublier un système qui fait que le drone se pose tout seul

je suppute que ce sera moins simple

trimarco232:
bravo !je suppute que ce sera moins simple

J’avais pensé à lui donner une valeur de moteur constante qui lui permettre de descendre tout seul, et au dire et a mesure (à - de 2m) qu’il descend, avec des capteurs à ultrasons, cette valeur de moteur diminue (proportionnellement)

Plutôt l’inverse en pratique.

Si tu ralentis les moteurs plus tu descends, le drone va descendre de plus en plus vite. C’est le crash

Plus le drone se rapproche du sol, plus il faudra remettre du gaz pour ralentir la descente. Sans toutefois remettre trop de gaz. Et là c’est atterrissage tout en douceur

Jambe:
Plutôt l’inverse en pratique.

Si tu ralentis les moteurs plus tu descends, le drone va descendre de plus en plus vite. C’est le crash

Plus le drone se rapproche du sol, plus il faudra remettre du gaz pour ralentir la descente. Sans toutefois remettre trop de gaz. Et là c’est atterrissage tout en douceur

Ah oui, bien vu ! :smiley: