DEBUTANT branchement DM542T à Arduino UNO

Salut à tous

Je suis débutant et souhaite faire varier la vitesse d'un moteur PAP (nema 23) via un potentiomètre.
J'ai fait pas mal d’essais aujourd'hui mais sans résultat (moteur bloqué qui grogne a chaque tentative) et je commence a m’emmêler les pinceaux du coup je reprend tout depuis le début.
matériel utilisé, un nema23 4.2A pas de 1.8° qui je suis quasi sur est bien branché au stepper DM542T qui est réglé sur 4.5A et résolution à 1600 micropas.

j'aimerai savoir comment correctement brancher le stepper a mon arduino uno ?

Merci d'avance !
Niko




pour info voici mon câblage




Bonjour nikopike

C'est souvent un problème de programme, mets le dans le forum.

Quel est la valeur de ton potentiomètre, recommandée, 10k.

Pour ce qui est du câblage, c'est OK, sauf ce pont:


Qui ponte le GND de la partie moteur, avec le GND de l'Arduino.
Or les entrées de commandes du DM542T sont sur optocoupleur:

justement pour séparer ces 2 parties, celle côté moteur étant susceptible d'être "bruitée" avec risque de gêner le bon fonctionnement de l'Arduino.

A+
Cordialement
jpbbricole

Bonjour,

Je plussoie @jpbbricole sur la séparation des 0V.

La question bête:

A propos de ENA, le "+" et "-" sont reliés, est-ce bien un ENA par niveau Bas?

(je n'ai pas regardé la doc!)

OK merci pour vos reponse je vais supprimer ce pont et mon potentiomètre fait bien 10KOhms voici un récapitulatif de tout les branchements:

Matériel utilisé :

  • Alimentation : Mean Well LRS-350-24 (24V)
  • Moteur pas à pas : StepperOnline Nema 23 (23HS45-4204S)
  • Driver : Stepper Driver DM542T
  • Microcontrôleur : Arduino Uno R3
  • Potentiomètre : AIPUGE 3590S-2-502L (10 tours)
  • Bouton poussoir à verrouillage ON/OFF
  • Résistance : 10 kΩ pour pull-up du bouton poussoir

Branchements :

Alimentation :

  • LRS-350-24 (24V)
    • V++VDC du DM542T
    • V-GND du DM542T

Moteur Nema 23 (23HS45-4204S) :

  • NoirA+ du DM542T
  • VertA- du DM542T
  • RougeB+ du DM542T
  • BleuB- du DM542T

DM542T vers Arduino :

  • PUL+D3 de l’Arduino
  • PUL-GND de l’Arduino
  • DIR+D2 de l’Arduino
  • DIR-GND de l’Arduino
  • Pontage : ENA-, ENA+, DIR-, PUL- du DM542T reliés au GND de l’Arduino

Potentiomètre (AIPUGE 10 tours) :

  • Borne 1A0 de l’Arduino
  • Borne 2GND de l’Arduino
  • Borne 35V de l’Arduino

Bouton poussoir à verrouillage ON/OFF :

  • COMGND de l’Arduino
  • NOD7 de l’Arduino
  • Résistance 10 kΩ entre NO et 5V de l’Arduino (Pull-up)

Bonjour nikopike

Pour moi, c'est OK.
Mets ton programme.

A+
Cordialement
jpbbricole

alors voici la photo des derniers branchement et aussi mon programme.
Avec les dernières modifications, les problèmes que je rencontre c'est avec le potard a 0 un moteur qui tourne tout doucement 10 tours minute alors qu'il devrait être arreté et ça augmente très peu a fond genre 60 tour minute a 1023 et il se stop des fois a fond ensuite le bouton poussoir a verrouillage ça fonctionne pas je dois appuyer 2 fois pour allumer et le meme pour éteindre

#define POT_PIN A0       // Broche du potentiomètre (A0)
#define PUL_PIN 3        // Broche PUL du DM542T (pour envoyer des impulsions)
#define DIR_PIN 2        // Broche DIR du DM542T (pour définir la direction)
#define BUTTON_PIN 7     // Broche du bouton poussoir (D7)
#define MICROSTEPS 1600  // Nombre de micropas par tour du moteur

int buttonState = 0;         // Etat actuel du bouton (0 ou 1)
int lastButtonState = 0;     // Dernier état du bouton
bool programRunning = false; // Variable pour savoir si le programme est en cours ou arrêté

void setup() {
  pinMode(PUL_PIN, OUTPUT);  // Définir la broche PUL comme une sortie
  pinMode(DIR_PIN, OUTPUT);  // Définir la broche DIR comme une sortie
  pinMode(BUTTON_PIN, INPUT); // Définir la broche du bouton poussoir comme une entrée

  // Initialisation de la direction (horaire)
  digitalWrite(DIR_PIN, HIGH);
}

void loop() {
  // Lire l'état du bouton poussoir
  buttonState = digitalRead(BUTTON_PIN);
  
  // Détection du changement d'état du bouton poussoir (passage de OFF à ON)
  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      // Si le bouton est enfoncé, inverser l'état du programme
      programRunning = !programRunning;
    }
    delay(50);  // Petite pause pour éviter les rebonds du bouton
  }
  
  lastButtonState = buttonState;  // Mettre à jour l'état du bouton pour la prochaine lecture

  if (programRunning) {
    // Lire la valeur du potentiomètre (de 0 à 1023)
    int potValue = analogRead(POT_PIN);
    
    // Calcul de la vitesse du moteur : plus la valeur est élevée, plus la vitesse est rapide
    // Si la valeur est faible, on met un délai plus long (vitesse lente), si elle est élevée, un délai plus court (vitesse rapide)
    int delayTime = map(potValue, 0, 1023, 2000, 100);  // Plage de délai entre 2000 µs (lent) et 100 µs (rapide)
    
    // Envoi des impulsions à la broche PUL pour faire tourner le moteur
    digitalWrite(PUL_PIN, HIGH);
    delayMicroseconds(delayTime);  // Délai pour ajuster la vitesse
    digitalWrite(PUL_PIN, LOW);
    delayMicroseconds(delayTime);  // Délai pour ajuster la vitesse
  } else {
    // Si le programme est arrêté, ne rien faire (le moteur est arrêté)
    digitalWrite(PUL_PIN, LOW);   // Assurez-vous que les impulsions ne sont pas envoyées
  }
}

