Pilotage de plusieurs moteurs pas à pas via application MAI

Bonjour
J'ai essayé de créer un code et une application sur MAI qui servirait à piloter 3 moteurs pas à pas à partir de modification d'une application et d'un code obtenu précédemment:


#include "AccelStepper.h"

char Incoming_value = 0;

boolean mpap1Running = false;
const bool boutonPinEtatOn = LOW;

const char mpapDirPin = 4;     // Pour driver MPAP pin pas
const char mpapStepPin = 5;     // Pour driver MPAP pin direction

AccelStepper MPAP1(1, mpapStepPin, mpapDirPin); 

int mpapNombreDePasAtourner = 200;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); 
  MPAP1.setMaxSpeed(400);
  MPAP1.setAcceleration(500);

  MPAP1.setPinsInverted(false, false, true);
  MPAP1.enableOutputs();     // Activer les signaux du MPAP
}

void loop()
{
  if (Serial.available() > 0)
  {
    Incoming_value = Serial.read();
    Serial.print(Incoming_value);
    Serial.print("\n");

    if (Incoming_value == '0')
    {
      MPAP1.stop();
      MPAP1.setCurrentPosition(0);
      mpap1Running = false;
    }

    if (Incoming_value == '1')
    {
      mpap1Running = true;
    }
  }
  

  if (mpap1Running)
  {
    MPAP1.run();
    MPAP1.move(mpapNombreDePasAtourner);
  }
}

L'application communique avec l'arduino au travers d'un module bluetooth hc-05. Le code fait que tant que l'on reste appuié sur le bouton de l'application, le mpap continue de tourner et ne s'arrête qu'une fois le bouton relâché.
J'ai fait évolué le code en dupliquant les instructions relatives aux mpap puis en changeant le type de la variable "Incoming_value" en String puis en le téléversant sur une arduino mega afin d'avoir la même fonction que le système précédent mais pour 3 moteurs. L'application a également adaptée avec l'ajout de deux boutons:


Sur l'image ci-dessus je n'ai représenté qu'un seul moteur pas à pas mais il y en a en réalité 3, un à chaque driver

#include "AccelStepper.h"

String Incoming_value;
boolean MPAP1Running = false;
boolean MPAP2Running = false;
boolean MPAP3Running = false;
const bool boutonPinEtatOn = LOW;

const char mpapDirPin = 4;     // Pour driver MPAP pin pas
const char mpapStepPin = 5;     // Pour driver MPAP pin direction

const char mpapDirPin2 = 6;     // Pour driver MPAP pin pas
const char mpapStepPin2 = 7;     // Pour driver MPAP pin direction

const char mpapDirPin3 = 8;     // Pour driver MPAP pin pas
const char mpapStepPin3 = 9;     // Pour driver MPAP pin direction

AccelStepper MPAP1(1, mpapStepPin, mpapDirPin); 
AccelStepper MPAP2(1, mpapStepPin2, mpapDirPin2); 
AccelStepper MPAP3(1, mpapStepPin3, mpapDirPin3); 

int mpapNombreDePasAtourner = 200;

void setup() {
  Serial.begin(9600); 
  // initialisation du mpap
  MPAP1.setMaxSpeed(400);
  MPAP1.setAcceleration(500);
  MPAP1.setPinsInverted(false, false, true);
  MPAP1.enableOutputs();     // Activer les signaux du MPAP

  // initialisation du mpap2
  MPAP2.setMaxSpeed(400);
  MPAP2.setAcceleration(500);
  MPAP2.setPinsInverted(false, false, true);
  MPAP2.enableOutputs();     // Activer les signaux du MPAP

  // initialisation du mpap2
  MPAP3.setMaxSpeed(400);
  MPAP3.setAcceleration(500);
  MPAP3.setPinsInverted(false, false, true);
  MPAP3.enableOutputs();     // Activer les signaux du MPAP
}

