Pilotage de moteur pas à pas 17hs15-1504s avec bibliothèque MTulnStepper

Bonsoir
J'aimerai piloter des moteurs pas à pas de modèle 17hs15-1504s avec des drivers A4988 et la bibliothèque MTulnStepper de sorte que si l'on appuie sur un bouton qui leur est dédié les moteurs tournent de tel nombre de pas selon ce l'on a réglé dans le programme. J'ai essayé de piloter les miens comme avec des petits moteurs pas à pas 28byj-48 et des drivers uln2003 pour voir ce que ça donnerait.

#include <Stepper.h>
int goutte=500;
int nombreDePas=48*64;
int pinBoutonTreize=13;
const int stepPin=3;
const int dirPin=4;
void setup() {
  // put your setup code here, to run once:
  pinMode(stepPin,OUTPUT);
  pinMode(dirPin,OUTPUT);
}

void loop() {
  pinMode(pinBoutonTreize, INPUT);
  boolean etatBouton=digitalRead(pinBoutonTreize);
  if (etatBouton){
    Serial.print("ca fonctionne:");
    for (int x=0;x<100;x++){
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(500);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(500);
  }
  delay(1000);
  } 
  else {
    digitalWrite(stepPin,LOW);
    delayMicroseconds(500);
  }
  delay(1000);
}
///////////////////////////////////////////////////

Il semblerai donc que la manière de piloter ce genre de moteur pas à pas soit radicalement différente. Quel programme auriez vous à me proposer pour contrôler ce moteur pas à pas avec la bibliothèque MTulnStepper svp ?

Cordialement

Bonjour enash

J'ai un exemple, mais avec la bibliothèque AccelStepper, des info ici.
Une pression brève sur le bouton (boutonPin) fait tourner le moteur de mpapNombreDePasAtourner, dans le cas de pression continue, le moteur tourne en continu, au relâché du bouton, il tourne, encore de mpapNombreDePasAtourner.

#include "AccelStepper.h"     // https://www.pjrc.com/teensy/td_libs_AccelStepper.html

int boutonPin = 3;
const int boutonPinEtatOn = LOW;     // Etat lu du bouton quand pressé (LOW pour PULL_UP)

const int mpapDirPin = 5;     // Pour driver MPAP pin pas
const int mpapStepPin = 6;     // Pour driver MPAP pin direction
// Facultatif si pin ENABLE est en l'air
const int mpapEnaPin = 7;     // Pour driver MPAP pin ENABLE

AccelStepper mpap1(1, mpapStepPin, mpapDirPin);     // 1 pour A4988

int mpapNombreDePasAtourner = 600;

void setup()
{
	mpap1.setMaxSpeed(400);
	mpap1.setAcceleration(500);
	
	pinMode(boutonPin, INPUT_PULLUP);

	mpap1.setEnablePin(mpapEnaPin);
	//                    DIR    STEP  ENA
	mpap1.setPinsInverted(false, false, true);
	mpap1.enableOutputs();     // Activer les signaux du MPAP
}

void loop()
{
	
	int etatBouton=digitalRead(boutonPin);
	if (etatBouton == boutonPinEtatOn)
	{
		mpap1.move(mpapNombreDePasAtourner);
	}
	mpap1.run();
}

A toi d'ajuster les pin du programme à ton installation.
Pour plusieurs moteurs, il suffit de dupliquer.

Cordialement
jpbbricole

Oui pour la bibliothèque, pas vraiment pour le programmeur, vrai aussi pour le cablâge.

Le 17hs15-1504 est bien un moteur 4 fils 1,5A. On les pilote effectivement avec des drivers ayant Step et DIR.

Note: le A4988 ne doit pas être capable d'aller jusqu'à 1,5A (réglage à √2.1,5A MAXI), et diminuer un peu le courant perd du couple (proportionnel au courant), mais diminue l'échauffement (proportionnel au carré du courant). C'est d'ailleurs comme cela que je travaille. Si le couple s'avérait insuffisant, il faudrait passer à un driver plus pissant, mais le moteur chaufferait jusqu'à 60°C au nominal.

Bon pour un 28BYJ48, mais le 17hs15-1504s est un hybride 200 pas. je conseille fortement d'utiliser 8 ou 16 micros pas pour diminuer le bruit et ne pas risquer la résonance. 16µpas est simple, sans réfléchir avec un A4988, il faut mettre MS1 MS2 et MS3 à 5V.

Pour l'alimentation, seule la broche Vmoteur des A4988 doit être à plus de 5V. Il faut mettre au moins 7V. Cette tension est l'alimentation du driver, c'est lui qui fournit le courant correct au moteur. On se moque ainsi de la tension réelle appliquée au moteur. Le moteur est un 5W (RI2), l'alim doit pouvoir fournir le triple (si on veut aller très vite), plus est inutile. Ne pas tomber dans le piège de dire pour une alim 24V: 24V avec 1A donne 24W et on surdimensionne un peu. Quelle que soit la tension d'alim, le moteur consomme la même puissance. Le driver consomme peu.

