Gestion tension d'un fil avec vérin double effet

Bonjour à tous,

Voila j’essaie de gérer la tension d’un fil dyneema grâce à un vérin double effet et une jauge de contrainte et d’un amplificateur qui permettent de capter la tension actuel du fil (en grammes).
J’ai déjà écrit un bout de code :

#define relaisD1  3
#define relaisAlim  25
#define Poids A11 
int commandLoad = 7000; 
float poidsBrute; 
float poidsConv; 
int hyst = 400;

unsigned long temps; 
unsigned long tempsInit;  

void setup() {
  

pinMode(Poids, INPUT); 
pinMode(relaisD1, OUTPUT); 
pinMode(relaisAlim, OUTPUT); 


Serial.begin(115200);

temps = 0;  
tempsInit = 0; 

}

void loop() {
  
poidsBrute = analogRead(Poids); 
poidsConv = map(poidsBrute, 0, 1024, 0, 59750);  
temps = millis(); 

if (temps > (tempsInit + 300)) { 

 if(abs(commandLoad - poidsConv)>hyst){
      if (poidsConv < commandLoad ){
      digitalWrite(relaisD1,LOW); 
    }
      else {
      digitalWrite(relaisD1,HIGH); 
      }
    int etatVerin = digitalRead(relaisD1); 
      
      poidsBrute = analogRead(Poids); 
      poidsConv = map(poidsBrute, 0, 1024, 0, 59750); 
      digitalWrite(relaisAlim, HIGH); 
      
      int etatAlim = digitalRead(relaisAlim);  
     
  }
 else {
  tempsInit = temps; 
  digitalWrite(relaisAlim, LOW); 
     }
   }
 }
}

J’ai enlevé la plupart de mon code pour que cela soit clair.
La valeur de hyst est de 400 (cela agis comme une hystérésis).

Pour l’instant les résultats sont les suivants :
le vérin sort jusqu’à atteindre la tension voulu (la commandLoad = 7000 grammes) puis les relais se mettent a bagoter.

Mon problème est le suivant : au début j’avais fait une boucle while seulement mon code comporte plusieurs autres choses a faire en même temps que cette régulation → donc impossible d’utiliser un delay(). J’ai donc essayer de m’en passer en ajoutant une boucle avec temps = millis().

si quelqu’un à une idée …

Bonne journée :slight_smile:

Appuyez sur ctrl-T on ne voit pas bien l’indentation (suis sur mobile), mais je pense que tempsInit n’est pas remis à jour au bon endroit si vous ne voulez passer qu’une fois toutes les 300ms

Vaut mieux écrireif (temps - tempsInit >  300)) { pour éviter des soucis dans 50 jours

etatVerin Et etatAlim ne servent à rien ?

Le map devrait être sans doute entre 0 et 1023

Oui je pense aussi que le problème vient de là ... Seulement je n'arrive pas à savoir ou le placer exactement.
J'ai bien changer la condition de la boucle et c'est vrai que c'est plus propre.

Oui désolé j'avais mis ça pour checker l’état des relais mais la aucune utilité.

Bonjour,

D'un point de vue logique si tu souhaites gérer la tension d'un fil il faut que soit déjà en mesure de gérer la force qui la contrôle mais le problème vient du fait que la commande est du tout-ou-rien.

Si je vulgarise un peu ton système le vérin tire a fond le fil puis quand la force est atteinte il arrête tout puis le fil se détend puis le vérin tire a fond.. inlassablement.