void loop()
{
  if (Serial.available() > 0)
  {
    Incoming_value = Serial.read();
    Serial.print(Incoming_value);
    Serial.print("\n");
    //MPAP1
    if (Incoming_value == "nonMPAP1")
    {
      MPAP1.stop();
      MPAP1.setCurrentPosition(0);
      MPAP1Running = false;
    }

    if (Incoming_value == "MPAP1")
    {
      MPAP1Running = true;
    }
    //MPAP2
    if (Incoming_value == "nonMPAP2")
    {
      MPAP2.stop();
      MPAP2.setCurrentPosition(0);
      MPAP2Running = false;
    }

    if (Incoming_value == "MPAP2")
    {
      MPAP2Running = true;
    }
    //MPAP3
    if (Incoming_value == "nonMPAP3")
    {
      MPAP3.stop();
      MPAP3.setCurrentPosition(0);
      MPAP3Running = false;
    }

    if (Incoming_value == "MPAP3")
    {
      MPAP3Running = true;
    }  
  }
  
  //rotation de MPAP1
  if (MPAP1Running)
  {
    MPAP1.run();
    MPAP1.move(mpapNombreDePasAtourner);
  }
  //rotation de MPAP2
  if (MPAP2Running)
  {
    MPAP2.run();
    MPAP2.move(mpapNombreDePasAtourner);
  }
  //rotation de MPAP3
  if (MPAP3Running)
  {
    MPAP3.run();
    MPAP3.move(mpapNombreDePasAtourner);
  }
}


le fichier aia de l'application que j'utilise:
Plusieurs_moteur_mpap_a_l_appuie.zip (2,3 Ko)

Le problème est que je n'ai aucune rotation des mpap, et que j'ai dans le moniteur série des chiffres non-voulus à chaque appuie d'un des boutons à la place des mots:


Comment dois-je modifier le programme de sorte à avoir le même résultat que le montage et programme originel mais avec trois moteurs et une variable String ?

Cordialement

Comment faire ?

La première des actions est de non seulement lire le message d’accueil mais aussi de l’appliquer en donnant tous les reseignements sur le matériel.
Ton fichier zip peut etre que tu trouve çà bien mais je te reponds d’une tablette et je le lit pas. Ce n’est pas pour rien que l’on demande des liens clquables.

Si j’ai compris ton "truc" fritzing tu alimentes trois moteurs avec des piles AA.

  • Les piles peuvent fournir quel courant ?
  • Chaque moteur consomme quel courant

Il faudrait s’intéresser a ce point avant d’aller plus loin.

les lignes d'un côté de la breadboard et celles qui sont de l'autre côté, même si le dessin est de la même couleur (rouge, bleu) ne sont pas reliées. Des fois d'ailleurs elle sont coupées au milieu.

En conséquence sur les câblages apparents, il n'y a pas de liaison entre les masses de la Mega et l'alimentations, et le module WIFI n'est pas alimenté.

Dans un premier temps touts les GND de toutes les cartes doivent être reliées.

Bonjour enash

Tu as un Mega, pourquoi faire passer le Bluetooth par Serial, Serial qui est le port de communication de l'USB.
image

Utilises Serial1 Rx 19 comme port data du Bluetooth.
Dans MAI lors de événement, tu envoies, par exemple:
image

Dans l'Arduino tu fais:

Incoming_value = Serial.read();

ça lit un char() et tu testes:

if (Incoming_value == "nonMPAP1")

ça ne peut pas fonctionner.

Suivant ces remarques, j'ai corrigé ton programme, mis la réception Bluetooth sur Rx1 (19).
C'est fait pour un seul moteur et testé sans les moteurs.
Dans MAI, termines tes String envoyées par un \n (fin de ligne)
image

Vu que:

btSerial.readStringUntil('\n');

Le programme:

#define btSerial Serial1     // Port du bluetooth

#include "AccelStepper.h"

String Incoming_value = "";

boolean mpap1Running = false;
const bool boutonPinEtatOn = LOW;

const char mpapDirPin = 4;     // Pour driver MPAP pin pas
const char mpapStepPin = 5;     // Pour driver MPAP pin direction

AccelStepper MPAP1(1, mpapStepPin, mpapDirPin);

int mpapNombreDePasAtourner = 200;

void setup() 
{
	// put your setup code here, to run once:
	Serial.begin(9600);

	btSerial.begin(9600);

	MPAP1.setMaxSpeed(400);
	MPAP1.setAcceleration(500);

	MPAP1.setPinsInverted(false, false, true);
	MPAP1.enableOutputs();     // Activer les signaux du MPAP
}

