[RESOLU] Couper le module RFID RC522 entre deux lectures

Bonjour

Je construis une conteuse pour mon fils avec un lecteur mp3 série et un lecteur RFID pour détecter les puces qui seront collées sur ses livres. J'ai pas encore fini mais ça fonctionne vraiment bien.
J'ai un seul problème: j'aimerais que le lecteur de carte RFID n'émette pas d'ondes entre deux lectures.

J'ai essayé plein de choses, même de couper l'alimentation du lecteur entre deux lecture (avec un transistor commandé par l'arduino), mais cette solution ne marche pas (le lecteur veut bien faire une lecture mais plus rien après).

J'ai cru trouver une solution en créant une variable "RFID_read", qui lorsqu'elle est à l'état "HIGH" autorise la lecture d'une puce RFID puis l'arrête lorsqu'une puce est détectée.
Sauf que quand j'ai pris mon oscilloscope (avec une boucle en guise d’antenne), j'ai remarqué que le lecteur RFID émet tout le temps.

Avez vous une solution?

Je vous laisse une version fortement allégée de mon programme pour plus de lisibilité.
il fonctionne ainsi:
Si j’appuie sur le bouton "RFID", la variable "RFID_read" passe à 1 ce qui autorise la lecture d'une puce. Lorsque la puce est lue, la variable "RFID_read" passe à 0
Merci pour votre temps.

//Module RFID
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 53
#define RST_PIN 51
MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class
byte nuidPICC[4];// stock l'IUD RFID
boolean RFID_init = LOW;
boolean RFID_read = LOW;

//déclaration Bouton RFID et variables pour sa gestion
const int BP_RFID = A2;
boolean BPState_RFID = 0;
boolean lastBPState_RFID = 0;


void setup() 
 {
pinMode(BP_RFID, INPUT);

  //Serial
  Serial.begin(9600);
  Serial.println("Ready");
 }



void loop() 
{
  //lecture des BP
  BPState_RFID = digitalRead(BP_RFID );




  // Gestion du bouton: BP_RFID
  if (BPState_RFID != lastBPState_RFID) {
    if (BPState_RFID == HIGH) {//Si je viens d'appuyer sur le Bouton RFID (c'est un bouton capacitif donc pas de rebonds)
      RFID_read = HIGH;//pour autoriser la lecture d'une puce RFID
      }
    //mémorise l'état courant du bouton 
    lastBPState_RFID = BPState_RFID;
  }



  //Détection d'une puce RFID
  if (RFID_read == HIGH){// si j'ai delandé la lecture d'un puce RFID par l'appuis sur le bouton "RFID"
    if(RFID_init == LOW){
      SPI.begin(); //initialise la liaison SPI pour le lecteur RFID
      rfid.PCD_Init(); //initialise le lecteur RFID
      RFID_init = HIGH;//l'init est faite et le module RFID est prêt à lire
    }
    else{//si l'init est déjà faire, alors lire la puce RFID
      Serial.println("read");
      // Initialisé la boucle si aucun badge n'est présent 
      if ( !rfid.PICC_IsNewCardPresent())
        return;
      // Vérifier la présence d'un nouveau badge 
      if ( !rfid.PICC_ReadCardSerial())
        return;
      // Afffichage 
      Serial.println(F("Un badge est détecté"));
      // Enregistrer l’ID du badge (4 octets)
      for (byte i = 0; i < 4; i++) {
        nuidPICC[i] = rfid.uid.uidByte[i];
      }
      //copie les nombres de l'IUD dans les bonnes variables
/*
      dossier = nuidPICC[3];
      pisteDeDebut = nuidPICC[2];
      nombreDePages = nuidPICC[1];
      typeDeSupport = nuidPICC[0];
      
  selectSourceFolderAndTrack(dossier, pisteDeDebut);// lecture de la première page du livre
*/
      // Affichage de l'identifiant 
      Serial.println(" L'UID du tag est:");
      for (byte i = 0; i < 4; i++) 
      {
        Serial.print(nuidPICC[i], DEC);
        Serial.print(" ");
      }
      Serial.println();
      RFID_read = LOW;
      RFID_init = HIGH;
    }
  }// la puce RFID est Lue et son identifiant est sauvegardé dans différentes variables.

  //FIN


 }

Pour info, le programme de base c'est celui çi

#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 53
#define RST_PIN 5

//RFID
MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class
//variables RFID
byte nuidPICC[4];// stock l'IUD RFID


void setup() 
{
  Serial.begin(9600);

//RFID
  // Init SPI bus
  SPI.begin();
  // Init MFRC522
  rfid.PCD_Init();
     
    }
void loop() {

  //RFID début

  // Initialisé la boucle si aucun badge n'est présent
if ( !rfid.PICC_IsNewCardPresent())
    return;

  // Vérifier la présence d'un nouveau badge
  if ( !rfid.PICC_ReadCardSerial())
    return;

  // Afffichage
  Serial.println(F("Un badge est détecté"));
 

  // Enregistrer l'ID du badge (4 octets)
  for (byte i = 0; i < 4; i++) {
    nuidPICC[i] = rfid.uid.uidByte[i];
    }
    delay(500);
  // Affichage de l'identifiant
  Serial.println(" L'UID du tag est:");
  for (byte i = 0; i < 4; i++)
  {
    Serial.print(nuidPICC[i], DEC);
    Serial.print(" ");
  }
  Serial.println();

  // Re-Init RFID
rfid.PICC_HaltA(); // Halt PICC
 rfid.PCD_StopCrypto1(); // Stop encryption on PCD
 

//RFID Fin
       
//FIN
}

As-tu essayé avec les méthodes PCD_AntennaOn/Off, PCD_SoftPowerUp/Down ?

guix:
As-tu essayé avec les méthodes PCD_AntennaOn/Off, PCD_SoftPowerUp/Down ?

Ca fonctionne, Merci beaucoup!
j'ai fouillé dans le dossier arduino et j'ai trouvé le fichier des mots clef dans la library.
J'ai simplement mis la fonction "rfid.PCD_SoftPowerDown();" après la lecture de la puce et ça coupe bien les RF du lecteur.

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