Faire plusieurs choses simultanément

Bonjour,

J’aimerai, si possible, commander deux moteurs pas à pas en même temps… Est-ce possible ?

Précisément, mon programme actuel permet de faire tourner mon moteur 1 de quelques pas puis le moteur 2 de quelques pas aussi, mais peut-on commander les deux simultanément, c’est-à-dire qu’ils fassent leurs pas à la même date ?

Merci de votre lecture.

bonjour, Developpe un peu plus, montre nous ton programme, pour le mot sémultanément ça nécessite un débat philosophique. soit précis, c'est plus facile de comprendre avec des schema des programmes des math que avec des mots comme "simultanément ???

On exécute une commande à la fois, mais cadencé à 16 MHz ça semble simultané, du moment qu'on ne met pas de delay() ou de commandes bloquantes dans son code.

Bonjour,
Personnellement, j’utilise la bibliothèque SimpleTimer qui est très simple.
C’est vrai que tous les exemples utilisant des delays, on a l’impression qu’on ne peut pas faire autrement. En fait c’est une mauvaise habitude d’utiliser la fonction delay.

bonjour, le meilleur exemple de ce type de commande qui a l'oeil nu parait se faire en même temps, est toute machine cnc, imprimante 3d qui utilisent plusieurs moteurs (voir 5). on utilise les portA B etc. si tu veux t'essayer à ce genre de sport, regarde grbl, marlin, repetier, mais avec du café très fort et plusieurs boites d'efferalgan :)

pito2901: J'aimerai, si possible, commander deux moteurs pas à pas en même temps... Est-ce possible ?

Y'a des firmwares (GRBL, Marlin, Repetier ...) qui permettent de piloter des CNC et des imprimantes 3D, donc oui c'est faisable ;)

tedour: En fait c'est une mauvaise habitude d'utiliser la fonction delay.

Faut pas être aussi catégorique, il y a simplement la bonne fonction à utiliser au bon moment ;)

Et côté programme, ça donnerait quoi ?

Quelqu'un peut me fournir le strict minimum pour piloter mes deux moteurs pas à pas simultanément ?

Merci pour toutes vos réponses !

Bonjour,
La commande simultanée au sens muti-tâche n’est pas possible avec une carte Arduino.
On ne fait que du déplacement pseudo simultané.
Si tu te déplaces de x1, y1 à x2, y2, il faut que tu fasses la démarche suivante :
Par exemple
abs(x2 - x1) > abs(y2 - y1)
calculer le nombre de pas élémentaire pour aller de x1 à x2 puis le nombre de pas correspondant pour le déplacement sur l’axe y.
Soit x1 + Δx et y1 + Δy puis
x1 + 2Δx et y1 + 2Δy etc …
Pour arriver finalement au point x2, y2
Le but est d’avoir une droite la plus régulière possible entre x1, y1 et x2, y2
@+

void loop()
{
  gererMoteurA();
  gererMoteurB();
}

Les fonctions gererMoteurX() sont appelées à haute fréquence, ce qui n'est réalisable que si elles ne contiennent aucune instruction delay()

Chacune d'elles utilise un jeu de variables globales pour savoir où elles en sont, c'est-à-dire des variables d'état.

Toutes les durées sont gérées grâce à la fonction millis().

1) mémorisation de la valeur de millis() associée à un événement précis, comme un arrêt ou une mise en route 2) calcul de délai écoulé

par ex :

void gererMoteurX()
{
  static int etat = 0;
  static unsigned long int chrono_evt;
  unsigned long int chrono;
  unsigned long int delai_evt;

  chrono = millis();

  if (evt)
  {
    chrono_evt = chrono;
    etat = 1;
  }

  if (etat == 1)
  {
    delai_evt = chrono - chrono_evt;

    if (delai_evt > delai_souhaite)
    {
      faireCeQuiEstPrevuDansCeCasLa();
      etat = 0;
    }
  }
}

Branche les deux moteurs ensemble, sur les mêmes sorties en bricolant un peu ton circuit pour gerer 2 moteurs. tu peut jouer sur les sorties des deux moteurs en inversant les fils par exemples pour fair tourner un moteur dans un sense et l'autre dans l'autre sense.

il y a évidement des limites, mais vu qu'on sait pas du tous ce que tu veux faire, c'est une idée.

Merci !

J'utilise deux moteurs pas à pas bipolaires et une carte arduino mega 2560. J'utilise les fonctions de Stepper pour les commander :

VARIABLES

//Moteur X
const int pwmPhaseA_X = 2;//constante pour PWM phase A moteur X
const int dirPhaseA_X = 52;//constante pour Direction phase A moteur X
const int intensitePhaseA_X = A0;//Intensité de la phase A moteur X

const int pwmPhaseB_X = 3;//constante pour PWM phase B moteur X
const int dirPhaseB_X = 53;//constante pour Direction phase B moteur X
const int intensitePhaseB_X = A1;//Intensité de la phase B moteur X

Stepper moteurX(resol_Moteurs, dirPhaseA_X, dirPhaseB_X);

//Moteur Y
const int pwmPhaseA_Y = 12;//constante pour PWM phase A moteur Y
const int dirPhaseA_Y = 50;//constante pour Direction phase A moteur Y
const int intensitePhaseA_Y = A2;//Intensité de la phase A moteur Y

const int pwmPhaseB_Y = 13;//constante pour PWM phase B moteur Y
const int dirPhaseB_Y = 51;//constante pour Direction phase B moteur Y
const int intensitePhaseB_Y = A3;//Intensité de la phase B moteur Y

Stepper moteurY(resol_Moteurs, dirPhaseA_Y, dirPhaseB_Y);

SETUP :

//Moteur X
pinMode (pwmPhaseA_X, OUTPUT);
pinMode (dirPhaseA_X, OUTPUT);
pinMode (pwmPhaseB_X, OUTPUT);
pinMode (dirPhaseB_X, OUTPUT);
  
//Initialisation
digitalWrite (pwmPhaseA_X, HIGH);
digitalWrite (dirPhaseA_X, LOW) ;
digitalWrite (pwmPhaseB_X, HIGH);
digitalWrite (dirPhaseB_X, LOW) ;
  
//Moteur Y
pinMode (pwmPhaseA_Y, OUTPUT);
pinMode (dirPhaseA_Y, OUTPUT);
pinMode (pwmPhaseB_Y, OUTPUT);
pinMode (dirPhaseB_Y, OUTPUT);

//Initialisation
digitalWrite (pwmPhaseA_Y, HIGH);
digitalWrite (dirPhaseA_Y, LOW) ;
digitalWrite (pwmPhaseB_Y, HIGH);
digitalWrite (dirPhaseB_Y, LOW) ;

LOOP

moteurX.setSpeed(50);
  moteurY.setSpeed(50);
  //nombre pas X et Y
  moteurX.step(200);
  moteurY.step(100);

Comment je pourrai adapter ça avec les codes que vous m'avez fourni ?