Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arduino + module relai + électroaimant

Sujet résolu
    19 avril 2018 à 13:09:46

    Bonjour à tous,

    Dans le cadre d'un projet, je dois réaliser un système d'ouverture de portes via détection de badges RFID. Le système est installé mais n'est pas stable.

    Concernant le système, il s'agit de mettre 4 cartes RFID sur 4 lecteurs RFID (RC522), chaque lecteur est relié à un arduino qui est programmé de tel sorte qu'un seul badge soit reconnu (codé en dur avec l'ID de la carte). Lorsque les 4 cartes sont bien mises en place, cela active un module relai 5V qui active désactive l'électroaimant et nous permet d'ouvrir la porte. Petite spécificité, les arduinos sont reliés entre eux via un pin. Quand une carte est détectée, cela envoi un HIGH sur le pin 8. Un fil relie le pin 8 au pin 7 de l'arduino suivant, j'ai bien relié les masses entre les Arduino. Je vais surement me faire taper mais il n'y a pas de diode de roue libre branché aux bornes de l'électroaimant pour le moment.

    Le système fonctionne mais lorsque je laisse assez longtemps les cartes RFID sur les lecteurs RFID, il arrive que cela bloque le relai et je suis obligé de débrancher et rebrancher.

    Pour revenir à mon problème, les Arduino sont branchés en USB via un adaptateur USB branché sur secteur. J'ai lu que l'Arduino ne pouvait fournir que 500 mA max via USB. L'électroaimant consomme 500 mA vu qu'on est branché en 12V. Bien que l'électroaimant ne soit pas relié à l'arduino, je voulais savoir s'il était préférable d'alimenter les Arduino avec le jack ou si je pouvais laisser en USB.

    Ensuite, ayant déja fait pas mal de recherches, j'ai vu qu'il était nécessaire de mettre une diode de roue libre, type IN4001 aux bornes de l'électroaimant. Si je ne le met pas, quels risques cela peut avoir ?

    Ci-joint un schéma du système (oui désolé ce n'est pas très propre).

    • Partager sur Facebook
    • Partager sur Twitter
      19 avril 2018 à 13:41:47

      Quand on alimente l'arduino par la prise JACK, cela passe par le régulateur linéaire qui a tendance à chauffer quand on consomme beaucoup (un montage avec beaucoup de LED par exemple).

      Dans ton cas, il n'y a qu'un lecteur RFID par arduino donc aucun risque à alimenter en 12V par la prise Jack.

      Mais tu rien ne t’empêche non plus d'alimenter tous tes arduinos avec un seul et même adaptateur 5V (pas besoin d'avoir un adaptateur par arduino vu le peu que tu consommes).

      -----

      Pour comprendre où est le bug de ton programme, il faudrait que tu nous montres le code.

      Sans ça, impossible de t'en dire plus.

      -----

      La diode de roue libre sert à protéger les autres composants de l'effet inductif de l'électroaimant.

      En effet, à chaque coupure de celui-ci, l'effet inductif de celui-ci va provoquer une surtension très brève qui peut atteindre plusieurs dizaines voir centaines de volts.

      Vu que l'électroaimant est relié à un relais, tu risques d'abimer petit à petit les contacts du relais.

      Et si tu avais utilisé un transistor à la place du relais, tu peux cramer le transistor voir pire encore puisque la surtension peut traverser le transistor en remonter jusqu'à l'arduino, ce qui aurait pour effet de cramer l'arduino.

      • Partager sur Facebook
      • Partager sur Twitter
        19 avril 2018 à 13:54:48

        Donc pas de soucis niveau alimentation. En soit ce n'est pas un souci pour les 4 câbles, je vais laisser comme ça surtout que c'est à l'intérieur d'un boitier qui est vissé.

        Le programme fonctionne parfaitement sans l'électroaimant branché. Ce n'est pas vraiment le souci je pense.

        #include <deprecated.h>
        #include <MFRC522.h>
        #include <MFRC522Debug.h>
        #include <MFRC522Extended.h>
        #include <MFRC522Hack.h>
        #include <require_cpp11.h>
        #include <SPI.h>
        
        /*
         * Dump serial number of a MIFARE RFID card using a RFID-RC522 reader
         * Uses MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
         * https://github.com/miguelbalboa/rfid
         -----------------------------------------------------------------------------
         * Pin layout should be as follows:
         * Signal     Pin              Pin               Pin
         *            Arduino Uno      Arduino Mega      MFRC522 board
         * ------------------------------------------------------------
         * Reset      5                5                 RST
         * SPI SS     10               53                SDA
         * SPI MOSI   11               52                MOSI
         * SPI MISO   12               51                MISO
         * SPI SCK    13               50                SCK
         */
         
        #define SS_PIN 10   
        #define RST_PIN 5
        byte tagok = 0;
        const int led_rouge = 2;
        const int pin_out = 8;
        const int pin_suivant = 7;
        //int val = 1;
        int lol = 0;
        
        unsigned long sernum[11];
        
        MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522  instance.
        MFRC522::MIFARE_Key key;
        
        void setup() {
          Serial.begin(9600);        // Initialize serial communications with the PC
          SPI.begin();                // Init SPI bus
          mfrc522.PCD_Init();        // Init MFRC522 card
          pinMode(led_rouge,OUTPUT);
          pinMode(pin_out,OUTPUT);
        }
        
        void loop() {
          mfrc522.PCD_Init();        // Init MFRC522 card
           
          if ( ! mfrc522.PICC_IsNewCardPresent()) {
            Serial.println(" PAS DE BADGE PRESENT ");
            digitalWrite(led_rouge, LOW);
            digitalWrite(pin_out,0);
          }
        
           lol = digitalRead(pin_out);
          Serial.print("pin ="); 
          Serial.print(lol);
        
          // Select one of the cards
          if ( ! mfrc522.PICC_ReadCardSerial())    return;
        
          Serial.print("Card UID:");    //Dump UID
        
          sernum[0] = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned
        
          Serial.print(" ");
          Serial.print(sernum[0]);
          Serial.print(" ");
          tagok = 0;
          for  (byte i = 1; i < 10; i++) {
            if (sernum[0] == sernum[i]) tagok = 1; // carte reconnue dans la liste
          }
        
            Serial.println();
            delay(100); // delai entre 2 lectures apres reconnaissance tag*/
        
        if(sernum[0] == 2781572640)
        {
          Serial.print("Carte 1 détectée ");
          digitalWrite(led_rouge,HIGH);
          digitalWrite(pin_out,1);
         
        }
        
        else if (sernum[0] == 2781572640) digitalWrite(pin_out,LOW);
        
        }
        #include <deprecated.h>
        #include <MFRC522.h>
        #include <MFRC522Debug.h>
        #include <MFRC522Extended.h>
        #include <MFRC522Hack.h>
        #include <require_cpp11.h>
        #include <SPI.h>
        
        /*
         * Dump serial number of a MIFARE RFID card using a RFID-RC522 reader
         * Uses MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
         * https://github.com/miguelbalboa/rfid
         -----------------------------------------------------------------------------
         * Pin layout should be as follows:
         * Signal     Pin              Pin               Pin
         *            Arduino Uno      Arduino Mega      MFRC522 board
         * ------------------------------------------------------------
         * Reset      5                5                 RST
         * SPI SS     10               53                SDA
         * SPI MOSI   11               52                MOSI
         * SPI MISO   12               51                MISO
         * SPI SCK    13               50                SCK
         */
         
        #define SS_PIN 10   
        #define RST_PIN 5
        byte tagok = 0;
        const int led_rouge = 2;
        const int pin_out = 8;
        const int pin_recu = 7;
        int val=0;
        unsigned long sernum[11];
        
        MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522  instance.
        MFRC522::MIFARE_Key key;
        
        void setup() {
          Serial.begin(9600);        // Initialize serial communications with the PC
          SPI.begin();                // Init SPI bus
          mfrc522.PCD_Init();        // Init MFRC522 card
          pinMode(led_rouge,OUTPUT);
          pinMode(pin_out,OUTPUT);
          pinMode(pin_recu,INPUT);
        }
        
        void loop() {
          mfrc522.PCD_Init();        // Init MFRC522 card
          
          if ( ! mfrc522.PICC_IsNewCardPresent()) {
            Serial.println(" PAS DE BADGE PRESENT ");
            digitalWrite(led_rouge, LOW);
            digitalWrite(pin_out,LOW);
          }
        
          val = digitalRead(pin_recu);
          Serial.print(val);
        
          // Select one of the cards
          if ( ! mfrc522.PICC_ReadCardSerial())    return;
        
          Serial.print("Card UID:");    //Dump UID
        
          sernum[0] = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned
        
          Serial.print(" ");
          Serial.print(sernum[0]);
          Serial.print(" ");
          tagok = 0;
          for  (byte i = 1; i < 10; i++) {
            if (sernum[0] == sernum[i]) tagok = 1; // carte reconnue dans la liste
          }
          
            Serial.println();
            delay(100); // delai entre 2 lectures apres reconnaissance tag*/
        
        if(sernum[0] == 2820796928 && val == 1)
        {
          Serial.print("Carte 2 détectée ");
          digitalWrite(led_rouge,HIGH);
          digitalWrite(pin_out,1);
          
        }
        
        else if (sernum[0] == 2820796928 && val == 0)
        {
          digitalWrite(pin_out,0);
        }
        }
        #include <deprecated.h>
        #include <MFRC522.h>
        #include <MFRC522Debug.h>
        #include <MFRC522Extended.h>
        #include <MFRC522Hack.h>
        #include <require_cpp11.h>
        #include <SPI.h>
        
        /*
         * Dump serial number of a MIFARE RFID card using a RFID-RC522 reader
         * Uses MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
         * https://github.com/miguelbalboa/rfid
         -----------------------------------------------------------------------------
         * Pin layout should be as follows:
         * Signal     Pin              Pin               Pin
         *            Arduino Uno      Arduino Mega      MFRC522 board
         * ------------------------------------------------------------
         * Reset      5                5                 RST
         * SPI SS     10               53                SDA
         * SPI MOSI   11               52                MOSI
         * SPI MISO   12               51                MISO
         * SPI SCK    13               50                SCK
         */
         
        #define SS_PIN 10   
        #define RST_PIN 5
        byte tagok = 0;
        const int led_rouge = 2;
        const int pin_out = 8;
        const int pin_in = 7;
        int val = 0;
        unsigned long sernum[11];
        
        MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522  instance.
        MFRC522::MIFARE_Key key;
        
        void setup() {
          Serial.begin(9600);        // Initialize serial communications with the PC
          SPI.begin();                // Init SPI bus
          mfrc522.PCD_Init();        // Init MFRC522 card
          pinMode(led_rouge,OUTPUT);
          pinMode(pin_out, OUTPUT);
          pinMode(pin_in, INPUT);
        }
        
        void loop() {
          mfrc522.PCD_Init();        // Init MFRC522 card
          
          if ( ! mfrc522.PICC_IsNewCardPresent()) {
            Serial.println(" PAS DE BADGE PRESENT ");
            digitalWrite(led_rouge, LOW);
            digitalWrite(pin_out,LOW);
          }
        
          val = digitalRead(pin_in);
          Serial.print(val);
        
          // Select one of the cards
          if ( ! mfrc522.PICC_ReadCardSerial())    return;
        
          Serial.print("Card UID:");    //Dump UID
        
          sernum[0] = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned
        
          Serial.print(" ");
          Serial.print(sernum[0]);
          Serial.print(" ");
          tagok = 0;
          for  (byte i = 1; i < 10; i++) {
            if (sernum[0] == sernum[i]) tagok = 1; // carte reconnue dans la liste
          }
        
            Serial.println();
            delay(100); // delai entre 2 lectures apres reconnaissance tag*/
        
        if(sernum[0] == 2786121120 && val == 1)
        { 
          Serial.print("Carte 3 détectée");
          digitalWrite(led_rouge,HIGH);
          digitalWrite(pin_out,1);
        }
        
        else if(sernum[0] == 2786121120 && val == 0)
        {
          digitalWrite(pin_out,0);
        }
        }
        #include <deprecated.h>
        #include <MFRC522.h>
        #include <MFRC522Debug.h>
        #include <MFRC522Extended.h>
        #include <MFRC522Hack.h>
        #include <require_cpp11.h>
        #include <SPI.h>
        
        /*
         * Dump serial number of a MIFARE RFID card using a RFID-RC522 reader
         * Uses MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
         * https://github.com/miguelbalboa/rfid
         -----------------------------------------------------------------------------
         * Pin layout should be as follows:
         * Signal     Pin              Pin               Pin
         *            Arduino Uno      Arduino Mega      MFRC522 board
         * ------------------------------------------------------------
         * Reset      5                5                 RST
         * SPI SS     10               53                SDA
         * SPI MOSI   11               52                MOSI
         * SPI MISO   12               51                MISO
         * SPI SCK    13               50                SCK
         */
         
        #define SS_PIN 10   
        #define RST_PIN 5
        byte tagok = 0;
        const int led_rouge = 2;
        const int pin_out = 8;
        const int pin_in = 7;
        int val = 0;
        
        unsigned long sernum[11];
        
        MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522  instance.
        MFRC522::MIFARE_Key key;
        
        void setup() {
          Serial.begin(9600);        // Initialize serial communications with the PC
          SPI.begin();                // Init SPI bus
          mfrc522.PCD_Init();        // Init MFRC522 card
          //Serial.println("LECTEUR OK ");
          pinMode(led_rouge,OUTPUT);
          pinMode(pin_out,OUTPUT);
          pinMode(pin_in, INPUT);
        
        }
        
        void loop() {
          mfrc522.PCD_Init();        // Init MFRC522 card
            
          if ( ! mfrc522.PICC_IsNewCardPresent()) {
            Serial.println(" PAS DE BADGE PRESENT ");
            digitalWrite(led_rouge, LOW);
            digitalWrite(pin_out,LOW);
          }
        
         val = digitalRead(pin_in);
         Serial.print(val);
        
          // Select one of the cards
          if ( ! mfrc522.PICC_ReadCardSerial())    return;
        
          Serial.print("Card UID:");    //Dump UID
        
          sernum[0] = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned
        
          Serial.print(" ");
          Serial.print(sernum[0]);
          Serial.print(" ");
          tagok = 0;
          for  (byte i = 1; i < 10; i++) {
            if (sernum[0] == sernum[i]) tagok = 1; // carte reconnue dans la liste
          }
            Serial.println();
            delay(100); // delai entre 2 lectures apres reconnaissance tag*/
        
        if(sernum[0] == 609950434 && val == 1)
        {
          Serial.print("Carte 4 détectée ");
          digitalWrite(led_rouge,HIGH);
           digitalWrite(pin_out,HIGH);
        
        }
        
        else if(sernum[0] == 609950434 && val == 0)
        {
          digitalWrite(pin_out,LOW);
        }
        }


        Donc je dois mettre une diode de roue libre de facon urgente.

        Encore une petite question, un IN4007 ne peut pas être utilisé comme diode de roue libre ? J'ai tenté d'en mettre une hier, elle a chauffé comme pas possible et l'alimentation 12V de l'électroaimant a pas aimé, il a fait un sacré bruit, je l'ai débranché immédiatement. Normalement je ne me suis pas trompé sur le sens, cathode sur le (+) de l'électroaimant et anode sur le (-) de l'électroaimant.



        • Partager sur Facebook
        • Partager sur Twitter
          19 avril 2018 à 16:29:56

          Connecter la cathode d'une diode de roue libre sur le "+", c'est effectivement ce qu'il faut faire.

          En revanche, d'après ton schéma, le "+" de l'électroaimant est relié au "-" de l'alimentation.

          L'électroaimant n'étant pas polarisé, il s'en fou un peu d'être branché à l'envers sur l'alimentation.

          En revanche, quand le relais va être fermé, la diode aussi se retrouve branchée à l'envers (cathode sur le "-" de l'alimentation).

          Ce qui revient à mettre la diode en court-circuit avec l'alimentation.

          Il est clair qu'elle 'a pas du tout aimé ce traitement de faveur, d'où le fait qu'elle devienne brulante et que l'alimentation n'ai pas apprécié non plus.

          -
          Edité par lorrio 19 avril 2018 à 16:30:41

          • Partager sur Facebook
          • Partager sur Twitter
            19 avril 2018 à 17:54:42

            Hmm, après une bêta-test avec le système, toujours le même problème, le relai bloque. Est ce qu'il est possible que l'arduino bloque en terme d'infos envoyés au relai ? 

            Si arduino 1 bon => envoi HIGH à l'arduino 2

            Si arduino 2 bon => envoi HIGH à l'arduino 3

            Si arduino 3 bon => envoi HIGH à l'arduino 4

            Si arduino 4 bon => envoi HIGH au relai

            Bien entendu cela peut être dans le désordre mais cela prendra plus de temps à envoyer l'information.

            En terme d'électronique cela me semble bon mais je ne suis pas sur.

            • Partager sur Facebook
            • Partager sur Twitter
              19 avril 2018 à 20:34:27

              Je crois qu'il y a un problème dans la gestion de ton programme...

              Imaginons que tu places ta carte sur le dernier lecteur en premier, alors voici ce qu'il va se passer :

              - ligne 52,  PICC_IsNewCardPresent va dire qu'il y a une nouvelle carte, donc le programme continue

              - ligne 62, PICC_ReadCardSerial va lire la carte, le programme continue

              - ligne 88, la sortie sera mise à LOW car l'arduino de la carte précédente n'a pas encore détecté de carte

              Puis loop recommence...

              Mais cette fois-ci, la ligne 52 va dire qu'il n'y a aucune nouvelle carte, donc la sortie est mise à LOW par la ligne 55

              Et même si plus tard la sortie est mise à HIGH par la ligne 82, elle sera remise à LOW très rapidement par la ligne 55...

              • Partager sur Facebook
              • Partager sur Twitter
                19 avril 2018 à 22:01:46

                Ce n'est pas un soucis, au final toutes les cartes doivent être mises sur les lecteurs au final, et à partir de ce moment cela activera le relai. Si je met dans le désordre, au final l'information passera quand même non ? Tous les pins seront mises en HIGH tôt ou tard selon mon point de vue. Cependant, un souci que j'ai remarqué c'est que lorsque je pose et retire la carte RFID plusieurs fois, cela fait "bloquer" le relai, il s'excite en commutant sans raison. Cela a surement un rapport avec ce que tu as dit mais j'ai du mal à comprendre.

                PS : Si j'ai bien compris le digitalWrite ligne 55 est à enlever ? 

                Nouvelle réponse : Comme ça du coup ? Cependant j'ai vu sur une doc de gotronic que la ligne 55 attend juste une carte RFID

                void loop() {
                  mfrc522.PCD_Init();        // Init MFRC522 card
                    
                  if ( ! mfrc522.PICC_IsNewCardPresent()) {
                    Serial.println(" PAS DE BADGE PRESENT ");
                
                  }
                
                 val = digitalRead(pin_in);
                 Serial.print(val);
                
                  // Select one of the cards
                  if ( ! mfrc522.PICC_ReadCardSerial())
                  {
                    digitalWrite(pin_out,LOW);
                    return;
                  }
                 // Attente d'une carte RFID
                 if ( ! mfrc522.PICC_IsNewCardPresent()) {
                 return;
                 }
                 // Récupération des informations de la carte RFID
                 if ( ! mfrc522.PICC_ReadCardSerial()) {
                 return;



                -
                Edité par Flamie 20 avril 2018 à 11:40:49

                • Partager sur Facebook
                • Partager sur Twitter
                  20 avril 2018 à 8:11:43

                  Le problème, c'est que ton programme tourne en boucle :

                  ligne 55: LOW parce qu'il n'y a pas de nouvelle carte

                  ligne 82: HIGH car la carte est bonne

                  Du coup, ta pin alterne : LOW/HIGH/LOW/HIGH/LOW en permanence.

                  Et il en va de même pour les autres arduinos qui ont donc une chance sur 2 de lire un LOW ou un HIGH...

                  Si il n'y a pas de nouvelle carte, tu ne devrais rien faire de particulier.

                  En revanche, si la lecture échoue, là tu devrais faire quelque chose !

                  Donc le LOW de la ligne 55 devrait plutôt être à la ligne 62.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 avril 2018 à 11:20:33

                    void loop() {
                      mfrc522.PCD_Init();        // Init MFRC522 card
                         
                      if ( ! mfrc522.PICC_IsNewCardPresent()) {
                        Serial.println(" PAS DE BADGE PRESENT ");
                    
                      }
                     
                     val = digitalRead(pin_in);
                     Serial.print(val);
                     
                      // Select one of the cards
                      if ( ! mfrc522.PICC_ReadCardSerial())
                          {  
                             digitalWrite(pin_out,LOW);  
                             return;
                    }

                    Comme ça du coup ? 
                    S'il y a une nouvelle carte qui est mise, on ne fais rien et on passe à la lecture du numéro de la carte RFID, si jamais on n'arrive pas à lire (mais dans quel cas exactement ?), on met à l'état bas. 
                    Est-ce qu'il ne serait pas mieux d'enlever ce digitalWrite et de garder les digitalWrite des lignes 82 et 88 ? Au final s'il détecte le bon code et qu'il recoit un HIGH de l'arduino précédent, on met à l'état HIGH le pin et si jamais on a le bon code mais qu'il n'a pas reçu un HIGH de l'arduino précédent on met à l'état LOW. 
                    PS : J'ai trouvé ça sur un doc de gotronic, la ligne 55 réfère seulement à l'attente d'une carte, du coup cela ne change rien non ?
                     // Attente d'une carte RFID
                     if ( ! mfrc522.PICC_IsNewCardPresent()) {
                     return;
                     }
                     // Récupération des informations de la carte RFID
                     if ( ! mfrc522.PICC_ReadCardSerial()) {
                     return;

                    -
                    Edité par Flamie 20 avril 2018 à 11:26:40

                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 avril 2018 à 11:53:11

                      Mettre un return si il n'y a pas de nouvelle n'est pas une bonne idée car si jamais le mec retire la carte, alors il n'y aura jamais de write LOW car le code aura été coupé par le return.

                      Et mettre un write LOW juste avant le return n'est pas une bonne idée non plus car si la carte reste présente, le fait qu'il n'y ai pas de nouvelle carte mettra un LOW, même si l'ancienne carte est encore là.

                      Au final, le write LOW dans le read est plutôt une bonne idée car si le read échoue, c'est qu'il n'y a aucune carte sur le lecteur (et donc que le mec a retiré sa carte).

                      En bref, contrairement aux autres codes de démo sur internet, tu es obligé de lire la carte en boucle pour savoir quand l'utilisateur la retire.

                      Tandis que dans les autres codes sur internet, la carte n'est généralement lu qu'une seule fois car on se fou de savoir si elle est retirée ou non.

                      -
                      Edité par lorrio 20 avril 2018 à 11:54:54

                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 avril 2018 à 11:59:42

                        Le return ne permet pas de nous donner le numéro de la carte ?

                        Donc pas de return si j'ai compris, directement un Write :

                          if ( ! mfrc522.PICC_ReadCardSerial())
                          {
                            digitalWrite(pin_out,LOW);
                            //return;
                          }



                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 avril 2018 à 13:02:34

                          Si, il te faut un return sur éhec de la lecture !

                          Mais il ne t'en faut pas lorsqu'il n'y a aucune nouvelle carte.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 avril 2018 à 13:39:26

                            Je pense que ca devrait être bon comme ça alors : 

                            void loop() {
                              mfrc522.PCD_Init();        // Init MFRC522 card
                                
                              if ( ! mfrc522.PICC_IsNewCardPresent()) {
                                Serial.println(" PAS DE BADGE PRESENT ");
                            
                              }
                            
                             val = digitalRead(pin_in);
                             Serial.print(val);
                            
                              // Select one of the cards
                              if ( ! mfrc522.PICC_ReadCardSerial())
                              {
                                digitalWrite(pin_out,LOW);
                                return;
                              }



                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 avril 2018 à 14:51:16

                              Je remets les codes en entier au cas où mais je me demande si je ne peux pas optimiser mes conditions sur tous les programmes, ligne 81 et 89 (pour la 4e carte):

                              #include <deprecated.h>
                              #include <MFRC522.h>
                              #include <MFRC522Debug.h>
                              #include <MFRC522Extended.h>
                              #include <MFRC522Hack.h>
                              #include <require_cpp11.h>
                              #include <SPI.h>
                              
                              /*
                               * Dump serial number of a MIFARE RFID card using a RFID-RC522 reader
                               * Uses MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
                               * https://github.com/miguelbalboa/rfid
                               -----------------------------------------------------------------------------
                               * Pin layout should be as follows:
                               * Signal     Pin              Pin               Pin
                               *            Arduino Uno      Arduino Mega      MFRC522 board
                               * ------------------------------------------------------------
                               * Reset      5                5                 RST
                               * SPI SS     10               53                SDA
                               * SPI MOSI   11               52                MOSI
                               * SPI MISO   12               51                MISO
                               * SPI SCK    13               50                SCK
                               */
                               
                              #define SS_PIN 10   
                              #define RST_PIN 5
                              byte tagok = 0;
                              const int led_rouge = 2;
                              const int pin_out = 8;
                              const int pin_suivant = 7;
                              //int val = 1;
                              int lol = 0;
                              
                              unsigned long sernum[11];
                              
                              MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522  instance.
                              MFRC522::MIFARE_Key key;
                              
                              void setup() {
                                Serial.begin(9600);        // Initialize serial communications with the PC
                                SPI.begin();                // Init SPI bus
                                mfrc522.PCD_Init();        // Init MFRC522 card
                                pinMode(led_rouge,OUTPUT);
                                pinMode(pin_out,OUTPUT);
                              }
                              
                              void loop() {
                                mfrc522.PCD_Init();        // Init MFRC522 card
                                 
                                if ( ! mfrc522.PICC_IsNewCardPresent()) {
                                  Serial.println(" PAS DE BADGE PRESENT ");
                                  //digitalWrite(led_rouge, LOW);
                                }
                              
                                 lol = digitalRead(pin_out);
                                Serial.print("pin ="); 
                                Serial.print(lol);
                              
                                // Select one of the cards
                                if ( ! mfrc522.PICC_ReadCardSerial()) 
                                {
                                  digitalWrite(pin_out,LOW);
                                  return;
                                }
                              
                                Serial.print("Card UID:");    //Dump UID
                              
                                sernum[0] = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned
                              
                                Serial.print(" ");
                                Serial.print(sernum[0]);
                                Serial.print(" ");
                                tagok = 0;
                                for  (byte i = 1; i < 10; i++) {
                                  if (sernum[0] == sernum[i]) tagok = 1; // carte reconnue dans la liste
                                }
                              
                                  Serial.println();
                                  delay(100); // delai entre 2 lectures apres reconnaissance tag*/
                              
                              if(sernum[0] == 2781572640)
                              {
                                Serial.print("Carte 1 détectée ");
                                digitalWrite(led_rouge,HIGH);
                                digitalWrite(pin_out,HIGH); 
                               
                              }
                              
                              else if (sernum[0] != 2781572640) digitalWrite(pin_out,LOW);
                              
                              }
                              #include <deprecated.h>
                              #include <MFRC522.h>
                              #include <MFRC522Debug.h>
                              #include <MFRC522Extended.h>
                              #include <MFRC522Hack.h>
                              #include <require_cpp11.h>
                              #include <SPI.h>
                              
                              /*
                               * Dump serial number of a MIFARE RFID card using a RFID-RC522 reader
                               * Uses MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
                               * https://github.com/miguelbalboa/rfid
                               -----------------------------------------------------------------------------
                               * Pin layout should be as follows:
                               * Signal     Pin              Pin               Pin
                               *            Arduino Uno      Arduino Mega      MFRC522 board
                               * ------------------------------------------------------------
                               * Reset      5                5                 RST
                               * SPI SS     10               53                SDA
                               * SPI MOSI   11               52                MOSI
                               * SPI MISO   12               51                MISO
                               * SPI SCK    13               50                SCK
                               */
                               
                              #define SS_PIN 10   
                              #define RST_PIN 5
                              byte tagok = 0;
                              const int led_rouge = 2;
                              const int pin_out = 8;
                              const int pin_recu = 7;
                              int val=0;
                              unsigned long sernum[11];
                              
                              MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522  instance.
                              MFRC522::MIFARE_Key key;
                              
                              void setup() {
                                Serial.begin(9600);        // Initialize serial communications with the PC
                                SPI.begin();                // Init SPI bus
                                mfrc522.PCD_Init();        // Init MFRC522 card
                                pinMode(led_rouge,OUTPUT);
                                pinMode(pin_out,OUTPUT);
                                pinMode(pin_recu,INPUT);
                              }
                              
                              void loop() {
                                mfrc522.PCD_Init();        // Init MFRC522 card
                                
                                if ( ! mfrc522.PICC_IsNewCardPresent()) {
                                  Serial.println(" PAS DE BADGE PRESENT ");
                                  //digitalWrite(led_rouge, LOW);
                                }
                              
                                val = digitalRead(pin_recu);
                                Serial.print(val);
                              
                                // Select one of the cards
                                if ( ! mfrc522.PICC_ReadCardSerial()) 
                                {
                                  digitalWrite(pin_out,LOW);
                                  return;
                                }
                              
                                Serial.print("Card UID:");    //Dump UID
                              
                                sernum[0] = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned
                              
                                Serial.print(" ");
                                Serial.print(sernum[0]);
                                Serial.print(" ");
                                tagok = 0;
                                for  (byte i = 1; i < 10; i++) {
                                  if (sernum[0] == sernum[i]) tagok = 1; // carte reconnue dans la liste
                                }
                                
                                  Serial.println();
                                  delay(100); // delai entre 2 lectures apres reconnaissance tag*/
                              
                              if(sernum[0] == 2820796928 && val == 1)
                              {
                                Serial.print("Carte 2 détectée ");
                                digitalWrite(led_rouge,HIGH);
                                digitalWrite(pin_out,HIGH);
                                
                              }
                              
                              else if (sernum[0] == 2820796928 && val == 0)
                              {
                                digitalWrite(pin_out,LOW);
                              }
                              }
                              #include <deprecated.h>
                              #include <MFRC522.h>
                              #include <MFRC522Debug.h>
                              #include <MFRC522Extended.h>
                              #include <MFRC522Hack.h>
                              #include <require_cpp11.h>
                              #include <SPI.h>
                              
                              /*
                               * Dump serial number of a MIFARE RFID card using a RFID-RC522 reader
                               * Uses MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
                               * https://github.com/miguelbalboa/rfid
                               -----------------------------------------------------------------------------
                               * Pin layout should be as follows:
                               * Signal     Pin              Pin               Pin
                               *            Arduino Uno      Arduino Mega      MFRC522 board
                               * ------------------------------------------------------------
                               * Reset      5                5                 RST
                               * SPI SS     10               53                SDA
                               * SPI MOSI   11               52                MOSI
                               * SPI MISO   12               51                MISO
                               * SPI SCK    13               50                SCK
                               */
                               
                              #define SS_PIN 10   
                              #define RST_PIN 5
                              byte tagok = 0;
                              const int led_rouge = 2;
                              const int pin_out = 8;
                              const int pin_in = 7;
                              int val = 0;
                              unsigned long sernum[11];
                              
                              MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522  instance.
                              MFRC522::MIFARE_Key key;
                              
                              void setup() {
                                Serial.begin(9600);        // Initialize serial communications with the PC
                                SPI.begin();                // Init SPI bus
                                mfrc522.PCD_Init();        // Init MFRC522 card
                                pinMode(led_rouge,OUTPUT);
                                pinMode(pin_out, OUTPUT);
                                pinMode(pin_in, INPUT);
                              }
                              
                              void loop() {
                                mfrc522.PCD_Init();        // Init MFRC522 card
                                
                                if ( ! mfrc522.PICC_IsNewCardPresent()) {
                                  Serial.println(" PAS DE BADGE PRESENT ");
                                  //digitalWrite(led_rouge, LOW);
                                }
                              
                                val = digitalRead(pin_in);
                                Serial.print(val);
                              
                                // Select one of the cards
                                if ( ! mfrc522.PICC_ReadCardSerial()) 
                                {
                                  digitalWrite(pin_out,LOW);
                                  return;
                                }
                              
                                Serial.print("Card UID:");    //Dump UID
                              
                                sernum[0] = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned
                              
                                Serial.print(" ");
                                Serial.print(sernum[0]);
                                Serial.print(" ");
                                tagok = 0;
                                for  (byte i = 1; i < 10; i++) {
                                  if (sernum[0] == sernum[i]) tagok = 1; // carte reconnue dans la liste
                                }
                              
                                  Serial.println();
                                  delay(100); // delai entre 2 lectures apres reconnaissance tag*/
                              
                              if(sernum[0] == 2786121120 && val == 1)
                              { 
                                Serial.print("Carte 3 détectée");
                                digitalWrite(led_rouge,HIGH);
                                digitalWrite(pin_out,HIGH);
                              }
                              
                              else if(sernum[0] == 2786121120 && val == 0)
                              {
                                digitalWrite(pin_out,LOW);
                              }
                              }
                              #include <deprecated.h>
                              #include <MFRC522.h>
                              #include <MFRC522Debug.h>
                              #include <MFRC522Extended.h>
                              #include <MFRC522Hack.h>
                              #include <require_cpp11.h>
                              #include <SPI.h>
                              
                              /*
                               * Dump serial number of a MIFARE RFID card using a RFID-RC522 reader
                               * Uses MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT.
                               * https://github.com/miguelbalboa/rfid
                               -----------------------------------------------------------------------------
                               * Pin layout should be as follows:
                               * Signal     Pin              Pin               Pin
                               *            Arduino Uno      Arduino Mega      MFRC522 board
                               * ------------------------------------------------------------
                               * Reset      5                5                 RST
                               * SPI SS     10               53                SDA
                               * SPI MOSI   11               52                MOSI
                               * SPI MISO   12               51                MISO
                               * SPI SCK    13               50                SCK
                               */
                               
                              #define SS_PIN 10   
                              #define RST_PIN 5
                              byte tagok = 0;
                              const int led_rouge = 2;
                              const int pin_out = 8;
                              const int pin_in = 7;
                              int val = 0;
                              
                              unsigned long sernum[11];
                              
                              MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522  instance.
                              MFRC522::MIFARE_Key key;
                              
                              void setup() {
                                Serial.begin(9600);        // Initialize serial communications with the PC
                                SPI.begin();                // Init SPI bus
                                mfrc522.PCD_Init();        // Init MFRC522 card
                                //Serial.println("LECTEUR OK ");
                                pinMode(led_rouge,OUTPUT);
                                pinMode(pin_out,OUTPUT);
                                pinMode(pin_in, INPUT);
                              
                              }
                              
                              void loop() {
                                mfrc522.PCD_Init();        // Init MFRC522 card
                                  
                                if ( ! mfrc522.PICC_IsNewCardPresent()) {
                                  Serial.println(" PAS DE BADGE PRESENT ");
                              
                                }
                              
                               val = digitalRead(pin_in);
                               Serial.print(val);
                              
                                // Select one of the cards
                                if ( ! mfrc522.PICC_ReadCardSerial())
                                {
                                  digitalWrite(pin_out,LOW);
                                  return;
                                }
                              
                                Serial.print("Card UID:");    //Dump UID
                              
                                sernum[0] = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned
                              
                                Serial.print(" ");
                                Serial.print(sernum[0]);
                                Serial.print(" ");
                                tagok = 0;
                                for  (byte i = 1; i < 10; i++) {
                                  if (sernum[0] == sernum[i]) tagok = 1; // carte reconnue dans la liste
                                }
                                  Serial.println();
                                  delay(100); // delai entre 2 lectures apres reconnaissance tag*/
                              
                              if(sernum[0] == 609950434 && val == 1)
                              {
                                Serial.print("Carte 4 détectée ");
                                digitalWrite(led_rouge,HIGH);
                                digitalWrite(pin_out,HIGH);
                              
                              }
                              
                              else if(sernum[0] == 609950434 && val == 0)
                              {
                                digitalWrite(pin_out,LOW);
                              }
                              }






                              • Partager sur Facebook
                              • Partager sur Twitter
                                20 avril 2018 à 20:40:00

                                Voir si je ne peux pas faire plus court, après si c'est bon comme ça je laisserais. J'attends les dernières beta-test de mon système pour voir s'il y a des problèmes, s'il y en a je mettrais les nouveaux programmes.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  23 avril 2018 à 12:21:55

                                  Bonjour,

                                  En attente des dernières bêta-test, je travaille sur un autre système du même style, j'aimerais installer un bouton d'urgence qui puisse reset l'Arduino et donc couper temporairement l'alimentation de l'électroaimant afin qu'il ouvre la porte.

                                  Ma question est de savoir, si je veux faire un reset matériel, puis-je utiliser le pin RESET de l'arduino ? 

                                  J'ai trouvé ça sur internet (lien trouvé sur le forum arduino) mais n'étant pas je me permet de demander si cela semble bon : http://www.instructables.com/id/two-ways-to-reset-arduino-in-software/

                                  PS : Apparemment pas besoin de code, je dois juste tirer un fil du pin RESET de l'arduino ainsi qu'un fil du GND et cela fonctionnerait comme le bouton reset déja installé sur l'arduino, avis ?

                                  -
                                  Edité par Flamie 23 avril 2018 à 12:47:17

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    23 avril 2018 à 13:01:49

                                    En mettant la pin RESET de l'arduino au GND, tu vas effectivement faire un reset hardware de l'arduino.

                                    Donc il te suffit simplement de cabler ton bouton entre RESET et GND.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      26 avril 2018 à 12:55:54

                                      Hello,

                                      Petite question de programmation n'étant pas sur : 

                                        if (fsrVoltage < 4700) // 4500 mV = 1 kg et 4900 mV = 10 kg /!\ ce n'est pas linéaire
                                        {
                                          Serial.println("Il n'y a personne");
                                          digitalWrite(pin_relai, HIGH); //on active le relai pour laisser le ventilo allumé
                                        }
                                        else if (fsrVoltage > 4900) //4900 mV = 10 kg
                                        {
                                          if ((millis() - temps_depart >= 5000))
                                          {
                                            temps_depart = millis();
                                            Serial.println("Il y a quelqu'un");
                                            digitalWrite(pin_relai, LOW); //on désactive le relai pour éteindre le ventilo
                                          }
                                        }

                                      Cela concerne le else if, j'aimerais que si jamais pendant 5s ou + j'ai des valeurs supérieures à 4900 sur l'analogRead, j'envoi un HIGH au module relai. Cependant je me demandais si je ne devais pas utiliser un while car le problème de ce que j'ai écrit si je ne me trompe pas c'est qu'il va lire une valeur supérieure à 4900, attendre la tempo de 5s quelque soit la valeur lue derrière et envoyer un HIGH.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        26 avril 2018 à 14:29:14 - Message modéré pour le motif suivant : Message complètement hors sujet


                                          27 avril 2018 à 12:42:13

                                          Au final, j'ai laissé le if, le while bloque complètement. Cependant j'ai un soucis, lorsqu'il détecte un 4900 ou +, il n'attend pas forcément 5s avant de dire qu'il y a quelqu'un, le timer est activé avant, soit dès la 1ere détection soit après 2, 3 détections etc. 

                                          void loop(void) {
                                            fsrReading = analogRead(fsrPin);
                                          
                                            Serial.print("Analog reading = ");
                                            Serial.print(fsrReading);     // the raw analog reading
                                            fsrVoltage = map(fsrReading, 0, 1023, 0, 5000);
                                            Serial.print("Voltage reading in mV = ");
                                            Serial.println(fsrVoltage); //tension entre 0 et 5000 mV
                                          
                                          
                                            if (fsrVoltage < 4900)
                                            {
                                              Serial.println("Il n'y a personne"); 
                                              digitalWrite(pin_relai, HIGH); //on active le relai pour laisser le ventilo allumé
                                            }
                                            if (fsrVoltage >= 4900) //4900 mV = 10 kg
                                            {
                                              temps_presence = millis();
                                              if ((temps_presence - temps_depart >= 5000))
                                              {
                                                temps_depart = millis(); //on copie le temps actuel à la place du temps de départ 
                                                Serial.println("Il y a quelqu'un");  
                                                digitalWrite(pin_relai, LOW); //on désactive le relai pour éteindre le ventilo
                                              }
                                            }
                                            delay(1000);
                                          }



                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            29 avril 2018 à 20:06:40

                                            On va faire un exemple tout simple :

                                            Au démarrage de ton programme, ta variable temps_depart vaut 0, c'est plutôt logique.

                                            Après 20 secondes sans personne, ta variable temps_depart vaut toujours 0 (puisqu'elle n'est modifié que si il y a quelqu'un) et millis() vaut maintenant 20000.

                                            Du coup, dès que le capteur donne plus de 4900, la soustraction de ton if ligne 19 sera forcément validée ;)

                                            Si tu veux que ça marche, il te faut modifier temps_depart quand il n'y a aucune détection.

                                            Ce qui donne le code suivant :

                                              if (fsrVoltage < 4900)
                                              {
                                                temps_depart = millis();
                                                Serial.println("Il n'y a personne");
                                                digitalWrite(pin_relai, HIGH);
                                              }
                                              if (fsrVoltage >= 4900) //4900 mV = 10 kg
                                              {
                                                temps_presence = millis();
                                                if ((temps_presence - temps_depart >= 5000))
                                                {
                                                  Serial.println("Il y a quelqu'un"); 
                                                  digitalWrite(pin_relai, LOW);
                                                }
                                              }



                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              23 mai 2018 à 14:17:32

                                              Hello, un très grand merci à toi lorrio pour ton aide. Après plusieurs sessions, je n'ai aucun problème avec les 4 plaques. Le problème venait bien de l'activation du relai lorsqu'il recherchait une nouvelle carte.

                                              Juste une dernière question, par rapport au reset de l'arduino via un bouton installé entre RESET et GND, est-ce que cela endommage l'arduino à court/moyen terme ? Le reset se fait environ toutes les heures mais pas forcément tout le temps, cela dépend des jours, généralement entre 3 et 7 resets par jour avec une heure d'intervalle. Je suppose qu'il n'est pas évident de trouver une réponse mais bon sait-on jamais. C'est juste un système temporaire pour remplacer un système qui ne fonctionne pas, environ 1-2 semaines, du moins je l'espère.

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                23 mai 2018 à 14:20:42

                                                Il n'y a aucun risque à faire des reset en court-circuitant GND et RESET.

                                                Tu peux le faire autant de fois que tu veux, il n'y aura pas de conséquence à long terme.

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  23 mai 2018 à 14:25:00

                                                  Parfait, je pense que tout est bon de mon côté ! 

                                                  Un immense merci !

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter

                                                  Arduino + module relai + électroaimant

                                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                  • Editeur
                                                  • Markdown