Problème de capteur RFID

Portrait de ElCreator

Bonjour, 

Pour mon école je dois présenter un projet et j'ai choisit d'essayer de faire une chatière électronique.

Pour cela j'ai dans un premier temps fait un montage avec un bouton qui fonctionne. Mais je voudrais à présent pouvoir la faire marcher avec un badge RFID. (J'utilise une carte arduino uno)

J'ai donc commencé avec les programmes permettant de trouver l'IUD de mon badge. Après plusieurs essais, il a marché une fois mais le temps que je prenne la carte fournie dans le pack pour la tester à son tour, plus de réponse, le programme ne marchait plus non plus avec le badge, qui fonctionnait pourtant 5 minutes avant.

J'ai essayé de brancher les sorties SDA et RST sur d'autres pins de la carte arduino (5 et 6) et ça n'a pas marché non plus.

Je n'ai branché le module que sur le 3,3V (jamais sur le 5V), j'ai vérifié mes soudures qui m'ont l'air correctes et j'ai changé les fils.

j'utilise cette carte https://www.amazon.fr/SODIAL-capteur-dinduction-CRFM-522-Module/dp/B00K6...

Comme mon programme avec le bouton marche toujours, je ne pense pas que le problème vienne de ma carte arduino.

Avez vous d'autres idée de où pourrait venir mon problème ?

Portrait de brossden

Sans voir le code que tu utilises cela va être compliqué de te répondre !

Portrait de ElCreator

Voici le programme que j'utilise pour obtenir l'IUD de la carte et qui a marché une fois

#include <SPI.h>
#include <RFID.h>

RFID RFID(10,9);

int UID[5];

void setup()
{
  Serial.begin(9600);
  SPI.begin();
  RFID.init();  

}

void loop()
{
    if (RFID.isCard()) {  
          if (RFID.readCardSerial()) {        
            Serial.print("L'UID est: ");
            for(int i=0;i<=4;i++)
            {
              UID[i]=RFID.serNum[i];
              Serial.print(UID[i],DEC);
              Serial.print(".");
            }
            Serial.println("");
          }          
          RFID.halt();
    }
    delay(100);    
}

Portrait de ElCreator

Et voici une photo de mon montage même si je pense qu'on ne dois pas comprendre grand chose a cause des fils du bouton

p4150067_-_copie.jpg

Portrait de brossden

Super

Ce soir je n'ai plus le temps mais demain promis !

Bonne soirée

Portrait de brossden

Comme promis voici ma réponse !

Tout d'abord je n'ai pas pu trouver la library RFID qui semble t il est trop ancienne donc j'ai téléchargé la Library : MFRC522-1.4.0.zip

et j'ai testé le programme ci-dessous qui se trouve dans les exemples de cette library  sous le nom ReadNUID mais je l'ai modifié car d'origine le programme lit une fois le code de la carte, le met en mémoire et si celui ci est présenté à nouveau il affiche que cette carte a déjà été lue. Pour éviter cela et donc lire le code aussi souvent que tu le présente devant le lecteur j'ai mis en commentaire les lignes 86 à 89 qui sont :

// Store NUID into nuidPICC array
    //for (byte i = 0; i < 4; i++) {
     // nuidPICC[i] = rfid.uid.uidByte[i];
    //}

Le programme et le montage fonctionne parfaitement avec un Arduino UNO les autre carte type Mega et autre nécessitent un autre câblage ! ! Preuve à l'appuis : Demo

et une photo du montage Montage.jpg

*
 * --------------------------------------------------------------------------------------------------------------------
 * Example sketch/program showing how to read new NUID from a PICC to serial.
 * --------------------------------------------------------------------------------------------------------------------
 * This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
 *
 * Example sketch/program showing how to the read data from a PICC (that is: a RFID Tag or Card) using a MFRC522 based RFID
 * Reader on the Arduino SPI interface.
 *
 * When the Arduino and the MFRC522 module are connected (see the pin layout below), load this sketch into Arduino IDE
 * then verify/compile and upload it. To see the output: use Tools, Serial Monitor of the IDE (hit Ctrl+Shft+M). When
 * you present a PICC (that is: a RFID Tag or Card) at reading distance of the MFRC522 Reader/PCD, the serial output
 * will show the type, and the NUID if a new card has been detected. Note: you may see "Timeout in communication" messages
 * when removing the PICC from reading distance too early.
 *
 * @license Released into the public domain.
 *
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 */

#include <SPI.h>
#include <MFRC522.h>

constexpr uint8_t RST_PIN = 9;     // Configurable, see typical pin layout above
constexpr uint8_t SS_PIN = 10;     // Configurable, see typical pin layout above
 
MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class

MFRC522::MIFARE_Key key;

// Init array that will store new NUID
byte nuidPICC[4];

void setup() {
  Serial.begin(9600);
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522

  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }

  Serial.println(F("This code scan the MIFARE Classsic NUID."));
  Serial.print(F("Using the following key:"));
  printHex(key.keyByte, MFRC522::MF_KEY_SIZE);
}
 
