View All

Facebook Timeline

Multimove : L'art de faire bouger plusieurs servomoteurs en même temps avec Arduino

Posted On: janv. 27, 2021

Seen by: 884

Categories: ROBOTS

Author: Christian Joseph

Si vous avez besoin de faire bouger plusieurs servomoteurs en même temps avec Arduino, Alors Multimove est fait pour vous.

1 - Présentation de Softmove et Multimove

Nous avons créé le programme Softmove - Multimove qui permet de faire varier 1 ou deux servomoteurs doucement d'un point A vers un point B. Ces fonctions sont très pratiques en robotique, notement lorsqu'on utilise un bras robot 6 axes par exemple car généralement on a tendance à faire bouger les servomoteurs l'un après l'autre et non en même temps. Le fait de les faire varier en même temps permet d'apporter plus de fluidité aux mouvements du robot.

La fonction Softmove permet de faire varier doucement la position d'un seul Servomoteur d'un Point A vers un Point B. Par exemple Softmove(3, 45, 68) permet de faire varier avec souplesse la position du Servomoteur 3 de la position de départ 45 vers la position finale 68.

La fonction Multimove permet de faire varier doucement la position de 2 Servomoteurs en même temps. Exemple: Multimove(7,10,84,2,170,25). Le Servomoteur 7 part de la position 10 vers la position 84, tandis que au même moment le Servomoteur 2 varie de la position 170 vers la position 25.

Ce Programme fonctionne avec tous types de servomoteurs: SG90, MG995, MG996R, S3003, etc...

2 - Programmation

Nous avons testé le programme avec une carte Arduino Uno et le Shield Eagle pour Servomoteurs

/*Programme: Softmove et Multimove
 * Softmove permet de faire varier un Servomoteur doucement d'une position A vers une position B
 * Multimove permet de faire varier 2 Servomoteurs en même temps doucement d'une position A1 vers une position B1
 * pour le servo 1, et A2 vers B2 pour le Servo 2
 * Date: 27/01/2021
 * Auteur: Christian Joseph
 * www.eagle-robotics.com
 *
 */
#include "Servo.h"

Servo p[12]; // Nombre de servomoteurs, A faire varier selon le nombre de servos
int a, b, c;
int mvt, mvt1;
void setup() {
  // Déclaration des Servomoteurs
p[1].attach(4);
p[2].attach(5);
p[3].attach(6);
p[4].attach(7);
p[5].attach(8);
p[6].attach(9);
p[7].attach(10);
p[8].attach(11);
p[9].attach(14);
p[10].attach(15);
p[11].attach(16);
delay(2000);

}

void loop() {

softmove(6,60,90);//Servo 6, Départ 60°, Arrivée 90°
delay(2000);
softmove(3,50,85); //Servo 3, Départ 50°, Arrivée 85°
delay(1000);
multimove(3,85,15,4,100,133);//(Servo 3, Départ 85°, Arrivée 15°),(Servo 4, Départ 100°, Arrivée 133°)
delay(1000);
multimove(10,20,50,5,165,90);//(Servo 10, Départ 20°, Arrivée 50°),(Servo 5, Départ 165°, Arrivée 90°)

}

