Réception données capteurs ILS, REED

Bonjour, je suis début en Arduino et je dois réaliser un banc de test pour valider le fonctionnement de deux capteurs ILS/REED dans une pièce.
Voici mon câblage actuel avec un schéma électrique fait sur Tinkercad donc je ne sais pas s'il est juste ou non.


Mon problème est le suivant : lors du lancement du programme mon servomoteur va devant mon capteur avec un aimant pour l'activer (jusque-là tout va bien :slight_smile: ) ensuite si le capteur fonctionne une LED devrait s'allumer puis même système pour la seconde LED sauf que mes LEDs ne s'allume soit pas du tout soit aléatoirement alors que les capteurs fonctionnent (tester avec un multimètre).

Je vous met mon code en espérant que quelqu'un pourra m'aider pour résoudre ce mystère :grin:

  #include <Servo.h>

    // crée l’objet pour contrôler le servomoteur
      Servo monservo; 

    // constantes ne change pas. Elles sont utilisées pour donner les pins:
      const int BoutonDepart = 11; //le numéro de la pin du bouton départ
      const int BoutonRAZ = 10; //le numéro de la pin du bouton RAZ
      const int LedFin = 6; //le numéro de la pin de la Led fin de cycle
      const int LedVerte = 3;//le numéro de la pin de la Led verte
      const int LedJaune = 2;//le numéro de la pin de la Led jaune
      const int ReedVert = 4;
      const int ReedJaune = 5;
      
    // les variables vont changées:
      int etatBoutonDepart;
      int etatBoutonRAZ;
      int etatReedVert;
      int etatReedJaune;
      
  void setup() {
  
    // initiliser les LEDs en tant que sortie
      pinMode(LedFin, OUTPUT);
      pinMode(LedVerte, OUTPUT);
      pinMode(LedJaune, OUTPUT);
    
    //initiliser les boutons en tant que entrer avec un état LOW au repos
      pinMode(BoutonDepart, INPUT);
      pinMode(BoutonRAZ, INPUT);

      //capteur Reed en tant qu'entrer avec un état LOW au repos
      pinMode(ReedVert, INPUT);
      pinMode(ReedJaune, INPUT);
      
      
    //initialisation du servomoteur
      monservo.attach(13);  // utilise la broche 13 pour le contrôle du servomoteur
      monservo.write(80); // positionne le servomoteur à 80°
     }
     
void loop() {
  
    // On mémorise l'état du bouton
      etatBoutonDepart = digitalRead(BoutonDepart);

    // teste si le bouton a un niveau logique BAS
      if (etatBoutonDepart == HIGH){
            
          monservo.write(135); // demande au servo de se déplacer à cette position
          delay(1500); // attend 2000 ms entre changement de position

             {etatReedVert = digitalRead(ReedVert);
                if (etatReedVert == HIGH){digitalWrite(LedVerte, HIGH);}
                delay(1);      
          }
                

          monservo.write(1); // demande au servo de se déplacer à cette position
          delay(1500); // attend 2000 ms entre changement de position

              {etatReedJaune = digitalRead(ReedJaune);
                if (etatReedJaune == HIGH){digitalWrite(LedJaune, HIGH);}
                delay(1);
              }
  
          monservo.write(80); // demande au servo de se déplacer à cette position
          delay(100); // attend 1000 ms entre changement de position

          digitalWrite(LedFin, HIGH); //Allumer la Led en fin de cycle
          }
          
  {// lire l'état du bouton départ
    etatBoutonRAZ = digitalRead(BoutonRAZ);

  //Vérifier si le bouton est pressé, si oui, l'état du bouton est HIGH
    if (etatBoutonRAZ == HIGH){digitalWrite(LedFin, LOW);digitalWrite(LedVerte, LOW);digitalWrite(LedJaune,LOW);}
    }
   }

ce que vous testez c'est S1 et S2 dans le schéma ?

image

normalement quand on fait une machine qui fait des tests, elle n'est pas sensée être intégrée dans le réseau de production.

Que voulez vous faire exactement?

PS: vous aviez déjà une autre post sur le même sujet, ce n'était pas vraiment nécessaire d'en créer un nouveau (c'est contre les règles du forum, ensuite l'information est éparpillée)

Bonjour, désoler je ne savais pas qu'il ne fallait pas ré ouvrir un chat.
Le S1 et S2 sont respectivement mon bouton de démarrage du programme et mon bouton pour la RAZ des LEDs en fin de cycle, moi je dois tester les TILT 1 et TILT 2 (capteur REED) avec une LEDS pour chacun des capteurs.
image

Mon objectif est d'identifié lors du démontage de mon produit si ces capteurs sont défectueux ou non pour qu'ils puissent être de nouveau assemblé.

Bonjour nat_bc

Tes relais REED n'ont pas de résistances de PULL_DOWN
image

comme tes boutons qui eux ont 10K contre GND,
image

donc les entrée REED de l'Arduino

	//capteur Reed en tant qu'entrer avec un état LOW au repos
	pinMode(ReedVert, INPUT);
	pinMode(ReedJaune, INPUT);

