Problème pour contrôler un moteur PàP

Bonjour/Bonsoir,

Je suis sur un projet d’un système coulissant pour faire sortir un écran de PC de mon bureau. Niveau mécanique et électronique je m’en sors bien par contre niveau programmation je cale complet … J’ai essayé tant bien que mal d’écrire un code mais celui ci ne fonctionne pas. Je n’ai aucun mouvement que ça soit en appuyant sur mes boutons ou pas. Je m’explique : j’aimerais qu’en appuyant sur le bouton “haut” mon moteur fasse monté l’écran jusqu’à ce que la butée appuie sur le bouton “stop haut”, puis quand j’appuie sur le bouton “bas” mon moteur fasse redescendre l’écran jusqu’à ce que la buté appuie sur le bouton “stop bas”. J’utilise 2 boutons poussoir ainsi que 2 boutons de fin de course. Si je n’ai pas été assez clair n’hésitez pas à me reprendre. Merci et joyeuse pâque !!

 int stepPin = 10;
int dirPin = 9;
int enPin = 8;

int swHaut = 5;
int endSwHaut = 4;
int swBas = 3;
int endSwBas = 2;

int swHautState = 0;
int endSwHautState = 0;
int swBasState = 0;
int endSwBasState = 0;

void setup() {

pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);

pinMode(swHaut, INPUT_PULLUP);
pinMode(endSwHaut, INPUT_PULLUP);
pinMode(swBas, INPUT_PULLUP);
pinMode(endSwBas, INPUT_PULLUP);

}

void loop() {
digitalWrite(stepPin, HIGH);

swHautState = digitalRead(swHaut);

if (swHautState == HIGH);
{
digitalWrite(dirPin, HIGH);
digitalWrite(enPin, LOW);
}

endSwHautState = digitalRead(endSwHaut);

if (endSwHaut == HIGH);
{
digitalWrite(enPin, HIGH);
}

swBasState = digitalRead(swBas);

if (swBas == HIGH);
{
digitalWrite(dirPin, LOW);
digitalWrite(enPin, LOW);
}

endSwBas = digitalRead(endSwBas);

if (endSwBas == HIGH);
{
digitalWrite(enPin, HIGH);
}
}

Tu ne donnes pas toutes les infos : quel Arduino (je suppose un Uno ou un Nano), est-ce que tu utilises un L293D ou équivalent pour contrôler le moteur ?

Ta gestion du moteur n’est pas bonne, lis cette page et la suivante pour voir comment ça marche.

Je te propose ceci :

int pwmPin = 10; // PWM pour la vitesse du moteur
/* sens de rotation du moteur
          sens 1  sens -1
  pin 8   HIGH    LOW
  pin 9   LOW     HIGH
*/
int m1Pin = 9;
int m2Pin = 8;
byte boutonsHB[2] = {5, 3};
byte finDeCourseHB[2] = {4, 2};
bool arret = true;   // true : arret, false : mouvement
bool sens = true;    // true : vers le bas, false : vers le haut
byte vitesse = 100;  // changer si trop rapide ou trop lent

void ascenseur() {
  if (arret) return;
  analogWrite(pwmPin, vitesse);
  if (!sens) { // vers le haut
    if (digitalRead(finDeCourseHB[0]) == LOW) { // arrivé en haut
      arret = true;
      analogWrite(pwmPin, 0);
      delay(30);
      return;
    } // sinon on monte
    digitalWrite(m1Pin, HIGH); // <-- échanger HIGH et LOW si pas le bon sens
    digitalWrite(m2Pin, LOW);
  } else { // vers le bas
    if (digitalRead(finDeCourseHB[1]) == LOW) { // arrivé en bas
      arret = true;
      analogWrite(pwmPin, 0);
      delay(30);
      return;
    } // sinon on descend
    digitalWrite(m1Pin, LOW);  // <-- échanger HIGH et LOW si pas le bon sens
    digitalWrite(m2Pin, HIGH);
  }
}

void setup() {
  for (byte i = 0; i < 2; i++) {
    pinMode(boutonsHB[i], INPUT_PULLUP); // renvoie LOW si appuyé
    pinMode(finDeCourseHB[i], INPUT_PULLUP);
  }
  pinMode(pwmPin, OUTPUT);
  pinMode(m1Pin,  OUTPUT);
  pinMode(m2Pin,  OUTPUT);
  Serial.begin (115200);
}

