Multipli RFID su Arduino UNO

Salve
Per un progetto/svago ho collegato 5 RFID MFRC522 su un arduino UNO tramite breadboard collegando i vari pin in questo modo:
SCK: 13
MOSI: 11
GND = GND
MISO = 12
RST = 9
3,3v = 3,3V

Singolarmente funzionano tutti senza problemi con il codice fornitomi come esempio dalla libreria.
Il problema sopraggiunge quando ne collego più di 4, perchè fino a 4 funzionano tutti senza problemi. Problema che arriva quando collego il quinto.
Infatti il quinto (l’ultimo inserito) non rileva nessuna card RFID. Pensando di aver sbagliato a collegare i cavi, essendo diventata una foresta di cavetti, provo ad invertire uno dei 4 funzionanti col quinto non funzionante, ma questo prova mi dimostra di aver collegato bene i cavi, dato che scambiandoli quello “non funzionante” funziona perfettamente. Quindi il mio dubbio è che Arduino riesca a supportare fino a 4 RFID contemporaneamente, anche se in un video tutorial sui multi-RFID, dice che se ne possono collegare fino a 6.
Inoltre, quando upload un codice su arduino, il led-RFID dell’ultima schedina collegata sembra quasi spegnersi, mentre gli altri 4 led delle altre 4 schedine sono perfettamente illuminati.
Quindi mi domandavo se con un arduino MEGA avrei risolto questo problema, essendo impegnato in un altro groviglio di cavetti, ho esitato ancora a smontarlo.
Lascio il codice che uso per i 5 RFID:

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


const byte numReader = 5; //numero di schede RFID

const byte ssPins[] = {2, 10, 6, 4, 3}; //numero dei pin collegati

const byte resetPin = 9; // condividono lo stesso reset pin

MFRC522 mfrc522[numReader];


void setup() {
  // put your setup code here, to run once:

  Serial.begin(9600);
  Serial.println(("Serial communication started"));

  SPI.begin();

  for (int i = 0; i < numReader; i++) {
    Serial.println("Reader: " + String(i));
    mfrc522[i].PCD_Init(ssPins[i], resetPin);
    delay(100);
    Serial.println(("pin: " + String(ssPins[i])));
    Serial.println(F(". Version : "));
    mfrc522[i].PCD_DumpVersionToSerial();
    Serial.println("\n");
    Serial.println("\n");
  }

}

void loop() {

    if (mfrc522[0].PICC_IsNewCardPresent() && mfrc522[0].PICC_ReadCardSerial()) {
        String readRFID = "";
        readRFID=getUID(0);
        Serial.println("RFID: " + String(0)  +  " - ID: " + readRFID + "- PIN:[" + String(ssPins[0]) + "]");
        mfrc522[0].PICC_HaltA();
        mfrc522[0].PCD_StopCrypto1();
    }
    delay(10);
        if (mfrc522[1].PICC_IsNewCardPresent() && mfrc522[1].PICC_ReadCardSerial()) {
        String readRFID = "";
        readRFID=getUID(1);
        Serial.println("RFID: " + String(1)  +  " - ID: " + readRFID + "- PIN:[" + String(ssPins[1]) + "]");
        mfrc522[1].PICC_HaltA();
        mfrc522[1].PCD_StopCrypto1();
    }
  delay(10);
        if (mfrc522[2].PICC_IsNewCardPresent() && mfrc522[2].PICC_ReadCardSerial()) {
        String readRFID = "";
        readRFID=getUID(2);
        Serial.println("RFID: " + String(2)  +  " - ID: " + readRFID + "- PIN:[" + String(ssPins[2]) + "]");
        mfrc522[2].PICC_HaltA();
        mfrc522[2].PCD_StopCrypto1();
    }
  delay(10);
        if (mfrc522[3].PICC_IsNewCardPresent() && mfrc522[3].PICC_ReadCardSerial()) {
        String readRFID = "";
        readRFID=getUID(3);
        Serial.println("RFID: " + String(3)  +  " - ID: " + readRFID + "- PIN:[" + String(ssPins[3]) + "]");
        mfrc522[3].PICC_HaltA();
        mfrc522[3].PCD_StopCrypto1();
    }
  delay(10);
        if (mfrc522[4].PICC_IsNewCardPresent() && mfrc522[4].PICC_ReadCardSerial()) {
        String readRFID = "";
        readRFID=getUID(4);
        Serial.println("RFID: " + String(4)  +  " - ID: " + readRFID + "- PIN:[" + String(ssPins[4]) + "]");
        mfrc522[4].PICC_HaltA();
        mfrc522[4].PCD_StopCrypto1();
    }
    delay(10);
}


String getUID(int k){
  String uid="";
  for(int i=0; i < mfrc522[k].uid.size; i++){
     uid += mfrc522[k].uid.uidByte[i] < 0x10 ? "0" : "";
     uid += String(mfrc522[k].uid.uidByte[i], HEX);
  }
  return uid;
}

Grazie per i consigli.

Ma li stai alimentando tutti con Arduino? ... perché non so quanto assorbe ogni lettore e se la corrente massima fornibile da Arduino sia sufficiente ... ::slight_smile:

Guglielmo

Il datasheet prevede circa 10mA per modulo. Se li alimenti tutti dal 3,3V di Arduino, il poveretto non ce la fa.

Ciao,
P.

eh si tutto da Arduino UNO. Avevo pensato anch’io fosse questa una possibile causa. Dovendo alimentarli tutti a 3,3v come consigliate di procedere? Usare un secondo arduino che mi fornisce solo tensione e smistare i 5 rfid tra i due arduino? Un powerbank con un uscita usb-pin a cui montare un modulo convertitore dc-dc regolabile a cui portare l’uscita del powerbank a 3,3v?

EDIT:
Nuove news:
Tramite la 3.3v di un altro arduino, alimento 2 RFID (che per comodità chiamo RFID-0 e RFID-2).
La GND però dev’essere quella del primo arduino a cui sono collegati gli altri 3 RFID.
Ora:

  • RFID-0 e RFID-2 comunque non rilevano alcuna schedina/ID
  • RFID-0 e RFID-2 alla pressione del tasto reset del primo Arduino, il loro led lampeggia, mentre quello degli altri 3 rfid non batte ciglio
  • Dei 3 rfid, collegati al primo arduino (RFID-1, RFID-3, RFID-4), uno di questi (RFID-4) non rileva anch’esso, nessuna schedina/ID.
    Amo questo mondo

EDIT:
Va bè, mi fermerò a 4 RFID pazienza, con 5 accadono cose strane ad ogni reset.
Grazie per i consigli

...ma prendere un alimentatore esterno a 3.3V per alimentare solo gli RFID no ? ? ? :o

Al limite, se non lo trovi, prendi un alimentatore da 5V ed usi un semplice step-down da pochi € e regoli esattamente a 3.3V l'uscita. L'importante è che il GND dell'alimentazione dei moduli RFID sia in comune con il GND di Arduino e che i fili di collegamento dei vari RFID siano corti e ben fatti (ricordati che stai su un bus SPI dove i segnali, di base, viaggiano a 4 MHz ... quindi, i fili, fanno da antenne ...).

Guglielmo