Asservissement d'un vérin

Bonjour,
Je réalise un projet dans lequel je dois apprendre à piloter un vérin. Cependant je rencontre quelques difficultés.
Je cherche premièrement à faire réaliser à mon vérin des aller-retours. Voici mon code :

void setup() {
// configuration du canal A
pinMode(12, OUTPUT); // Broche arduino réservé pour le sens du moteur A
pinMode(9, OUTPUT); //Broche arduino réservée pour le freinage du moteur A
Rentree_verin();
}

void loop() {
  delay(10000); //10 secondes
  Rentree_verin();
  delay(10000);
  Sortie_verin();
}

void Rentree_verin () {
digitalWrite(12, HIGH); // le moteur A tourne dans le sens normal
digitalWrite(9, LOW); //desactivation du frein moteur A
analogWrite(3, 255); //vitesse maximale pour le moteur A
delay(1000); //attente de 1 secondes
Arret();
Sortie_verin ();
}

void Sortie_verin () {
digitalWrite(12, LOW); // le moteur A tourne dans le sens inverse
digitalWrite(9, LOW); //desactivation du frein moteur A
analogWrite(3, 255); //vitesse maximale pour le moteur A
delay(1000); //attente de 1 secondes
Arret();
Rentree_verin();
}

void Arret () {
digitalWrite(12, LOW);
digitalWrite(9, LOW);
analogWrite(3, 0);
}

Le vérin ne fait que sortir et ne rentre pas après sa course. Il y a également possibilité d'avoir réalisé de mauvais branchements :

  • mon alimentation est branchée au shield motor par les bornes vin et GND, et le moteur par les bornes A+ et A-.
  • je ne sais pas si il faut utiliser les bornes 9 et 12 de la carte, et si oui, comment et à quoi les brancher.
    Merci d'avance pour toute votre aide,
    Faustine

Bonjour faustooo

As tu vu cette page?:

A+
Cordialement
jpbbricole

Ceci ne rend pas le code très clair.
Il serait mieux de définir quelques constantes au début de ton code pour commencer.

#define SORTIR_VERIN LOW
#define RENTRER_VERIN HIGH
#define FREIN_ACTIF HIGH
#define FREIN_INACTIF LOW
const int PIN_DIRECTION_VERIN = 12;
const int PIN_FREIN = 9;

Ce qui permet ensuite d'écrire quelque chose comme ça

void Rentree_verin () {
digitalWrite(PIN_DIRECTION_VERIN, RENTRER_VERIN); // le moteur A tourne dans le sens normal
digitalWrite(PIN_FREIN, FREIN_INACTIF); //desactivation du frein moteur A
....

Et ainsi le code est auto-documenté

Quel shield utilises-tu?
Si c'est le Motor Shield d'Arduino, les broches 9 et 12 sont raccordées lorsque tu enfiches le shield sur ta carte.

Bonjour faustooo

J'ai, un peu, étudié ton programme, voila mes constatations:

Tes fonctions se mordent la queue, à la fin de void Rentree_verin () il y a Sortie_verin (); et à la sortie de Sortie_verin ();, il y a Rentree_verin();:

11:46:26:470 -> Rentree_verin
11:46:27:470 -> 	Arret
Sortie_verin
11:46:28:456 -> 	Arret
Rentree_verin
11:46:29:454 -> 	Arret
Sortie_verin
11:46:30:456 -> 	Arret
Rentree_verin
11:46:31:454 -> 	Arret
Sortie_verin
11:46:32:456 -> 	Arret
Rentree_verin
11:46:33:455 -> 	Arret
Sortie_verin
11:46:34:452 -> 	Arret
Rentree_verin
11:46:35:113 ->

Si tu supprimes ces 2 appels de fonction, il se présente un autre problème, toutes les 10 secondes tu lance Rentree_verin(); et Sortie_verin ();. Or dans les 2 fonctions, au bout de 1 seconde tu fais Arret(); donc, pendant 9 secondes il ne se passe plus rien.

11:45:18:888 -> Sortie_verin
11:45:19:890 -> 	Arret
11:45:29:867 -> Rentree_verin
11:45:30:885 -> 	Arret
11:45:40:869 -> Sortie_verin
11:45:41:905 -> 	Arret
11:45:43:779 ->

Il faut déplacer ton Arret(); après les 10 secondes.

Pour élucider ce genre de problème, il faut mettre des Serial.println(); afin de "voir" son programme fonctionner. Il faut mettre la console à 115200 et le timeStamp
image

//-------------------------------------Déclaration des pin utilisées
const int moteurDirectionPin = 12; 
const int moteurVitessePin = 3;
const int moteurFreinPin = 9;

void setup() {
	Serial.begin(115200);
	// configuration du canal A
	pinMode(moteurDirectionPin, OUTPUT); // Broche arduino réservé pour le sens du moteur A
	pinMode(moteurFreinPin, OUTPUT); //Broche arduino réservée pour le freinage du moteur A
	Rentree_verin();
}

void loop() {
	delay(10000); //10 secondes
	Rentree_verin();
	delay(10000);
	Sortie_verin();
}

void Rentree_verin () {
	Serial.println("Rentree_verin");

	digitalWrite(moteurDirectionPin, HIGH); // le moteur A tourne dans le sens normal
	digitalWrite(moteurFreinPin, LOW); //desactivation du frein moteur A
	analogWrite(moteurVitessePin, 255); //vitesse maximale pour le moteur A
	delay(1000); //attente de 1 secondes
	Arret();
	Sortie_verin ();
}

void Sortie_verin () {
	Serial.println("Sortie_verin");

	digitalWrite(moteurDirectionPin, LOW); // le moteur A tourne dans le sens inverse
	digitalWrite(moteurFreinPin, LOW); //desactivation du frein moteur A
	analogWrite(moteurVitessePin, 255); //vitesse maximale pour le moteur A
	delay(1000); //attente de 1 secondes
	Arret();
	Rentree_verin();
}

void Arret () {
	Serial.println("\tArret");

	digitalWrite(moteurDirectionPin, LOW);
	digitalWrite(moteurFreinPin, LOW);
	analogWrite(moteurVitessePin, 0);
}

A+
Cordialement
jpbbricole

Le programme marche, merci beaucoup pour votre aide !

Rentree_verrin() appelle Sortie_Verrin() qui appelle Rentree_verrin() qui appelle Sortie_Verrin() qui appelle ...
Ca va pas marcher longtemps...

Bonjour biggil

En fait, dans le programme du post#4, ce défaut n'est pas corrigé, j'ai simplement ajouté des print pour débugger.

Cordialement
jpbbricole

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