void loop() {
  if (digitalRead(boutonsHB[0]) == LOW) {  // appui bouton montée
    sens = false;
    arret = false;
    delay(30);
  }
  if (digitalRead(boutonsHB[1]) == LOW) {  // appui bouton descente
    sens = true;
    arret = false;
    delay(30);
  }
  ascenseur();
}

Ça compile mais je n’ai pas testé donc je ne sais pas si ça marche. De plus, comme je ne sais pas comment ton moteur est câblé, il est possible que ça ne fonctionne pas. Quand je mets

    digitalWrite(m1Pin, HIGH); // <-- échanger HIGH et LOW si pas le bon sens
    digitalWrite(m2Pin, LOW);

il faudra peut-être changer par

    digitalWrite(m1Pin, LOW); 
    digitalWrite(m2Pin, HIGH);

ou inverser les fils des pins 8 et 9.
Enfin pour le câblage du moteur, si tu as un L293D ou un L298N :

  • EN1 : pin 10
  • 1A : pin 8
  • 2A : pin 9
  • 1Y, 2Y : vers le moteur
    Je n’ai pas changé les câblages de boutons, note au passage qu’un bouton en INPUT_PULLUP renvoie LOW lorsqu’il est enfoncé.

J'ai posté le schéma dans le premier post il y a tout ce que j'utilise dessus hormis le Easy Driver que je remplace par un A4988 qui est à peu près similaire niveau connectique. Pour le reste j'utilise un Arduino Nano, un moteur NEMA17, une alimentation 12v.

Je ne connais pas le A4988 mais il est présenté ici. Je ne comprends pas la configuration “axe moteur totalement libre”, tu l’utilises ?

Essaye ça :

int pinEnable = 10; // Activation du driver/pilote
/* Le module est activé lorsque la sortie 13 est LOW (niveau bas) ->
   L'axe du moteur est donc maintenu bloqué en attente du prochain pas.
   Le module est désactivé lorsque la sortie 13 est HIGH (niveau haut) ->
   L'axe du moteur est donc totalement libre de tout mouvement puisque le moteur est désactivé.
   https://wiki.mchobby.be/index.php?title=A4988
*/
int pinStep   = 9;  // Signal de PAS (avancement)
int pinDir    = 8;  // Direction
byte boutonsHB[2] = {5, 3};
byte finDeCourseHB[2] = {4, 2};
bool arret = true;   // true : arret, false : mouvement
bool sens = true;    // true : vers le bas, false : vers le haut
byte vitesse = 10;   // changer si trop rapide ou trop lent

void ascenseur() {
  if (arret) return;  // pas de step, axe bloqué : rien ne bouge
  digitalWrite(pinStep, sens);  // <-- changer par !sens si pas le bon sens
  if (!sens) { // vers le haut
    if (digitalRead(finDeCourseHB[0]) == LOW) { // arrivé en haut
      arret = true;
      delay(30);
      return;
    }
  } else { // vers le bas
    if (digitalRead(finDeCourseHB[1]) == LOW) { // arrivé en bas
      arret = true;
      delay(30);
      return;
    }
  }
  digitalWrite( pinStep, HIGH );
  delay(vitesse);
  digitalWrite( pinStep, LOW );
  delay(vitesse);
}

void setup() {
  for (byte i = 0; i < 2; i++) {
    pinMode(boutonsHB[i], INPUT_PULLUP); // renvoie LOW si appuyé
    pinMode(finDeCourseHB[i], INPUT_PULLUP);
  }
  pinMode(pinEnable, OUTPUT);
  pinMode(pinDir   , OUTPUT);
  pinMode(pinStep  , OUTPUT);
  digitalWrite(pinEnable, LOW);
  Serial.begin (115200);
}

void loop() {
  if (digitalRead(boutonsHB[0]) == LOW) {  // appui bouton montée
    sens = false;
    arret = false;
    delay(30);
  }
  if (digitalRead(boutonsHB[1]) == LOW) {  // appui bouton descente
    sens = true;
    arret = false;
    delay(30);
  }
  ascenseur();
}