StepperonLine DM320T

Ce code fonctionne avec le A4988?

Je ne sais plus , mais en fait j'ai testé ainsi modifié:

/*
    Name:       Test_MPAPenable.ino
    Created:	20.11.2024
    Author:     jpbbricole
*/
/*
AC A4988 + AccelStepper
  
*/

#include <AccelStepper.h> // https://github.com/waspinator/AccelStepper

//ATTENTION  OPTO en l'air

const int dirPin = 3;
const int stepPin = 2;
const int enaPin = 12;
int nbMouv ;
int Mouv;
int cpt=0;
long distToGo=0;
boolean AR = true;
String chaine_caractere;
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);


void setup() {
  Serial.begin(115200);
  while(!Serial); 
  
  Serial.print("Saisissez un nombre d'aller et de retour : ") ;
	stepper.setEnablePin(enaPin); // Définition de la pin ENA
 	//                       DIR    STEP   ENA
	stepper.setPinsInverted(false, false, true); // https://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html#ac62cae590c2f9c303519a3a1c4adc8ab
  //digitalWrite(enaPin,LOW);
  stepper.disableOutputs();
//	stepper.moveTo(200);
}


void loop()
{
	// If at the end of travel go to the other end

  if (Serial.available() > 0) {
    
    chaine_caractere = Serial.readStringUntil('\n');
    // Affichage de la chaîne de caractères entrée par l'utilisateur sur le port série de l'Arduino.
    Serial.print("Le nombre saisi est : ") ;
    nbMouv = chaine_caractere.toInt();
    Serial.println(nbMouv);
    Mouv=1;
    cpt=0;
    
    stepper.setMaxSpeed(100);
	  stepper.setAcceleration(50);
   
    //digitalWrite(enaPin,HIGH);delay(10);
    stepper.enableOutputs();
    stepper.setCurrentPosition(0);
    delay(10);
    stepper.moveTo(200);
  }
    
  if (nbMouv >0){
    // Option 1  

    if (Mouv>nbMouv)  {Mouv=1;nbMouv=0;Serial.println(" fini ");stepper.disableOutputs();} //

    distToGo=stepper.distanceToGo();
    if (distToGo == 0 && Mouv<=nbMouv)    // stepper.disableOutputs();
    {
      //Serial.println(F("Stepper STOP"));
      delay(500);
      //Serial.print(F("Stepper START "));
      
      Serial.print(Mouv);Serial.print(" ");Serial.print(stepper.targetPosition());Serial.print(" ");Serial.println(cpt);cpt=0;
      //stepper.setCurrentPosition(0);
      stepper.moveTo(-stepper.currentPosition());
      
      Mouv++;
    }
     
    stepper.run();
    if (stepper.distanceToGo()!= distToGo) {cpt++;}

    // fin option 1

    // Option 2

    // Tourne(500,200,AR,100);
    // delay(500);
    // Mouv++;
    // //AR= !AR;
    // if (Mouv>nbMouv) nbMouv=0;
    // fin option2
  }
  
}

void Tourne (int Vit, int NbPas, boolean Sens, int Acc) {
  digitalWrite(enaPin,HIGH);delay(10);

  if( Sens) stepper.moveTo(NbPas); else stepper.moveTo(-NbPas);

  while (true) {
    if (stepper.distanceToGo() == 0 ) {
      digitalWrite(enaPin,LOW);
      stepper.setCurrentPosition(0);
      break;
    }
      stepper.run();
  }
}

Etant donné le nombre d'alertes sur la toile, concernant le UNO WF R4 , et l'alerte compatibilité AccelStepper, je pense qu'il y a un problème de ce coté, j'en ai un avec le LCD qui affiche bien, mais les touches KP ne sont pas opérationnelles

Faut démonter et mettre une UNO à la place derriere le DM320T pour confirmer.

voir : GitHub - arduino/uno-r4-library-compatibility

Bonjour AC74

J'ai testé ton programme #181, "retouché" sur un UNO R4 Wifi et A4988 et il tourne sans problème.
Le programmme:

/*
Name:       Test_MPAPenable.ino
Created:	20.11.2024
Author:     jpbbricole
*/
/*
AC DM320T réglé
SW1 ON SW2 OFF SW3 OFF => 1.9A
SW4 ON SW5 ON  SW6 ON  => 400 pas/tour
OPTO en l'air
*/

#include <AccelStepper.h> // https://github.com/waspinator/AccelStepper

