Probleme mit MFRC522

Hall zusammen,
ich entwickle aktuell ein spiel in dem Mem
ory Karten mittels RFID Tags eingelesen werden sollen.
Die eingelesenen Tags werden über Seriell mittels JSON Format an die GUI in processing geschickt.
Leider habe ich immer wieder probleme mit den MFRC522 RFID Lesern.
Mal funktionieren Sie, mal nicht. Mal nur einer mal alle drei...ich fange langsam echt an mir selber zu zweifeln...Vielleicht könnt ihr mir ja helfen den Fehler zu finden warum die MFRC522 nicht zuverlässig funktionieren.
Ich benutze folgende Hardware:
1x Arduino Uno
3x MFRC522 RFID Leser
zusätzlich noch ein LEDs und einen Button, das funktioniert aber zum glück.

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

#define RST_PIN         9          
#define SDA_9_PIN        7         
#define SDA_8_PIN        8          
#define SDA_7_PIN        10
#define NR_OF_READERS   3

byte SDAPins[] = {SDA_9_PIN, SDA_8_PIN, SDA_7_PIN};

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

int LED_0 = A0;
int LED_1 = A1;
int LED_2 = A2;
int LED_3 = A3;
int LED_4 = A4;
int LED_5 = A5;
String str_rfid0;
String str_rfid1;
String str_rfid2;

int BUTTON_2 = A6;
int buttonstatus = 0;

int LED[] = {LED_0, LED_1, LED_2, LED_3, LED_4, LED_5};
String str_rfid[]={str_rfid0,str_rfid1,str_rfid1};

StaticJsonDocument<500> jsonDoc;

char buffer1[500];
char buffer2[500];
boolean copy = true;
boolean state0;
boolean state1;
boolean state2;
boolean state[] = {state0, state1, state2};

void setup() {

  pinMode(BUTTON_2, INPUT);

  Serial.begin(9600); 
  while (!Serial);   

  SPI.begin();        

  for (uint8_t i = 0; i < 6; i++) {
    pinMode(LED[i], OUTPUT);
    digitalWrite(LED[i], HIGH);
    delay(200);
    digitalWrite(LED[i], LOW);
  }
  for (int reader = 0; reader < NR_OF_READERS; reader++) {
    Serial.print("in for. Iteration round: ");
    Serial.println(reader);
    rfid[reader].PCD_Init(SDAPins[reader], RST_PIN); // Init each MFRC522 card
    rfid[reader].PCD_DumpVersionToSerial();
    delay(10);
    turn_red_on(reader);
  }
  delay(500);
}

void loop() {
  jsonDoc["Board"]="Uno";
  
  buttonstatus = digitalRead(BUTTON_2);
  if (buttonstatus == HIGH) {
    led_disco();
  }
  
  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    digitalWrite(SDAPins[reader],HIGH);
    rfid[reader].PCD_SetAntennaGain(rfid[reader].RxGain_max);
    char str[32]="";
    
    if (rfid[reader].PICC_IsNewCardPresent() && rfid[reader].PICC_ReadCardSerial()) {
     array_to_string(rfid[reader].uid.uidByte,4,str);
     str_rfid[reader] = str;    
    }
    FillJson(reader,str_rfid[reader]);
    rfid[reader].PICC_HaltA();
  }
   serializeJson(jsonDoc, buffer1);
     Serial.println(buffer1);
     if(Serial.available()){
      int val=Serial.parseInt();
      read_input(val);
     }
     delay(200);
}

void array_to_string(byte array[], unsigned int len, char buffer[]) {
  for (unsigned int i = 0; i < len; i++) {
    byte nib1 = (array[i] >> 4) & 0x0F;
    byte nib2 = (array[i] >> 0) & 0x0F;
    buffer[i * 2 + 0] = nib1  < 0xA ? '0' + nib1  : 'A' + nib1  - 0xA;
    buffer[i * 2 + 1] = nib2  < 0xA ? '0' + nib2  : 'A' + nib2  - 0xA;
  }
  buffer[len * 2] = '\0';
}
void turn_green_on(int reader) {
  digitalWrite(LED[reader * 2], LOW);
  digitalWrite(LED[reader * 2 + 1], HIGH);
}
void turn_red_on(int reader) {
  digitalWrite(LED[reader * 2], HIGH);
  digitalWrite(LED[reader * 2 + 1], LOW);
}
void led_disco() {
  for (int i = 0; i < 6; i++) {
    digitalWrite(LED[i], LOW);
  }
  delay(300);
  for (int i = 0; i < 6; i++) {
    digitalWrite(LED[i], HIGH);
    delay(300);
  }
  for (int i = 0; i < 6; i++) {
    digitalWrite(LED[i], LOW);
  }
  
for(int j=0;j<5;j++){
  for (int i = 5; i >= 0; i--) {
    digitalWrite(LED[i], HIGH);
    delay(100);
    digitalWrite(LED[i], LOW);
    }
  } 
  for(int j=0;j<3;j++){
    for(int i=0;i<6;i++){
      digitalWrite(LED[i],LOW);
    }
    delay(500);
        for(int i=0;i<6;i++){
      digitalWrite(LED[i],HIGH);
    }
    delay(500);
  }
}
void FillJson(uint8_t reader, String str){
  if(reader == 0){
    jsonDoc["RFID0"] = str;
  }
  if(reader == 1){
    jsonDoc["RFID1"] = str;
  }
  if(reader == 2){
    jsonDoc["RFID2"] = str;
  }
}
void read_input(int val){
  if(val ==3){
    led_disco();
      for(int i = 0;i<3;i++){
      turn_red_on(i);
      state[val]=false;
    }
  }else if(state[val] == false){
    state[val] = true;
    turn_green_on(val);
  }else{
    state[val] = false;
    turn_red_on(val);
  }
}

