Mehrere Module an Arduino Nano gleichzeitig anschließen

Hey,
Ich bin ziemlicher Anfänger und habe einen Arduino Nano an den ich einen RFID-Sensor (Mc522) und einen Micro SD Karten Modul anschließen. Beide müssen ja eigentlich an die pins 10-12 angeschlossen werden. Kann ich beides gleichzeitig anschließen an den Nano und wenn ja wie?

Ich habe es mit Änderungen im sketch probiert, ich möchte das SD Modul an 3-6 anschließen. Der ss pin (cs steht auf meinem Modul) ist dann an 6 angeschlossen.

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

File Textdatei;

const int chipSelectPin = 6; // Neuer SS-Pin

void setup() {
  Serial.begin(9600);
  Serial.println("Initialisiere SD-Karte");

  // Konfiguration der SPI-Kommunikation mit benutzerdefinierten Pins
  SPI.begin();
  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
  pinMode(chipSelectPin, OUTPUT);
  
  if (!SD.begin(chipSelectPin)) {
    Serial.println("Initialisierung fehlgeschlagen!");
    return;
  }

  Serial.println("Initialisierung abgeschlossen");

  Textdatei = SD.open("test.txt", FILE_WRITE);

  if (Textdatei) {
    Serial.println("Schreibe in Textdatei...");
    Textdatei.println("Funduino GmbH");
    Textdatei.println("1, 2, 3, 4, 5");
    Textdatei.println("a, b, c, d, e");
    Textdatei.println();
    Textdatei.close();
    Serial.println("Abgeschlossen.");
    Serial.println();
  } else {
    Serial.println("Textdatei konnte nicht erstellt werden");
  }

  Textdatei = SD.open("test.txt");

  if (Textdatei) {
    Serial.println("test.txt:");
    while (Textdatei.available()) {
      Serial.write(Textdatei.read());
    }
    Textdatei.close();
  } else {
    Serial.println("Textdatei konnte nicht geoeffnet werden");
  }
}

void loop() {
  // Der Loop bleibt leer.
}

Mit dem Code funktioniert es allerdings nicht, es kommt immer Initialisierung Fehlgeschlagen.

Gibt es überhaupt eine Möglichkeit, beides gleichzeitig anzuschließen?

Schau mall hier ist ein Bild wie man das macht.

SPI ist ein Bus: CLK, MISO und MOSI (oder wie sie heutzutage heissen) gehen an alle Teilnehmer. Für CS hat jeder Slave einen eigenen Pin, der vom Master als OUTPUT gesetzt wird.

Das ist sehr kompliziert, so wie ich es verstehe werden die beiden dann an die gleichen pins angeschlossen, nur entgegengesetzt?

Pinmode Output habe ich ja eingebaut für den CS pin, oder stimmt es so nicht?

Mit dem pinmode wäre es dann so?

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

File Textdatei;

const int misoPin = 3;       // MISO-Pin (D3)
const int mosiPin = 4;       // MOSI-Pin (D4)
const int sckPin = 5;        // SCK-Pin (D5)
const int chipSelectPin = 6; // CS-Pin (D6)

void setup() {
  Serial.begin(9600);
  Serial.println("Initialisiere SD-Karte");

  // Konfiguration der SPI-Kommunikation mit benutzerdefinierten Pins
  pinMode(chipSelectPin, OUTPUT);
  digitalWrite(chipSelectPin, HIGH); // SS-Pin auf HIGH setzen
  pinMode(misoPin, INPUT);
  pinMode(mosiPin, OUTPUT);
  pinMode(sckPin, OUTPUT);

  if (!SD.begin(chipSelectPin)) { // Benutzerdefinierten CS-Pin übergeben
    Serial.println("Initialisierung fehlgeschlagen!");
    return;
  }

  Serial.println("Initialisierung abgeschlossen");

  Textdatei = SD.open("test.txt", FILE_WRITE);

  if (Textdatei) {
    Serial.println("Schreibe in Textdatei...");
    Textdatei.println("Funduino GmbH");
    Textdatei.println("1, 2, 3, 4, 5");
    Textdatei.println("a, b, c, d, e");
    Textdatei.println();
    Textdatei.close();
    Serial.println("Abgeschlossen.");
    Serial.println();
  } else {
    Serial.println("Textdatei konnte nicht erstellt werden");
  }

  Textdatei = SD.open("test.txt");

  if (Textdatei) {
    Serial.println("test.txt:");
    while (Textdatei.available()) {
      Serial.write(Textdatei.read());
    }
    Textdatei.close();
  } else {
    Serial.println("Textdatei konnte nicht geoeffnet werden");
  }
}