Pour un moteur piloté par un Driver avec STEP, c'est MTstepStepper (MTstepStepper.pdf (104.7 KB) qu'il faut choisir:

#include "MTstepStepper.h" // Voir http://arduino.dansetrad.fr/MTobjects
MTstepStepper(pin_Step 3, pin_Dir 4, pin_EN NON_CONNECTEE, 0.31 micro_pas, 1.0 RPS);

Pour la vitesse, 3 possibilités:
0.31 RPS (rotate per second = tour par seconde)
18.75 RPM (tr/mn)
1000 micro_secondes_par_pas

Le reste du programme est inchangé par rapport aux 28BYJ48:

Bonsoir
Voici mon nouveau montage:


Avec ce nouveau montage, j'ai essayer les trois codes suivants mais à chaque fois que j'appuie sur le bouton, le moteur ne faisait que tourner d'un petit pas au lieu de tourner du nombre de pas dans le programme, pas du tout ou en faisant capricieusement plusieurs tours.

#include "AccelStepper.h"     // https://www.pjrc.com/teensy/td_libs_AccelStepper.html

int boutonPin = 3;
const int boutonPinEtatOn = LOW;     // Etat lu du bouton quand pressé (LOW pour PULL_UP)

const int mpapDirPin = 5;     // Pour driver MPAP pin pas
const int mpapStepPin = 6;     // Pour driver MPAP pin direction
// Facultatif si pin ENABLE est en l'air
const int mpapEnaPin = 7;     // Pour driver MPAP pin ENABLE

AccelStepper mpap1(1, mpapStepPin, mpapDirPin);     // 1 pour A4988

int mpapNombreDePasAtourner = 10000;

void setup()
{
  mpap1.setMaxSpeed(400);
  mpap1.setAcceleration(500);
  
  pinMode(boutonPin, INPUT_PULLUP);

  mpap1.setEnablePin(mpapEnaPin);
  //                    DIR    STEP  ENA
  mpap1.setPinsInverted(false, false, true);
  mpap1.enableOutputs();     // Activer les signaux du MPAP
}

void loop()
{
  
  boolean etatBouton=digitalRead(boutonPin);
  if (etatBouton == boutonPinEtatOn)
  {
    mpap1.move(mpapNombreDePasAtourner);
  }
  mpap1.run();
}
#include "AccelStepper.h"  
#include "MTstepStepper.h" 

int boutonPin = 3;
const int boutonPinEtatOn = LOW;     // Etat lu du bouton quand pressé (LOW pour PULL_UP)

const int mpapDirPin = 5;     // Pour driver MPAP pin pas
const int mpapStepPin = 6;     // Pour driver MPAP pin direction
// Facultatif si pin ENABLE est en l'air
const int mpapEnaPin = 7;     // Pour driver MPAP pin ENABLE

MTstepStepper mpap1(pin_Step 3, pin_Dir 4, pin_EN NON_CONNECTEE, 0.31 micro_pas, 1.0 RPS);

int mpapNombreDePasAtourner = 10000;

void setup()
{
  mpap1.setMaxSpeed(400);
  mpap1.setAcceleration(500);
  
  pinMode(boutonPin, INPUT_PULLUP);

  mpap1.setEnablePin(mpapEnaPin);
  //                    DIR    STEP  ENA
  mpap1.setPinsInverted(false, false, true);
  mpap1.enableOutputs();     // Activer les signaux du MPAP
}

void loop()
{
  
  boolean etatBouton=digitalRead(boutonPin);
  if (etatBouton == boutonPinEtatOn)
  {
    mpap1.move(mpapNombreDePasAtourner);
  }
  mpap1.run();
}
const int stepPin = 6;
const int dirPin = 5;
int boutonPin = 3;
const int boutonPinEtatOn = LOW;


const int stepsPerRev=200;
int pulseWidthMicros = 100;  // microseconds
int millisBtwnSteps = 1000;

void setup() {
  Serial.begin(9600);
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(boutonPin, INPUT_PULLUP);
  Serial.println(F("A4988 Initialized"));
}

void loop() {
  boolean etatBouton=digitalRead(boutonPin);
  if (etatBouton == boutonPinEtatOn){
    Serial.println(F("Running clockwise"));
    digitalWrite(dirPin, HIGH); // Enables the motor to move in a particular direction
    // Makes 200 pulses for making one full cycle rotation
    for (int i = 0; i < stepsPerRev; i++) {
      digitalWrite(stepPin, HIGH);
      delayMicroseconds(pulseWidthMicros);
      digitalWrite(stepPin, LOW);
      delayMicroseconds(millisBtwnSteps);
    }
  delay(1000); // One second delay
  }
}

