RFID-RC522: Karte nicht erkannt.

Hallo zusammen,

ich versuche schon seit Tagen einen RFID-RC522 an einem ESP32 bzw. NodeMCU (ESP8266) zu laufen zu bringen.
Da ich mir nicht mehr weiter weis hoffe ich ihr könnt mir einen Tip geben woran es liegten könnte.
Entwicklungsumgebung:

  • Platformio (core: 5.0.3, Home: 3.3.1)
  • Plattform: espressif32 @2.1.0; espressif8266 @2.6.2
  • Framework: Arduino
  • MFR522 lib: miguelbalboa/MFRC522@^1.4.7

RFID-RC522 habe ich von 2 Lieferanten je 2 verwendet.
Je an einem NodeMCU und ESP32 Dev auf einem Breadboard.
Bei allen habe ich das gleiche Verhalten.
Versionsabfrage und Selbsttest geht:

--- Available filters and text transformations: colorize, debug, default, direct, esp8266_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at http://bit.ly/pio-monitor-filters
--- Miniterm on COM6 115200,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
Trigger come in 10s
Firmware Version: 0x92 = v2.0


MFRC522 Digital self test


Firmware Version: 0x92 = v2.0

Only known versions supported

Performing test...

Result: OK

Scan PICC to see UID, SAK, type, and data blocks..

Wenn ich eine Karte/Chip dran halte wird diese nicht erkannt. Karten und Chips kann ich mit dem Smartphone lesen!
Trace mit einem Logic-Analyser (SPI) sieht vernünftig aus, zumindest scheint die Kommunikation zu gehen.
Habe auch 3.3V aus einem Labornetzteil angelegt.
Ich glaube wohl nicht, dass ich 4 RFID-RC522 von zwei Lieferanten habe, die defekt sind.

Als Anlage mein Testcode auf dem NodeMCU (ESP32 Dev ist gleiche Code nur die Pin's halt anders)
Gruß
Stefan

rfid-rc522.jpg

coderfid.txt (2.29 KB)

rfid-rc522.jpg

Hast du die RFID-Leser mal an einem UNO o.ä. getestet ?
Wenn nicht, solltest du das machen, um sicher zu zu sein, das alles funktioniert.
Danach kannst du doch problemlos auf die ESP umsteigen.

Und poste deinen Sketch bitte direkt im Forum in Code-Tags.
Dann wird dieser Sketch für alle besser lesbar.

Hab nur Mega und NANOs.
Dann besorge ich mir einen.

stefana20:
Hab nur Mega und NANOs.
Dann besorge ich mir einen.

Der Nano geht auch, hat auch einen Atmega328p drauf, daher kompatibel.

Ich bin mal so frei… Sketch des TOs

#include <Arduino.h>
#include <SPI.h>
#include <MFRC522.h>
 
//#define RST_PIN 9 // Configurable, see typical pin layout above
//#define SS_PIN 10 // Configurable, see typical pin layout above
const int RST_PIN = D3; // Reset pin
const int SS_PIN = D8;  // Slave select pin
const int trigger = D1; // for logic analyser

// const int irq = D2;
// byte regVal = 0x7F;
 
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance

void setup() {
Serial.begin(115200); // 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
mfrc522.PCD_Init(); // Init MFRC522
delay(2000);
 pinMode(trigger,OUTPUT);
 
 digitalWrite(trigger,LOW);
 Serial.println(F("Trigger come in 10s"));
 delay(10000);

 digitalWrite(trigger,HIGH);
mfrc522.PCD_DumpVersionToSerial(); // Show details of PCD - MFRC522 Card Reader details
Serial.println(F("*****************************"));
  Serial.println(F("MFRC522 Digital self test"));
  Serial.println(F("*****************************"));
  mfrc522.PCD_DumpVersionToSerial();  // Show version of PCD - MFRC522 Card Reader
  Serial.println(F("-----------------------------"));
  Serial.println(F("Only known versions supported"));
  Serial.println(F("-----------------------------"));
  Serial.println(F("Performing test..."));
  bool result = mfrc522.PCD_PerformSelfTest(); // perform the test
  Serial.println(F("-----------------------------"));
  Serial.print(F("Result: "));
  if (result)
    Serial.println(F("OK"));
  else
    Serial.println(F("DEFECT or UNKNOWN"));
  Serial.println();
//mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
digitalWrite(trigger,LOW);
Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
}
 
void loop() {
 delay(5000);
digitalWrite(trigger,HIGH);
if ( ! mfrc522.PICC_IsNewCardPresent()) {
  digitalWrite(trigger,LOW);
return;
}
Serial.println(F("New Card found"));
 delay(200);
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
digitalWrite(trigger,LOW);
return;
}
Serial.println(F("Card read"));
// Dump debug info about the card; PICC_HaltA() is automatically called
mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
digitalWrite(trigger,LOW);
delay(1000);

}

