Go Down

Topic: [RESOLU] Problemes liés aux tempo (Read 995 times) previous topic - next topic

bricopin

Jan 29, 2013, 02:03 pm Last Edit: Jan 29, 2013, 10:03 pm by bricopin Reason: 1
Bonjour à tous
je vais essayé d'être le plus clair possible
Il y a 2 cas de figure
1 - le test "testouverture" est negatif
2 - le test "testouverture" est positif
Il y a 1 relais qui alimente  1 verin.

Si le test est negatif, le relais est alimenté durant 5 secondes (delay = 5000) puis
coupé, puis alimenté, etc.La, ça fonctionne bien.
Si le test est positif, il faut que le relais soit coupé instantannement.
Or, il ne se coupe qu'au bout du delay(5000)
Pourtant, d'après le code, il devrait se couper de suite.
Il y a surement un probleme dans mon code ...
J'ai fait des essais en remplaçant "delay" par des boucles ou bien par "millis", ça
ne change rien.

Code: [Select]
if (NIVAVAR_REF_0 <= NIVAVAR_AV_M) { // si la condition est OK
 digitalWrite(AVGRO, LOW); // j'alimente le relais
 testouverture ();
 delay (5000);
 digitalWrite(AVGRO, HIGH); // je coupe le relais
}  
               -------------------------------------------------
void testouverture () {
 // ARRET VERIN AVANT GAUCHE SI COMPLETEMENT OUVERT
 VAL_CVOAVG = digitalRead (CVOAVG); // lecture de l'entréé
 if (VAL_CVOAVG == HIGH){ // je teste si le verin associé au relais est completement ouvert
   digitalWrite(AVGRO, HIGH); // je coupe le relais
 }
}


Bonne journée
JP

Malicati

#1
Jan 29, 2013, 03:23 pm Last Edit: Jan 29, 2013, 03:57 pm by Malicati Reason: 1
Bonjour,

Je commence en programmation Arduino, mais je programme sous d'autre langage.

Pour moi il y a une petite erreur dans la compréhension.

La fonction Dely(), pour moi , te bloque l'exécution de ton code pendant le temps voulu, c'est-à-dire que l'excution reste sur cette ligne, et attend.

Pour ce que tu veux faire, il faut, au début, mémoriser ''l'heure'' de l'Arduino, puis dans la boucle, lui dire de faire l'action si temps mémoriser + temps action >= ''l'heure'' de l'Arduino

Je pense qu'une personne avec plus d'expérience va te le confirmer.

Par contre je ne comprends l'intérêt, pourquoi ne pas attendre la présence de l'ouverture.

Sinon comme un schema parle plus ....

Cordialement.

B@tto

Ca ne peut pas être ça puisque le delay est précédé parce la condition de testouverture(). Donc les 5000 ms peuvent se passer relais ouvert ou relais fermé.

A mon avis c'est plus un problème de latence : un digitalWrite() prend quelques microseconds, puis tu tests un paramètre après le relais ce qui prend la aussi un temps de l'ordre de la µs. Probleme : même si ton relais commute en 10 ou 20µs (ce qui est très rapide pour un relais !) testouverture() sera passé depuis longtemps. De toute façon ton code n'est pas rigoureux il vaut mieux :

Code: [Select]


if (NIVAVAR_REF_0 <= NIVAVAR_AV_M && digitalRead (CVOAVG)== LOW) { // si la condition est OK
  digitalWrite(AVGRO, LOW); // j'alimente le relais
    delay (5000);
} else {
  digitalWrite(AVGRO, HIGH); // je coupe le relais
}   
}


Après tu veux peut-être que ton relais se coupe quand ton verrin arrive en butée :

Code: [Select]

long Depart;
...
if (NIVAVAR_REF_0 <= NIVAVAR_AV_M && digitalRead (CVOAVG)== LOW ) { // si la condition est OK
  digitalWrite(AVGRO, LOW); // j'alimente le relais
    Depart=millis();
}
if(millis()-Depart>5000 || digitalRead (CVOAVG)== HIGH) {
  digitalWrite(AVGRO, HIGH); // je coupe le relais
}   
}
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Malicati

Bonsoir,
Je comprends le principe de la programmation.
Par contre que le but de la programmation.
Est-ce que le but est de faire avancer le vérin pendant cinq secondes, de tester savoir s'il est en bout de courses et arrêter sa progression le cas échéant ou alors est-ce que le but est de faire avancer le vérin et de l'arrêter en bout de courses ?

bricopin

--> Malicati
Le but : les vérins effectuent des cycles "marche" et "arrêt" de X secondes.
Mais, s'ils arrivent en butée "ouverture", ils doivent s'arrêter instantanément.
Or pour le moment, ils ne le font pas.
Ils ne stoppent qu'après avoir fait un cycle complet (marche +arrêt).