void loop()
{
	if (btSerial.available())
	{
		Incoming_value = btSerial.readStringUntil('\n');
		Incoming_value.trim();     // Nettoyage de Incoming_value
		Serial.println("Recu : " + Incoming_value);

		if (Incoming_value == "MPAP1")
		{
			mpap1Running = true;
		}

		if (Incoming_value == "nonMPAP1")
		{
			MPAP1.stop();
			MPAP1.setCurrentPosition(0);
			mpap1Running = false;
		}

	}

	if (mpap1Running)
	{
		MPAP1.run();
		MPAP1.move(mpapNombreDePasAtourner);
		Serial.println("MPAP1.run()");
	}
}

A+
Cordialement
jpbbricole

Bonjour vileroi

C'est justement pas conseillé, cette alimentation
image
est VMOT
image
donc danger.

Ce qui est le cas puisque le GND de VMOT et MEGA sont mis en commun via le A4988.

Oui, il est alimenté.

Cordialement
jpbbricole

Je n'avais pas vu la deuxième alimentation!

@68tjs il n'est pas possible de placer directement un fichier aia sur le forum. voici un lien wetransfer pour télécharger le fichier aia mais le défaut, je pense, est que le fichier ne sera disponible que temporairement: https://we.tl/t-8kBkNbCKhU
Il me semble qu'il est possible d'avoir un fichier de décompression spécialement pour tablette: https://play.google.com/store/apps/details?id=com.rarlab.rar&hl=fr&gl=US
J'alimente mes moteurs avec une pièce comme celle-ci relié à une alimentation 12V dans laquelle sont vissés des fils:
image
image
image
Les moteurs sont des nema 17. Si j'en crois ce lien, ils ont chacun un courant de 3.4 ampères: https://www.robot-maker.com/shop/moteurs-et-actionneurs/14-moteur-pas-a-pas-nema-17-14.html

@jpbbricole Comment dois-je alimenter le montage convenablement sachant que la façon que j'utilise est déconseillée ?
Comment sait-on dans le programme corrigé pour un seul moteur que le RX est paramétré sur la broche 19 ?

Cordialement

Bonjour enash

Tel qu'il est présenté dans l'image, l'alimentation est correcte, les moteurs sont alimentés par
image
et le Mega par le port USB.

Par cette déclaration:
#define btSerial Serial1 // Port du bluetooth
Le port du bluetooth, btSrerial est, physiquement sur Serial1 dont les broches sont Tx = 18 et Rx = 19
image

Cordialement
jpbbricole

Bonsoir
Si je comprends bien le schéma suivant:
image
si l'on veut par exemple placer le TX et RX sur les broches 16 et 17 alors il faudra écrire "#define btSerial Serial2", est-ce bien cela ?

Voici le nouveau câblage avec les branchements de TX et RX déplacés sur les broches 18 et 19, le nouveau programme et le nouveau fichier aia en PJ:

#define btSerial Serial1     // Port du bluetooth

#include "AccelStepper.h"

String Incoming_value = "";
boolean MPAP1Running = false;
boolean MPAP2Running = false;
boolean MPAP3Running = false;
const bool boutonPinEtatOn = LOW;

const char mpapDirPin = 4;     // Pour driver MPAP pin pas
const char mpapStepPin = 5;     // Pour driver MPAP pin direction

const char mpapDirPin2 = 6;     // Pour driver MPAP pin pas
const char mpapStepPin2 = 7;     // Pour driver MPAP pin direction

const char mpapDirPin3 = 8;     // Pour driver MPAP pin pas
const char mpapStepPin3 = 9;     // Pour driver MPAP pin direction

AccelStepper MPAP1(1, mpapStepPin, mpapDirPin); 
AccelStepper MPAP2(1, mpapStepPin2, mpapDirPin2); 
AccelStepper MPAP3(1, mpapStepPin3, mpapDirPin3); 

int mpapNombreDePasAtourner = 200;

void setup() {
  Serial.begin(9600); 
  // initialisation du mpap
  MPAP1.setMaxSpeed(400);
  MPAP1.setAcceleration(500);
  MPAP1.setPinsInverted(false, false, true);
  MPAP1.enableOutputs();     // Activer les signaux du MPAP

  // initialisation du mpap2
  MPAP2.setMaxSpeed(400);
  MPAP2.setAcceleration(500);
  MPAP2.setPinsInverted(false, false, true);
  MPAP2.enableOutputs();     // Activer les signaux du MPAP

  // initialisation du mpap2
  MPAP3.setMaxSpeed(400);
  MPAP3.setAcceleration(500);
  MPAP3.setPinsInverted(false, false, true);
  MPAP3.enableOutputs();     // Activer les signaux du MPAP
}

