ITead WIZnet W5100 und NRF24L01+ Arduino Mega 2560

Hallo zusammen,

ich bin grad etwas am verzweifeln. Ich versuche das ITead WIZnet W5100 und das NRF24L01+ Modul an einem Arduino Mega 2560 ans laufen zu bekommen. Das Problem ist, wenn ich “nur” den W5100 betreibe funktioniert dieser einwandfrei. Wenn ich “nur” den NRF anschließe, dann geht dieser ebenfalls einwandfrei. Wenn ich beide zusammen anschließe, geht zwar das W5100 aber der NRF funktioniert nicht mehr, bzw. es kann keine Verbindung mehr aufgebaut werden. Angeschlossen sind beide an MISO, MOSI, SCK und CE. CSN ist beim NRF auf 40 der W5100 liegt auf Pin 10.

Könntet ihr mir unter die Arme greifen? Was mache ich falsch? Im Forum habe ich gelesen das man den W5100 ausschalten kann wenn ich den Pin 10 auf High setze. Leider funktioniert das nicht. Hat irgendwer diese Kombi am laufen?

Anbei mal ausschnitte des relevanten Codes:

//####################################################################//
//                         Librarys einbinden                         //
//####################################################################//

#include <Wire.h>  // Wire Library
#include <SPI.h> // SPI Library
#include <Ethernet.h> // Ethernet Library
#include <EthernetUdp.h>
#include <RF24Network.h> // NRF24L01+ Netzwerk Library 
#include <RF24.h> // NRF24L01+ Library 

//####################################################################//
//                     Konfiguration Ethernet                         //
//####################################################################//

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0xEE, 0xF3 };
byte ip[] = { 192, 168, 2, 199 };
byte gateway[] = { 192, 168, 2, 1};
byte subnet[] = {255, 255, 255, 0};

//####################################################################//
//                     Konfiguration RTC, NTP                         //
//####################################################################//

uint16_t startAddr = 0x0000; // Start address to store in the NV-RAM
uint16_t lastAddr; // new address for storing in NV-RAM
uint16_t TimeIsSet = 0xaa55; // Helper that time must not set again

unsigned int localPort = 8888; // local port to listen for UDP packets

IPAddress timeServer(192, 168, 2, 1); // fritz.box NTP server
const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets 

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

unsigned long highWord;
unsigned long lowWord;
unsigned long secsSince1900;
unsigned long epoch;
unsigned long seventyYears;
unsigned long time_2000 = 946684800;
unsigned long timeNow;
unsigned long mesz;

long interval_NTPSyncUpdate = 86400000; // Intervalzeit DCF --> RTC abgleich (86400000 = 24Std. (1Std. = 3600s) ACHTUNG --> 86400000 sind ms)
unsigned long prev_NTPSyncUpdate;



//####################################################################//
//                     Konfiguration NRF24L01+                        //
//####################################################################//

// Adressen aller Sensoren
// ####### 00: Basis #######
// 01: Aussensensor
// 02: Kinder Zimmer
// 03: Schlafzimmer
// 04: Bad
// 05: Server / Flur

// nRF24L01(+) radio attached using Getting Started board 
RF24 radio(40,53);
// Network uses that radio
RF24Network network(radio);
// Address of our node
const uint16_t this_node = 0;
// Address of the other node
//const uint16_t other_node = 2;
// Structure of our payload
struct payload_t // Struktur wie die Daten versendet werden FIFO
{ 
  float TEMP_NODE; // Variable um die Innen Luftfeuchte zu speichern
  float RH_NODE; // Variable um die Innen Temperatur zu speichern
  boolean ERR_NODE; // Variable um Error zu übermitteln
};


//####################################################################//
//                Setup (wird einmalig durchlaufen)                   //
//####################################################################//


