Arduino Mega +RFID +Ethernet

Hallo Leute!
Ich verzweifel schon sehr an diesem Projekt. Zuerst mal was mein Projekt überhaupt ist: Ich will mittels dem RFID-Modul die ID der Magnetkarte auslesen und dann mit dem Ethernetshield via UDP auf eine Software zu Visual Studio auf meinen PC senden.

Wenn ich beides separat laufen lasse, sprich das RFID-Modul zum auslesen der ID und das Ethernshield zum Senden eines String auf meinen PC funktioniert alles einwandfrei.

Das Problem ist jetzt wenn ich beides an meinem Arduino angesteckt habe und versuche die ausgelesene ID via UDP zu versenden funktioniert es nicht mehr. Das Auslesen der ID funktioniert jedoch.

Habe im INternet sehr viel gelesen jedoch konnte mir nichts weiterhelfen.. das einzige was ich verstanden habe ist dass das Ethernetshield durch die Pins 50-53 mit dem Arduino kommuniziert und da ist aber mein Kartenlesemodul angesteckt.
Ich hoffe mir kann jemand helfen :frowning: :frowning:

SPI ist ein Bus. MOSI/MISO/SCK kannst Du für alle nehmen, CS (manchmak auch SS genannt) braucht jeder Teilnehmer seinen eigenen Pin, den Du auch in der Software ändern musst.

Ohne Links zu den Modulen/Shields und deine Sketche (bitte in Codetags </> oben links im Forumseditor) werden wir Dir da nicht viel helfen können.

Gruß Tommy

Tommy56:
SPI ist ein Bus. MOSI/MISO/SCK kannst Du für alle nehmen, CS (manchmak auch SS genannt) braucht jeder Teilnehmer seinen eigenen Pin, den Du auch in der Software ändern musst.

Ohne Links zu den Modulen/Shields und deine Sketche (bitte in Codetags </> oben links im Forumseditor) werden wir Dir da nicht viel helfen können.

Gruß Tommy

Hallo!

Zu meinen Modulen:
EthernetShield:ARDUINO SHD ETH2: Arduino Shield - Ethernet Shield 2, ohne PoE, W5500 bei reichelt elektronik

RC522:DEBO RFID RC522: Entwicklerboards - RFID-Modul, NXP MFRC-522 bei reichelt elektronik

Auf der Arduino Webseite stehen MISO,MOSI,usw. des Arduino Mega und des Shields: Ethernet - Arduino Reference

So nun mein Sketch: In diesem Sketch sind beide Module angeschlossen.
Das RFID-Modul habe ich an auf dem EthernetShield angeschlossen. Sprich an pin 11-13.

Der Code:

#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet2.h>
#include <EthernetUdp2.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008


// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x11, 0x2E, 0x46
};
IPAddress ip(192, 168, 1, 177);

unsigned int localPort = 8888;      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char  ReplyBuffer[] = "AntwortString ";       // a string to send back

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

//MFRC522
#include <MFRC522.h>
constexpr uint8_t RST_PIN = 6;     
constexpr uint8_t SS_PIN = 2;     
MFRC522 mfrc522(SS_PIN, RST_PIN); 

void setup() {
  // start the Ethernet and UDP:
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);

   SPI.begin();
 mfrc522.PCD_Init();

  Serial.begin(9600);
  Serial.println("Setup fertig");
}

void loop() {

    String content;

  // put your main code here, to run repeatedly:
  // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
  MFRC522::MIFARE_Key key;
  for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
  
 int packetSize = Udp.parsePacket();

    if (packetSize)
      {
        int i = 0;
        //String von VisualStudio empfangen
      IPAddress remote = Udp.remoteIP();
      Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); 
      Serial.println(packetBuffer);

       for (byte i = 0; i < mfrc522.uid.size; i++) {
          content.concat(String(mfrc522.uid.uidByte[i] <0x10 ? "0" : " "));
          content.concat(String(mfrc522.uid.uidByte[i],HEX));
          }
          
          content.toUpperCase();
          String UID= content.substring(1);
          Serial.println(UID);
      

      //Antwort zurücksenden
      Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
      Udp.write(ReplyBuffer);
      Udp.endPacket();
      }
      delay(10);
  }