void loop()
{
  if (btSerial.available())
  {
    Incoming_value = btSerial.readStringUntil('\n');
    Incoming_value.trim();     // Nettoyage de Incoming_value
    Serial.println("Recu : " + Incoming_value);
    //MPAP1
    if (Incoming_value == "MPAP1")
    {
      MPAP1Running = true;
    }
    if (Incoming_value == "nonMPAP1")
    {
      MPAP1.stop();
      MPAP1.setCurrentPosition(0);
      MPAP1Running = false;
    }

    //MPAP2
    if (Incoming_value == "MPAP2")
    {
      MPAP2Running = true;
    }
    if (Incoming_value == "nonMPAP2")
    {
      MPAP2.stop();
      MPAP2.setCurrentPosition(0);
      MPAP2Running = false;
    }
    //MPAP3
    if (Incoming_value == "MPAP3")
    {
      MPAP3Running = true;
    }
    if (Incoming_value == "nonMPAP3")
    {
      MPAP3.stop();
      MPAP3.setCurrentPosition(0);
      MPAP3Running = false;
    }  
  }
  
  //rotation de MPAP1
  if (MPAP1Running)
  {
    MPAP1.run();
    MPAP1.move(mpapNombreDePasAtourner);
    Serial.println("MPAP1.run()");
  }
  //rotation de MPAP2
  if (MPAP2Running)
  {
    MPAP2.run();
    MPAP2.move(mpapNombreDePasAtourner);
    Serial.println("MPAP2.run()");
  }
  //rotation de MPAP3
  if (MPAP3Running)
  {
    MPAP3.run();
    MPAP3.move(mpapNombreDePasAtourner);
    Serial.println("MPAP3.run()");
  }
}

nouveau fichier aia:
Plusieurs_moteur_mpap_a_l_appuie (1).zip (2,3 Ko)

Lorsque j'ai testé le programme pour un seul moteur, même s'il a fonctionner avec des vibrations et moins fluidement que celui tout en haut, il s'est mis à tourner. Puis lorsque j'ai dupliquer les instructions pour 3 moteurs dans ce même programme et avoir ajouté des "\n" dans les blocks MAI, avant de tester le tout, les moteurs n'ont étrangement, donné aucune réponse. Aurait-je oublier quelque chose ?

Cordialement

Bonsoir enash

Oui, l'initialisation de btSerial
btSerial.begin(9600);
J'ai essayé le couple MAI/Mega, ça fonctionne.
Après, pour la fluidité des moteurs, fait des essais ainsi et redis moi, il faudra, peut être revoir la réception des ordres de MAI

A+
Cordialement
jpbbricole

1 Like

Pour moi, oui: les tests individuels. Au lieu de tester tout au final, il vaut mieux tester les composants individuellement. D'un côté voir ce qui vient de la liaison série seul. Chacun des moteurs individuellement. Puis enfin mettre le tout ensemble.

1 Like

Voici le nouveau programme auquel j'ai simplement ajouté a ligne "btSerial.begin(9600);" dans le setup:

#define btSerial Serial1     // Port du bluetooth

#include "AccelStepper.h"

String Incoming_value = "";
boolean MPAP1Running = false;
boolean MPAP2Running = false;
boolean MPAP3Running = false;
const bool boutonPinEtatOn = LOW;

const char mpapDirPin = 4;     // Pour driver MPAP pin pas
const char mpapStepPin = 5;     // Pour driver MPAP pin direction

const char mpapDirPin2 = 6;     // Pour driver MPAP pin pas
const char mpapStepPin2 = 7;     // Pour driver MPAP pin direction

const char mpapDirPin3 = 8;     // Pour driver MPAP pin pas
const char mpapStepPin3 = 9;     // Pour driver MPAP pin direction

AccelStepper MPAP1(1, mpapStepPin, mpapDirPin); 
AccelStepper MPAP2(1, mpapStepPin2, mpapDirPin2); 
AccelStepper MPAP3(1, mpapStepPin3, mpapDirPin3); 

int mpapNombreDePasAtourner = 200;