//ATTENTION  OPTO en l'air

const int dirPin = 3;
const int stepPin = 2;
const int enaPin = 12;
int nbMouv ;
int Mouv;
int cpt=0;
long distToGo=0;
boolean AR = true;
String chaine_caractere;
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);


void setup() {
	Serial.begin(115200);
	while(!Serial);

	
	Serial.print("Saisissez un nombre d'aller et de retour : ") ;
	stepper.setEnablePin(enaPin); // Définition de la pin ENA
	//                       DIR    STEP   ENA
	stepper.setPinsInverted(false, false, true); // https://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html#ac62cae590c2f9c303519a3a1c4adc8ab
	digitalWrite(enaPin,LOW);
	stepper.disableOutputs();
	//	stepper.moveTo(200);
}


void loop()
{
	// If at the end of travel go to the other end

	if (Serial.available() > 0) {
		
		chaine_caractere = Serial.readStringUntil('\n');
		// Affichage de la chaîne de caractères entrée par l'utilisateur sur le port série de l'Arduino.
		Serial.print("Le nombre saisi est : ") ;
		nbMouv = chaine_caractere.toInt();
		Serial.println(nbMouv);
		Mouv=1;
		cpt=0;
		
		stepper.setMaxSpeed(500);
		stepper.setAcceleration(50);
		
		//digitalWrite(enaPin,HIGH);delay(10);
		stepper.enableOutputs();
		stepper.setCurrentPosition(0);
		delay(10);
		stepper.moveTo(400);
	}
	
	if (nbMouv >0){
		// Option 1

		// if (Mouv>nbMouv)  {Mouv=1;nbMouv=0;Serial.println(" fini ");digitalWrite(enaPin,LOW);} //

		// distToGo=stepper.distanceToGo();
		// if (distToGo == 0 && Mouv<=nbMouv)    // stepper.disableOutputs();
		// {
		//   //Serial.println(F("Stepper STOP"));
		//   delay(500);
		//   //Serial.print(F("Stepper START "));
		
		//   Serial.print(Mouv);Serial.print(" ");Serial.print(stepper.targetPosition());Serial.print(" ");Serial.println(cpt);cpt=0;
		//   //stepper.setCurrentPosition(0);
		//   stepper.moveTo(-stepper.currentPosition());
		
		//   Mouv++;
		// }
		
		// stepper.run();
		// if (stepper.distanceToGo()!= distToGo) {cpt++;}

		// fin option 1

		// Option 2

		Tourne(500,200,AR,100);
		delay(500);
		Mouv++;
		//AR= !AR;
		if (Mouv>nbMouv) nbMouv=0;
		// fin option2
	}
	
}

void Tourne (int Vit, int NbPas, boolean Sens, int Acc) {
	//digitalWrite(enaPin,HIGH);delay(10);
	stepper.enableOutputs();delay(10);

	if( Sens) stepper.moveTo(NbPas); else stepper.moveTo(-NbPas);
	while (stepper.distanceToGo() != 0 ) {
		stepper.run();
	}
	stepper.disableOutputs();
	stepper.setCurrentPosition(0);
}

Dans les retouches, j'ai surtout corrigé ceci:

//digitalWrite(enaPin,HIGH);delay(10);
stepper.enableOutputs();delay(10);

Tes digitalWrite sur ENA étaient "à l'envers" et comme l'on utilise AccelStepper, autant utiliser ses fonctions.

Essaies ça, avec un A4988.

A+
jpbbricole

Ça marche très bien avec UNO + A4988
avec AR= !AR; et //AR= !AR;
Il faut que je démonte pour le tester sur UNO R4

Ca ne devrait poser aucun problème :wink:

Bonsoir,

Kes étudiants qui en ce moment font un tuto sur un p à p et un drivers équivaleny n'ont pas ce genre de pb (OPTO en l'air...)

C'est dommage de laisser de côté ce genre de matériel, j'espére pour vous qi'un jour vous regarderez à tête reposée pourquoi il y a un bug.

Juste un petit retour sur cette remarque.
Le constructeur est au contraire très clair.
ENABLE si :

  • non connecté: comme la liaison se fait au travers d'un opto-coupleur donc en l'air pas de courant dans l'opto
  • actif au niveau haut: le schéma d'application montre un commun des opto-coupleurs au +V, donc un niveau haut sur l'entrée revient à ne pas faire circuler de courant dans l'opto-coupleur