void setup(void) // Setup wird einmalig durchlaufen
{
  SPI.begin();
  radio.begin();
  network.begin(/*channel*/ 90, /*node address*/ this_node);
  // start Ethernet and UDP
  Ethernet.begin(mac, ip, gateway);
  Udp.begin(localPort);
  Wire.begin();
  prev_NTPSyncUpdate = millis(); // Millis (Zeit seitdem der µC läuft) wird in Variable "prev" geschrieben
  sendNTPpacket(timeServer); // send an NTP packet to a time server
  if(Udp.available()) { // Wenn ein Netzwerk gefunden wurde, dann...
    NTPSync(); // Funktion NTPSync aufrufen 
  } 
}

Im Anhang eine ZIP mit bisschen mehr Code

Forum.zip (4.03 KB)

Hallo!

Genauso verzweifelt war ich auch mal und hab auch nicht endgültig rausgefunden, warum die nicht miteinander wollen.
“Gelöst” hab ich das Problem dadurch, dass ich das Ethernet-Shield durch ein ENC28J60-Modul (http://ebay.eu/MqzIEq) ersetzt habe. Ich nutze es, um Daten vom Webserver per UDP zu empfangen. Läuft prima auch zusammen mit dem NRF24L01+
Ich weiss, das ist nicht wirklich DIE Antwort auf deine Frage, aber mir hat es geholfen, das Modul zu wechseln…

ulli.

Ich dreh echt noch durch. Irgendwie will und will es nicht funktionieren. Ich habe jetzt sogar per SoftSPI das ganze probiert. Es will einfach nicht zusammen funktionieren. Ich bekomme es durch Zufall ab und zu hin, aber es ist nicht reproduzierbar. Habe sogar schon den MEGA getauscht, weil ich ihn im Verdacht hatte. Wenn ich einen UNO oder NANO verwende funktionieren die NRF einwandfrei.

Irgendwas stimmt also mit dem Code /SPI Bus nicht, oder die Library hat einen Bug, behaupte ich jetzt mal. Selbst verschiedene IDE Versionen habe ich probiert. Ich find den Fehler irgendwie nicht.

@ulli: Ich hatte vorher den ENC28J60 im Einsatz, jedoch lief der Code nicht. Welche LIB hast Du verwendet? Wie sieht deine Verdrahtung aus?

Ich muss / möchte per UPD / NTP meinen RTC einmal am Tag stellen. Hierzu muss das ENC28J60 dieses Protokoll unterstützen. Dann wollte ich eigentlich die Daten auf xively.com hochladen. Das ging damals mit dem ENC28J60 nicht. Deswegen wollte ich auf den W5100 ausweichen. Mittlerweile denke ich darüber nach, die Daten per GET auf meinem eigenem Server zu speichern. Funktioniert das ENC28J60 mit dem Befehl GET und der UPD / NTP? Dann wäre mir geholfen.

Könntest Du evtl. deinen Code posten, oder gerne per PN

Sorry das ich erst jetzt Zeit hatte zu schreiben. Habe heute den ganzen Tag damit verbracht das Problem zu lösen.

Grüße Thomas

Hi!

Ich hab mir selber einen Wecker gebaut, den ich übers Internet "stellen" kann. Hab lokal einen Webserver (nicht nur dafür :)) laufen. Der schickt alle 5 Minuten per UDP den aktuellen Timestamp und die nächste Weckzeit an ein Sendemodul, das dann per NRF24L01+ die Daten ans Weckermodul weiterschickt. Das ENC28J60 spreche ich mit der Ethercard-Library an: https://github.com/jcw/ethercard, das Funkmodul mit dieser: https://github.com/maniacbug/RF24 Das NRF24-Modul ist so verdrahtet: CE:3, CS:9, MOSI:5, MISO:6, SCK: 7, IRQ:2

HTH ulli.

Wie hast du beide am Bus angeschlossen? mM nach müssen da noch entsprechende Widerstände an den Bus, wenn mehr als ein Gerät angeschlossen ist, siehe zB. I2C.

Beide? Das ENC28J60 hängt an 8,11,12,13

Für den I2C gilt das zwar, aber laut Wikipedia gibt es das nicht beim SPI http://de.wikipedia.org/wiki/Serial_Peripheral_Interface Da sind zumindest keine Widerstände eingezeichnet.

