lecture NTAG RC522 sans utilisé IsNewCardPresent()

Bonjour,

J'ai réalisé un code qui lit des NTAG depuis un RC522/Arduino Uno piloté depuis une application que j'ai faite en C# .net

Mon code:

void Ntag_is_here()
{
  Serial.print(Begin);

  if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) 
  {
    Serial.print("NO");
  }
  else
    Serial.print("YES");
  
  Serial.print(End);
}

Mon code fonctionne parfaitement, mais... je suis obligé de relancer mon application C# ET de soit retiré ce NTAG ou soit en remettre un nouveau. Les print begin, end, ne sont biensure là que pour le traitement coté PC...

j'ai tenté d'utilisé un while toujours coté Arduino mais je boucle toujours sur "NO"

void Ntag_is_here()
{
  Serial.print(Begin);

  while (mfrc522.PICC_ReadCardSerial()) 
  {
    Serial.print("YES");
  }
Serial.print("NO");
  
  Serial.print(End);
}

Merci pour votre aide.

personne ?

As-tu testé ce qui est indiqué ici (Manuel d'utilisation du module RFID RC522) ?

Déjà bonjour,

As tu au moins lu mon post/code ... ?

Balancer toute la doc est simple comme réponse :o

j'ai posté du code et une question précise...

MERCI

Bonjour toi-même ... :slight_smile:

Ton code, tel que je le comprends:

void Ntag_is_here()
{
  Serial.print(Begin);

  while (mfrc522.PICC_ReadCardSerial()) 
  {
    Serial.print("YES");
  }
Serial.print("NO");
  
  Serial.print(End);
}

C'est une fonction, on ne sait pas dans quelles conditions elle est exécutée, donc pas forcément facile d'y voir clair. Lorsqu'elle est lancée, elle teste la réponse du PICC_ReadCardSerial et affiche "YES" tant que cette réponse est 1 ou HIGH.
Ensuite elle affiche "NO".

Donc s'il n'affiche que "NO" c'est que le PICC_ReadCardSerial est toujours LOW ou 0... donc je suppose que le bidule ne reçoit rien sur sa liaison série.

C'est pourquoi je posais cette question : as-tu testé le sketch de la datasheet? S'il ne fonctionne pas, c'est qu'il y a un problème (alim, branchement, ...).

Je n'ai jamais utilisé ce composant, je ne sais pas comment il fonctionne

guyo_21:
Bonjour,

J'ai réalisé un code qui lit des NTAG depuis un RC522/Arduino Uno piloté depuis une application que j'ai faite en C# .net

Mon code:

void Ntag_is_here()

{
 Serial.print(Begin);

if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial())
 {
   Serial.print("NO");
 }
 else
   Serial.print("YES");
 
 Serial.print(End);
}





Mon code fonctionne parfaitement, mais... je suis obligé de relancer mon application C# ET de soit retiré ce NTAG ou soit en remettre un nouveau. Les print begin, end, ne sont biensure là que pour le traitement coté PC...

j'ai tenté d'utilisé un while toujours coté Arduino mais je boucle toujours sur "NO"



void Ntag_is_here()
{
 Serial.print(Begin);

while (mfrc522.PICC_ReadCardSerial())
 {
   Serial.print("YES");
 }
Serial.print("NO");
 
 Serial.print(End);
}






Merci pour votre aide.

Bonjour
je n'ai pas saisi exactement quel est vraiment ton probleme , mais je pense que tu n'a pas inclus qq part dans tes phases de lectures un PICC_HaltA , pour cloturer aprés une lecture reussie

 mfrc522.PICC_HaltA(); // Halt PICC

J'avais eu lors de mes premiers essais un "blocage affichage" lors de la presentation/retrait d'un tag
résolu par cette ligne.

juste pour info , je poste dessous le code que j'avais utilisé

#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>  // Comes with Arduino IDE

#include <LiquidCrystal_I2C.h>

/*-----( Declare Constants )-----*/
//none
/*-----( Declare objects )-----*/
// set the LCD address to 0x20 for a 20 chars 4 line display
// Set the pins on the I2C chip used for LCD connections:
//                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
#define SS_PIN 10    //Arduino Uno
#define RST_PIN 9
byte tagok = 0;

unsigned long sernum[11] = {0, 679864085, 3478850816, 1159921925, 3278950471, 1364574940, 0, 0, 0, 0, 1149839889}; //poste 0 N° carte lue, poste 1 à 9 pour UID carte a tester, poste 10 carte master

MFRC522 mfrc522(SS_PIN, RST_PIN);        // Create MFRC522  instance.
MFRC522::MIFARE_Key key;
int led = 8;
void setup() {
  lcd.begin(16, 2);
  pinMode(led, OUTPUT);
  Serial.begin(9600);        // Initialize serial communications with the PC
  SPI.begin();                // Init SPI bus
  mfrc522.PCD_Init();        // Init MFRC522 card
  Serial.println("SERIAL OK ");
  lcd.backlight(); // finish with backlight on

  //-------- Write characters on the display ----------------
  // NOTE: Cursor Position: CHAR, LINE) start at 0
  lcd.clear();
  lcd.home ();
  lcd.setCursor(0, 0); //Start at character 4 on line 0
  lcd.print("LECTEUR MFRC522");
  lcd.setCursor(0, 1); //Start at character 4 on line 0
  lcd.print("TEST ARTOUSTE");
}

