Problema lettura doppio RFID.-RC522

Salve,

ho acquistato due lettori RFID-RC522.

Inizialmente ho provato a utilizzarne solo uno seguendo questo esempio:

e fin qui tutto funziona senza problemi

dopodichè ho provato a collegare anche il secondo condividendo i pin (SCK, MOSI, MISO e RST) tra i due sensori e lasciando indipendenti solo i due cavi SDA.

ho utilizzato il seguente sketch

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

#define RST_PIN         9          // Configurable, see typical pin layout above
#define SS_1_PIN        10         // Configurable, take a unused pin, only HIGH/LOW required, must be diffrent to SS 2
#define SS_2_PIN        8          // Configurable, take a unused pin, only HIGH/LOW required, must be diffrent to SS 1

#define NR_OF_READERS   2

byte ssPins[] = {SS_1_PIN, SS_2_PIN};

MFRC522 mfrc522[NR_OF_READERS];   // Create MFRC522 instance.

/**
 * Initialize.
 */
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

  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    mfrc522[reader].PCD_Init(ssPins[reader], RST_PIN); // Init each MFRC522 card
    Serial.print(F("Reader "));
    Serial.print(reader);
    Serial.print(F(": "));
    mfrc522[reader].PCD_DumpVersionToSerial();
  }
}

/**
 * Main loop.
 */
void loop() {

  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    // Look for new cards

    if (mfrc522[reader].PICC_IsNewCardPresent() && mfrc522[reader].PICC_ReadCardSerial()) {
      Serial.print(F("Reader "));
      Serial.print(reader);
      // Show some details of the PICC (that is: the tag/card)
      Serial.print(F(": Card UID:"));
      dump_byte_array(mfrc522[reader].uid.uidByte, mfrc522[reader].uid.size);
      Serial.println();
      Serial.print(F("PICC type: "));
      MFRC522::PICC_Type piccType = mfrc522[reader].PICC_GetType(mfrc522[reader].uid.sak);
      Serial.println(mfrc522[reader].PICC_GetTypeName(piccType));

      // Halt PICC
      mfrc522[reader].PICC_HaltA();
      // Stop encryption on PCD
      mfrc522[reader].PCD_StopCrypto1();
    } //if (mfrc522[reader].PICC_IsNewC
  } //for(uint8_t reader
}

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

Il problema è che quando collego più di un sensore le letture iniziano a essere “casuali”. devo mettere e togliere più volte la scheda per vedere una lettura e in alcuni casi devo ripetutamente riavviare arduino. Quando tolgo una delle due schede e uso l’altra singolarmente tutto funziona correttamente.

Ho provato anche a utilizzare altre schede (ne ho comprato 5 in stock) ma il problema non cambia. Uno funziona e due no.

Avete qualche idea sul perchè di questa anomalia?

Saluti e grazie in anticipo per la disponibilità :slight_smile:

Luca

Prova a dare un’occhiata qui.

Ciao,
P.

Ciao,

grazie della risposta ho provato a leggere tutti i thread già aperti che ho trovato su questo argomento.

Ho provato a riscrivere il software come suggerito nei thread e a cambiare i pin SDA e RST ma nulla.

Quando è solo uno funziona regolarmente, quando aggiungo il secondo il funzionamento diventa "random"

Tra l'altro molte persone nei thread alla fine non hanno risolto.

Volevo capire se sbaglio qualcosa a livello di collegamenti (il software sono abbastanza sicuro sia corretto) oppure è un limite del bus di Arduino.

Grazie mille Luca

Conosci come funziona un bus SPI? ... ecco, Arduino ne rispetta il funzionamento, quindi, se qualche cosa non va, o è colpa dei collegamenti (magari cavi troppo lunghi, il bus SPI NON è fatto per essere portato in giro) o è colpa del programma che gestisce male il segnale SS che deve essere attivato SOLO su un'unità alla volta (è quello che decide chi usa il bus SPI).

Quindi, se non ti funziona, ci sono sollo tre possibilità:

  1. l'insieme dei cavi è troppo lungo ed introduce una capacità parassita troppo alta per il bus SPI.

  2. Il software non gestisce correttamente il segnale SS.

  3. L'hardware che connetti non rispetta le specifiche del bus SPI (es. rimane attivo nonostante il il pin SS gli indichi che deve disattivarsi).

Senza un adeguata strumentazione è piuttosto difficile capire esattamente dove è il problema ... ::)

Guglielmo

Ciao,

anzitutto Guglielmo grazie della risposta :slight_smile:

allora:

  • attualmente il circuito è su breadboard (gli rfid sono distanti pochi centimetri da arduino)

  • non ho usato alcun tipo di componente a parte gli rfid (non ho messo resistenze per intenderci, credo non servano ma potrei sbagliarmi)

  • ho provato a modificare il codice cercando di stoppare il singolo dispositivo dopo ogni lettura (dovrebbero essere le funzioni PICC_HaltA() e PCD_StopCrypto1() che ho spostato fuori dall’if)

questo è il codice che sto utilizzando attualmente

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

#define RST_PIN         9  
#define SS_1_PIN        10
#define SS_2_PIN        8 
#define NR_OF_READERS   2

byte ssPins[] = {SS_1_PIN, SS_2_PIN};

MFRC522 mfrc522[NR_OF_READERS];   // Create MFRC522 instance.

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

  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    mfrc522[reader].PCD_Init(ssPins[reader], RST_PIN);
  }
}

void loop() {
  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    if (mfrc522[reader].PICC_IsNewCardPresent()) {
      if (mfrc522[reader].PICC_ReadCardSerial()) {
        Serial.println("Reader: " + String(reader));

        Serial.print("Card UID: ");
        dump_byte_array(mfrc522[reader].uid.uidByte, mfrc522[reader].uid.size);
        Serial.println();
      }
    }

    // Halt PICC
    mfrc522[reader].PICC_HaltA();
    // Stop encryption on PCD
    mfrc522[reader].PCD_StopCrypto1();
  }
}

void dump_byte_array(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

lo schema elettrico è questo: (con aggiunta del pin RST che è condiviso tra tutti)

attualmente mi sto accorgendo che il comportamento non è più “random” (forse non lo è mai stato) ma ha una logica: i codici vengono letti solamente quando entrambi i tag sono poggiati sui rispettivi sensori. Praticamente se li poggio entrambi ottengo due letture con i rispettivi codici, se invece poggio solamente uno dei due (ma non l’altro) non legge nulla.

Ho fatto un pò di debug e sembra che nel secondo caso non viene eseguito neanche il primo if, ovvero:

if (mfrc522[reader].PICC_IsNewCardPresent()) {

se invece poggio entrambi i tag sono eseguite entrambe le letture.

Avete qualche idea sul motivo?

Grazie in anticipo per la disponibilità

Ho allegato una foto del circuito realizzato, magari può essere utile

Luca