Faire tourner en même temps 2 moteurs pas à pas 28BYJ-48 avec drivers ULN2003 et une seule carte arduino uno R3

Bonjour,
Je voudrais faire tourner deux moteurs pas à pas de modèle 28BYJ-48 accompagnés de leurs drivers de modèle ULN2003 sur une carte arduino uno R3 en fonction de deux boutons poussoirs branchés en pull-down:
-Si l'on appuie sur l'un ou l'autre des deux boutons poussoir le moteur pas à pas lui
étant dédié doit tourner.
-Si l'on appuie sur les deux boutons poussoir les deux moteurs doivent tourner en
même temps.
Le soucis est qu'avec la bibliothèque stepper.h, les moteurs effectuent un pas l'un après l'autre au lieu de tourner simultanément et qu'il faut utiliser la bibliothèque AccelStepper. Quelqu'un aurait-il un exemple de code AccelStepper à me suggérer svp ?

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Il y a quand même pas mal d'exemples installés avec la librairie AccelStepper.

1 Like

Bnjour enash

C'est faisable avec les fonctions non bloquantes de AccelStepper comme move() et moveTo().
Pour fonctionner de façon "indépendante" il est nécessaire de mettre un run() dans loop().

Ainsi si tu initialise le moteur 1
AccelStepper mpap1(4, mpap1pin1, mpap1pin3, mpap1pin2, mpap1pin4);

tu fais tourner mpap1 avec mpap1.move(xxx)
et dans dans loop()

if(bouton1estPresse)
{
      mpap1.run();
}

Il ne reste plus qu'à dédoubler ça pour le moteur/bouton 2.

Fais, déjà l'exemple Bounce de la bibliothèque et, après, tu pourra l'adapter.

Cordialement
jpbbricole

1 Like

Bonjour,
J'ai essayer avec un seul moteur pas à pas pour commencer avec le montage suivant:Imgur: The magic of the Internet. Voici le programme que j'ai utilisé et auquel le moteur ne répond pas.

#include "AccelStepper.h"
int nombreDePas=48*65;
int pinBoutonTreize=13;
AccelStepper mpap1(nombreDePas,8,11,10,6);

void setup(){
  mpap1.setMaxSpeed(100);
  mpap1.moveTo(500);
}

void loop(){
  pinMode(pinBoutonTreize, INPUT);
  boolean etatBouton=digitalRead(pinBoutonTreize);
  if (etatBouton==1){
    mpap1.run();
  } 
}

Qu'est-ce qui ne vas pas d'après toi ? Merci d'avance

Cordialement

Ce n'est pas la syntaxe correcte pour l'appel du constructeur d'AccelStepper. Le premier argument c'est le type du moteur.
https://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html

1 Like

Bonsoir,
Cette fois-ci j'ai remplacer la variable "nombreDePas" par "4" mais le moteur refuse toujours de tourner. Il y a seulement les LEDs du driver qui clignotent tour à tour.

#include "AccelStepper.h"
int pinBoutonTreize=13;
AccelStepper mpap1(4,8,11,10,6);

void setup(){
  mpap1.setMaxSpeed(100);
  mpap1.setAcceleration(20);
  mpap1.moveTo(500);
}

void loop(){
  pinMode(pinBoutonTreize, INPUT);
  boolean etatBouton=digitalRead(pinBoutonTreize);
  if (etatBouton==1){
    mpap1.run();
  } 
}

Bonjour enash

C'est que le programme tourne.
Comment alimentes tu les moteurs?

Cordialement
jpbbricole

1 Like

Bonsoir enash

Quelques petites remarques:
La ligne
pinMode(pinBoutonTreize, INPUT);
devrait se trouver dans setup() et, ainsi, être initialisée qu'une fois.
Quand c'est dans loop(), c'est initialisé à chaque tour de loop(), inutile.

Avec mpap1.moveTo(500);, (aller à) ton moteur va aller à 500 pas ne plus bouger du tout, parce que arrivé à destination.
Utilises mpap1.move(500); à chaque pression du bouton.