Die Ausgabe der seriellen Schnittstelle ist beim Starten jene:
Setup fertig
BEREIT (Das ist der String den mein C#-Programm an den Arduino sendet)

Funktioniert also alles bis zum Auslesen der ID der Magnetkarte.
Hoffe ihr könnt mit dieser Antwort eineiges mehr anfangen und mir helfen.
Mfg Felix

Das RFID-Modul habe ich an auf dem EthernetShield angeschlossen. Sprich an pin 11-13.

Was ist mit den Pins 6 und 2 zum RFID-Shield? Die haben Luftverkablung?

Gruß Tommy

Das RFID-Modul habe ich an auf dem EthernetShield angeschlossen. Sprich an pin 11-13.

Auf den Pins ist kein SPI, beim Mega.
Darum tuts dein Ding auch nicht.

Du hast Recht, ich habe den MEGA übersehen und bin vom UNO ausgegangen.

Gruß Tommy

Die RFID-Library die ich verwende schreibt vor den Sonsor über die Pins 50-53 zu verbinden.. jedoch dachte ich dass dies eventuell der Fehler ist wenn das Shield mit dem Arduino über diese Pins kommuniziert..

Ich werde das morgen direkt ausprobieren, meint ihr dass das dann funktionieren sollte oder das nicht der Fehler sein könnte?

Mfg Felix

jedoch dachte ich dass dies eventuell der Fehler ist wenn das Shield mit dem Arduino über diese Pins kommuniziert..

Nöö, 53 ist frei.
Und die anderen können/müssen gemeinsam benutzt werden

/* * Uses MFRC522 - Library


  • MFRC522 Arduino
  • Reader/PCD Mega
  • Signal Pin Pin

  • RST/Reset RST 5
  • SPI SS SDA(SS) 53
  • SPI MOSI MOSI 51
  • SPI MISO MISO 50
  • SPI SCK SCK 52
    */

Das ist die Pinangabe meiner Library.. Jedoch habe ich den RST auf Pin 5 und den SS auf Pin 31 in meinem Sketch. Habe ich das RFID-Modul so angeschlossen + dem EthernetShield bekomme ich nicht einmal den String von dem C# Programm..

SS auf Pin 31

SS des MFRC522?

Dann muss der SS des Mega noch zum Output gemacht werden, oder alternativ, dauerhaft auf High gezogen werden.

combie:
SS des MFRC522?

Dann muss der SS des Mega noch zum Output gemacht werden, oder alternativ, dauerhaft auf High gezogen werden.

Ja genau! der Pin des MFRC522. Der Hardware SS pin des Megas ist 53. Also den einfach auf HIGH (digitalwrite(53,HIGH)) ?

Tut mir echt leid aber bin Anfänger..

digitalwrite(53,HIGH)

Ja, ein digitalWrite(SS,HIGH) würde den Pullup aktivieren.
Wenn nichts angeschlossen ist, reicht das.

Mein Tipp ist weiterhin: Mache ihn zum Output!

Denn als Input ist er nicht zu gebrauchen, da er dann nie LOW werden darf, ohne dass die Hardware SPI in den Slave Modus schaltet.
Als Output, darfst du ihn für beliebige Zwecke verwenden. Ohne jedes Hemmnis.

combie:
Ja, ein digitalWrite(SS,HIGH) würde den Pullup aktivieren.
Wenn nichts angeschlossen ist, reicht das.

Mein Tipp ist weiterhin: Mache ihn zum Output!

Denn als Input ist er nicht zu gebrauchen, da er dann nie LOW werden darf, ohne dass die Hardware SPI in den Slave Modus schaltet.
Als Output, darfst du ihn für beliebige Zwecke verwenden. Ohne jedes Hemmnis.

Habe den Pin jetzt mit einem digitalWrite(53,HIGH) auf high gesetzt.

Nun bekomm ich den String meines c#-Programms, jedoch passiert an der Stelle wo eigentlich die ID auf den COM-Port ausgegeben werden soll nichts mehr.

#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet2.h>
#include <EthernetUdp2.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008


// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x11, 0x2E, 0x46
};
IPAddress ip(192, 168, 1, 177);

unsigned int localPort = 8888;      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char  ReplyBuffer[] = "AntwortString ";       // a string to send back

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