sont "en l'air" quand il ne sont pas activés et leur fil est susceptible de capter n'importe quoi comme perturbations, d'où l'aléatoire.
Si ton montage de test n'est pas dans un endroit trop perturbé, tu te simplifierai la tâche en inversant la logique de lecture de tes boutons et reed en mettant un côté à GND et l'entrée configurée en INPUT_PULLUP ainsi tu n'a plus besdoin de réststances. La lecture s'inverse, également == HIGH devient == LOW, pour les boutons et les REED.

Cordialement
jpbbricole

Je n'ai pas compris le système de pull_down et l’inversion HIGH LOW, pouvez vous m'expliquer ?

Pas moi, mais Locoduino :wink:

Après ça, si tu as encore des questions, il n'y a pas de problème.

Cordialement
jpbbricole

1 Like

Super grâce au PULLUP je n'ai plus d'aléatoire dans mon test, les LEDs s'allume correctement, merci jpbbricole

Bonjour nat_bc

Super!
Même si l'on ne joue pas au petit train, Locoduino est une excellente source d'information, qui a, pour moi, une qualité essentielle, la sobriété.

Bonne continuation.
jpbbricole

J'ai un problème maintenant avec le pullup je pense, car quand mon capteur est fonctionnel tout se passe bien les deux LEDs s'allume et quand un deux ne fonctionne plus une des LEDs reste éteint jusque-là nickel.
Viens le moment ou un capteur est bloqué en position fermée donc le banc le détecte comme valide car le courant passe.
Pour remédier à cela est ce possible d'annuler le pullup ?

Bonjour nat_bc

En fait le programme lit un LOW quand un capteur reste fermé.

Mets ton programme complet en ligne.

Cordialement
jpbbricole

  #include <Servo.h>

    // crée l’objet pour contrôler le servomoteur
      Servo monservo; 

    // constantes ne change pas. Elles sont utilisées pour donner les pins:
      const int BoutonDepart = 11; //le numéro de la pin du bouton départ
      const int BoutonRAZ = 10; //le numéro de la pin du bouton RAZ
      const int LedFin = 6; //le numéro de la pin de la Led fin de cycle
      const int LedVerte = 3;//le numéro de la pin de la Led verte
      const int LedJaune = 2;//le numéro de la pin de la Led jaune
      const int ReedVert = 4;//le numéro de la pin du capteur REED vert
      const int ReedJaune = 5;//le numéro de la pin du capteur REED jaune
      
    // les variables vont changées :
      int etatBoutonDepart = 0;
      int etatBoutonRAZ = 0;
      int etatReedVert = 0;
      int etatReedJaune = 0;
      
  void setup() {

    Serial.begin(9600);
  
    // initiliser les LEDs en tant que sortie :
      pinMode(LedFin, OUTPUT);
      pinMode(LedVerte, OUTPUT);
      pinMode(LedJaune, OUTPUT);
    
    //initiliser les boutons en tant que entrer :
      pinMode(BoutonDepart, INPUT);
      pinMode(BoutonRAZ, INPUT);

      //capteur Reed en tant qu'entrer :
      pinMode(ReedVert, INPUT_PULLUP);
      pinMode(ReedJaune, INPUT_PULLUP);
      
      
    //initialisation du servomoteur
      monservo.attach(13);  // utilise la broche 13 pour le contrôle du servomoteur
      monservo.write(80); // positionne le servomoteur à 80°
     }
     
void loop() {
  
    // On mémorise l'état du bouton
      etatBoutonDepart = digitalRead(BoutonDepart);

    // teste si le bouton a un niveau logique BAS
      if (etatBoutonDepart == HIGH){
            
          monservo.write(135); // demande au servo de se déplacer à cette position
          delay(1500); // attend 2000 ms entre changement de position

             {etatReedVert = digitalRead(ReedVert);
                if (etatReedVert == LOW){
                  digitalWrite(LedVerte, HIGH);
                  }else{
                    digitalWrite(LedVerte,LOW);      
                  }
             }
                

          monservo.write(5); // demande au servo de se déplacer à cette position
          delay(1500); // attend 2000 ms entre changement de position

              {etatReedJaune = digitalRead(ReedJaune);{
                if (etatReedJaune == LOW){
                  digitalWrite(LedJaune, HIGH);
                  }else{
                    digitalWrite(LedJaune, LOW);
                  } 
              }
              }
  
          monservo.write(80); // demande au servo de se déplacer à cette position
          delay(100); // attend 1000 ms entre changement de position

          digitalWrite(LedFin, HIGH); //Allumer la Led en fin de cycle
          
         }
       
          
  {// lire l'état du bouton départ
    etatBoutonRAZ = digitalRead(BoutonRAZ);

  //Vérifier si le bouton est pressé, si oui, l'état du bouton est HIGH
    if (etatBoutonRAZ == HIGH){digitalWrite(LedFin, LOW);digitalWrite(LedVerte, LOW);digitalWrite(LedJaune,LOW);}
    }
      }
   

L'utilisation du front montant pourrais être utile pour vérifié le changement d'état et non juste l'état au point X

Bonjour nat_bc

