Go Down

Topic: Problème de sortie qui s'active toute seule (Read 1 time) previous topic - next topic

bricoleau

#15
Jun 04, 2015, 12:33 pm Last Edit: Jun 04, 2015, 12:34 pm by bricoleau
Stoooop !!!!

Eh, les électroniciens, je suis le seul à lire le code ou quoi ?  :smiley-evil:

Derrière ma remarque sibylline, il y avait le pointage de ce qui ressemble fortement à une erreur grossière dans le code.
L'objectif était d'inciter à chercher un peu par soi-même, mais bon c'est raté.

Je ne demandais pas ce que sont censées faire les lignes ci-dessous, mais bien ce qu'elles font réellement à l'exécution

Extraits :
Code: [Select]
do{
    val_lue_2=analogRead(capteur_debut_course_v1);
    digitalWrite(electrovanne1, LOW);
    }while(analogRead(val_lue_2<=204));


C'est la condition du while qui est fausse.

analogRead() prend en paramètre un numéro de pin.
val_lue_2 est une variable dont la valeur est issue d'un analogRead().
L'opérateur logique <= retourne 0 ou 1
while boucle tant que sa condition est différente de 0

Donc là en gros on boucle tant que analogRead(0) ou analogRead(1) retourne une valeur supérieure à 0.

Est-ce vraiment la logique de programme recherchée ?

Vraisemblablement, le analogRead() est en trop dans la condition du while.
Et pareil à deux autres endroits du code
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

B@tto

Stoooop !!!!

Eh, les électroniciens, je suis le seul à lire le code ou quoi ?  :smiley-evil:

Elle aurait pu écrire le meilleur code au monde, si l'hardware n'est pas bon il ne sert strictement à rien !

Donc on a simplement fait les choses dans l'ordre ... En plus un mauvais code on ne grille rien ... Il ne tourne pas bien c'est tout.

Pour en revenir maintenant au code :

Code: [Select]
do{
    val_lue_2=analogRead(capteur_debut_course_v1);
    digitalWrite(electrovanne1, LOW);
    }while(analogRead(val_lue_2<=204));


Pas bon en effet, je pense que ce qu'il était prévu était plutôt :

Code: [Select]
do{
    val_lue_2=analogRead(capteur_debut_course_v1);
    digitalWrite(electrovanne1, LOW);
    }while(val_lue_2<=204);


De toute manière tout va changer puisque analogRead() va être remplacé par des digitalRead()
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

Lucie_sys

#17
Jun 04, 2015, 01:56 pm Last Edit: Jun 04, 2015, 01:59 pm by Lucie_sys
Re,

@ B@tto:

Quote
Pas bon en effet, je pense que ce qu'il était prévu était plutôt :

Code: [Select]
do{
    val_lue_2=analogRead(capteur_debut_course_v1);
    digitalWrite(electrovanne1, LOW);
    }while(val_lue_2<=204);


De toute manière tout va changer puisque analogRead() va être remplacé par des digitalRead()
Effectivement c'était l'intention. Je voulais exprimer : tant que mon entrée est inférieure à 4VdC.

Maintenant, j'ai tout modifié avec les digital pins mais j'ai toujours un soucis. Voir mon précédent post.

L'init se passe bien mais je dois bloquer sur cette boucle car ma sortie 9 reste à 5Vdc malgré que je mette mon entrée 4 à la masse.


 
Code: [Select]
while(val_lue_3==HIGH);

    {
      val_lue_3=digitalRead(capteur_fin_course_v1);
    }


La ou je me pose vraiment des questions c'est que c'est le même fonctionnement que pour l'init mais la ça ne marche pas....

Autre question, j'ai vu que les entrées analogiques peuvent être utilisées en digital pins. Qu'elle est la meilleur solution?

Surtout, comment fais ARDUINO pour distinguer la digitale 2 et l'analogue 2 si on la met en digitale?

fdufnews

En fait c'est une très mauvaise habitude d'identifier les entrées analogique avec des numéros cela pose des problèmes de portage. En effet, les entrées analogiques lorsqu'on les utilisent en I/O logiques prennent les numéros qui suivent le plus haut numéros d'I/O logique. Toutes les cartes n'ont pas le même nombre d'entrées/sorties logiques et donc suivant les cartes  (UNO, MEGA par exemple) les broches analogiques sont identifiées différement.

Il faut plutôt utiliser A0, A1, A2 .... voir là : http://www.arduino.cc/en/Tutorial/AnalogInputPins

