Programme de synchronisation moteur et vérin

Bonjour, je souhaite faire fonctionner un moteur et un vérin électrique avec chacun 2 fin de courses comme suit : Automatisme d'un moteur électrique 24v à commander dans les deux sens par inversion de polarité. Avec deux fins de course à chaque extrémité qu'on appellera haut et bas. ainsi qu'un vérin électrique 12v deux commande par inversion de polarité et deux fins de course qu'on appellera sortie et entré. Faire un programme pour Arduino UNO, avec un bouton mise en route et un bouton arrêt. Le moteur doit revenir à sa position initiale avant chaque démarrage de séquence position fin de course haut activé et le vérin fin de course rentré. Au démarrage le moteur doit tourner jusqu'au fin de course bas, lorsque qu'il est arrivé le moteur s'arrête et le vérin sort jusqu'à fin de course sortie puis attente 10 secondes. Ensuite le vérin doit rentré jusqu'à fin de course entré le moteur peut démarrer dans le sens inverse jusqu'au fin de course haut puis attente de 20 secondes.
Mais le programme qui me semble bon ne fonctionne pas.

// Définition des broches
const int boutonMarche = 6;
const int boutonArret = 7;
const int finCourseHaut = 2;
const int finCourseBas = 3;
const int finCourseSortie = 4;
const int finCourseEntree = 5;
const int relaisMoteurHaut = 8;
const int relaisMoteurBas = 9;
const int relaisVerinSortie = 10;
const int relaisVerinEntree = 11;

bool enMarche = false;

void setup() {
  // Initialisation des broches
  pinMode(boutonMarche, INPUT_PULLUP);
  pinMode(boutonArret, INPUT_PULLUP);
  pinMode(finCourseHaut, INPUT_PULLUP);
  pinMode(finCourseBas, INPUT_PULLUP);
  pinMode(finCourseSortie, INPUT_PULLUP);
  pinMode(finCourseEntree, INPUT_PULLUP);
  pinMode(relaisMoteurHaut, OUTPUT);
  pinMode(relaisMoteurBas, OUTPUT);
  pinMode(relaisVerinSortie, OUTPUT);
  pinMode(relaisVerinEntree, OUTPUT);

  // Assurez-vous que tout est arrêté au démarrage
  digitalWrite(relaisMoteurHaut, LOW);
  digitalWrite(relaisMoteurBas, LOW);
  digitalWrite(relaisVerinSortie, LOW);
  digitalWrite(relaisVerinEntree, LOW);
}

void loop() {
  if (digitalRead(boutonMarche) == LOW) {
    enMarche = true;
  }

  if (digitalRead(boutonArret) == LOW) {
    enMarche = false;
    arreterTout();
  }

  if (enMarche) {
    // Retour à la position initiale
    retourPositionInitiale();

    // Début de la séquence
    while (enMarche) {
      // Moteur vers le bas
      digitalWrite(relaisMoteurBas, HIGH);
      while (digitalRead(finCourseBas) == HIGH && enMarche) {
        if (digitalRead(boutonArret) == LOW) {
          enMarche = false;
          arreterTout();
        }
      }
      digitalWrite(relaisMoteurBas, LOW);

      // Vérin sort
      digitalWrite(relaisVerinSortie, HIGH);
      while (digitalRead(finCourseSortie) == HIGH && enMarche) {
        if (digitalRead(boutonArret) == LOW) {
          enMarche = false;
          arreterTout();
        }
      }
      digitalWrite(relaisVerinSortie, LOW);

      // Attente de 10 secondes
      delay(10000);

      // Vérin rentre
      digitalWrite(relaisVerinEntree, HIGH);
      while (digitalRead(finCourseEntree) == HIGH && enMarche) {
        if (digitalRead(boutonArret) == LOW) {
          enMarche = false;
          arreterTout();
        }
      }
      digitalWrite(relaisVerinEntree, LOW);

      // Moteur vers le haut
      digitalWrite(relaisMoteurHaut, HIGH);
      while (digitalRead(finCourseHaut) == HIGH && enMarche) {
        if (digitalRead(boutonArret) == LOW) {
          enMarche = false;
          arreterTout();
        }
      }
      digitalWrite(relaisMoteurHaut, LOW);

      // Attente de 20 secondes
      delay(20000);
    }
  }
}

void arreterTout() {
  digitalWrite(relaisMoteurHaut, LOW);
  digitalWrite(relaisMoteurBas, LOW);
  digitalWrite(relaisVerinSortie, LOW);
  digitalWrite(relaisVerinEntree, LOW);
}

void retourPositionInitiale() {
  // Moteur vers le haut jusqu'à fin de course haut
  digitalWrite(relaisMoteurHaut, HIGH);
  while (digitalRead(finCourseHaut) == HIGH) {
    // Attendre jusqu'à ce que le fin de course haut soit atteint
  }
  digitalWrite(relaisMoteurHaut, LOW);

  // Vérin rentre jusqu'à fin de course entrée
  digitalWrite(relaisVerinEntree, HIGH);
  while (digitalRead(finCourseEntree) == HIGH) {
    // Attendre jusqu'à ce que le fin de course entrée soit atteint
  }
  digitalWrite(relaisVerinEntree, LOW);
}

Merci pour votre aide !!!

Bonjour moa26

Tu devrais mettre des print pour regarder "vivre" ton programme et, ainsi, détecter le moment où ça coince, ainsi:

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