Der UNO ist da und habe die RFID Inputs über einen Level-Shifter angeschlossen.
Getestet habe ich mit 2 RFID Boards von 2 Lieferanten.
Karten können mit dem Handy gelesen werden: Tag Typ: ISO 14443-3A.
Versionsabfrage und Selbsttest sind immer noch OK.
Man kann davon ausgehen, dass die Kommunikation UNO - Reader funktioniert.
Aber Karten werden immer noch nicht erkannt.
IDE:

  • Platformio (core: 5.0.3, Home: 3.3.1)
  • platform = atmelavr
    board = uno
    framework = arduino (version=1.8.3)
  • MFR522 lib: miguelbalboa/MFRC522@^1.4.7
#include <Arduino.h>
#include <SPI.h>
#include <MFRC522.h>

/*
 * Write personal data of a MIFARE RFID card using a RFID-RC522 reader
 * Uses MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT. 
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 *
 * Hardware required:
 * Arduino
 * PCD (Proximity Coupling Device): NXP MFRC522 Contactless Reader IC
 * PICC (Proximity Integrated Circuit Card): A card or tag using the ISO 14443A interface, eg Mifare or NTAG203.
 * The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com. 
 */

const int RST_PIN = 9; // Reset pin
const int SS_PIN = 10; // Slave select pin
const int trigger = 5; // for logic analyser

MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance

void setup()
{
  Serial.begin(115200); // 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
  mfrc522.PCD_Init(); // Init MFRC522
  pinMode(trigger, OUTPUT);
  digitalWrite(trigger, LOW);
  Serial.println(F("Trigger come in 5s"));
  delay(5000);
  digitalWrite(trigger, HIGH);
  mfrc522.PCD_DumpVersionToSerial(); // Show details of PCD - MFRC522 Card Reader details
  Serial.println(F("*****************************"));
  Serial.println(F("MFRC522 Digital self test"));
  Serial.println(F("*****************************"));
  mfrc522.PCD_DumpVersionToSerial(); // Show version of PCD - MFRC522 Card Reader
  Serial.println(F("-----------------------------"));
  Serial.println(F("Only known versions supported"));
  Serial.println(F("-----------------------------"));
  Serial.println(F("Performing test..."));
  bool result = mfrc522.PCD_PerformSelfTest(); // perform the test
  Serial.println(F("-----------------------------"));
  Serial.print(F("Result: "));
  if (result)
    Serial.println(F("OK"));
  else
    Serial.println(F("DEFECT or UNKNOWN"));
  Serial.println();
  //mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);
  digitalWrite(trigger, LOW);
  Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
}

void loop()
{
  delay(500);
  digitalWrite(trigger, HIGH);
  if (!mfrc522.PICC_IsNewCardPresent())
  {
    digitalWrite(trigger, LOW);
    return;
  }
  Serial.println(F("New Card found"));
  delay(200);
  // Select one of the cards
  if (!mfrc522.PICC_ReadCardSerial())
  {
    digitalWrite(trigger, LOW);
    return;
  }
  Serial.println(F("Card read"));
  // Dump debug info about the card; PICC_HaltA() is automatically called
  mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
  digitalWrite(trigger, LOW);
}

Dann sind deine Tags (Karten) nicht kompatibel zu deinem Reader.
Da gibt es Unterschiede in Frequenz und Datenprotokoll.

Waren aber bei den Reader :confused:

stefana20:
Waren aber bei den Reader :confused:

Ok, dann habe ich keine Idee mehr, sieht alles soweit ok aus.

@Stefan: Du nimmst zum Triggern Deines LA den Pin 5. Das kann funktionieren, scheint aber beim Mega lt. der Tabelle der RESET zu sein. Das solltest Du mal entzerren.

Wenn ich mich recht erinnere, zickt mfrc522.PICC_IsNewCardPresent() gelegentlich. Wenn das schiefgeht, versuch direkt danach nochmal.

*** Problem gefunden ***

Wenn man den PCD_PerformSelfTest() gemacht hat bleibt der Reader hängen.
Entweder muss man nach PCD_PerformSelfTest() ein neues PCD_init() absetzen oder den PCD_PerformSelfTest() gleich sein lassen.
Läuft jetzt mit UNO und NodeMCU sowohl in der Arduino IDE als auch in platformIO
Gruß
Stefan

Na prima. Danke für die Rückmeldung!

stefana20:
*** Problem gefunden ***

Wenn man den PCD_PerformSelfTest() gemacht hat bleibt der Reader hängen.
Entweder muss man nach PCD_PerformSelfTest() ein neues PCD_init() absetzen oder den PCD_PerformSelfTest() gleich sein lassen.
Läuft jetzt mit UNO und NodeMCU sowohl in der Arduino IDE als auch in platformIO

Ahh ok. Danke auch für die Rückmeldung.