Tu ne testes jamais cette condition du REED bloqué fermé, il me semble.
Ce que tu devrait faire, au départ du cycle ou à la fin du cycle est de mettre le servo en position médiane et de contrôler si un REED te renvoie un LOW auquel cas, il serait bloqué fermé.

Cordialement
jpbbricole

Bonjour, j'ai refais mon programme avec un test au début du cycle pour savoir si un des deux capteurs était défaillant pour éviter un résultat erroné, maintenant suite à la demande de mon tuteur d'apprentissage (J'ai oublier de précis c'est un projet pour un BTS CIM) j'ai mis en place un code pour tester le front montant lors du test mais je n'ai aucun résultat est ce que j'ai fait une erreur dans le codage ?

Et voici le code avec le front montant

  #include <Servo.h>

    // crée l’objet pour contrôler le servomoteur
      Servo monservo; 

    // constantes ne change pas. Elles sont utilisées pour donner les pins:
      const int BoutonDepart = 11; //le numéro de la pin du bouton départ
      const int BoutonRAZ = 10; //le numéro de la pin du bouton RAZ
      const int LedFin = 6; //le numéro de la pin de la Led fin de cycle
      const int LedVerte = 3;//le numéro de la pin de la Led verte
      const int LedJaune = 2;//le numéro de la pin de la Led jaune
      const int ReedVert = 4;//le numéro de la pin du capteur REED vert
      const int ReedJaune = 5;//le numéro de la pin du capteur REED jaune
      
    // les variables vont changées :
      int etatBoutonDepart = 0;
      int etatBoutonRAZ = 0;
      int etatReedVert = 0;
      int etatReedJaune = 0;
      int etatReedVertMem = 0;
      int etatReedJauneMem = 0;
      int compteur = 0;
      
  void setup() {

    Serial.begin(9600);
  
    // initiliser les LEDs en tant que sortie :
      pinMode(LedFin, OUTPUT);
      pinMode(LedVerte, OUTPUT);
      pinMode(LedJaune, OUTPUT);
    
    //initiliser les boutons en tant que entrer :
      pinMode(BoutonDepart, INPUT);
      pinMode(BoutonRAZ, INPUT);

      //capteur Reed en tant qu'entrer :
      pinMode(ReedVert, INPUT_PULLUP);
      pinMode(ReedJaune, INPUT_PULLUP);
      
      
    //initialisation du servomoteur
      monservo.attach(13);  // utilise la broche 13 pour le contrôle du servomoteur
      monservo.write(80); // positionne le servomoteur à 80°
     }
     
void loop() {
  
    // On mémorise l'état du bouton
      etatBoutonDepart = digitalRead(BoutonDepart);

    // teste si le bouton a un niveau logique BAS
      if (etatBoutonDepart == HIGH){
            
          monservo.write(135); // demande au servo de se déplacer à cette position
          delay(1500); // attend 2000 ms entre changement de position

          { etatReedVert = digitalRead(ReedVert);

           if (etatReedVert != etatReedVertMem){
            if (etatReedVert == HIGH){
              compteur++;
              digitalWrite(LedVerte, HIGH);
              delay(500);
            }
           }
          }
                

          monservo.write(5); // demande au servo de se déplacer à cette position
          delay(1500); // attend 2000 ms entre changement de position

          { etatReedJaune = digitalRead(ReedJaune);

           if (etatReedJaune != etatReedJauneMem){
            if (etatReedJaune == HIGH){
              compteur++;
              digitalWrite(LedJaune, HIGH);
              delay(500);
            }
           }
          }
  
          monservo.write(80); // demande au servo de se déplacer à cette position
          delay(100); // attend 1000 ms entre changement de position

          digitalWrite(LedFin, HIGH); //Allumer la Led en fin de cycle
          
         }
       
          
  {// lire l'état du bouton départ
    etatBoutonRAZ = digitalRead(BoutonRAZ);

  //Vérifier si le bouton est pressé, si oui, l'état du bouton est HIGH
    if (etatBoutonRAZ == HIGH){digitalWrite(LedFin, LOW);digitalWrite(LedVerte, LOW);digitalWrite(LedJaune,LOW);}
    }
      }
   

où sont maintenus etatReedVertMem et etatReedJauneMem ?

votre tuteur serait-il OK si vous utilisiez une bibliothèque de boutons ? ça simplifierait la lecture (et l'écriture) du code

Il m'a proposé d'utilisé un front montant car cela serait plus simple, hors je n'y connais rien et avec les recherche effectuées j'ai pu bidouiller un petit code donc je pense ne pas du tout avoir stocker l'information que vous me demander, et utilisé une bibliothèque je ne pense pas que ca va causer des problèmes.

Un bouton câblé en INPUT_PULLUP et et avec une des bibliothèques comme Button dans easyRun ou OneButton de Matthias Hertel ou encore Toggle simplifie grandement les choses mais ce sera un front descendant.

Après entre un test en début de cycle et voir si il y a changement d'état lors du test qu'est ce qui le plus simple à mettre en place dans le code ?

Rien n’est vraiment compliqué
S’il y a des rebonds ça peut vous jouer des tours, les bibliothèques bouton gèrent ça pour vous.

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