void setup() {
  Serial.begin(9600);
  btSerial.begin(9600); 
  // initialisation du mpap
  MPAP1.setMaxSpeed(400);
  MPAP1.setAcceleration(500);
  MPAP1.setPinsInverted(false, false, true);
  MPAP1.enableOutputs();     // Activer les signaux du MPAP

  // initialisation du mpap2
  MPAP2.setMaxSpeed(400);
  MPAP2.setAcceleration(500);
  MPAP2.setPinsInverted(false, false, true);
  MPAP2.enableOutputs();     // Activer les signaux du MPAP

  // initialisation du mpap2
  MPAP3.setMaxSpeed(400);
  MPAP3.setAcceleration(500);
  MPAP3.setPinsInverted(false, false, true);
  MPAP3.enableOutputs();     // Activer les signaux du MPAP
}

void loop()
{
  if (btSerial.available())
  {
    Incoming_value = btSerial.readStringUntil('\n');
    Incoming_value.trim();     // Nettoyage de Incoming_value
    Serial.println("Recu : " + Incoming_value);
    //MPAP1
    if (Incoming_value == "MPAP1")
    {
      MPAP1Running = true;
    }
    if (Incoming_value == "nonMPAP1")
    {
      MPAP1.stop();
      MPAP1.setCurrentPosition(0);
      MPAP1Running = false;
    }

    //MPAP2
    if (Incoming_value == "MPAP2")
    {
      MPAP2Running = true;
    }
    if (Incoming_value == "nonMPAP2")
    {
      MPAP2.stop();
      MPAP2.setCurrentPosition(0);
      MPAP2Running = false;
    }
    //MPAP3
    if (Incoming_value == "MPAP3")
    {
      MPAP3Running = true;
    }
    if (Incoming_value == "nonMPAP3")
    {
      MPAP3.stop();
      MPAP3.setCurrentPosition(0);
      MPAP3Running = false;
    }  
  }
  
  //rotation de MPAP1
  if (MPAP1Running)
  {
    MPAP1.run();
    MPAP1.move(mpapNombreDePasAtourner);
    Serial.println("MPAP1.run()");
  }
  //rotation de MPAP2
  if (MPAP2Running)
  {
    MPAP2.run();
    MPAP2.move(mpapNombreDePasAtourner);
    Serial.println("MPAP2.run()");
  }
  //rotation de MPAP3
  if (MPAP3Running)
  {
    MPAP3.run();
    MPAP3.move(mpapNombreDePasAtourner);
    Serial.println("MPAP3.run()");
  }
}

Comme prévu les trois moteurs ont fonctionner mais avec les vibrations toujours présentes

Cordialement

Bonsoir enash

J'avais pressenti ça, je regarderai demain comment t'aider à optimiser ça.
Auras tu qu'un moteur qui tourne à la fois?

Cordialement
jpbbricole

1 Like

La bibliothèque accelStepper impose d'appeler les fonctions run() le plus souvent possible. Il faut pour cela faire une loop() très courte. Un pas ne peut avoir lieu qu'au moment ou on appelle run(). Si loop() est irrégulière (par exemple si on reçoit un caractère), les moteurs auront des pas irréguliers et ils vont faire du bruit.

Les pas à pas font aussi beaucoup plus de bruit si on est en pas entier qu'en 8 micros pas ou plus. c'est sans doute cela qui procure les vibrations.

`MPAP1.setMaxSpeed(400);`

Les moteurs tournent-ils bien à 2 tours par seconde? Ou beaucoup moins vite?

  //rotation de MPAP1
  if (MPAP1Running)
  {
    MPAP1.run();
    MPAP1.move(mpapNombreDePasAtourner);
    Serial.println("MPAP1.run()");
  }

A quoi peut bien servir MPAP1.move(mpapNombreDePasAtourner); sachant que l'on ne peut faire qu'un seul pas chaque fois que cette instruction est exécutée (car il n'y a qu'unseul run() )?
Remplace la par
MPAP1.move(10);
cela doit faire la même chose.

Pour l'instant il y a un problème d'utilisation de la bibliothèque. Si on veut faire tourner un moteur à 400 pas par secondes avec accelStepper, il faut que loop() dure moins que 2,5ms. Avec ce programme on peut le voir en affichant l'horodatage de la console et en regardant les temps de deux affichages successifs de Serial.println("MPAP1.run()");