et un exemple:

	if (digitalRead(boutonMarche) == LOW) {
		enMarche = true;
		Serial.println("En marche true");
	}

En mettant le moniteur de l'IDE à 115200 tu verra les indications que tu as sélectionnées:
image

Cordialement
jpbbricole

Merci de ton retour mais le programme ne se lance pas du tout quand j'appuie sur le bouton !

Bonjour moa26

Oui, il démarre, j'ai ajouté des print à ton programme, avec tu verras que ton programme démarre bien:

// Définition des broches
const int boutonMarche = 6;
const int boutonArret = 7;
const int finCourseHaut = 2;
const int finCourseBas = 3;
const int finCourseSortie = 4;
const int finCourseEntree = 5;
const int relaisMoteurHaut = 8;
const int relaisMoteurBas = 9;
const int relaisVerinSortie = 10;
const int relaisVerinEntree = 11;

bool enMarche = false;

void setup() {
	Serial.begin(115200);
	// Initialisation des broches
	pinMode(boutonMarche, INPUT_PULLUP);
	pinMode(boutonArret, INPUT_PULLUP);
	pinMode(finCourseHaut, INPUT_PULLUP);
	pinMode(finCourseBas, INPUT_PULLUP);
	pinMode(finCourseSortie, INPUT_PULLUP);
	pinMode(finCourseEntree, INPUT_PULLUP);
	pinMode(relaisMoteurHaut, OUTPUT);
	pinMode(relaisMoteurBas, OUTPUT);
	pinMode(relaisVerinSortie, OUTPUT);
	pinMode(relaisVerinEntree, OUTPUT);

	// Assurez-vous que tout est arrêté au démarrage
	digitalWrite(relaisMoteurHaut, LOW);
	digitalWrite(relaisMoteurBas, LOW);
	digitalWrite(relaisVerinSortie, LOW);
	digitalWrite(relaisVerinEntree, LOW);
	
	delay(500);
	Serial.println("Démarrage");
}

void loop() {
	if (digitalRead(boutonMarche) == LOW) {
		enMarche = true;
		Serial.println("En marche true");
	}

	if (digitalRead(boutonArret) == LOW) {
		enMarche = false;
		arreterTout();
		Serial.println("Arrêt tout");
	}

	if (enMarche) {
		Serial.println("En marche");
		// Retour à la position initiale
		retourPositionInitiale();

		// Début de la séquence
		while (enMarche) {
			// Moteur vers le bas
			digitalWrite(relaisMoteurBas, HIGH);
			while (digitalRead(finCourseBas) == HIGH && enMarche) {
				if (digitalRead(boutonArret) == LOW) {
					enMarche = false;
					arreterTout();
				}
			}
			digitalWrite(relaisMoteurBas, LOW);

			// Vérin sort
			digitalWrite(relaisVerinSortie, HIGH);
			while (digitalRead(finCourseSortie) == HIGH && enMarche) {
				if (digitalRead(boutonArret) == LOW) {
					enMarche = false;
					arreterTout();
				}
			}
			digitalWrite(relaisVerinSortie, LOW);

			// Attente de 10 secondes
			delay(10000);

			// Vérin rentre
			digitalWrite(relaisVerinEntree, HIGH);
			while (digitalRead(finCourseEntree) == HIGH && enMarche) {
				if (digitalRead(boutonArret) == LOW) {
					enMarche = false;
					arreterTout();
				}
			}
			digitalWrite(relaisVerinEntree, LOW);

			// Moteur vers le haut
			digitalWrite(relaisMoteurHaut, HIGH);
			while (digitalRead(finCourseHaut) == HIGH && enMarche) {
				if (digitalRead(boutonArret) == LOW) {
					enMarche = false;
					arreterTout();
				}
			}
			digitalWrite(relaisMoteurHaut, LOW);

			// Attente de 20 secondes
			delay(20000);
		}
	}
}

void arreterTout() {
	Serial.println("arreterTout");
	digitalWrite(relaisMoteurHaut, LOW);
	digitalWrite(relaisMoteurBas, LOW);
	digitalWrite(relaisVerinSortie, LOW);
	digitalWrite(relaisVerinEntree, LOW);
}

void retourPositionInitiale() {
	Serial.println("retourPositionInitiale");
	// Moteur vers le haut jusqu'à fin de course haut
	digitalWrite(relaisMoteurHaut, HIGH);
	while (digitalRead(finCourseHaut) == HIGH) {
	Serial.println("\tAttente finCourseHaut");
	}
	digitalWrite(relaisMoteurHaut, LOW);
	Serial.println("\t\tFinCourseHaut atteint");

	// Vérin rentre jusqu'à fin de course entrée
	digitalWrite(relaisVerinEntree, HIGH);
	while (digitalRead(finCourseEntree) == HIGH) {
		// Attendre jusqu'à ce que le fin de course entrée soit atteint
	}
	digitalWrite(relaisVerinEntree, LOW);
}

Dans le moniteur tu dois avoir:

En marche
retourPositionInitiale
	Attente finCourseHaut
	Attente finCourseHaut
	Attente finCourseHaut
	Attente finCourseHaut
...
	Attente finCourseHaut
	Attente finCourseHaut
	Attente finCourseHaut
	Attente finCourseHaut
	Attente finCourseHaut
		FinCourseHaut atteint

A+
Cordialement
jpbbricole

Merci beaucoup de ton aide !
je test cette après midi !