Probleme mit SD Reader und RFID reader (MFRC522)

Hallo Arduino Community,

ich habe vor Kurzem versucht, einen SD-Kartenleser und einen MFRC522 (RFID Reader) gleichzeitig mit meinem Arduino Mega zu verwenden. Beide funktionieren einwandfrei, wenn sie einzeln angeschlossen sind, aber sobald ich beide gleichzeitig angeschlossen habe, scheint es zu Problemen zu kommen. Der Arduino Mega kann nicht mit dem RFID Reade komuniziern, wenn der SD reader auch nur verbunden ist.

Mein Aufbau:
SD reader:

  • MISO = PIN 50
  • MOSI = PIN 51
  • VCC = 5V
  • GND = GND (am Arduino)
  • CS = PIN 30
  • SCK = PIN 52

RFID reader(MFRC522):

  • SDA = PIN 41
  • SCK = PIN 52
  • MOSI = PIN 51
  • MISO = PIN 50
  • IRQ = nicht Verbunden
  • GND = GND(am Arduino)
  • RST = PIN 40
  • VCC = 3,3V

code

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

Sd2Card card;
SdVolume volume;
SdFile root;

#define CS_SD 30
#define RST_PIN 40
#define SS_PIN 41

MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;

void setup(){
  Serial.begin(9600);
  while (!Serial);
  SPI.begin();
  Serial.println("Initializing RFID...");
  mfrc522.PCD_Init();
  Serial.println("RFID initialized.");
  
  Serial.println("Initializing SD card...");
  if (!card.init(SPI_HALF_SPEED, CS_SD)) {
    Serial.println("SD card initialization failed.");
    return;
  }
  Serial.println("SD card initialized.");
  digitalWrite(CS_SD,HIGH);
}

void loop(){
  if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
    delay(50);
    Serial.println("_______");
    return;
  }
  
  Serial.print(F("Card UID:"));
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  }
  Serial.println();
  delay(2000);
}

Verwendet wird ein Arduino Mega,
ein MFRC522 RFID reader,
und ein SD reader:

Danke jetzt schon fĂĽr eure Antworten,
MFG

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

@nixzocker
sorg nach dem SPI begin dafĂĽr, dass der Cardreader die CS Leitung nicht belegt.

SPI.begin();
pinMode(SS, OUTPUT);       // der default SS vom MEGA (53) 
pinMode(CS_SD, OUTPUT);    // weil nachfolgende schon darauf geschrieben wird
digitalWrite(CS_SD, HIGH); // SD jetzt schon high setzen
// und jetzt erst den RFID

// und dann die SD init...

wenns nicht funktioniert, zeig mal die Serial Outputs

Ich habe den Code so geändert, dass der cs-pin, des SD-reader ist die ganze zeit auch high (außer am Anfang), jedoch der des RFID geräts auch.

Wenn alles verkabelt ist der cs-pin beider Geräte gleichzeitig HIGH, außer man trennt den MISO-pin des SD-readers, dann ist der cs-pin am RFID gerät LOW, muss ich eine Diode oder etwas verwenden?

nein.

  • neuen code posten.
  • Output von der seriellen Schnittstelle posten.
  • Schaltplan posten
  • Bilder posten auf denen jede einzelne Verbindung eindeutig erkennbar ist.
#include <SPI.h>
#include <SD.h>
#include <MFRC522.h>

Sd2Card card;
SdVolume volume;
SdFile root;

#define CS_SD 30
#define RST_PIN 40
#define SS_PIN 41

MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;

void setup(){
  Serial.begin(9600);
  while (!Serial);
  SPI.begin();
  pinMode(SS, OUTPUT);
  pinMode(CS_SD,OUTPUT);
  digitalWrite(CS_SD,HIGH);
  Serial.println("Initializing RFID...");
  mfrc522.PCD_Init();
  Serial.println("RFID initialized.");
  
  Serial.println("Initializing SD card...");
  if (!card.init(SPI_HALF_SPEED, CS_SD)) {
    Serial.println("SD card initialization failed.");
    return;
  }
  Serial.println("SD card initialized.");
  digitalWrite(CS_SD,HIGH);
}

void loop(){
  if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
    delay(100);
    Serial.println("_");
    return;
  }
  
  Serial.print(F("Card UID:"));
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  }
  Serial.println();
  delay(2000);
}

Der Serielle Output:

Initializing RFID...
RFID initialized.
Initializing SD card...
SD card initialized.
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_

wenn der SD Reader verbunden ist, geht der rfid reader nicht, jedoch der SD reader.


Moin @nixzocker und @noiasca,

ich habe an anderer Stelle gelesen, dass es SD Card Reader geben soll, die das MISO-Signal nicht sauber freigeben und damit die Kommunikation anderer Geräte verhindern:

Siehe z.B. hier
https://forum.arduino.cc/t/spi-sd-card-reader-other-spi-device-not-working-together/447006/3

oder auch hier
https://forum.arduino.cc/t/rfid-rc522-sd-card-both-on-spi-not-working-together/392686/5

Eine einfache Abhilfe soll möglich sein, wenn man in die MISO-Leitung des SD Card Readers zum Arduino einen Widerstand einbaut (1 bis 3.3 KOhm, muss man ausprobieren).

Wenn der SD Card Reader das Signal "hochhält", kann das 2. Gerät übersteuern ...

Man muss die Ursache manchmal auch bei der Hardware suchen :wink:

Viel Erfolg!

2 Likes

Danke für die Lösung, bei mir hat es aber nur mit einem 1kOhm funktioniert.
Vielen Danke

Gerne, letztlich ist es dieses Forum, das für viele Probleme die Lösungen bereithält. Man muss sie nur in der Fülle an Informationen finden. :wink:

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