J'ai ensuite tester le programme suivant qui fait tourner deux fois le moteur dans le sens inverse des aiguilles d'une montre et une fois dans le sens des aiguilles d'une montre pour vérifier si mes moteurs fonctionnent bien, ce qui s'est avéré être le cas.

const int stepPin = 6;
const int dirPin = 5;


const int stepsPerRev=200;
int pulseWidthMicros = 100;  // microseconds
int millisBtwnSteps = 1000;
void setup() {
  Serial.begin(9600);
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
 
  Serial.println(F("A4988 Initialized"));
}

void loop() {
  Serial.println(F("Running clockwise"));
  digitalWrite(dirPin, HIGH); // Enables the motor to move in a particular direction
  // Makes 200 pulses for making one full cycle rotation
  for (int i = 0; i < stepsPerRev; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(pulseWidthMicros);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(millisBtwnSteps);
  }
  delay(1000); // One second delay

  Serial.println(F("Running counter-clockwise"));
  digitalWrite(dirPin, LOW); //Changes the rotations direction
  // Makes 400 pulses for making two full cycle rotation
  for (int i = 0; i < 2*stepsPerRev; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(pulseWidthMicros);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(millisBtwnSteps);
  }
  delay(1000);
}

Quelle(s) erreur(s) ai-je commis ?

Cordialement

Tu as le bouton sur 7
image
dans le programme:

int boutonPin = 3;

La pin 7 sert pour la pin ENABLE du A4988, si nécessaire.

Cordialement
jpbbricole

Bonjour
J'ai déplacé le fils qui était sur le pin 7 sur le pin 3 comme suit avec le programme suivant:

#include "AccelStepper.h"     // https://www.pjrc.com/teensy/td_libs_AccelStepper.html

int boutonPin = 3;
const int boutonPinEtatOn = LOW;     // Etat lu du bouton quand pressé (LOW pour PULL_UP)

const int mpapDirPin = 5;     // Pour driver MPAP pin pas
const int mpapStepPin = 6;     // Pour driver MPAP pin direction
// Facultatif si pin ENABLE est en l'air
const int mpapEnaPin = 7;     // Pour driver MPAP pin ENABLE

AccelStepper mpap1(1, mpapStepPin, mpapDirPin);     // 1 pour A4988

int mpapNombreDePasAtourner = 10000;

void setup()
{
  mpap1.setMaxSpeed(400);
  mpap1.setAcceleration(500);
  
  pinMode(boutonPin, INPUT_PULLUP);

  mpap1.setEnablePin(mpapEnaPin);
  //                    DIR    STEP  ENA
  mpap1.setPinsInverted(false, false, true);
  mpap1.enableOutputs();     // Activer les signaux du MPAP
}

void loop()
{
  
  boolean etatBouton=digitalRead(boutonPin);
  if (etatBouton == boutonPinEtatOn)
  {
    mpap1.move(mpapNombreDePasAtourner);
  }
  mpap1.run();
}

Cette fois ci le moteur ne réagissait que peu ou pas du tout aux pressions sur le bouton au départ. Puis au bout d'un certain nombre de pression sur le bouton le moteur se met à tourner plusieurs fois sur lui même en vibrant.

Cordialement

Toutes les masses doivent être reliées ( pas le 5V pas non plus le + de la puissance).

Il manque donc un fil de masse entre Uno et le - de l'alim de puissance.

C'est pas cela, les masses sont reliées par le A4988.

C'est peut être une inversion des fils du moteur. Cela se voit bien si on demande une vitesse de 2 pas/s.

Le nombre de pas par tour est de 200 si MS1 à MS3 sont en l'air. Et cela doit être indiqué quelque part, je crois dans sa définition du moteur.

Le 1 n'est pas bon, il me semble que c'est DRIVER ou 4, sans garantie, je n'ai pas mon ordi pour verifier

Bonsoir vileroi

Oui, c'est bon.
AccelStepper mystepper(1, pinStep, pinDirection);
1 pour driver avec STEP et DIR

Cordialement
jpbbricole

Bonsoir vileroi

Oui, c'est juste, mais le GND de l'Arduino est uniquement sur le commun du bas et n'a aucun lien avec le commun du haut. Le seul lien du GND Arduino et le A4988 se fait via ENABLE, pas très bon!

Cordialement
jpbbricole

Bonsoir
Je vous prie de m'excuser. j'avais oublié que ma platine est coupé en son milieu. Depuis que j'ai deplacé le ground du bouton sur la première moitié de la platine, le moteur tourne comme voulu. Merci infiniment

Cordialement

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