Das NRF24-Modul ist so verdrahtet: CE:3, CS:9, MOSI:5, MISO:6, SCK: 7, IRQ:2

Wo definierst Du das MOSI, MISO und SCK auf 5,6, und 7 liegen? Dachte die Hardware SPI auf dem Mega ist 50, 51, 52

ht81: Für den I2C gilt das zwar, aber laut Wikipedia gibt es das nicht beim SPI http://de.wikipedia.org/wiki/Serial_Peripheral_Interface Da sind zumindest keine Widerstände eingezeichnet.

Das NRF24-Modul ist so verdrahtet: CE:3, CS:9, MOSI:5, MISO:6, SCK: 7, IRQ:2

Wo definierst Du das MOSI, MISO und SCK auf 5,6, und 7 liegen? Dachte die Hardware SPI auf dem Mega ist 50, 51, 52

Richtig, Hardware SPI gibts aber 2mal. Einmal noch auf dem ICSP Header nahe der 2reihigen Leiste und einmal ein 2. SPI bus auf den Headers hinterm USB Anschluss. Was ist, wenn du deine System Bustechnisch komplett trennst, ist das bei dir möglich?

Bzgl. den Widerständen, es war eine Vermutung ;) Aber auch wenn auf Wiki keine Widerstände eingezeichnet sind, wiederlegt das meiner Vermutung noch nicht ;)

ht81: Wo definierst Du das MOSI, MISO und SCK auf 5,6, und 7 liegen? Dachte die Hardware SPI auf dem Mega ist 50, 51, 52

Mit iBoardRF24 radio(3,9,5,6,7,2); kannst du festlegen, welche Pins genutzt werden. Ich habs mit einem UNO bzw im "Endausbau" einem Standalone ATmega 328P gemacht.

ulli.

Hallo,

danke nochmals für eure Antworten und eure Hilfe. Und danke nochmals an Ulli für deine PN. Ich habe jetzt den Code umgebaut, jedoch läuft es immer noch nicht ganz korrekt. Es läuft immer nur eine gewisse Zeit lang. Ich habe gestern einen Versuch unternommen und mal alles, bis auf den Mega, extern mit einem Labornetzteil zu betreiben. Und siehe da, alles läuft Std. so wie es soll. Ich habe eine Gesamtstromaufnahme von ca. 220mA, gemessen OHNE Mega. Daran hängt folgendes: Ehternet Shield, NRF24L01, RTC, I2C Adapter und das 20x4 LCD Display. Bisschen viel?

Hallo Thomas,

AFAIR hatte ich mit ENC28J60, NRF24 und ATmega 328p auch um die 180mA. Das LAN-Modul ist nicht gerade sparsam...

ulli.

Das ist beim ENC bereits bekannt. Wurde mehrmals davon abgeraten, das Gerät nur mit einem Akku zu betreiben.

Die 3,3V werden aus den 5V gemacht, richtig? Ich pulse per PWM meine Display Beleuchtung, kann es deswegen sein das der NRF24L01 nicht richtig funktioniert? Habe jetzt mal einen 100nF an VCC und GND gelötet, jedoch noch keine Besserung.... :~

Ja, die 3,3V Spannung kommt von Mega. Jedoch sollten die 50mA Grenze nicht überschritten werden. Ethernet Shield mag noch gehen, aber sonst würde ich da nicht mehr viel dran hängen. Kannst evtl. mal den Strom messen was da fließen kann.

Was für ein Display? Ein 4zeiliges Character Display oder ein GraphicLCD würde ich nicht mehr mit dem Arduino einem Ausgang versorgen. Da sollte dann ein kleiner Transistor zwischen. Wenn das NRF garnicht geht, liegt das nicht am fehlenden 100nF. Wenn der fehlt und es Störungen auftreten würden, dann machen die Bauteile was sie wollen, aber selten nichts.

Besteht die Möglichkeit, dass sich hier Timer überschneiden von den Libs?

Das Display habe ich per Transistor angeschlossen. Das ist nicht das Problem. Habe irgendwie die Vermutung das mir die 3,3V nicht Stabil ist oder kurzzeitig weg ist.