void loop() {
  // Der Loop bleibt leer.
}

Nein!
nur so
MOSI, MISO,SCK sind festgelegte Pins die darf man bei Nano R§ nicht ändern.

MISO auf Pin 12
MOSI auf Pin 11
SCK auf Pin 13 Klemmen und nicht deklarieren, war mein .Fehler bei Beschreibung.
nur das lassen

const int chipSelectPin = 6; // CS-Pin  
#include <SPI.h>
#include <SD.h>

File Textdatei;

 
const int chipSelectPin = 6; // CS-Pin (D6)

void setup() {
  Serial.begin(9600);
  Serial.println("Initialisiere SD-Karte");

  // Konfiguration der SPI-Kommunikation mit benutzerdefinierten Pins
  pinMode(chipSelectPin, OUTPUT);
  digitalWrite(chipSelectPin, HIGH); // SS-Pin auf HIGH setzen
 

  if (!SD.begin(chipSelectPin)) { // Benutzerdefinierten CS-Pin übergeben
    Serial.println("Initialisierung fehlgeschlagen!");
    return;
  }

  Serial.println("Initialisierung abgeschlossen");

  Textdatei = SD.open("test.txt", FILE_WRITE);

  if (Textdatei) {
    Serial.println("Schreibe in Textdatei...");
    Textdatei.println("Funduino GmbH");
    Textdatei.println("1, 2, 3, 4, 5");
    Textdatei.println("a, b, c, d, e");
    Textdatei.println();
    Textdatei.close();
    Serial.println("Abgeschlossen.");
    Serial.println();
  } else {
    Serial.println("Textdatei konnte nicht erstellt werden");
  }

  Textdatei = SD.open("test.txt");

  if (Textdatei) {
    Serial.println("test.txt:");
    while (Textdatei.available()) {
      Serial.write(Textdatei.read());
    }
    Textdatei.close();
  } else {
    Serial.println("Textdatei konnte nicht geoeffnet werden");
  }
}

void loop() {
  // Der Loop bleibt leer.
}

So soll es sein. Habe das im Setup nicht gesehen auf die schnelle :neutral_face:

1 Like

Ah okay, also von beiden Sensoren/Modulen, RFID und SD Karte an die selben pins klemmen? Außer eben den CS/ss pin von dem SD Modul auf die 6

Außer CS, SS die brauchen eigene Pins.

Genau also ss bei dem RFID ist 13 und der ss vom SD Leser 6. Werde es dann demnächst Mal testen :slight_smile:

Beim UNO R3, UNO R3 SMD, MINI
und auch NANO V3.0 (alle mit ATmega328 Kontroller)
sind folgende Pins:

11(COPI bzw MOSI), 12(CIPO bzw MISO), 13(SCK)

Also die Pins 11, 12, 13 des Arduino gehen an alle SPI Slaves.
Ein weiteres Pin (oft bei verschiedenen Shields verwendet) 10 und 4 sind das SS bzw CS bzw EN Pin.

https://docs.arduino.cc/learn/communication/spi/
und

11(COPI bzw MOSI), 12(CIPO bzw MISO), 13(SCK) müssen nicht als Eingänge oder Ausgänge deklariert werden.

Das jeweilige SS bzw CS bzw EN Pin muß als Ausgang deklariert werden und auch auf H bzw L gesetzt werden um einen der mehreren Slaves/Peripheral zu aktivieren.

Grüße Uwe

Hast Vollkommen recht sollte mall öfters Brille putzen, den Unsinn habe korrigiert.

vielen dank für die hilfe. also der sd reader funktioniert jetzt, ss pin ist jetzt 4. allerdings bekomme ich es nicht gleichzeitig mit dem rfid reader zum laufen. cs pin ist hier eben 10, der Rest ist gleich angeschlossen wie der sd leser. Er soll eigentlich die erkannte ID auf der sd karte speichern.

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

File textDatei;

