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.
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.
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ß
#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);
}
}
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.
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)
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.