ESP32 mehrere RFID Lesegeräte

Hallo zusammen,
Ich würde gerne für ein Schulprojekt zwei RFID Lesegeräte(MFRC522) und ein LCD display (16x2) an einem ESP32 betreiben. Ich bin nur aktuell in der Pinbelegung etwas ratlos. Also zum einen ist die Frage ob es überhaupt möglich ist, und zum anderen wie eine Verkabelung dann aussehen würde.

Vielen Dank für die Hilfe im vorraus!
LG
Hyper

[Edit: Ich nutze aktuell folgende Verkablung sowie Code: ESP32 with MFRC522 RFID Reader/Writer (Arduino IDE) | Random Nerd Tutorials]

ja das ist möglich

Häng die I2C Pins an SDA (GPIO21) und SCL (GPIO22).

Wenn das nicht geht. Wähle andere Pins.

Laut dem in

abgedruckten Sketchen ist das RFID Modul über SPI angeschlossen.

Alternativ könnte I2C verwendet werden.

SPI spricht die einzelnen Slaves durch das ein EN / SS Signal pro Slave.
Mir scheint daß auf dem Modul als RST bezeichnet ist. Im Sketch habe ich nicht verstanden wie man die EN auf einen gewissen Pin festlegen kann.

bei I2C werden die SLaves durch eine 7 Bit Adresse voneinander unterschieden. Meist kann hat die i2C Adresse des Bausteins durch einige Eingänge auswählen. Ein Teil der 7 Bit adresse ist fix und einige der niedrigsten Bit kann man einstellen. Dies wird auf den Platinen meist durch Steckbrücken oder Lötbrücken eingestellt.

Grüße Uwe

Kleiner Hinweis.

Bei den MFRC522 ist i2c Ansteuerung so gut wie unmöglich.
Grund :

  1. Das Modul hat ein Konstruktionsfehler (den man mit hervorragenden Lötkenntnissen beseitigen kann. Siehe RC522 RFID-RC522 Switching SPI to UART interface or i2c ! POSSIBLE !

  2. Das Modul kann nicht adressiert werden, was bei dein Projekt aber bei i2c Zwingend erforderlich ist.

Es gibt aber eine Möglichkeit 2 Module zu benutzen. (Warum auch immer).

Nehme SPI-Bus. Dann musst du nur über CS (Cable-Select) das richtige Modul ansteuern.

Ach und noch was. Das Modul frisst nur MiFare Karten/Chips. Die günstigeren NFC-Tag Chips habe ich damit nicht ans laufen bekommen.

Diese und viele anderen Gründe haben mich dazu bewogen das Modul gegen ein PN532 auszutauschen. Der Frisst viel mehr, besonders die NTAG-Chips, welche ich in der Aufkleber-Variante benutze.
Leider ist der PN532 bedeutend teurer als das blaue Modul. Hier ein Beispiel.

Aber der PN532 ist auch NICHT Adressierbar, was bedeutet das du nur 1 Modul am i2c anklemmen kannst. Bei SPI ist das wegen CS egal.

Ach und noch ein Tipp.
Entscheide dich für ein Kartentyp. Du musst sonst richtig viel Programmieren.

Hier noch ein Anschlußschema für den PN532.

Über DIP-Schalter muss man nur das einstellen vorher.
Gruß

Pucki

Hey,
Erstmal Danke für die Ganze Hilfe hab das Programm nun mit folgender Verkabelung :


angeschlossen und ich nutze nun diesen Skript:

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

// Pins für RFID-Module
#define SS_1 5  // RFID 1
#define SS_2 4  // RFID 2
#define RST_1 22
#define RST_2 21

// SPI-Schnittstelle für beide Module
MFRC522 rfid1(SS_1, RST_1);
MFRC522 rfid2(SS_2, RST_2);

void setup() {
    Serial.begin(115200);
    delay(2000);
    SPI.begin();  // SPI starten
    rfid1.PCD_Init();
    rfid2.PCD_Init();
}

void loop() {
    // RFID 1 prüfen
    if (rfid1.PICC_IsNewCardPresent() && rfid1.PICC_ReadCardSerial()) {
        Serial.println("1");
        rfid1.PICC_HaltA();  // Karte zurücksetzen
        delay(500);  // Kurze Pause, um den Leser wieder bereit zu machen
    }

    // RFID 2 prüfen
    if (rfid2.PICC_IsNewCardPresent() && rfid2.PICC_ReadCardSerial()) {
        Serial.println("2");
        rfid2.PICC_HaltA();  // Karte zurücksetzen
        delay(500);  // Kurze Pause, um den Leser wieder bereit zu machen
    }

    delay(100);  // Kurze Verzögerung, damit es nicht zu schnell liest
}

Das Programm erkennt aber leider nur wenn ich einen Chip vor den ersten Leser halte. ch habe die beiden Lesegeräte auch bereits getauscht dies ändert nichts am Problem und es werden nur Eingaben am Lesegerät 1 erkannt. LG

Es gibt eine einfach Lösung die du dir erarbeiten musst aber.

Sauge dir die Libs und schau in die Beispiele.

Dort findest du unter "ReadUidMultiReader" eine "ReadUidMultiReader.ino" .

In diesen Code wird beschrieben wie du es machen musst.

Deine Code dort oben ist nach diesen Beispiel NICHT geeignet. Ach und dein Anschlusschema auch nicht.

Hier mal eine Copy der INO-Datei.

/**
 * --------------------------------------------------------------------------------------------------------------------
 * Example sketch/program showing how to read data from more than one PICC to serial.
 * --------------------------------------------------------------------------------------------------------------------
 * This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
 *
 * Example sketch/program showing how to read data from more than one PICC (that is: a RFID Tag or Card) using a
 * MFRC522 based RFID Reader on the Arduino SPI interface.
 *
 * Warning: This may not work! Multiple devices at one SPI are difficult and cause many trouble!! Engineering skill
 *          and knowledge are required!
 *
 * @license Released into the public domain.
 *
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             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 1    SDA(SS)      ** custom, take a unused pin, only HIGH/LOW required **
 * SPI SS 2    SDA(SS)      ** custom, take a unused pin, only HIGH/LOW required **
 * 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
 *
 * More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
 *
 */

#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 different to SS 2
#define SS_2_PIN        8          // Configurable, take a unused pin, only HIGH/LOW required, must be different 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);
  }
}