void loop() {

  digitalWrite(led, LOW);
  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial())    return;

  Serial.print("Card UID:");    //Dump UID
  for (byte i = 0; i < 4; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  }

  sernum[0] = *((unsigned long *)mfrc522.uid.uidByte); //recup num serie lu long unsigned
  lcd.clear();
  lcd.setCursor(0, 0); //Start at character 1 on line 0
  lcd.print(sernum[0]);
  Serial.print(" ");
  Serial.print(sernum[0]);
  Serial.print(" ");
  Serial.print(sernum[0], HEX);
  Serial.print(" ");
  tagok = 0;
  for  (byte i = 1; i < 10; i++) {
    if (sernum[0] == sernum[i]) tagok = 1; // carte reconnue dans la liste

  }
  if (sernum[0] == sernum[10]) tagok = 255; // carte master reconnue

  if (tagok == 0) { // faire si carte inconnue
    lcd.setCursor(0, 1);
    lcd.print("TAG INCONNU");
    Serial.print("TAG INCONNU");
  }
  if (tagok > 0) //faire si carte reconnue
  {
    digitalWrite(led, HIGH);
    Serial.print("TAG OK ");
    lcd.setCursor(0, 1);
    lcd.print("TAG OK");
    if (sernum[0] == sernum[1]) Serial.print("Badge STOCK     " );
    if (sernum[0] == sernum[2]) Serial.print("Badge LABO      " );
    if (sernum[0] == sernum[3]) Serial.print("Bramble card " );
    if (sernum[0] == sernum[4]) Serial.print("Badge ANECHO    " );
    if (sernum[0] == sernum[5]) Serial.print("Badge CLOTURE    " );
    if (sernum[0] == sernum[10]) Serial.print("Badge MASTER    " );
    delay(1500);
    digitalWrite(led, LOW);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("   PRESENTEZ");
    lcd.setCursor(0, 1);
    lcd.print("     BADGE");
  }

  if (tagok == 255) //faire si carte master reconnue
  {

    Serial.print("CARTE MASTER RECONNUE");

  }


  Serial.println();

  mfrc522.PICC_HaltA(); // Halt PICC

}

Bonjour, et oui c'est toujours plus sympa la politesse lesept (et sache que comme déjà dis et redis, tout fonctionne je n'ai aucun souci de lecture ou de liaison série...)

Je lis beaucoup d'incompréhension dans vos réponses, je vais poster une partie de mon code Arduino et app C#, j'ai bien compris que vous ne saisissez pas du tout ce que je souhaite. Je l'avais portant clairement exprimé dès mon 1er post.

Mon code fonctionne, il n'y a aucun souci de ce coté là Artouste, mais je suis obligé de retirer mon NTAG pour le relire et ça ! je ne le souhaite pas et pour te répondre j'utilise bien la fonction Halt.

// j’utilise une librairie développée en C++ pour envoyer des commandes à mon code C# --> SCmd.addCommand

void loop()
{
  SCmd.readSerial();
}

void setup()
{
  Serial.begin(115200);
  SPI.begin();
  mfrc522.PCD_Init();
  SCmd.addCommand("/CONNECTION", IsConnected); // j'envoie la commande à mon code C# que l'Arduino est bien connecté !
  SCmd.addCommand("/NTAG_IS_PRESENT", NTAG_IS_PRESENT); // j'envoie la commande à mon code C# que le NTAG est bien détecté !
  SCmd.addCommand("/GET_NTAG_UID", NTAG_UID); // j'envoie la commande à mon code C# Pour lire le UID
  SCmd.addCommand("/NTAG_HALT", NTAG_Halt); // j'envoie la commande à mon code C# je "coupe le flux PICC"
  SCmd.addCommand("/NTAG_READ", Read); // j'envoie la commande à mon code C# je lis ...
}


void IsConnected()
{
  Serial.print(Begin);
  Serial.print("START");
  Serial.print(End);
}

void NTAG_Halt()
{
  mfrc522.PICC_HaltA(); // Halt PICC
  mfrc522.PCD_StopCrypto1();

  Serial.print(Begin);
  Serial.print("HALT");
  Serial.print(End);
}
void NTAG_Here()
{
  Serial.print(Begin);

  if (mfrc522.PICC_IsNewCardPresent() || mfrc522.PICC_ReadCardSerial()) 
  {
    Serial.print("YES");
  }
  else
    Serial.print("NO");
  
  Serial.print(End);
}

Bon, maintenant que le décor est posé et que tout est très clair, quand mon code Arduino envoi autre chose que "YES", donc un "TIMEOUT" ou un "NO" je ne peux plus re lire directement sans fermer mon application(assez problématique et brutale), et je ne souhaite pas ce genre de comportement.

maintenant le traitement de mes commandes coté C#:

// Traitement des messages reçus de l'Arduino

  private bool NTAG_IS_PRESENT()
 {
      string NTAG_Here = arduino.SendCommand("/NTAG_IS_PRESENT"); // Conserve la référence mémoire

      if (NTAG_Here == "YES")
      {
            return true;
       }
       else
       {
            return false;
       }
 }

Et pour clorurer le flux après une action lecture ou écriture:

//exit
arduino.Close();
arduino.SendCommand("/NTAG_HALT");

et cette méthode renvoi donc ... un boolean pour vérifier avant chaque traitement de lecture/écriture.

Mais quand je lis une fois ! donc si le test est true, je ne peux plus relire etc
Mon code me parait relativement simple et morcelé pour un meilleur débogage.

Merci pour votre écoute et de prendre le temps de l’analyse :wink:

Edit:
j’ai déjà utilisé ce genre de code avec un RC532 Adafruit en SPI comme en I2C et je pouvais très bien lire le même tag sans jamais le retiré du lecteur ...

toujours personne ?

aucune aide ?