1 Like

Bonjour

D'après le cahier des charges si le bouton dédié à un moteur est appuyé alors ce moteur doit tourner et si plusieurs boutons dédiés sont appuyés simultanément alors tous les moteurs desdits boutons doivent tourner en même temps. J'ai fait l'essai avec le programme, montage et application actuels car je me suis souvenu qu'il n'est pas possible de bouger plusieurs sliders en même temps sur MAI: Il est apparemment possible d'appuyer sur plusieurs boutons. Cela à fait que les moteurs ont bien tournés collectivement mais plus lentement. Je fait mes essais avec trois moteurs car l'alimentation dont je dispose n'en supporterai pas davantage sachant que la précédente qui est la même a grillé, mais j'ai l'intention de dupliquer les instructions du programme pour une dizaine de moteurs alimenté avec une alimentation plus puissante:

En appuyant sur un seul bouton pour compter le temps que met un moteur pour faire un tour, je compte environ un demi tours par seconde soit un tour toute les deux seconde.

J'ai tester le programme avec la variable "mpapNombreDePasAtourner" à laquelle j'ai alloué la valeur 10 mais cela à donner à peu près le même résultat:

#define btSerial Serial1     // Port du bluetooth

#include "AccelStepper.h"

String Incoming_value = "";
boolean MPAP1Running = false;
boolean MPAP2Running = false;
boolean MPAP3Running = false;
const bool boutonPinEtatOn = LOW;

const char mpapDirPin = 4;     // Pour driver MPAP pin pas
const char mpapStepPin = 5;     // Pour driver MPAP pin direction

const char mpapDirPin2 = 6;     // Pour driver MPAP pin pas
const char mpapStepPin2 = 7;     // Pour driver MPAP pin direction

const char mpapDirPin3 = 8;     // Pour driver MPAP pin pas
const char mpapStepPin3 = 9;     // Pour driver MPAP pin direction

AccelStepper MPAP1(1, mpapStepPin, mpapDirPin); 
AccelStepper MPAP2(1, mpapStepPin2, mpapDirPin2); 
AccelStepper MPAP3(1, mpapStepPin3, mpapDirPin3); 

int mpapNombreDePasAtourner = 10;

void setup() {
  Serial.begin(9600);
  btSerial.begin(9600); 
  // initialisation du mpap
  MPAP1.setMaxSpeed(400);
  MPAP1.setAcceleration(500);
  MPAP1.setPinsInverted(false, false, true);
  MPAP1.enableOutputs();     // Activer les signaux du MPAP

  // initialisation du mpap2
  MPAP2.setMaxSpeed(400);
  MPAP2.setAcceleration(500);
  MPAP2.setPinsInverted(false, false, true);
  MPAP2.enableOutputs();     // Activer les signaux du MPAP

  // initialisation du mpap2
  MPAP3.setMaxSpeed(400);
  MPAP3.setAcceleration(500);
  MPAP3.setPinsInverted(false, false, true);
  MPAP3.enableOutputs();     // Activer les signaux du MPAP
}

void loop()
{
  if (btSerial.available())
  {
    Incoming_value = btSerial.readStringUntil('\n');
    Incoming_value.trim();     // Nettoyage de Incoming_value
    Serial.println("Recu : " + Incoming_value);
    //MPAP1
    if (Incoming_value == "MPAP1")
    {
      MPAP1Running = true;
    }
    if (Incoming_value == "nonMPAP1")
    {
      MPAP1.stop();
      MPAP1.setCurrentPosition(0);
      MPAP1Running = false;
    }

    //MPAP2
    if (Incoming_value == "MPAP2")
    {
      MPAP2Running = true;
    }
    if (Incoming_value == "nonMPAP2")
    {
      MPAP2.stop();
      MPAP2.setCurrentPosition(0);
      MPAP2Running = false;
    }
    //MPAP3
    if (Incoming_value == "MPAP3")
    {
      MPAP3Running = true;
    }
    if (Incoming_value == "nonMPAP3")
    {
      MPAP3.stop();
      MPAP3.setCurrentPosition(0);
      MPAP3Running = false;
    }  
  }
  
  //rotation de MPAP1
  if (MPAP1Running)
  {
    MPAP1.run();
    MPAP1.move(mpapNombreDePasAtourner);
    Serial.println("MPAP1.run()");
  }
  //rotation de MPAP2
  if (MPAP2Running)
  {
    MPAP2.run();
    MPAP2.move(mpapNombreDePasAtourner);
    Serial.println("MPAP2.run()");
  }
  //rotation de MPAP3
  if (MPAP3Running)
  {
    MPAP3.run();
    MPAP3.move(mpapNombreDePasAtourner);
    Serial.println("MPAP3.run()");
  }
}

