Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comparaison valeurs carte RFID Arduino

    31 mai 2013 à 15:45:46

    Bonjour les zér0s! :p

    Etant en Terminale S-SI, je travaille sur un PPE (d'ailleurs la fin arrive à grands pas).

    Il consiste à la gestion de l'ouverture d'une porte via un Arduino couplé à un détecteur Adafruit de carte RFID (la breakout board PN532). J'ai récupéré l'exemple fourni un peu partout sur internet pour le modifier et l'adapter à nos besoins:

    #include <Adafruit_PN532.h>
    #include <SPI.h>
    
    
    
    #define SCK  (2)
    #define MOSI (4)
    #define SS   (5)
    #define MISO (3)
    
    Adafruit_PN532 nfc(SCK, MISO, MOSI, SS);
    const int led_rouge=10;
    const int led_verte=8;
    const int aimant=9;
    
    void setup(void) {
      digitalWrite(led_rouge, HIGH);
      digitalWrite(led_verte, HIGH);
      Serial.begin(9600);
      Serial.println("Bonjour!");
      pinMode(led_rouge, OUTPUT);
      pinMode(led_verte, OUTPUT);
      pinMode(aimant, OUTPUT);
      nfc.begin();
    
      uint32_t versiondata = nfc.getFirmwareVersion();
      if (! versiondata) {
        Serial.print("board PN53x non trouvée");
        while (1);
      }
      Serial.print("Puce PN5"); Serial.print((versiondata>>24) & 0xFF, HEX); Serial.println(" trouvee.");
      Serial.print("Version du logiciel: "); Serial.print((versiondata>>16) & 0xFF, DEC); 
      Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
      
      nfc.SAMConfig();
      
      Serial.println("En attente d'une carte ISO14443A ...");
    }
    
    
    void loop(void) {
      
      digitalWrite(led_rouge,LOW);
      delay(100);
      digitalWrite(led_rouge,HIGH);
      delay(200); 
    
      uint8_t id;
      uint8_t uid[]= { 0 ,0 ,0 ,0 ,0 ,0 ,0 };
      uint8_t uid1[]= { 0xEB ,0x06 ,0x02 ,0x96 ,0 ,0 ,0 };
      uint8_t uidLength;
      id=nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
      
      if (id) {
        digitalWrite(aimant, HIGH);
        Serial.println("Carte ISO14443A trouvee.");
        Serial.print("  Longueur UID: ");Serial.print(uidLength, DEC);Serial.println(" octets");
        Serial.print("  Valeur UID: ");
        nfc.PrintHex(uid, uidLength);
        Serial.println("");
        
        for (int a=0; a <= 25; a++){ 
        digitalWrite(led_verte, LOW);
        delay(100);
        digitalWrite(led_verte, HIGH);
        delay(100);
        }
        
      for (int a=0; a <= 10; a++){
      digitalWrite(led_rouge,LOW);
      delay(100);
      digitalWrite(led_rouge,HIGH);
      delay(100); 
        }
        
        digitalWrite(aimant,LOW);
      }
    }


    Le problème se trouve au niveau de

    uint8_t id;
      uint8_t uid[]= { 0 ,0 ,0 ,0 ,0 ,0 ,0 };
      uint8_t uid1[]= { 0xEB ,0x06 ,0x02 ,0x96 ,0 ,0 ,0 };
      uint8_t uidLength;
      id=nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
      
      if (id) {....

    En effet, je voudrai récupérer l'ID lue par le capteur pour effectuer un test de comparaison. Ainsi, si la bonne carte est présentée, l'électroaimant débloque la porte, sinon rien ne se passe. Seulement la variable "id" est du type booléen, et ne sert donc qu'à vérifier la présence de carte, pas de la bonne carte.

    En revanche, je sais que l'ID de la carte est lue quelque part car la fonction:

    nfc.PrintHex(uid, uidLength);


    affiche sur le port série les 4 octets de la puce RFID.

    Voilà, si vous avez des questions, n'hésitez pas.

    PS 1: "uid1" contient les octets de la carte que je voudrai autoriser. Je l'ai créée car j'ai pensé pouvoir la comparer avec "uid", en vain.

    PS 2: Je suis désolé pour l'absence de commentaires, débutant en programmation je n'ai pas encore pris la bonne habitude de tout commenter :euh:

    • Partager sur Facebook
    • Partager sur Twitter
      31 mai 2013 à 17:21:47

      Bonjour,

      Je déplace dans la section Électronique.

      Merci de votre compréhension.

      • Partager sur Facebook
      • Partager sur Twitter
      Moi, c'est tcitounet. «Peut mieux faire». Rendez-vous sur Zeste de Savoir ♥
        31 mai 2013 à 18:03:24

        Quand tu fais ca :

         id=nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);


        et bien les valeurs de l'uid sont justement stockées dans ta variable uid.

        Il ne te reste donc qu'a comparer cette variable (uid) avec ta référence (uid1) en comparant chaque case du tableau

        • Partager sur Facebook
        • Partager sur Twitter

        Retrouvez moi sur mon blog et ma chaine Youtube !

          31 mai 2013 à 18:58:26

          tcit: Oui, excusez-moi.

          Eskimon: je faisais un vulgaire if (uid=uid1) {...  mais ça ne fonctionnait pas. Quand tu dis "comparer chaque case du tableau", tu entends quoi ? Les variables uint8_t sont des tableaux de valeurs?

          • Partager sur Facebook
          • Partager sur Twitter
            31 mai 2013 à 21:44:45

            fais un petit for ou 4 if pour comparer les 4 cases de ton tableau ;) (car uid et uid1 sont déclarés comme des tableaux, on le voit avec le ' [ ] ' )
            • Partager sur Facebook
            • Partager sur Twitter

            Retrouvez moi sur mon blog et ma chaine Youtube !

              5 juin 2013 à 18:03:59

              Merci beaucoup! J'ai enfin terminé le programme! :p
              • Partager sur Facebook
              • Partager sur Twitter
                5 juin 2013 à 18:08:58

                (Tu pourras le poster à la suite au cas où quelqu'un est confronté au même souci ;) )
                • Partager sur Facebook
                • Partager sur Twitter

                Retrouvez moi sur mon blog et ma chaine Youtube !

                  5 juin 2013 à 21:14:58

                  Pas de souci, je le teste demain avec la carte (je l'ai pas sur moi) et je le posterai à la suite.

                  EDIT: Voici donc le programme final que j'utilise pour mon PPE.

                  Je tiens à préciser que j'utilise un capteur RFID Arduino "breakout board" (car il nécessite l'utilisation d'une pleaque-lab (breadboard) pour la connecter à l'Arduino):

                  http://cdn.shopify.com/s/files/1/0187/3430/products/pn532_large.jpg?1175

                  Contrairement au shield RIFD qui lui se connecte directement par-dessus l'Arduino:

                  http://snootlab.com/351-1134-thickbox/adafruit-pn532-rfid-shield-controleur-pour-arduino-et-extras.jpg

                  #include <Adafruit_PN532.h>
                  #include <SPI.h>
                  
                  #define SCK  (2)
                  #define MOSI (4)
                  #define SS   (5)
                  #define MISO (3)
                  
                  Adafruit_PN532 nfc(SCK, MISO, MOSI, SS);
                  const int led_rouge=10;
                  const int led_verte=8;
                  const int aimant=9;
                  
                  void setup(void) {
                    digitalWrite(led_rouge, HIGH);
                    digitalWrite(led_verte, HIGH);
                    Serial.begin(9600);
                    Serial.println("Bonjour!");
                    pinMode(led_rouge, OUTPUT);
                    pinMode(led_verte, OUTPUT);
                    pinMode(aimant, OUTPUT);
                    nfc.begin();
                  
                    uint32_t versiondata = nfc.getFirmwareVersion();
                    if (! versiondata) {
                      Serial.print("board PN53x non trouvée");
                      while (1);
                    }
                    Serial.print("Puce PN5"); Serial.print((versiondata>>24) & 0xFF, HEX); Serial.println(" trouvee.");
                    Serial.print("Version du logiciel: "); Serial.print((versiondata>>16) & 0xFF, DEC); 
                    Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
                    
                    nfc.SAMConfig();
                    
                    Serial.println("En attente d'une carte ISO14443A ...");
                  }
                  
                  
                  void loop(void) {
                    int c=0;
                    
                    digitalWrite(led_rouge,LOW);
                    delay(100);
                    digitalWrite(led_rouge,HIGH);
                    delay(200); 
                  
                    uint8_t id;
                    uint8_t uid[]= { 0 ,0 ,0 ,0 ,0 ,0 ,0 };
                    uint8_t uid1[]= { 0xEB ,0x06 ,0x02 ,0x96 ,0 ,0 ,0 };
                    uint8_t uidLength;
                    id=nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
                    
                    for(int b=0; b<4; b++){
                          if(id && uid[b]==uid1[b]){
                            
                            c++;
                          }
                    }
                          if (c==4){
                              digitalWrite(aimant,HIGH);
                              Serial.println("Entrez.");
                              
                          for (int a=0; a <= 25; a++){ 
                              digitalWrite(led_verte, LOW);
                              delay(100);
                              digitalWrite(led_verte, HIGH);
                              delay(100);
                            }
                      
                           for (int a=0; a <= 10; a++){
                              digitalWrite(led_rouge,LOW);
                              delay(100);
                              digitalWrite(led_rouge,HIGH);
                              delay(100); 
                          }
                      
                              digitalWrite(aimant,LOW);
                          }
                          
                          else if(id && c!=4){
                            
                            Serial.println("Carte interdite.");
                            digitalWrite(led_rouge,LOW);
                            delay(5000);
                            digitalWrite(led_rouge,HIGH);
                          }
                  }

                  -
                  Edité par Lumenis 6 juin 2013 à 18:16:58

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Comparaison valeurs carte RFID Arduino

                  × 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