Go Down

Topic: using nRF24LO1+ with w5100 ethernet shield (Read 3231 times) previous topic - next topic

bakla89

Hi everyone, I'm sorry for my bad English, I will try to explain myself as good as possible.

I have an Arduino Leonardo Board. http://arduino.cc/en/Main/ArduinoBoardLeonardo
I soldered on it the Arduino Ethernet shield with the W5100 chip. http://arduino.cc/en/Main/ArduinoEthernetShield
I bought on ebay (from china) the nRF24L01+ and I'm trying to get it working.

I saw the following topics in english language about my problem but I couldn't find any solution in them:
http://arduino.cc/forum/index.php/topic,20688.0.html
http://arduino.cc/forum/index.php/topic,88015.0.html

I'm following the maniacBug tutorial at the following link: http://maniacbug.wordpress.com/2011/11/02/getting-started-rf24/
I've to say it is a really well done tutorial.
maniacBug personally suggested me to try to ask to the arduino forum and this is what I'm doing here  :)

I tried also with the MIRF library but it's even worse.

I changed the RF24 configurable pins to 8 and 9 insted of 9 and 10.
I thought that the possible solution was to disable the w5100 chip putting the DP10 to high. I didn't know if I had to disable also the SD card putting the DP4 to high, I tried both but nothing worked.


Here is my code:
Code: [Select]
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"

//
// Hardware configuration
//

// Set up nRF24L01 radio on SPI bus plus pins 9 & 10

RF24 radio(8,9);

//
// Topology
//

// Radio pipe addresses for the 2 nodes to communicate.
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

//
// Role management
//
// Set up role.  This sketch uses the same software for all the nodes
// in this system.  Doing so greatly simplifies testing. 
//

// The various roles supported by this sketch
typedef enum { role_ping_out = 1, role_pong_back } role_e;

// The debug-friendly names of those roles
const char* role_friendly_name[] = { "invalid", "Ping out", "Pong back"};

// The role of the current running sketch
role_e role = role_pong_back;