Vielen Dank und beste Grüße
bigmouse68

Dies ist der Code, den ich verwende.
Ich hatte viele Probleme, einen zuverlässigen Messwert zu erhalten, daher starte ich den RFID-Leser jetzt grundsätzlich jedes Mal neu. (translated from English :slight_smile: )

  restart(); // turn antenna ON  turn off afterwards
  bool present = PICC_IsNewCardPresent();
  bool readCard = PICC_ReadCardSerial();
  if (!present || !readCard) {
    stop();
    clearPreviousUid(); // allow retry here??
    return STATUS_CARD_NOT_FOUND;
  }
  bool uidsMatch = compareUid(&previousUid, &uid);
  if (uidsMatch) {
    // same uid, but try may have been removed
    // need to see if can read tray factor
    if (debugOut != NULL) {
      debugOut->println("Uid matches");
    }
  } else {
    // try changed
    // update previous uid
    if (debugOut != NULL) {
      debugOut->println("New Uid");
    }
    for (int i = 0; i < uidMaxByteSize; i++) {
      previousUid.uidByte[i] = uid.uidByte[i];
    }
  }
  if (debugOut != NULL) {
    for (byte i = 0; i < uid.size; i++) {
      debugOut->print(uid.uidByte[i] < 0x10 ? " 0" : " ");
      debugOut->print(uid.uidByte[i], HEX);
    }
    debugOut->println();
  }

RFID bedeutet funken. Zwar nur ein paar Zentimeter aber eben Funk der sich in alle Richtungen ausbreitet. Sind leigen die RFID-reader ganz nahe beieinander? Dann könnten das auch schlichtweg Interferenzen sein.

Hast du mal ausprobiert ob es besser funktioniert wenn die RFID-reader mindestens 20 cm weit auseinander liegen?

Ich weiß nicht ob das der Grund ist. Es ist aber einen Versuch wert.

Wenn es daran liegt sollte und bei deinem Spiel alle RFID-reader direkt nebeneinander liegen sollen, Haben die RFID-reader einen Aktivierungs/De-aktivierungseingang?

Alternativ könnte man auch die Spannungsversorgung ein/ausschalten.

vgs

hups doppel-post gelöscht. Das tut mir leid

Mein stop() schaltet die Antenne aus, was helfen sollte
dann restart() schaltet es ein

/**
   Turns the antenna on by enabling pins TX1 and TX2.
   After a reset these pins are disabled.
*/
void RFID::PCD_AntennaOn() {
  byte value = PCD_ReadRegister(TxControlReg);
  if ((value & 0x03) != 0x03) {
    PCD_WriteRegister(TxControlReg, value | 0x03);
  }
} // End PCD_AntennaOn()

/**
   Turns the antenna off by disabling pins TX1 and TX2.
*/
void RFID::PCD_AntennaOff() {
  PCD_ClearRegisterBitMask(TxControlReg, 0x03);
} // End PCD_AntennaOff()

void RFID::stop() {
  if (spiRunning) {
    spiRunning = false;
    PCD_AntennaOff();
    digitalWrite(_cs, HIGH); // Deselect
    hwspi._spi->end();
  }
}
void RFID::restart() {
  if (!spiRunning) {
    spiRunning = true;
    digitalWrite(_cs, HIGH); // Deselect
    hwspi._spi->begin(_sck, _miso, _mosi, _cs);
    PCD_AntennaOn();
  }
}

Chip-Select ist aktiv LOW. was versuchen Sie hier zu erreichen? (die Bibliothek übernimmt die Chip-Select für Sie)

Vielen Dank für den Hinweis.

digitalWrite(SDAPins[reader],HIGH);

Nach dem entfernen der Zeile sowie

rfid[reader].PCD_SetAntennaGain(rfid[reader].RxGain_max);

hat alles so funktioniert wie es soll :slight_smile:

Vielen Dank!

Cool!