//Softmove
int softmove(int ser,int pos1, int pos2){ // Servomoteur, Position de départ, Position d'arrivée
  if(pos1 < pos2){
  while(pos1 < pos2){
    pos1 = pos1 +1;
    p[ser].write(pos1);
    delay(60);            // Faire varier pour modifier la vitesse du Servomoteur
    Serial.println(pos1);
  }
  }

  else if (pos1 > pos2){
   while(pos1 > pos2){
   pos1 = pos1 -1;
   p[ser].write(pos1);
   delay(60);            // Faire varier pour modifier la vitesse du Servomoteur
   Serial.println(pos1);
  }
  }
}

 //Multimove
 int multimove(int ser1, int pos11, int pos12, int ser2, int pos21, int pos22){ // Servo 1, Position de départ, Position d'arrivée, Servo 2,Position de départ, Position d'arrivée  
 if(pos11 < pos12 && pos21 < pos22){
  a = pos12 - pos11;
  b = pos22 - pos21;
  if(a > b){
    c = a - b;
    for(mvt = 0; mvt < b; mvt++){
      p[ser1].write(pos11);
      p[ser2].write(pos21);
      pos11++;
      pos21++;
      delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
    for(mvt1 = 0; mvt1 < c; mvt1++){
     p[ser1].write(pos11);
     pos11++;
     delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
  }
  else if(a < b){
    c = b - a;
    for(mvt = 0; mvt < a; mvt++){
      p[ser1].write(pos11);
      p[ser2].write(pos21);
      pos11++;
      pos21++;
      delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
    for(mvt1 = 0; mvt1 < c; mvt1++){
     p[ser2].write(pos21);
     pos21++;
     delay(60);   // Faire varier pour modifier la vitesse du Servomoteur
    }
  }
  else {
    for(mvt = 0; mvt < b; mvt++){
      p[ser1].write(pos11);
      p[ser2].write(pos21);
      pos11++;
      pos21++;
      delay(60);   // Faire varier pour modifier la vitesse du Servomoteur
    }
  }
 }

 else if(pos11 < pos12 && pos21 > pos22){
  a = pos12 - pos11;
  b = pos21 - pos22;
  if(a > b){
    c = a - b;
    for(mvt = 0; mvt < b; mvt++){
      p[ser1].write(pos11);
      p[ser2].write(pos21);
      pos11++;
      pos21--;
      delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
    for(mvt1 = 0; mvt1 < c; mvt1++){
     p[ser1].write(pos11);
     pos11++;
     delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
  }
  else if(a < b){
    c = b - a;
    for(mvt = 0; mvt < a; mvt++){
      p[ser1].write(pos11);
      p[ser2].write(pos21);
      pos11++;
      pos21--;
      delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
    for(mvt1 = 0; mvt1 < c; mvt1++){
     p[ser2].write(pos21);
     pos21--;
     delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
  }
   else {
    for(mvt = 0; mvt < b; mvt++){
      p[ser1].write(pos11);
      p[ser2].write(pos21);
      pos11++;
      pos21--;
      delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
  }
 }

  if(pos11 > pos12 && pos21 < pos22){
  a = pos11 - pos12;
  b = pos22 - pos21;
  if(a > b){
    c = a - b;
    for(mvt = 0; mvt < b; mvt++){
      p[ser1].write(pos11);
      p[ser2].write(pos21);
      pos11--;
      pos21++;
      delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
    for(mvt1 = 0; mvt1 < c; mvt1++){
     p[ser1].write(pos11);
     pos11--;
     delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
  }
  else if(a < b){
    c = b - a;
    for(mvt = 0; mvt < a; mvt++){
      p[ser1].write(pos11);
      p[ser2].write(pos21);
      pos11--;
      pos21++;
      delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
    for(mvt1 = 0; mvt1 < c; mvt1++){
     p[ser2].write(pos21);
     pos21++;
     delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
  }
   else {
    for(mvt = 0; mvt < b; mvt++){
      p[ser1].write(pos11);
      p[ser2].write(pos21);
      pos11--;
      pos21++;
      delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
  }
 }

  if(pos11 > pos12 && pos21 > pos22){
  a = pos11 - pos12;
  b = pos21 - pos22;
  if(a > b){
    c = a - b;
    for(mvt = 0; mvt < b; mvt++){
      p[ser1].write(pos11);
      p[ser2].write(pos21);
      pos11--;
      pos21--;
      delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
    for(mvt1 = 0; mvt1 < c; mvt1++){
     p[ser1].write(pos11);
     pos11--;
     delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
  }
  else if(a < b){
    c = b - a;
    for(mvt = 0; mvt < a; mvt++){
      p[ser1].write(pos11);
      p[ser2].write(pos21);
      pos11--;
      pos21--;
      delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
    for(mvt1 = 0; mvt1 < c; mvt1++){
     p[ser2].write(pos21);
     pos21--;
     delay(60);  // Faire varier pour modifier la vitesse du Servomoteur
    }
  }
   else {
    for(mvt = 0; mvt < b; mvt++){
      p[ser1].write(pos11);
      p[ser2].write(pos21);
      pos11--;
      pos21--;
      delay(60);   // Faire varier pour modifier la vitesse du Servomoteur
    }
  }
 }
}

Pour toutes questions relatives à ce Post, nous sommes disponibles sur Projet@eagle-robotics.com et next time, we'll try 3 servos and more on the same time .