Bonjour nikopike

Je vais regarder pourquoi ton programme fonctionne mal mais, comme tu est débutant, autant que tu prennes les bonnes habitudes, les bibliothèques:
Tu veux utiliser un moteur pas à pas, il y a AccelStepper
Tu veux un bouton, il y a Button
Tout ça te simplifie la vie.

Si tu me décris ce que tu veux faire, je te montrerai comment utiliser l'IA pour arriver à tes fins.

A+
Cordialement
jpbbricole

Voilà la réponse à ma question.

Par défaut, ENA est activé si rien n'est connecté sur ENA+ et ENA-.
Moins il y a de fils qui ne servent à rien, mieux c'est je pense.

Bonjour nikopike

Cela venait du fait que tu évaluai le potentiomètre à la mauvaise place, après la condition:
if (programRunning)
Je l'ai mise avant et inclu sa valeur dans la condition:
`

As tu mis une résistance de PULLDOWN (10k):
image

Je t'ai "réaménagé" le traitement du bouton, je te laisse découvrir :wink:

Le programme:

#define POT_PIN A0       // Broche du potentiomètre (A0)
#define PUL_PIN 3        // Broche PUL du DM542T (pour envoyer des impulsions)
#define DIR_PIN 2        // Broche DIR du DM542T (pour définir la direction)
#define BUTTON_PIN 7     // Broche du bouton poussoir (D7)
#define MICROSTEPS 1600  // Nombre de micropas par tour du moteur

int buttonState = 0;         // Etat actuel du bouton (0 ou 1)
//int lastButtonState = 0;     // Dernier état du bouton
bool programRunning = false; // Variable pour savoir si le programme est en cours ou arrêté

const int pulImpulseMin = 100; // Impulsion moteur minimum
const int pulImpulseMax = 2000 ; //2000; // Impulsion moteur maximum

const int potpotValueMin = 0; // Valeur potentiomètre minimum 
const int potpotValueMax = 1023; // Valeur potentiomètre maximum

void setup() {
	
	pinMode(PUL_PIN, OUTPUT);  // Définir la broche PUL comme une sortie
	pinMode(DIR_PIN, OUTPUT);  // Définir la broche DIR comme une sortie
	pinMode(BUTTON_PIN, INPUT); // Définir la broche du bouton poussoir comme une entrée

	// Initialisation de la direction (horaire)
	digitalWrite(DIR_PIN, HIGH);
}

void loop() {
	// Lire l'état du bouton poussoir
	buttonState = digitalRead(BUTTON_PIN);
	
	// Détection du changement d'état du bouton poussoir (passage de OFF à ON)
	//if (buttonState != lastButtonState) {
		if (buttonState == HIGH) {
			// Si le bouton est enfoncé, inverser l'état du programme
			programRunning = !programRunning;
			while(digitalRead(BUTTON_PIN) == HIGH){} // Tant que le bouton est pressé
			delay(50);  // Petite pause pour éviter les rebonds du bouton
		}
	//}
	
	//lastButtonState = buttonState;  // Mettre à jour l'état du bouton pour la prochaine lecture
	// Lire la valeur du potentiomètre (de 0 à 1023)
	int potValue = analogRead(POT_PIN);
	
	if (programRunning && potValue > potpotValueMin) {		
		// Calcul de la vitesse du moteur : plus la valeur est élevée, plus la vitesse est rapide
		// Si la valeur est faible, on met un délai plus long (vitesse lente), si elle est élevée, un délai plus court (vitesse rapide)
		int pulImpulse = map(potValue, potpotValueMin, potpotValueMax, pulImpulseMax, pulImpulseMin);  // Plage de délai entre 2000 µs (lent) et 100 µs (rapide)
		
		// Envoi des impulsions à la broche PUL pour faire tourner le moteur
		digitalWrite(PUL_PIN, HIGH);
		delayMicroseconds(pulImpulse);  // Délai pour ajuster la vitesse
		digitalWrite(PUL_PIN, LOW);
		delayMicroseconds(pulImpulse);  // Délai pour ajuster la vitesse
		} else {
		// Si le programme est arrêté, ne rien faire (le moteur est arrêté)
		digitalWrite(PUL_PIN, LOW);   // Assurez-vous que les impulsions ne sont pas envoyées
	}
}

A+
Cordialement
jpbbricole

merci pour les réponse, voici programme avec la bibliotheque accelstepper:

saisi#include <AccelStepper.h>

// Définition des broches
#define DIR_PIN 2       // Direction
#define PUL_PIN 3       // Pulse (Step)
#define SWITCH_PIN 7    // Interrupteur ON/OFF
#define POT_PIN A0      // Potentiomètre

// Création de l'objet moteur en mode DRIVER (STEP + DIR)
AccelStepper stepper(AccelStepper::DRIVER, PUL_PIN, DIR_PIN);

void setup() {
  pinMode(SWITCH_PIN, INPUT_PULLUP);  // Interrupteur avec pull-up interne
  pinMode(POT_PIN, INPUT);            // Potentiomètre

  stepper.setMaxSpeed(5000); // Vitesse max en pas/sec (ajustable)
  stepper.setAcceleration(1000); // Accélération pour fluidité
}

void loop() {
  if (!digitalRead(SWITCH_PIN)) { // Interrupteur sur ON (inversé car pull-up)
    int potValue = analogRead(POT_PIN); // Lire le potentiomètre
    float speed = map(potValue, 0, 1023, 80, 5000); // Adapter la vitesse

    stepper.setSpeed(speed); // Appliquer la vitesse
    stepper.runSpeed();      // Faire tourner le moteur
  } else {
    stepper.setSpeed(0); // Arrêter proprement
  }
}
ssez ou collez du code ici

mais même avec celui ci c'est pas terrible moteur qui tourne doucement ou il s’arrête, par contre merci le bouton poussoir fonctionne maintenant.

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