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 ?
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
}
}
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.
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):
Je t'ai "réaménagé" le traitement du bouton, je te laisse découvrir
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
}
}