#define RST_PIN 9  // Reset-PIN für den RFID-Reader
#define SS_PIN 10  // Slave-Select-PIN für den RFID-Reader

MFRC522 mfrc522(SS_PIN, RST_PIN); // Erstellen einer MFRC522-Instanz

const int chipSelectPin = 4;

void setup() {
  Serial.begin(9600);
  Serial.println("Initialisiere SD-Karte");

  pinMode(chipSelectPin, OUTPUT);
  digitalWrite(chipSelectPin, HIGH);

  // Initialisierung der SD-Karte
  if (!SD.begin(chipSelectPin)) { // Benutzerdefinierten CS-Pin übergeben
    Serial.println("Initialisierung der SD-Karte fehlgeschlagen!");
    return;
  }

  Serial.println("Initialisierung der SD-Karte abgeschlossen");

  textDatei = SD.open("test.txt", FILE_WRITE);

  if (textDatei) {
    Serial.println("Schreibe in Textdatei...");
    textDatei.println("Funduino GmbH");
    textDatei.println("1, 2, 3, 4, 5");
    textDatei.println("a, b, c, d, e");
    textDatei.println();
    textDatei.close();
    Serial.println("Abgeschlossen.");
    Serial.println();
  } else {
    Serial.println("Textdatei konnte nicht erstellt werden");
  }

  textDatei = SD.open("test.txt");

  if (textDatei) {
    Serial.println("test.txt:");
    while (textDatei.available()) {
      Serial.write(textDatei.read());
    }
    textDatei.close();
  } else {
    Serial.println("Textdatei konnte nicht geoeffnet werden");
  }

  // Initialisierung des RFID-Readers
  SPI.begin(); // Initialisierung der SPI-Kommunikation
  mfrc522.PCD_Init(); // Initialisierung des RFID-Readers

  Serial.println("RFID-Reader initialisiert");
}

void loop() {
  // Versuche eine Karte zu lesen
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
    Serial.println("Karte erkannt");

    // Lesen der UID der Karte
    String uidString = "";
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      uidString += String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
      uidString += String(mfrc522.uid.uidByte[i], HEX);
    }

    // Öffnen oder Erstellen der Datei auf der SD-Karte
    textDatei = SD.open("rfid_ids.txt", FILE_WRITE);
    if (textDatei) {
      // Schreiben der UID in die Datei
      textDatei.println(uidString);
      textDatei.close();
      Serial.println("UID erfolgreich in die Datei geschrieben");
    } else {
      Serial.println("Fehler beim Öffnen der Datei");
    }

    // Beenden des Leseprozesses
    mfrc522.PICC_HaltA();
    mfrc522.PCD_StopCrypto1();
  }
}

Ein paar Sachen sind unlogisch.

Erst wird die SD Kate initialisiert und dann folgt eine SPI.begin().
Warum?

Für die SD Karte bereitest du den /SS Pin vor, für den Reader nicht.
Auch das scheint mir verwunderlich

Manche SD Adapter sind nicht wirklich SPI konform,
und geben MISO nicht frei.

Manche RFID Adapter haben keinen 5V 3.3V Level-Shifter.

Ah ja das stimmt, habe das falsch reinkopiert.
Dachte für den reader passt es auch so, da der ja mit den Anschlüssen direkt funktioniert hat ohne extra Zuordnung. Es ist so, dass beide einzeln funktionieren, allerdings noch nicht gemeinsam

Ich nutze diesen RFID Reader:
ARCELI 3 x RFID-RC-522 Mini... Amazon.de

Funktioniert wenn man den RST Pin an den 5v Anschluss verbindet.

Die Beschreibung sagt:

Elektrische Parameter Profil:
Betriebsstrom: 13-26mA/DC 3.3V

Dein Nano hat 5V

Ja finde es ist da auch undurchsichtig, auf einem Plan ist er an pin 9 angeschlossen (geht bei mir aber nicht) und auf dem anderen Schaltplan an den 5V pin vom Arduino. Das hat auf jeden Fall geklappt bei mir. Die Stromversorgung kommt vom 3.3V pin

Und auf MOSI und CLK donnern die 5V weiter ungehindert in den 3,3V Chip.
Das arme Ding.....

Okay und wie wäre es dann richtig? Den RST auch an 3,3v?