//MFRC522
#include <MFRC522.h>
constexpr uint8_t RST_PIN = 5;     
constexpr uint8_t SS_PIN = 31;     
MFRC522 mfrc522(SS_PIN, RST_PIN); 

void setup() {
  // start the Ethernet and UDP:
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);

   SPI.begin();
 mfrc522.PCD_Init();
 digitalWrite(53,HIGH);

  Serial.begin(9600);
  Serial.println("Setup fertig");
}

void loop() {

    String content;

  // put your main code here, to run repeatedly:
  // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
  MFRC522::MIFARE_Key key;
  for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
  
 int packetSize = Udp.parsePacket();

    if (packetSize)
      {
        int i = 0;
        //String von VisualStudio empfangen
      IPAddress remote = Udp.remoteIP();
      Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); 
      Serial.println(packetBuffer);

      // HIER hängt sich der Sketch dann auf bzw. tut es nichts mehr

        if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }
  
       for (byte i = 0; i < mfrc522.uid.size; i++) {
          content.concat(String(mfrc522.uid.uidByte[i] <0x10 ? "0" : " "));
          content.concat(String(mfrc522.uid.uidByte[i],HEX));
          }
          
          content.toUpperCase();
          String UID= content.substring(1);
          Serial.println(UID);
      

      //Antwort zurücksenden
      Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
      Udp.write(ReplyBuffer);
      Udp.endPacket();
      }
      delay(10);
  }

Bin erleichtert das dass jetzt schon mal funktioniert. Sobald ich die folgenden Zeilen Code entferne

        if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

geht es wie gewohnt mit Reply und response zwischen asoftware und arduino hin und her.

Habe den Pin jetzt mit einem digitalWrite(53,HIGH) auf high gesetzt.

Das geht ja in die richtige Richtung.
Immerhin...

Aber warum du meiner Empfehlung nicht folgen willst, ist mir ein Rätsel.

Ich wiederhole mich nochmal, dieses mal mit noch anderen Worten...

Mal angenommen, und ich hätte recht, dass SPI nur funktioniert, wenn der Pin 53 des Mega High, oder ein Output, ist.

Dann sage mir doch mal, warum du den Pullup des Pins erst nach dem mfrc522.PCD_Init() auf High setzt...

Wenn mfrc522.PCD_Init(); selber schon SPI nutzt, dann wird der init versagen.
Und so geschieht es dir hier!

Bitte mehr Sorgfalt!
Die Reihenfolge der Initialisierungen ist durchaus wichtig!

Also:

void setup() 
{
  Serial.begin(9600);
  Serial.println("Setup Start");

  pinMode(SS,OUTPUT); // ab jetzt kann SPI zuverlässig im Master Mode bleiben

  SPI.begin(); // ab jetzt können die einzelnen SPI Geräte initialisiert werden

  // start the Ethernet and UDP:
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);


  mfrc522.PCD_Init();


  Serial.println("Setup fertig");
}

combie:
Das geht ja in die richtige Richtung.
Immerhin...

Aber warum du meiner Empfehlung nicht folgen willst, ist mir ein Rätsel.

Ich wiederhole mich nochmal, dieses mal mit noch anderen Worten...

Mal angenommen, und ich hätte recht, dass SPI nur funktioniert, wenn der Pin 53 des Mega High, oder ein Output, ist.

Dann sage mir doch mal, warum du den Pullup des Pins erst nach dem mfrc522.PCD_Init() auf High setzt...

Wenn mfrc522.PCD_Init(); selber schon SPI nutzt, dann wird der init versagen.
Und so geschieht es dir hier!

Bitte mehr Sorgfalt!
Die Reihenfolge der Initialisierungen ist durchaus wichtig!

Also:

void setup() 

{
  Serial.begin(9600);
  Serial.println("Setup Start");

pinMode(SS,OUTPUT); // ab jetzt kann SPI zuverlässig im Master Mode bleiben

SPI.begin(); // ab jetzt können die einzelnen SPI Geräte initialisiert werden

// start the Ethernet and UDP:
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);

mfrc522.PCD_Init();

Serial.println("Setup fertig");
}

An die Reihenfolge habe ich gar nicht gedacht...

Jedoch passiert an der Stelle wo die Karte eingelesen wird wieder nichts..

COM zeigt an:
Setup Start
Setup fertig
BEREIT (String der Software)

