Problema di lettura valori da RFID MFRC522

Buongiorno a tutti,
sono iscritto a questo forum da un po' e sono anche convinto di aver già postato qualcosa ma non ritrovo nulla... tant'è.
Mi chiamo Luca, sto lavorando ad un progetto che utilizzi l'RFID e devo realizzare un sistema che possa rilevare la presenza contemporanea di due TAG RFID su due lettori diversi.
Utilizzo un Arduino MEGA 2560, due di questi lettori RFID e questa libreria.

Il codice molto semplice (sicuramente ottimizzabile) è il seguente:

/*
  RFID a (sinistra), tag riconosciuti
  1836014245
  1357614245
  1674912245
  2154412245

  RFID b (destra), tag riconosciuti
  1996914245
  1197914245
  2474112245
  2317614245

*/

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

constexpr uint8_t SS_PINa = 42;         // Configurable, see typical pin layout above

constexpr uint8_t RST_PIN = 45;          // Configurable, see typical pin layout above
constexpr uint8_t SS_PINb = 43;         // Configurable, see typical pin layout above

MFRC522 mfrc522a(SS_PINa, RST_PIN);  // Create mfrc522a instance
MFRC522 mfrc522b(SS_PINb, RST_PIN);  // Create mfrc522b instance

String currentTAGa = "";
String currentTAGb = "";

void setup() {
  Serial.begin(9600);    // Initialize serial communications with the PC
  while (!Serial);    // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
  SPI.begin();      // Init SPI bus
  mfrc522a.PCD_Init();   // Init mfrc522a
  mfrc522a.PCD_DumpVersionToSerial();  // Show details of PCD - mfrc522a Card Reader details
  mfrc522b.PCD_Init();   // Init mfrc522a
  mfrc522b.PCD_DumpVersionToSerial();  // Show details of PCD - mfrc522a Card Reader details
  Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
}

void loop() {
  currentTAGa = "";
  currentTAGb = "";
  // Look for new cards
  if ( mfrc522a.PICC_IsNewCardPresent() || mfrc522b.PICC_IsNewCardPresent()) {

    // Select one of the cards
    if (mfrc522a.PICC_ReadCardSerial()) {
      for (int i = 0; i < mfrc522a.uid.size; i++) {
        currentTAGa.concat(mfrc522a.uid.uidByte[i]);
      }
      if (currentTAGa.equals("1836014245") || currentTAGa.equals("1357614245") || currentTAGa.equals("1674912245") || currentTAGa.equals("2154412245")) {
      Serial.print("currTAGa "); Serial.println(currentTAGa);
      }
    }
    Serial.print("currentTAGa "); Serial.println(currentTAGa);

    // Dump debug info about the card; PICC_HaltA() is automatically called
    //mfrc522a.PICC_DumpToSerial(&(mfrc522a.uid));
    //dump_byte_array(mfrc522a.uid.uidByte, mfrc522a.uid.size);

    if (mfrc522b.PICC_ReadCardSerial()) {
      for (int i = 0; i < mfrc522b.uid.size; i++) {
        currentTAGb.concat(mfrc522b.uid.uidByte[i]);
      }
      if (currentTAGb.equals("1996914245") || currentTAGb.equals("1197914245") || currentTAGb.equals("2474112245") || currentTAGb.equals("2317614245")) {
      Serial.print("currTAGb "); Serial.println(currentTAGb);
      }
    }
Serial.print("currentTAGb "); Serial.println(currentTAGb);
  }
}

In pratica se è presente un TAG su uno dei due lettori, leggo il codice di entrambi e li stampo.
Utilizzo due print differenti come debug per far capire meglio il problema che è il seguente:
Quando posiziono un TAG del gruppo "a" sul lettore "a" oppure un tag "b" sul lettore "b" tutto funziona bene come da immagini

Se invece posiziono entrambi i tag contemporaneamente sembra che aletrnativamente non legga la presenza di uno dei due TAG

Sto utilizzando in comune il pin di Reset, ma anche separandolo non ottengo risultati diversi.

Avete idea di quale possa essere il problema?
E' una questione di SPI che non ho capito?

Grazie mille
Luca

Tag-A_su-A.PNG

Tag-A_su-A_e_Tag-B_su-B.PNG

Tag-B_su-B.PNG

Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

Ciao,
nonostante i miei ulteriori test non sono riuscito a risolvere.
Qualcuno può consigliarmi in merito?
Grazie mille
Luca

Se nessuno ti ha risposto probabilmente nessun ha realizzato una configurazione come la tua ... ::slight_smile:

L'unica è, ogni tanto, riportare in vita il thread facendo "up" e sperare che passi qualcuno che ha avuto la tua stessa esigenza.

Guglielmo

Ciao a tutti,
la soluzione potrebbe essere che a quanto pare indipendentemente dalla prima inizializzazione dell'oggetto mfrc522 (nel mio caso mrf522a e mfr522b) nel loop bisogna comunque richiamare

mfrc522a.PCD_Init();

e soprattutto dopo la lettura utilizzare le funzioni

//Halt PICC
mfrc522a.PICC_HaltA();
// Stop encryption on PCD
mfrc522a.PCD_StopCrypto1();

per pemettere la corretta lettura dal lettore successivo.
Immagino dipenda dal protocollo I2C che deve liberare la comunicazione fra i due lettori.

Ora a me funziona ma la mia conclusione è empirica.
Se qualcuno la può confermare o confutare, ben venga!
Luca