Activation de deux servomoteurs simultanément

Bonjour,

J'ai pour projet de construire un robot qui joue du piano, il est composé d'un moteur mcc pour la translation et pour l'instant de deux servomoteurs MG996R. J'aurai envie que les deux doigts s'activent en même temps pour que le robot joue deux notes en même temps, cela rend beau en musique. Cependant j'ai beaucoup cherché et ne trouve pas commun les activer en même temps.
Voici mon code:


#include <Servo.h>
Servo monServomoteur1;
Servo monServomoteur2;
void setup() {

  // Attache le servomoteur1 à la broche D9
  monServomoteur1.attach(9);
  // Attache le servomoteur2 à la broche D10
  monServomoteur2.attach(10);

}

void loop() {

   doigt_1();
   doigt_2(); 
}
void doigt_1() {
 
  for (int position = 103.24; position >= 83.24; position--) {
    monServomoteur1.write(position);
    delay(6);
  }
  delay(500);

  // Fait bouger le bras de 0° à 180°
  for (int position =83.24; position <= 103.24; position++) {
    monServomoteur1.write(position);
    delay(6);
 
  }
}

void doigt_2 () {

    // Fait bouger le bras de 0° à 180°
  for (int position =80.31; position <= 97.94; position++) {
    monServomoteur2.write(position);
    delay(8);
  }
  delay(500);

  for (int position = 97.94; position >= 80.31; position--) {
    monServomoteur2.write(position);
    delay(8);
   
  }

}

J'ai cru comprendre que comme il s'agissait d'un microcontrôleur mono-coeur donc que c'est compliqué pour faire deux action en même temps. Mais si vous avez une idée pour y arriver d'une autre manière je suis preneur.

Merci d'avance

Toujours "oops"

Oui en effet, oups ! Je corrige ça ...

L'esp32 a 2 cœur.
Ça peut le faire ?

Vous pouvez utiliser des tableaux, un exemple possible :

#include <Servo.h>
Servo monServomoteur1;
Servo monServomoteur2;

int doigt_1[20] {103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 87, 86, 85, 84, 83};
int doigt_2[20] {80, 81, 82, 83, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,};

void setup() {
  // Attache le servomoteur1 à la broche D9
  monServomoteur1.attach(9);
  // Attache le servomoteur2 à la broche D10
  monServomoteur2.attach(10);
}

void loop() {
  for (int x = 0; x < 20; x++) {
    monServomoteur1.write(doigt_1[x]);
    monServomoteur2.write(doigt_2[x]);
    delay(6);
  }
  delay(500);  
  for (int x = 19; x >= 0; x--) {
    monServomoteur1.write(doigt_1[x]);
    monServomoteur2.write(doigt_2[x]);
    delay(6);
  }
}

Non, il peut faire plusieurs les unes après les autres suffisamment vite pour que cela paraisse simultané.
Mais, c'est sûr qu'en appelant doigt_1() puis après doigt_2() les actions ne s'exécuteront pas simultanément.

Tu devrais peut-être regarder cette librairie qui permet de mouvoir plusieurs servos en synchronisant leurs mouvements.

Bonjour, un grand merci pour cette aide, les servo fonctionnent en même temps !
Cependant j'ai aujourd'hui un autre problème :
Je voudrais créer une fonction qui nous permet de choisir les servomoteurs que je veux activer. J'ai appelé ces variables : "Sm_a" et "Sm_b" cependant je ne sais pas comment les déclarer. J'ai essayé en temps que chaine de caractère mais ce n'est pas bon. Auriez vous une idée? Je vous mets ci-joint mon code :

#include <Servo.h>

Servo Sm1;
Servo Sm2;
Servo Sm3;

int doigt_1[20] {103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 87, 86, 85, 84, 83};

int doigt_2[20] {80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99};

int t ;




void deux_notes(Sm_a,Sm_b,t){

  
   
  for (int x = 0; x < 20; x++) {

    Sm_a.write(doigt_1[x]);

    delay(6);
    

  }
  delay(t);
    
  for (int x = 19; x >= 0; x--) {
    
    Sm_a.write(doigt_1[x]);

    Sm_b.write(doigt_2[x]);
    
    delay(6);
  }

  delay(t);  

  for (int x = 0; x < 20; x++) {


    Sm_b.write(doigt_2[x]);

    delay(6);

  }

void setup() {
  
Sm1.attach(16);
Sm2.attach(17);
Sm3.attach(5);
}

void loop() {
  

 2_notes(Sm1,Sm2,500);
}


}

Oui, ce n'est pas une bonne façon de faire, essayez d'étudier le code suivant car je vois que vous avez encore besoin d'un peu de pratique :wink:

Servo Sm1;
Servo Sm2;
Servo Sm3;

int doigt_1[20] {103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 87, 86, 85, 84, 83};
int doigt_2[20] {80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99};
//int doigt_3[20] {?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?};

void accord (bool Sm_a, bool Sm_b, bool Sm_c, int t) {
  for (int x = 0; x < 20; x++) {
    if (Sm_a == true ){Sm1.write(doigt_1[x]);}
    if (Sm_b == true ){Sm2.write(doigt_2[x]);}
//   if (Sm_c == true ){Sm3.write(doigt_3[x]);}
    delay(6);
  }
  for (int x = 19; x >= 0; x--) {
     if (Sm_a == true ){Sm1.write(doigt_1[x]);}
     if (Sm_b == true ){Sm2.write(doigt_2[x]);}
//   if (Sm_c == true ){Sm3.write(doigt_3[x]);}
     delay(6);
  } 
  delay(t);  
}

void setup() {
  Sm1.attach(16);
  Sm2.attach(17);
  Sm3.attach(5);
}

void loop() {
  accord (1, 0, 0, 400);
  accord (1, 1, 0, 350);
  accord (0, 1, 0, 500);
}

Je crois avoir compris ce que tu voulais faire avec tes doigts, j'ai inventé l'époque.
Les salutations.

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