Cordialement

Si tu changes Serial.begin(9600); en Serial.begin(115200); et en changeant aussi la vitesse de la console à 115200 bauds, cela va accélérer les affichages et les moteurs vont tourner plus vite. mais on est loin de la vitesse demandée: MPAP1.setMaxSpeed(400); (400 pas/s soit 2tr/s). Je ne suis pas sûr qu'accelStepper puisse faire beaucoup mieux. Et Si tu cherches à diminuer les vibrations, il faudrait passer en 8 micros pas, mais cela diminuerait la vitesse par 8.

AcccelStepper est donné comme fiable jusqu'à des vitesses de 1000 pas/s. Pour 3 moteurs on peut théoriquement monter à 333pas/s sans histoires, à condition que loop() soit courte.

1 Like

Il serait intéressant de revenir à l'étape d'avant, le cahier de charges.
Combien de moteurs tournent en même temps
Quelle est la vitesse souhaitée
Les accélérations sont elles utiles, souhaitées, indispensables

1 Like

Bonjour enash

J'ai fait des essais, avec le programme de départ et avec 3 moteurs, mis à part la suppression des impressions dans les MPAPxRunning

	if (MPAP1Running)
	{
		MPAP1.move(mpapNombreDePasAtourner);
		//Serial.println("MPAP 1");
		MPAP1.run();
	}

Le test a été fait avec un seul moteur "réel" mais les pin STEP des 2 autres moteurs sont visualisées par des instruments de mesure, je n'ai pas d'installation avec 3 moteurs.
Aucun des arguments évoqués plus haut n'ont d'influences sur la rotation des MPAP, elle parfaitement fluide à 1, 2 ou 3 moteurs. Les essais sont fait en FULL-STEP.

Si tes moteurs vibrent, regarde du côté du réglage du courant.

Le programme d'essai:

/*
    Name:       ARDFR_3MpapMAI.ino
    Created:	23.08.2022
    Author:     jpbbricole
*/


#define btSerial Serial1     // Port du bluetooth

#include "AccelStepper.h"

String Incoming_value = "";

boolean MPAP1Running = false;
boolean MPAP2Running = false;
boolean MPAP3Running = false;
const bool boutonPinEtatOn = LOW;

//------------------------------------- Parametres enash
const char mpapDirPin = 4;     // Pour driver MPAP pin pas
const char mpapStepPin = 5;     // Pour driver MPAP pin direction

const char mpapDirPin2 = 6;     // Pour driver MPAP pin pas
const char mpapStepPin2 = 7;     // Pour driver MPAP pin direction

const char mpapDirPin3 = 8;     // Pour driver MPAP pin pas
const char mpapStepPin3 = 9;     // Pour driver MPAP pin direction

//------------------------------------- Parametres jpbbricole
//const int mpapDirPin = 5;     // Pour driver MPAP pin pas
//const int mpapStepPin = 6;     // Pour driver MPAP pin direction
//
//const int mpapDirPin2 = 24;     // Pour driver MPAP pin pas
//const int mpapStepPin2 = 25;     // Pour driver MPAP pin direction
//
//const int mpapDirPin3 = 26;     // Pour driver MPAP pin pas
//const int mpapStepPin3 = 27;     // Pour driver MPAP pin direction

AccelStepper MPAP1(1, mpapStepPin, mpapDirPin);
AccelStepper MPAP2(1, mpapStepPin2, mpapDirPin2);
AccelStepper MPAP3(1, mpapStepPin3, mpapDirPin3);

int mpapNombreDePasAtourner = 2010;