void setup(void)
{
  pinMode(10, OUTPUT);
  pinMode(4, OUTPUT);   
  //disable the W5100 chip
  digitalWrite(10, HIGH);
  //disable sd card
  digitalWrite(4, HIGH);
 
  //
  // Print preamble
  //

  Serial.begin(57600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  printf_begin();
  printf("\n\rRF24/examples/GettingStarted/\n\r");
  printf("ROLE: %s\n\r",role_friendly_name[role]);
  printf("*** PRESS 'T' to begin transmitting to the other node\n\r");

  //
  // Setup and configure rf radio
  //

  radio.begin();

  // optionally, increase the delay between retries & # of retries
  radio.setRetries(15,15);

  // optionally, reduce the payload size.  seems to
  // improve reliability
  //radio.setPayloadSize(8);

  //
  // Open pipes to other nodes for communication
  //

  // This simple sketch opens two pipes for these two nodes to communicate
  // back and forth.
  // Open 'our' pipe for writing
  // Open the 'other' pipe for reading, in position #1 (we can have up to 5 pipes open for reading)

  //if ( role == role_ping_out )
  {
    //radio.openWritingPipe(pipes[0]);
    radio.openReadingPipe(1,pipes[1]);
  }
  //else
  {
    //radio.openWritingPipe(pipes[1]);
    //radio.openReadingPipe(1,pipes[0]);
  }

  //
  // Start listening
  //

  radio.startListening();

  //
  // Dump the configuration of the rf unit for debugging
  //

  radio.printDetails();
}

void loop(void)
{
  //
  // Ping out role.  Repeatedly send the current time
  //

  if (role == role_ping_out)
  {
    // First, stop listening so we can talk.
    radio.stopListening();

    // Take the time, and send it.  This will block until complete
    unsigned long time = millis();
    printf("Now sending %lu...",time);
    bool ok = radio.write( &time, sizeof(unsigned long) );
   
    if (ok)
      printf("ok...");
    else
      printf("failed.\n\r");

    // Now, continue listening
    radio.startListening();

    // Wait here until we get a response, or timeout (250ms)
    unsigned long started_waiting_at = millis();
    bool timeout = false;
    while ( ! radio.available() && ! timeout )
      if (millis() - started_waiting_at > 200 )
        timeout = true;

    // Describe the results
    if ( timeout )
    {
      printf("Failed, response timed out.\n\r");
    }
    else
    {
      // Grab the response, compare, and send to debugging spew
      unsigned long got_time;
      radio.read( &got_time, sizeof(unsigned long) );

      // Spew it
      printf("Got response %lu, round-trip delay: %lu\n\r",got_time,millis()-got_time);
    }

    // Try again 1s later
    delay(1000);
  }

  //
  // Pong back role.  Receive each packet, dump it out, and send it back
  //

  if ( role == role_pong_back )
  {
    // if there is data ready
    if ( radio.available() )
    {
      // Dump the payloads until we've gotten everything
      unsigned long got_time;
      bool done = false;
      while (!done)
      {
        // Fetch the payload, and see if this was the last one.
        done = radio.read( &got_time, sizeof(unsigned long) );

        // Spew it
        printf("Got payload %lu...",got_time);

// Delay just a little bit to let the other unit
// make the transition to receiver
delay(20);
      }

      // First, stop listening so we can talk
      radio.stopListening();

      // Send the final one back.
      radio.write( &got_time, sizeof(unsigned long) );
      printf("Sent response.\n\r");

      // Now, resume listening so we catch the next packets.
      radio.startListening();
    }
  }

  //
  // Change roles
  //

  if ( Serial.available() )
  {
    char c = toupper(Serial.read());
    if ( c == 'T' && role == role_pong_back )
    {
      printf("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK\n\r");

      // Become the primary transmitter (ping out)
      role = role_ping_out;
      radio.openWritingPipe(pipes[0]);
      radio.openReadingPipe(1,pipes[1]);
    }
    else if ( c == 'R' && role == role_ping_out )
    {
      printf("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK\n\r");
     
      // Become the primary receiver (pong back)
      role = role_pong_back;
      radio.openWritingPipe(pipes[1]);
      radio.openReadingPipe(1,pipes[0]);
    }
       
  }
}


Now the error I get is that in the preamble that the arduino prints to the serial monitor, I get only zero-adress. In the maniacBug tutorial it means that the wiring is incorrect, but I checked it many and many times, redoing it from the beginning for many times.
I'm not soldering wires, I'm using the pinned wires of the "arduino prototyping kit" (just to be understandable, I have not the kit unfortunately)

Any Ideas?
Any help?

Thank you for your time.

PaulS

Quote
I soldered on it the Arduino Ethernet shield with the W5100 chip.

That shield is meant to plug in. Why did you solder it?

Quote
I saw the following topics in english language about my problem but I couldn't find any solution in them

Well, you haven't told us what your problem is, so we can't help.

Have you tried the Ethernet shield and the radios with other than the Leonardo? Why do you even have the ethernet shield? That code does not use the Ethernet connection provided.

SurferTim

That is an SPI device? How do you have the SPI data lines connected? Do you have them connected to the ICSP connector? If not, it won't work. The Leonardo does not have the SPI data lines on digital pins 11-13 like the Uno.
http://arduino.cc/en/Main/ArduinoBoardLeonardo

bakla89

thank you for your replies.

Quote
Why did you solder it?

many unexplainable valid reasons.

Quote
Well, you haven't told us what your problem is, so we can't help.

It is explained below the code

Quote
Why do you even have the ethernet shield? That code does not use the Ethernet connection provided.

I removed all unnecessary function in order to understand why the nRF24L01 doesn't work.

Quote
That is an SPI device? How do you have the SPI data lines connected? Do you have them connected to the ICSP connector? If not, it won't work. The Leonardo does not have the SPI data lines on digital pins 11-13 like the Uno.

Thank you Tim!
I think you find the reason!

I didn't realize that the leonardo has no SPI on any digital pin.
Thank you very much!
I will make some tries and let you know.

bakla89

Solved!

I linked the nRF24L01 to the arduino leonardo following this scheme:

(ref http://spazspot.blogspot.it/2011/03/pocket-avr-programmer.html)

I confirm you that my code was correct.
Actually it was not necessary to put the pin 04 HIGH.

Thank you very much to SurferTim because he solved my problem.
And thank you to PaulS as well for trying to solve it.

crystal13

Hello, I resume this topic because I would like to know if are there problems (with SPI) to use all together:

Arduino UNO + ethernet shield + nRF24LO1+

Can you help me?


up, i'm very interested in using together RF24 and W5100...



regards

SurferTim

There should not be a problem with the devices working together. The OP had no trouble once he figured out the SPI data lines were not on D11-D13 like the Uno. The only requirement is insure you have the correct pins for the SPI data lines, and each must have a separate slave select pin.

edit: Providing there is enough power for all that running together...

Go Up