Partage
  • Partager sur Facebook
  • Partager sur Twitter

Arduino : plusieurs lecteurs NFC ?

Sujet résolu
    20 avril 2017 à 10:09:09

    Bonjour,

    Dans le cadre d'un stage, je suis amené à travailler sur Arduino. Nous disposons d'une carte Arduino UNO, et d'un lecteur RFID/NFC Adafruit PN532.D'après la description du produit, celui-ci utilise les ports analogiques 4, 5, et le port digital 2.

    Notre application du NFC nécessite la lecture simultanée de 3 tags. Nous avons donc pensé à utiliser 3 lecteurs NFC (pour résoudre le problème de conflits mais également parce que leurs places physiques sur le prototype final sera différentes).

    Du coup, nous faudrait-il 3 lecteurs NFC ou bien pouvons-nous utiliser les 3 cartes juste en pluguant sur différents ports et en utilisant dans le code les différents ports ?

    Nous utilisons les librairies d'Adafruit PN532, SPI, et Wire (en C). Est-ce possible ?

    Merci d'avance !

    • Partager sur Facebook
    • Partager sur Twitter
      20 avril 2017 à 13:17:58

      Que veux tu dire par "Du coup, nous faudrait-il 3 lecteurs NFC ou bien pouvons-nous utiliser les 3 cartes" ???

      Je doute que ce genre de shield lecteur soit capable de lire plusieurs tags en même temps.

      Si tu places 2 tags au dessus de celui-ci, il est fort probablement qu'il ne lise rien du tout.

      Du coup, il te faudra forcément 3 shield lecteur.

      Reste à savoir comment les connecter à l'arduino de façon à ce qu'il n'y ai pas de conflit.

      Sur le site de adafruit, on peut lire que le shield supporte une communication SPI ou I2C, ce qui est plutôt bon signe.

      Concernant l'I2C :

      Il est possible de connecter plusieurs périphérique sur un même bus I2C (et donc partager les 2 fils SDA/SCL entre tout le monde) à condition que chaque périphérique ai une adresse différente.

      Pas de chance, le module PN532 a une adresse fixe 0x48 non modifiable donc impossible d'en connecter plusieurs sur le même bus I2C.

      Il te faudrait donc utiliser 3 bus I2C distinct mais l'arduino n'en possède qu'un.

      Du coup, si tu veux utiliser l'I2C, il te faudrait forcément émuler celui-ci sur des pins I/O classique et modifier la lib de Adafruit de façon à ce qu'elle utilise tes bus I2C émulé et non le bus I2C hardware de l'arduino.

      Concernant le SPI :

      Là encore, ce genre de bus supporte plusieurs périphérique sur un même bus SPI (les signaux SCLK/MOSI/MISO sont partagés) à condition que chaque périphérique ai son signal ChipSelect dédié.

      De ce coté là, tu as beaucoup plus de chance car la lib de Adafruit semble parfaitement gérer le module en SPI émulé (émulation de 3 bus SPI distinct) ou en SPI hardware (partage du bus SPI hardware et utilisation d'une pin I/O classique pour le ChipSelect).

      Ce qu'il te reste à faire, c'est donc :

      - configurer tes modules en SPI à l'aide de SEL0/SEL1

      - brancher tes modules sur le bus SPI hardware avec chacun leur chip select

      - déclarer 3 modules dans ton code avec ce constructeur : Adafruit_PN532(uint8_t ss);

      • Partager sur Facebook
      • Partager sur Twitter
        20 avril 2017 à 15:24:12

        Hey !

        Merci pour toutes ces infos !

        Jusque là nos expérimentations n'ont pas permis d'utiliser le SPI, bien que ça serait un gain énorme niveau coût pour la fabrication du circuit (on pensait pallier à cela en utilisant plusieurs ATmega qui communiqueraient sur un bus CAN les informations relatives aux différents lecteurs. Mon problème est que je n'ai pas vraiment de connaissances en électronique, mais j'essaie de contourner le problème ainsi.

        Je ne sais pas s'il s'agit là de la meilleure solution, mais l'idée est de permettre au système de voir la présence d'un récipient qui possède un tag NFC, d'authentifier un utilisateur avec un badge NFC, et (en arrière), d'avoir des conteneurs de produits (pour le remplissage du récipient cité au dessus) eux-même taggués NFC pour éviter les erreurs humaines.

        Pour enclencher quelque chose, il faut que l'utilisateur soit loggué et que tout soit en place correctement, + que l'utilisateur appuie sur un bouton en continu. D'où l'utilisation de 4 lecteurs NFC à minima qui pourraient être liés tous ensembles à la carte Arduino ou, pour un gain de place, directement à l'ATmega.

        Néanmoins, après réalisation de la soudure pour faire le pont du SPI, le firmware n'est pas détecté par la bibliothèque, qui dit que la carte est injoignable.

         /**************************************************************************/
        /*! 
            @file     readMifareClassic.pde
            @author   Adafruit Industries
          @license  BSD (see license.txt)
        
            This example will wait for any ISO14443A card or tag, and
            depending on the size of the UID will attempt to read from it.
           
            If the card has a 4-byte UID it is probably a Mifare
            Classic card, and the following steps are taken:
           
            Reads the 4 byte (32 bit) ID of a MiFare Classic card.
            Since the classic cards have only 32 bit identifiers you can stick
          them in a single variable and use that to compare card ID's as a
          number. This doesn't work for ultralight cards that have longer 7
          byte IDs!
           
            Note that you need the baud rate to be 115200 because we need to
          print out the data and read from the card at the same time!
        
        This is an example sketch for the Adafruit PN532 NFC/RFID breakout boards
        This library works with the Adafruit NFC breakout 
          ----> https://www.adafruit.com/products/364
         
        Check out the links above for our tutorials and wiring diagrams 
        These chips use SPI to communicate, 4 required to interface
        
        Adafruit invests time and resources providing this open source code, 
        please support Adafruit and open-source hardware by purchasing 
        products from Adafruit!
        */
        /**************************************************************************/
        #include <Wire.h>
        #include <SPI.h>
        #include <Adafruit_PN532.h>
        
        // If using the breakout with SPI, define the pins for SPI communication.
        #define PN532_SCK  (2)
        #define PN532_MOSI (3)
        #define PN532_SS   (4)
        #define PN532_MISO (5)
        
        // If using the breakout or shield with I2C, define just the pins connected
        // to the IRQ and reset lines.  Use the values below (2, 3) for the shield!
        #define PN532_IRQ   (2)
        #define PN532_RESET (3)  // Not connected by default on the NFC Shield
        
        // Uncomment just _one_ line below depending on how your breakout or shield
        // is connected to the Arduino:
        
        // Use this line for a breakout with a SPI connection:
        //Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);
        
        // Use this line for a breakout with a hardware SPI connection.  Note that
        // the PN532 SCK, MOSI, and MISO pins need to be connected to the Arduino's
        // hardware SPI SCK, MOSI, and MISO pins.  On an Arduino Uno these are
        // SCK = 13, MOSI = 11, MISO = 12.  The SS line can be any digital IO pin.
        Adafruit_PN532 nfc(PN532_SS);
        
        // Or use this line for a breakout or shield with an I2C connection:
        //Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);
        
        void setup(void) {
          Serial.begin(9600);
          Serial.println("Hello!");
        
          nfc.begin();
        
          uint32_t versiondata = nfc.getFirmwareVersion();
          if (! versiondata) {
            Serial.print("Didn't find PN53x board");
            while (1); // halt
          }
        }

        Le message du dernier if s'affiche. Donc il n'arrive pas à détecter la carte pour lui demander son numéro de Firmware...

        Une piste/idée pour une résolution du problème ?

        -
        Edité par GeeksdelaCave 20 avril 2017 à 15:25:20

        • Partager sur Facebook
        • Partager sur Twitter
          20 avril 2017 à 16:10:02

          Sur les photos du shield, on peut voir des trous pour le bus SPI : MOSI / SS / MISO / SCK.

          Du coup, il est possible que ces pins ne soient pas reliées aux pins du bus SPI de l'arduino afin de laisser ces pins libre sur l'arduino pour d'autres éléments.

          Si tu veux utiliser le SPI, il va te falloir faire ces connexion toi même avec des fils.

          • Partager sur Facebook
          • Partager sur Twitter
            21 avril 2017 à 9:30:42

            Bonjour,

            J'ai soudé des PINs sur le shield PN532 pour pouvoir faire nos manips. En passant par une breadboard, j'ai pu faire le câblage en me basant sur les PINs proposés directement par Arduino pour la communication SPI.

            Donc j'utilise les ports hardware de 16 à 19 inclus, branchés dans l'ordre.

            Cependant, même avoir rectifié les PINs dans le code, donné précédemment, en mettant ou bien les adresses des ports physiques ou bien "logiques", aka "digital pin x" sur le schéma envoyé plus haut, dans les deux cas la carte n'est pas reconnue avec le code donné précédemment.

            J'ai essayé ceci (numéros logiques des PINs) :

            // If using the breakout with SPI, define the pins for SPI communication.
            #define PN532_SCK  (13)
            #define PN532_MOSI (11)
            #define PN532_SS   (10)
            #define PN532_MISO (12)

            Et cela (numéros physiques des PINs) :

            // If using the breakout with SPI, define the pins for SPI communication.
            #define PN532_SCK  (19)
            #define PN532_MOSI (17)
            #define PN532_SS   (18)
            #define PN532_MISO (16)

            Et, dans ces deux cas, en utilisant le constructeur pour NFC de telle manière :

            // Use this line for a breakout with a software SPI connection (recommended):
            Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);

            (comme ça, on renseigne bien si ça change comparé à l'autre, et en + ça servira + tard lorsqu'il faudra en faire plusieurs...)

            J'ai juste un doute sur une soudure, je pars la refaire, et je retesterai les différentes valeurs pour savoir si c'était ça. Si jamais tu vois quelque chose en attendant...

            EDIT : nan c'est bon...

            Un bon logiciel simple à prendre en main pour pouvoir poster mes schémas au lieu des valeurs écrites en dur ?

            Le SPI émulé par la bibliothèque d'Adafruit peut-il être incompatible avec celui de la carte Arduino ?

            Merci d'avance !

            -
            Edité par GeeksdelaCave 21 avril 2017 à 11:09:58

            • Partager sur Facebook
            • Partager sur Twitter
              21 avril 2017 à 11:50:05

              Pas simple de répondre là... tu es en train de nous dire : "j'ai tout bien câblé comme il faut avec un code correct et ça marche pas, vous avez une idée ???"

              Une photo (correcte!) de ton câblage ainsi que le code que tu as utilisé pour ce câblage serait plus parlant.

              J'insiste bien sur "correct!" car c'est une une photo flou prise sur un mauvais angle, on ne verra strictement rien de ce que tu as câblé.

              • Partager sur Facebook
              • Partager sur Twitter
                24 avril 2017 à 11:28:49

                Hello !

                Alors, après y avoir passé quelques heures, le topic est résolu !

                En fait les PIN de sortie SPI ne sont pas reliés à ceux de l'exemple par défaut (on est trop cons de notre côté on n'a même pas pensé à regarder). Du coup, des PIN headers, de la soudure, quelques fils, et ça marche à présent...

                http://arduino103.blogspot.fr/2015/11/tutoriel-sur-le-lecteur-rfidnfc-pn532.html

                (si éventuellement ça peut aider le suivant)

                Merci pour ton aide :)

                La bise !

                -
                Edité par GeeksdelaCave 24 avril 2017 à 11:29:04

                • Partager sur Facebook
                • Partager sur Twitter

                Arduino : plusieurs lecteurs NFC ?

                × 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