hat dies noch mit der anordung von dem code teil des RFID-Moduls zu tun?

Funktionieren denn die Beispiele?
Kenne die Lib nicht....

Ja, beides separat tut genau so wie es soll. Ich versuche heute noch einmal einen neuen Sketch zu schreiben wo einfach nur die ID versendet wird, und der PIN 53 ein OUTPUT ist.Vielleicht hat sich ein schlampigkeitsfehler eingeschlichen.. denke ich aber nicht. Werde dann einen Reply schreiben mit den PINS,Library usw. habe leider übersehen dass der Beitrag schon eine zweite Seite hat und die Alerts waren aus.
Mit freundlichen Grüßen Felix

combie:
Funktionieren denn die Beispiele?
Kenne die Lib nicht....

Bin jetzt nochmal alles sehr sorgfältig durchgegangen und bin mir sicher den Fehler gefunden zu haben! Jedoch weiß ich nicht wie ich diesen beheben kann.

Der Tipp von dir mit dem pinMode(SS,OUTPUT) war schon einmal grandios und hat mich weitergebracht.
Ich kann nun die UDP-Connection verwenden mit dem angeschlossenen RC522 Modul!
Jedoch geht es im Sketch nicht weiter wenn ich versuche eine Karte zu finden.. Bis zu jenem Punkt wo die IF-Bedingung mit der suche der Karte ist funkt alles. Wenn ich diesen Teil vom Code auskommentiere funktioniert alles wie es soll. Das Shield sowie das RC522-Modul wird initialisiert und ich bekomme einen String von meiner Software und sende an diese meine Antwort zurück.

Der Code sieht wiefolgt aus:

#include <SPI.h>         // needed for Arduino versions later than 0018
#include <Ethernet2.h>
#include <EthernetUdp2.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008


// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x11, 0x2E, 0x46
};
IPAddress ip(192, 168, 1, 177);

unsigned int localPort = 8888;      // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char  ReplyBuffer[] = "String von meinem Arduino";       // a string to send back

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;


//MFRC522
#include <MFRC522.h>
constexpr uint8_t RST_PIN = 5;     
constexpr uint8_t SS_PIN = 7;     
MFRC522 mfrc522(SS_PIN, RST_PIN); 


void setup() {

  Serial.begin(9600);
  Serial.println("Setup Start");
  
  pinMode(SS,OUTPUT);

  SPI.begin();  
  
  // start the Ethernet and UDP:
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);

 mfrc522.PCD_Init();
 
  Serial.println("Setup fertig");
}
int i =0;
void loop() {
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remote = Udp.remoteIP();
    for (int i = 0; i < 4; i++)
    {
      Serial.print(remote[i], DEC);
      if (i < 3)
      {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.println(Udp.remotePort());
  
    // read the packet into packetBufffer
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
//    Serial.println("Contents:");
    Serial.println(packetBuffer);

    GetUID();

    // send a reply, to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
  }
  delay(10);
}


void GetUID()
{
  String content;
  MFRC522::MIFARE_Key key;
  for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;

//for( i; i<1;i++)
//{
//// Look for new cards
//  if ( ! mfrc522.PICC_IsNewCardPresent()) {
//    return;
//  }
//
//  // Select one of the cards
//  if ( ! mfrc522.PICC_ReadCardSerial()) {
//    return;
//  }

 for (byte i = 0; i < mfrc522.uid.size; i++) {
    content.concat(String(mfrc522.uid.uidByte[i] <0x10 ? "0" : " "));
    content.concat(String(mfrc522.uid.uidByte[i],HEX));
    }
    content.toUpperCase();
    String UID= content.substring(1);
    Serial.println(UID);
}
   
  }
Die serielle Ausgabe sieht dann so aus:
Setup Start
Setup fertig
BEREIT (der String den ich von C# erhalte)

Und nach diesem BEREIt sollte dann die UID der angehaltenen Karte ausgegeben werden.
Muss ich da vielleicht dem SPI irgendwie klar machen dass nun der Kartenleser an der Reihe ist? oder bin ihc da mit meiner Vermutung ganz danaben?

Die Idee ist richtig und dem Ethernet sagen, dass es nicht mehr dran ist.
Also die Steuerung mit den SS/CS-Pins.

Gruß Tommy

Okay, und wie schreib ich das am besten? Mit pinMode??