Donc, au final :

  • si du courant circule dans l'opto le driver est désactivé
  • si aucun courant dans l'opto-coupleur le driver est activé

Je ne contredis absolument pas cela et c'est d'ailleurs similaire à ce que vous écrivez.

Par contre, vous ne l'avez pas souligné (sans doute pas lu?) mais cela n'est valable (surtout pour les autres signaux) que si OPTO est relié au +5V.

Ce qui semble être contredit depuis au moins le post#166

Alors si OPTO, commun des OPTO, n'est pas à +5V, ENA est de toutes façons en l'air par défaut et PULL et DIR aussi.

Avec des anodes communes je vois mal où pourrait être le commun ailleurs qu'à un +

Test matinal
Avec UNO WIFI R4 + A4988
Avec prog #187

Il tourne bien ; j'ai testé avec et sans A/R (AR= !AR;), j'ai testé Options 1 et 2
Tout va bien, l'arbre est débloqué à la fin du test que le nombre soit pair ou non.

Ce qui prouve que la lib AccelStepper n'est pas en cause, que le UNO WF R4 accepte bien cette lib.

Donc mon DM320T est soit en panne d'optos, soit est en version modifiée (peu probable mais je l'ai déjà rencontré)

Je n'abandonne pas ce DM320T, il tourne à sa façon
Mais je comparerai quand j'en rentrerai un autre

Bonjour Il tourne bien

Super, le choix du A4988 était le bon!
Ton DM320T est surdimensionné pour ton projet, si tu veux un driver de cette "grosseur", choisi plutôt un TB6600.

Bonne journée!
jpbbricole

On est d'accord.

J'ai procédé à une série d'essais avec UNO R3 + DM320T

J'ai reproduit certaines des anomalies constatées avec le UNO Wifi R4 , à savoir le pair/impair.

La seule conclusion que je tire, c'est que la UNO Wifi R4 n'est pas la cause des problèmes.

J'observe qu'avec la UNO R3 on peut fonctionner avec OPTO à 5V
Mais si je refais les tests du tableau, j'obtiens des résultats différents ce qui signifie que le résultat dépend de ce qui s'est passé avant.

Il marche bizarrement mon DM320T

Bonsoir AC74

Il fait des chinoiseries :rofl:

Ça fonctionne toujours bien avec le A4988 ?

Bonne soirée !
jpbbricole

Compte tenu que dans les conditions minimum à remplir pour un bon fonctionnement il y a
OPTO à 5V
Ça n'a rien de chinois si ça marche avec OPTO à +5V.

Par contre, votre derniére ligne du tableau, c'est un peu du chinois pour moi.

C'est quoi 1, 2, 3, 4, 5?
Vous avez écrit
1 tout est OK
2 tourne puis bloque si pair, débloque si impair
3 tourne puis bloque

4 ?
5 ?

Mon tableau est peut être un peu aride, et il était incomplet

J'ai voulu savoir comment marchait ce DM320T avec une ancienne UNO R3
Je me rends compte qu'il manquait 2 lignes sur mon précédent post

Signification :man_factory_worker:

J'ai utilisé le dernier prg de test dans sa version option2 que voici :

/*
Name:       Test_MPAPenable.ino
Created:	20.11.2024
Author:     jpbbricole
*/
/*
AC DM320T réglé
SW1 ON SW2 OFF SW3 OFF => 1.9A
SW4 ON SW5 ON  SW6 ON  => 400 pas/tour
Modifié AC74
*/

#include <AccelStepper.h> // https://github.com/waspinator/AccelStepper

//ATTENTION  OPTO 

const int dirPin = 3;
const int stepPin = 2;
const int enaPin = 12;

int nbMouv ;
int Mouv;
int cpt=0;
long distToGo=0;
boolean AR = true;
String chaine_caractere;
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);


void setup() {
	Serial.begin(115200);
	while(!Serial);

	
	Serial.print("Saisissez un nombre d'aller et de retour : ") ;
	stepper.setEnablePin(enaPin); // Définition de la pin ENA

	//                       DIR    STEP   ENA  // https://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html#ac62cae590c2f9c303519a3a1c4adc8ab
	
  stepper.setPinsInverted(false, false, true);  // cette ligne avec ENA true ou false
	
  digitalWrite(enaPin,LOW);     // ligne à annuler ou pas
	//stepper.disableOutputs();     // ligne à annuler ou pas
	 
}