Gruß

Pucki

Nachtrag:

Beachte auch das NUR der CS-Pin (im Code als SS-Pin benannt) für jeden Reader unterschiedlich ist. Was im Umkehrschluss bedeutet das der RST-Pin gleich ist. :wink:

Gruß

Pucki

Bitte die Überschrift lesen: Es geht hier nicht um AVR Arduinos, sondern um ESP32.
Der Einwand mit dem gleichen RST wäre einen Versuch wert.

@hypergamer7391
Ein wenig Stochern im Nebel (Ich habe keine zwei Leser zum Ausprobieren hier):

  • Hast Du Deinen Code mal ohne die delay(500) versucht? Ich meine, dass die entbehrlich sind, weil die MFRC522-Library selbst merkt, wenn die Karte weg und eine neue da ist.
  • Was passiert, wenn Du zunächst den Leser 2 und dann erst 1 abfragst? (Code umstellen)
  • Was passiert, wenn Du die SS (CS) vertauscht? (Hardware umstellen)
  • Hilft gleicher RST?

Ja, aber das ist völlig egal.

Die Libs läuft auf einen Nano + ein ESP32 DEV v4 bei mir.
Der TO muss halt nur in den Layout-Plan seines Modells schauen und die SPI-Schnittstelle suchen.
Etwas was er im großen und ganzen schon gemacht hat.

Den Code da habe nicht ich geschrieben sondern ist nur eine Kopie des Originalcode aus den Beispielen der Libs .

Er sollte zeigen wie man mit Array das ganze regelt und das die Erfinder immer den selben RST -Pin nutzen.

Gruß

Pucki

Moin,
vielen Dank für die Hilfe der Code funktioniert super!
LG

Das freut mich :wink:

Gruß

Pucki

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.