void setup()
{
	// put your setup code here, to run once:
	Serial.begin(115200);
	btSerial.begin(9600);

	//--------------------------------- MPAP 1
	MPAP1.setMaxSpeed(400);
	MPAP1.setAcceleration(500);

	MPAP1.setPinsInverted(false, false, true);
	MPAP1.enableOutputs();     // Activer les signaux du MPAP

	//--------------------------------- MPAP 2
	MPAP2.setMaxSpeed(400);
	MPAP2.setAcceleration(500);

	MPAP2.setPinsInverted(false, false, true);
	MPAP2.enableOutputs();     // Activer les signaux du MPAP

	//--------------------------------- MPAP 3
	MPAP3.setMaxSpeed(400);
	MPAP3.setAcceleration(500);

	MPAP3.setPinsInverted(false, false, true);
	MPAP3.enableOutputs();     // Activer les signaux du MPAP
}

void loop()
{
	if (btSerial.available())
	{
		Incoming_value = btSerial.readStringUntil('\n');
		Incoming_value.trim();     // Nettoyage de Incoming_value 
		Serial.println("Recu : " + Incoming_value);

		//----------------------------- MPAP1
		if (Incoming_value == "MPAP1")
		{
			MPAP1Running = true;
		}
		if (Incoming_value == "nonMPAP1")
		{
			MPAP1.stop();
			MPAP1.setCurrentPosition(0);
			MPAP1Running = false;
		}

		//----------------------------- MPAP2
		if (Incoming_value == "MPAP2")
		{
			MPAP2Running = true;
		}

		if (Incoming_value == "nonMPAP2")
		{
			MPAP2.stop();
			MPAP2.setCurrentPosition(0);
			MPAP2Running = false;
		}

		//----------------------------- MPAP3
		if (Incoming_value == "MPAP3")
		{
			MPAP3Running = true;
		}

		if (Incoming_value == "nonMPAP3")
		{
			MPAP3.stop();
			MPAP3.setCurrentPosition(0);
			MPAP3Running = false;
		}

	}

	if (MPAP1Running)
	{
		MPAP1.move(mpapNombreDePasAtourner);
		//Serial.println("MPAP 1");
		MPAP1.run();
	}

	if (MPAP2Running)
	{
		MPAP2.move(mpapNombreDePasAtourner);
		//Serial.println("MPAP 2");
		MPAP2.run();
	}

	if (MPAP3Running)
	{
		MPAP3.move(mpapNombreDePasAtourner);
		//Serial.println("MPAP 3");
		MPAP3.run();
	}
}

PS: J'ai fait l'essai avec 3 moteurs, sans dégradation de leur rotation.
Le plus difficile est de presser les 3 boutons sur MAI :wink:

A+
Cordialement
jpbbricole

1 Like

@jpbbricole Le système est bien opérationnel de mon coté.

Tous les moteurs dont les boutons sont appuyés doivent tourner même si c'est en même temps.

La vitesse n'a pas à être particulièrement rapide mais doit l'être assez pour ne pas lasser l'utilisateur à la longue. Ici la vitesse obtenue est largement acceptable.
Je cherche en ce moment à créer une version de ce projet avec des boutons virtuels à la place des boutons physiques:

Ce sujet visait à remplacer les boutons dédiés physiques par des boutons digitaux.
Mes prochaines étapes sont donc:
-remplacer les boutons physiques de marches avant et marches arrière
-faire transmettre les valeurs des sliders à l'arduino qui sont destinés à remplacer les potentiomètres et remplacer les boutons physiques de lancement et d'arrêt d'urgence par des boutons digitaux
image
Plusieurs_sliders_C.zip (62,0 Ko)
-et enfin changer les câblages afin que les moteurs cessent de consommer lorsqu'il sont à l'arrêt en alimentant le système avec cette alimentation externe plus puissante:

Le bouton d'affichage qui permettait d'afficher les valeurs des potentiomètres dans le moniteur série sera absent car tous les ratios sont déjà visibles sur l'application à l'écran

Cordialement

Bonjour enash

Il faut câbler la pin ENABLE du driver A4988 et AccelStepper a les outils pour gérer cette pin:

const int mpapEnaPin = 7;     // Pour driver MPAP pin activation

mpap.setEnablePin(mpapEnaPin);
//                         DIR        STEP  ENA
mpap.setPinsInverted(mpapDirReverse, false, true);

mpap.enableOutputs();     // Activer les signaux du MPAP
mpap.disableOutputs();     // Desactiver les signaux du MPAP

Cordialement
jpbbricole

1 Like