En fait actuellement avec ton code tu testes les entrées logiques 2, 3, 4 et 5 (D2, D3, D4 et D5)

fablath

... En plus un mauvais code on ne grille rien ... Il ne tourne pas bien c'est tout.
+1 !

Je ne suis pas fan des boucles while... pendent ce temps le micro ne peut rien faire d'autre!
Le moniteur série est très pratique pour savoir comment se déroule un code.

Avec des "if" ça pourrait ressembler à ça (je n'ai pas tester...) :

Code: [Select]
const int electrovanne1 = 9;
const int electrovanne2 = 11;
const int capteur_debut_course_v1 = 2;
const int capteur_fin_course_v1 = 4;
const int capteur_debut_course_v2 = 7;
const int capteur_fin_course_v2 = 8;

int val_debut_course_v1;
int val_fin_course_v1;
int val_debut_course_v2;
int val_fin_course_v2;

byte phase = 0;    // 4 phases : sortie V1, rentrée V1, sortie V2, rentrée V2

void setup()
{
  pinMode(electrovanne1, OUTPUT);
  pinMode(electrovanne2, OUTPUT);
  pinMode(capteur_debut_course_v1, INPUT);
  pinMode(capteur_debut_course_v2, INPUT);
  pinMode(capteur_fin_course_v1, INPUT);
  pinMode(capteur_fin_course_v2, INPUT);

  Serial.begin(9600);

  //phase d'init
  Serial.print("Phase ");
  Serial.print(phase);
  Serial.println(" (init...)");

  digitalWrite(electrovanne1, LOW);
  digitalWrite(electrovanne2, LOW);
}

void loop()
{
  val_debut_course_v1 = digitalRead(capteur_debut_course_v1);
  val_fin_course_v1 = digitalRead(capteur_fin_course_v1);
  val_debut_course_v2 = digitalRead(capteur_debut_course_v2);
  val_fin_course_v2 = digitalRead(capteur_fin_course_v2);

  if(val_debut_course_v1 == false && val_fin_course_v1 == true
    && val_debut_course_v2 == false && val_fin_course_v2 == true
    && phase == 0)
  {
    phase = 1;
    digitalWrite(electrovanne1, HIGH);

    Serial.print("Phase ");
    Serial.print(phase);
    Serial.println(" : Sortie vérin 1");
  }

  else if(val_debut_course_v1 == true && val_fin_course_v1 == false
    && val_debut_course_v2 == false && val_fin_course_v2 == true
    && phase == 1)
  {
    phase = 2;
    digitalWrite(electrovanne1, LOW);

    Serial.print("Phase ");
    Serial.print(phase);
    Serial.println(" : Rentrée vérin 1");
  }

  else if(val_debut_course_v1 == false && val_fin_course_v1 == true
    && val_debut_course_v2 == false && val_fin_course_v2 == true
    && phase == 2)
  {
    phase = 3;
    digitalWrite(electrovanne2, HIGH);

    Serial.print("Phase ");
    Serial.print(phase);
    Serial.println(" : Sortie vérin 2");
  }

  else if(val_debut_course_v1 == false && val_fin_course_v1 == true
    && val_debut_course_v2 == true && val_fin_course_v2 == false
    && phase == 3)
  {
    phase = 0;
    digitalWrite(electrovanne2, LOW);

    Serial.print("Phase ");
    Serial.print(phase);
    Serial.println(" : Rentrée vérin 2");
  }
}



il manque dans ce code un contrôle du fonctionnement des détecteurs : que fait on si les détecteurs début et fin de courses sont actif en même temps? si on perd le début de course 2 pendant la sortie du vérin 1... si le fin de course ne s'active pas au bout d'un certain temps alors qu'un mouvement est en cours...

Lucie_sys

Bon alors problème résolu....

En fait il passait jamais dans ma boucle while car j'avais mis un *** de ";" !!!! 

En plus je ne connaissais pas le moniteur série...en fouillant un peu je l'ai trouvé et révélation ALLELUIA!!

C'est mon premier code sur ARDUINO, et d'habitude le pas à pas ça m'aide beaucoup c'est vraiment pratique pour savoir ou on se trouve et qu'elles valeurs ont les variables donc la j'étais un peu perdue.
(Enfin avec le moniteur série on peut à peu près faire pareil...)

En tous cas Merci à tous pour votre aide!

Je suis loin d'avoir finie mais j'ai déjà bien avancé!!

Go Up