Essaies ces autres valeurs:
mpap1.setMaxSpeed(400);

  • mpap1.setAcceleration(500);*

Cordialement
jpbbricole

1 Like

Bonsoir,
J'alimente les moteurs via un driver qui reçoit du 5V venant de l'arduino et relié au ground au travers d'une platine d'essai. Voici l'image:

Effectivement mon moteur tourne cette fois d'un pas à chaque pression grâce au nouveau programme suivant:

#include "AccelStepper.h"
int nombreDePas=48*65;
int pinBoutonTreize=13;
AccelStepper mpap1(4,8,11,10,6);

void setup(){
  pinMode(pinBoutonTreize, INPUT);
}

void loop(){
  mpap1.setMaxSpeed(400);
  mpap1.setAcceleration(500);
  mpap1.move(1000);
  boolean etatBouton=digitalRead(pinBoutonTreize);
  if (etatBouton==1){
    mpap1.run();
  } 
}

Quelle(s) instruction(s) dois-je utiliser pour qu'a chaque pression le moteur tourne d'un nombre de pas bien spécifique et plus vite ?

Cordialement

Bonjour enash

C'est pas très bon d'alimenter ton ou tes moteur(s) "au travers" de l'Arduino, prends une alimentation 5V externe comme un chargeur USB, afin d'alimenter tes moteurs en 5V. Tu pourras aussi alimenter ton Arduino en mettant le +5V du chargeur sur la pin 5V et le GND du chargeur sur le GND.
Pour ce qui est du programme, pour un moteur, c'est ainsi:

#include "AccelStepper.h"     // https://www.pjrc.com/teensy/td_libs_AccelStepper.html
int pinBoutonTreize=13;
AccelStepper mpap1(4,8,10,11,6);

void setup()
{
	mpap1.setMaxSpeed(400);
	mpap1.setAcceleration(500);
}

void loop()
{
	pinMode(pinBoutonTreize, INPUT);
	
	boolean etatBouton=digitalRead(pinBoutonTreize);
	if (etatBouton==1)
	{
		mpap1.move(500);
	}
	mpap1.run();
}

Quand le moteur tourne, pince l'axe, s'il a tendance à perdre des pas, inverse la paire centrale des fils sur le driver:

AccelStepper mpap1(4,8,10,11,6);
// Passe à
AccelStepper mpap1(4,8,11,10,6);

Cordialement
jpbbricole

1 Like

Bonjour,
Merci infiniment. L'essai avec un seul moteur fonctionne. J'ai dupliquer le code pour contrôler un deuxième moteur et les deux moteurs fonctionnent en même temps comme voulu.

#include "AccelStepper.h"

int pinBoutonTreize=13;
int pinBoutonQuatre=4;
AccelStepper mpap1(4,8,11,10,6);
AccelStepper mpap2(4,7,12,8,5);

void setup(){
  pinMode(pinBoutonQuatre, INPUT);
  pinMode(pinBoutonTreize, INPUT);
}

void loop(){
  mpap1.setMaxSpeed(400);
  mpap1.setAcceleration(500);
  mpap2.setMaxSpeed(400);
  mpap2.setAcceleration(500);
  boolean etatBouton=digitalRead(pinBoutonTreize);
  boolean etatBouton2=digitalRead(pinBoutonQuatre);
  if (etatBouton==1){
    mpap1.move(500);
  } 
  mpap1.run();
  if (etatBouton2==1){
    mpap2.move(500);
  } 
  mpap2.run();
}

Pour augmenter la vitesse je crois que je devrais changer le modèle de mes moteurs pas à pas par un autre de type PM35L-048-HPD4 car le 28BYJ-48 imposant une vitesse maximale trop lente.

Cordialement

Bonjour enash

Super, tu as tout compris :wink:

Bonne continuation!
Cordialement
jpbbricole

1 Like

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