Arduino UNO, NFC-Shiel und Ethernet

Hallo Arduino Forum User
Hab versprochen einem Freund zu helfen und bin mangels Hardware nicht in der Lage meine Vermutungen zu testen.

Hat jemand schon erfolgreich den orginal Arduino UNO mit dem orginal Arduino Ethernet Shield und dem NFC Shield v2.0 von Seedstudio zusammen zum laufen gebracht? (am NFC ist SS auf Pin 9 statt Pin 10 modifiziert)
http://www.seeedstudio.com/depot/NFC-Shield-V20-p-1370.html

Ethernet Shield und NFC Shield einzeln am Arduino funktionieren.
Zusammen funktioniert die Initialisation des NFC nicht (Ethernet wird vor NFC initialisiert)

#include <SPI.h>
#include <PN532_SPI.h>
#include <PN532.h>
#include <Ethernet.h>

#define ETH_SS 10
#define NFC_SS 9

PN532_SPI pn532spi(SPI, NFC_SS);
PN532 nfc(pn532spi);

byte mac[] = { [mac address gelöscht für Forum] }; // MAC address
IPAddress ip(192,168,0,5);       // Static IP if DHCP fails

IPAddress server(192,168,0,10);   // IP for the WebServer
int port = 8080;
EthernetClient client;

void setup() {

  /* Start serial output */
  Serial.begin(115200);
  Serial.println("Arduino Powered On");

  pinMode(ETH_SS, OUTPUT);
  pinMode(NFC_SS, OUTPUT);

  digitalWrite(ETH_SS, HIGH);
  digitalWrite(NFC_SS, HIGH);

  Serial.println("Init Ethernet");
  initEthernet();
  delay(500);
  Serial.println("Init NFC");
  initNFC();
}

void initEthernet() {

  //Serial.println("Search DHCP server");
  //if (Ethernet.begin(mac) == 0) {
  //  Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    // try to congifure using IP address instead of DHCP:

    digitalWrite(ETH_SS, LOW);
    digitalWrite(NFC_SS, HIGH);
    Ethernet.begin(mac, ip);
    digitalWrite(ETH_SS, HIGH);
  //}

  Serial.print("Arduino IP is ");
  Serial.println(Ethernet.localIP());
}

boolean initNFC() {

  digitalWrite(ETH_SS, HIGH);
  digitalWrite(NFC_SS, LOW);
  nfc.begin();
  digitalWrite(NFC_SS, HIGH);

  uint32_t versiondata = nfc.getFirmwareVersion();

  if (! versiondata) {

    Serial.println("Didn't find PN53x board ... PANIC, program stopped!!");


  } else {

    // Got ok data, print it out!
    Serial.print("Found chip PN5"); Serial.println((versiondata>>24) &
0xFF, HEX);
    Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC);
    Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);

    // configure board to read RFID tags
    nfc.SAMConfig();

    Serial.println("Waiting for an ISO14443A Card ...");
  }
}

String getUnlockCode() {
   return httpCall("DoorManUnlock");
}

... 

void loop() {...}

Es wird

Arduino IP is …
Didn’t find PN53x board … PANIC, program stopped!!

ausgegeben.

Die Reihenfolge der Shields auf dem Arduino ist egal.

Ich tippe mal auf vollem RAM. Was sagt Ihr dazu?

Viele Grüße Uwe

Ich kann auch nicht testen...
Aber was mir auffällt:

Die Reihenfolge der Shields ist nicht egal, denn das (original) Ethernetshield hat keine SPI Weiterleitung (ISP Pins).

Auch würde ich das unterlassen:

digitalWrite(ETH_SS, HIGH);
digitalWrite(NFC_SS, HIGH);

Die Libs müssen die SS Pins selber verwalten.

Auch verwundert mich die Angabe von 2 verschiedenen IP Adressen.
Das wundert mich sehr.

Hallo,

die 2 IPs sind einmal die IP des Ethernet Shields (sofern DHCP nicht funkt) und die zweite IP ist der WebServer bei dem Infos geholt werden. Dieser Teil ist mit ... gekennzeichnet :slight_smile:

Gruss
Marco

Ich tippe mal auf vollem RAM. Was sagt Ihr dazu?

Wieso verwendest Du dann nicht das F() Macro?

Auch verwundert mich die Angabe von 2 verschiedenen IP Adressen.
Das wundert mich sehr.

Das wundert mich nicht, denn eine ist die IP, die der Arduino bekommen soll, das andere ist die Server-IP.

Die Reihenfolge der Shields ist nicht egal, denn das (original) Ethernetshield hat keine SPI Weiterleitung (ISP Pins).

Beide Boards nehmen die SPI-Leitungen vom ICSP-Header, führen diesen aber nicht nach oben weiter. Insofern glaube ich, dass nur jeweils das direkt auf den Arduino montierte Board funktionieren wird.

pylon:

Ich tippe mal auf vollem RAM. Was sagt Ihr dazu?

Wieso verwendest Du dann nicht das F() Macro?

Da muß mann auch die Bibliotheken mächtig modifizieren weil dort auch nirgens ein F() verwendet wird.
Grüße Uwe

Ok, das mit den 2 IP Adressen sehe ich ein.

@uwefed
Was ist mit den ICSP Steckern (zwecks SPI) werden die jetzt durch beide Boards durchgereicht?

Da muß mann auch die Bibliotheken mächtig modifizieren weil dort auch nirgens ein F() verwendet wird.

Zumindest bei den Serial.print() Dingern kann man das einsetzen.

Was ist mit den ICSP Steckern (zwecks SPI) werden die jetzt durch beide Boards durchgereicht?

Hallo, der ICSP-Header wird vom Ethernet Shield nicht weitergereicht, aber das NFC Shield v2 reicht diesen weiter. Also muss das NFC Shield in der Mitte montiert werden. Was auch kein Problem ist, denn die Antenne ist nicht auf dem Board montiert.