void loop()
{
  if (Serial.available() > 0) {
		chaine_caractere = Serial.readStringUntil('\n');
		// Affichage de la chaîne de caractères entrée par l'utilisateur sur le port série de l'Arduino.
		Serial.print("Le nombre saisi est : ") ;
		nbMouv = chaine_caractere.toInt();
		Serial.println(nbMouv);
		Mouv=1;
		cpt=0;
		
		stepper.setMaxSpeed(500);
		stepper.setAcceleration(50);
		stepper.setCurrentPosition(0);
		delay(10);
		//stepper.moveTo(200);    // pour option 1
	}
	
	if (nbMouv >0){
    digitalWrite(enaPin,HIGH);     // ligne à annuler ou pas
	//stepper.enableOutputs();     // ligne à annuler ou pas

		Tourne(500,200,AR,100);

    digitalWrite(enaPin,LOW);     // ligne à annuler ou pas
	//stepper.disableOutputs();     // ligne à annuler ou pas

    Serial.println("Fini");
		delay(500);
		Mouv++;
		AR= !AR;
		if (Mouv>nbMouv) nbMouv=0;
	}
}

void Tourne (int Vit, int NbPas, boolean Sens, int Acc) {
	
  // //digitalWrite(enaPin,HIGH);delay(10);   // enlevée pour éviter les accoups sur les A/R
	// //stepper.enableOutputs();delay(10);

	if( Sens) stepper.moveTo(NbPas); else stepper.moveTo(-NbPas);
	while (stepper.distanceToGo() != 0 ) {
		stepper.run();
	}
  // //digitalWrite(enaPin,LOW);delay(10);  // enlevée pour éviter les accoups sur les A/R
	// //stepper.disableOutputs();

	stepper.setCurrentPosition(0);
}

Je manipule 3 paramètres :

  • le false / true sur ENA dans le setup
  • les différents digitalWrite(enaPin, HIGH/LOW annulés ou non
    ou
  • les différents Outputs annulés ou non
  • la borne OPTO raccordée ou non au 5V

et je regarde si la rotation est efective et si l'arbre est libéré à la fin

Si tourne et arbre libéré => 1 en vert
Si ne tourne pas => 4

reste 3 autres cas si tourne
* l'arbre est bloqué si la demande Série est paire ou impaire (nb de mouvements)
* larbre est débloqué si paire bloqué si impaire et l'inverse

RESULTAT :melting_face:

  • Contrairement à UNO WF R4, UNO R3 le moteur tourne avec OPTO sur 5V
  • J'observe que l'arbre peut être bloqué ou nom aprés x (pair/impair) mouvements comme s'il y avait un effet de bascule stable
  • J'observe que ces résultats bloqué ou non varie selon l'ordre des tests, donc de l'état obtenu au test précédent (bascule stable ?)
  • Si je reviens à la UNO WF R4 , je n'ai pas réussi à faire tourner avec OPTO sur 5V

Avec ça "comprenne qui pourra" , moi je me doute que mon DM320T ... :hot_face:

Test même programme sur UNO WF R4

Première ligne ENA sur false

Lignes digitalWrite(enaPin, activées
Lignes stepper.enab ou disableOutputs( désactivées
OPTO en l'air

Tourne résultat 2

Après setup => arbre bloqué (alors qu'il devrait être débloqué) , puis demande 1 mouvement => l'arbre est débloqué , puis demande 1 mouvement => arbre bloqué .... bloque , débloque si demande 1 mouvement

Il y a une situation ou l'arbre est débloqué sur setup puis le résulta est ineversé selon que la demande est paire ou impaire

Bonjour,

OK, c'est plus clair, merci.

Pour faire reference à "chinoiserie", peut-être que (moi je n'en suis pas certain) les chinois sont moins "carrés" que les américains et en ce sens se permettent des "chinoisseries" là où les américains n'oserez pas.

En tout cas, il est fort probable que si tu utilise leur matériel de façons non reconnues, les chinois ne garantissent rien du résultat.

Et OPTO CONNECTÉ A +5V est je pense le seul état reconnut et conseillé pour ce signal.

Ensuite, j'ai lu chez les anglosaxons

  • If you want to enable the stepper with the AccelStepper library you should use: stepper.enableOutputs();. To disable the stepper you should use stepper.disableOutputs();*

Ce qui explique que tu trouve si peu de 1 dans ton tableau je pense.