--> B@tto
Ta solution est peut être la bonne, mais je ne peux pas la tester.
En effet, le Code que j'ai mis est très épuré (c'était surtout pour voir le principe)
En réalité, les vérins fonctionnent par paires, il y à 4 vérins, et ils sont testés 2 par 2.
On teste :
- inclinaison avant -> vérin avant droit et vérin avant gauche
- inclinaison droite -> vérin avant droit et vérin arrière droit
- inclinaison arrière -> vérin arriéré droit et vérin arriéré gauche
- inclinaison gauche -> vérin arrière gauche et vérin avant gauche
Voila le code plus complet.
Code: [Select]
    // SI CA PENCHE VERS L'AVANT ON ALIMENTE LES RELAIS "OUVERTURE" AVG ET AVD
      if (NIVAVAR_REF_0 <= NIVAVAR_AV_M) { // si la condition est OK
        digitalWrite(AVGRO, LOW); // j'alimente le relais AVGRO
        digitalWrite(AVDRO, LOW); // j'alimente le relais AVDRO
        testouverture (); // je teste si le verin est totalement ouvert
        delay (3000); // délai 3 secondes lorsque l'on est en cycle normal
        digitalWrite(AVGRO, HIGH); // je coupe le relais AVGRO
        digitalWrite(AVDRO, HIGH); // je coupe le relais AVDRO
      }

      // SI CA PENCHE VERS LA DROITE ON ALIMENTE LES RELAIS "OUVERTURE" AVD ET ARD
      if (NIVGADR_REF_0 >= NIVGADR_DR_M) {
        digitalWrite(AVDRO, LOW);
        digitalWrite(ARDRO, LOW);
        testouverture ();
        delay (3000);
        digitalWrite(AVDRO, HIGH);
        digitalWrite(ARDRO, HIGH);         
      }

      // SI CA PENCHE VERS L'ARRIERE ON ALIMENTE LES RELAIS "OUVERTURE" ARG ET ARD
      if (NIVAVAR_REF_0 >= NIVAVAR_AR_M) {
        digitalWrite(ARGRO, LOW);
        digitalWrite(ARDRO, LOW);
        testouverture ();
        delay (3000);
        digitalWrite(ARGRO, HIGH);
        digitalWrite(ARDRO, HIGH);         
      }

      // SI CA PENCHE VERS LA GAUCHE ON ALIMENTE LES RELAIS "OUVERTURE" AVG ET ARG     
      if (NIVGADR_REF_0 <= NIVGADR_GA_M) {
        digitalWrite(AVGRO, LOW);   
        digitalWrite(ARGRO, LOW);
        testouverture ();
        delay (3000);
        digitalWrite(AVGRO, HIGH);
        digitalWrite(ARGRO, HIGH);         
      }

          --------------------------------------------------------------------


void testouverture () {
 
  // ARRET VERIN AVANT GAUCHE SI COMPLETEMENT OUVERT
  VAL_CVOAVG = digitalRead (CVOAVG);
  if (VAL_CVOAVG == HIGH){
    digitalWrite(AVGRO, HIGH);
  }

  // ARRET VERIN AVANT DROIT SI COMPLETEMENT OUVERT
  VAL_CVOAVD = digitalRead (CVOAVD);
  if (VAL_CVOAVD == HIGH){
    digitalWrite(AVDRO, HIGH);
  }

  // ARRET VERIN ARRIERE GAUCHE SI COMPLETEMENT OUVERT
  VAL_CVOARG = digitalRead (CVOARG);
  if (VAL_CVOARG == HIGH){
    digitalWrite(ARGRO, HIGH);
  }

  // ARRET VERIN ARRIERE DROIT SI COMPLETEMENT OUVERT
  VAL_CVOARD = digitalRead (CVOARD);
  if (VAL_CVOARD == HIGH){
    digitalWrite(ARDRO, HIGH);
  }
     


JP

B@tto

Bin tu multiplies mon code par 4 et de changer les variables :)
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

bricopin

Oui, mais ça oblige à tester les vérins 1 par 1 .
Or, il faut qu'ils fonctionnent par paire

B@tto

Bin tu rassemblent les conditions alors
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

fdufnews

Quote
Mais, s'ils arrivent en butée "ouverture", ils doivent s'arrêter instantanément.
Or pour le moment, ils ne le font pas.

Ben oui parce que ton pas d'échantillonnage est de 5s (ou 3 dans le deuxième code). Ton vérin peut arriver en butée à n'importe quelle moment.
Tu peux très bien tester ne pas le trouver en butée. Alimenter pour 5s et là il arrive en butée tout de suite mais comme tu as un delay() le code est bloqué le temps de ce délai.

Il ne faudrait pas fonctionner comme cela.
Il faut faire une boucle utilisant millis() afin de gérer le temps et tester dans la boucle tes entrées et pouvoir ainsi réagir immédiatement à l'arrivée en butée.

bricopin

#9
Jan 29, 2013, 10:02 pm Last Edit: Jan 29, 2013, 10:05 pm by bricopin Reason: 1
Bon, en fait, j'ai testé mes 2 vérins à l'intérieur d'une boucle "for".
Ca fonctionne bien.
Code: [Select]
      if (NIVAVAR_REF_0 <= NIVAVAR_AV_M) {
        for ( x = 0; x <= 100000; x++){         
          VAL_CVOAVG = digitalRead (CVOAVG);
          if (VAL_CVOAVG == LOW){
            digitalWrite(AVGRO, LOW);
          }
          digitalWrite(AVGRO, HIGH);
          VAL_CVOAVD = digitalRead (CVOAVD);
          if (VAL_CVOAVD == LOW){
            digitalWrite(AVDRO, LOW);         
          }   
          digitalWrite(AVDRO, HIGH);
        }

Je passe le post en "RESOLU"
Bonne soirée et merci
JP

Malicati

Bonjour bricopin,

En fait, regarde le deuxième logigramme de mon précédent post, c'est le principe de programmation.

Je suis en train de coder un peu la même fonction pour la gestion de mes lumières extérieures. En effet, il y a une tempo pour l'arrêt, sauf si je demande l'arrêt avant la fin.

Si tu le souhaites, je pourrais te montrer le code.

Bonne journée.

Go Up