void loop() {

  // Look for new cards
  if ( ! rfid.PICC_IsNewCardPresent())
    return;

  // Verify if the NUID has been readed
  if ( ! rfid.PICC_ReadCardSerial())
   return;

  Serial.print(F("PICC type: "));
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  Serial.println(rfid.PICC_GetTypeName(piccType));

  // Check is the PICC of Classic MIFARE type
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println(F("Your tag is not of type MIFARE Classic."));
    return;
  }

  if (rfid.uid.uidByte[0] != nuidPICC[0] ||
    rfid.uid.uidByte[1] != nuidPICC[1] ||
    rfid.uid.uidByte[2] != nuidPICC[2] ||
    rfid.uid.uidByte[3] != nuidPICC[3] ) {
    Serial.println(F("A new card has been detected."));

    // Store NUID into nuidPICC array
    //for (byte i = 0; i < 4; i++) {
     // nuidPICC[i] = rfid.uid.uidByte[i];
    //}
   
    Serial.println(F("The NUID tag is:"));
    Serial.print(F("In hex: "));
    printHex(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();
    Serial.print(F("In dec: "));
    printDec(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();
  }
  else Serial.println(F("Card read previously."));

  // Halt PICC
  rfid.PICC_HaltA();

  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
}

/**
 * Helper routine to dump a byte array as hex values to Serial.
 */
void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

/**
 * Helper routine to dump a byte array as dec values to Serial.
 */
void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], DEC);
  }
}

Bonne journée à tous

Portrait de brossden

Regarde en bas à droite de ton écran quand tu es sur ce site il y a possibilité de Chatter  avec le lien "Discussion"!

Portrait de ElCreator

Voici des photos plus zoomées de mes branchements

p4160070.jpg

p4160069.jpg

J'ai branché :

SDA -> 10 (orange)

SCK -> 13 (vert)

MOSI -> 11 (violet)

MISO -> 12 (bleu)

IRQ -> pas branché

GND -> GND (noir)

RST -> 9 (orange)

3.3V -> 3.3V (rouge)

Portrait de ElCreator

Et voilà un schéma du montage avec uniquement le module RFID

p4160071.jpg

Portrait de ElCreator

Et voici un shéma avec le bouton et le servomoteur

p4160072.jpg

Portrait de ElCreator

Voici le module RFID de plus prèsp4160081.jpg

p4160085.jpg

Portrait de ElCreator

Merci pour tous vos bon conseils et vos réponses rapides.

J'ai racheté une carte et ça a marché du premier coup !

Pour ceux qui rencontreront des problèmes similaires, voici la carte que j'ai acheté : https://www.velleman.eu/support/downloads/?code=VMA405 (et là au moins les soudures étaient déjà faites !)  et j'ai appliqué à la lettre les consignes données par la "notice" fournie sur le site : https://www.velleman.eu/downloads/29/vma405_a4v01.pdf avec la librairie qu'ils donnent : https://www.velleman.eu/downloads/29/vma405_library.zip

J'ai adapté le programme pour le faire marcher avec mon servomoteur plutôt qu'avec des leds :

#include <SPI.h>
#include <RFID.h>
#include <Servo.h>                    // permet de faire appel à la bibliothèque Servo

Servo cervelle;                       // crée une constante appelée « cervelle » utilisable par la bibliothèque Servo.

#define SS_PIN 10
#define RST_PIN 9

RFID rfid(SS_PIN,RST_PIN);

int power = 7;
int led = 8; 
int serNum[5];
/*
* This integer should be the code of Your Mifare card / tag 
*/
int cards[][5] = {{93,134,37,217,39}};

bool access = false;

void setup(){

    Serial.begin(9600);
    SPI.begin();
    rfid.init();
    cervelle.attach(3);                   // commande de la bibliothèque Servo, qui consiste à « attacher » le servomoteur à la PIN 3
   
}

void loop(){
    
    if(rfid.isCard()){
    
        if(rfid.readCardSerial()){
            Serial.print(rfid.serNum[0]);
            Serial.print(" ");
            Serial.print(rfid.serNum[1]);
            Serial.print(" ");
            Serial.print(rfid.serNum[2]);
            Serial.print(" ");
            Serial.print(rfid.serNum[3]);
            Serial.print(" ");
            Serial.print(rfid.serNum[4]);
            Serial.println("");
            
            for(int x = 0; x < sizeof(cards); x++){
              for(int i = 0; i < sizeof(rfid.serNum); i++ ){
                  if(rfid.serNum[i] != cards[x][i]) {
                      access = false;
                      break;
                  } else {
                      access = true;
                  }
              }
              if(access) break;
            }
           
        }
        
       if(access){
           Serial.println("Welcome MINOU ");
    cervelle.write (110);              // alors le servomoteur prend un angle de 110°.
    delay(5000) ;                     // on attend un délais de 5 secondes  
    cervelle.write (2);               // le servomoteur revient à l’angle 0, sa position de départ.
           
      } else {
        
    cervelle.write (2);               // le servomoteur revient à l’angle 0, sa position de départ.   
      
       }        
    }
    
    rfid.halt();
    cervelle.write (2);               // le servomoteur revient à l’angle 0, sa position de départ.   
}

La conclusion pour ceux qui rencontreront les mêmes symptomes que moi : c'est le module RFID qui est mort *^w^*

Merci encore à brossden pour son aide précieuse et bon courage à ceux qui se lancent dans des projets similaires ! :)

Portrait de brossden

Tu vois c'était bien ta carte qui avait souffert !

Mais je viens de voir un truc en grossissant la photo de ta carte coté soudures il n'y aurait pas une soudure qui aurait court circuitée une la piste très proche ???

soudure.jpg

Portrait de ElCreator

c'est possible, a vue d'oeuil je dirais que non, ça ne touche pas, mais c'est sûrement un truc de ce genre qui s'est passé

Portrait de brossden

Merci quand même pour le partage et les liens pour les différents fichiers VelleMan !