NRF24L01 transmit to RFM73

From my research it seems as though i can transmit data from an NRF24L01 to an RFM73.
But so far i've been unsuccessful and am hoping for some help...

I have a custom android tablet and the tablet hardware includes an RFM73.
I want to transmit data to this data's RFM73 from an arduino.

With an RFM73 attached to the arduino i can send data to the tablet.
This works very reliably using the RFM73 library from RFM73.

I've also tried using the version of RadioHead available from GitHub - Yveaux/RadioHead: Git repository for RadioHead wireless networking library. as well as the version of Radioduino available from GitHub - HackerspaceKRK/rfm73: This is a library for the Arduino. Designed originaly to work with the Radioduino..
Neither of these 2 libraries have been successful, i think in the past month of experimenting they have worked once or twice then mysteriously stopped.
The few times they did work was when i reverted to an old version of the arduino IDE.
A sketch might work or might not, if it worked and i reset the arduino it might or might not work again.
I haven't had time to debug this - but have mentioned these 2 other libraries anyway.

Now the arduino must also have an ethernet shield connected.
Most Wiznet based shields have a hardware SPI bug preventing them from shring the SPI bus with other devices.
So i'm hoping to use an ENC28J60 based ethernet module instead of a Wiznet shield and use the Ethercard library from http://jeelabs.org/pub/docs/ethercard/

  • The RFM73 library from voti.nl is not working with the Ethercard library and does not support use of the RFM73 interupt pin.
    My client wants the RFM73's interupt pin to be used.
  • There's loads of articles and blogs detailing how to get an NRF24L01 to work with an ENC28J60.
    Some of the available NRF24L01 libraries support the NRF24L01's interupt pin.

It looks logical to me to use an NRF24L01 on the arduino instead of an RFM73.
But am i correct in thinking that an NRF24L01 can transmit to an RFM73 or not?

I'm using this RadioHead nrf24_client example sketch:

#include <SPI.h>
#include <RH_NRF24.h>

// Singleton instance of the radio driver
RH_NRF24 nrf24(8, 9); // i'm using pins 8 and 9 as CS and CE

// RH_NRF24 nrf24(8, 7); // use this to be electrically compatible with Mirf
// RH_NRF24 nrf24(8, 10);// For Leonardo, need explicit SS pin
// RH_NRF24 nrf24(8, 7); // For RFM73 on Anarduino Mini

void setup() 
{
  Serial.begin(9600);
  while (!Serial) 
    ; // wait for serial port to connect. Needed for Leonardo only
  if (!nrf24.init())
    Serial.println("init failed");
  // Defaults after init are 2.402 GHz (channel 2), 1Mbps, 0dBm
  if (!nrf24.setChannel(2))
    Serial.println("setChannel failed");
  if (!nrf24.setRF(RH_NRF24::DataRate1Mbps, RH_NRF24::TransmitPower0dBm))
    Serial.println("setRF failed");    
}


void loop()
{
  Serial.println("Sending to nrf24_server");
  // Send a message to nrf24_server
  uint8_t data[] = "Hello World!";
  nrf24.send(data, sizeof(data));
  
  nrf24.waitPacketSent();
  // Now wait for a reply
  uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);

  if (nrf24.waitAvailableTimeout(500))
  { 
    // Should be a reply message for us now   
    if (nrf24.recv(buf, &len))
    {
      Serial.print("got reply: ");
      Serial.println((char*)buf);
    }
    else
    {
      Serial.println("recv failed");
    }
  }
  else
  {
    Serial.println("No reply, is nrf24_server running?");
  }
  delay(400);
}

The sketch works when i run it on 2 arduinos - each arduino has an NRF24L01 attached.
But with my android device's RFM73 listening on channel 2 it fails to detect transmissions from either arduino.

I'm wondering whether the android's RFM73 pipe addresses are not set to whatever pipe addresses the RadioHead library is using.
But i have no way to get or set the android's RFM73 pipe addresses - no way to know what it's pipe addresses are set to.
Could this be my problem - my NRF24L01s are transmitting to a pipe address that the android RFM73 is not listening to?

Thanks for any help or info.

Martin.

I can't see any evidence in your Post that suggests someone else has managed to get those two devices to communicate.

To the best of my (limited) knowledge an NRF24 can only communicate with another nRF24 because there is a tonne of proprietary error checking and whatnot to make them work reliably.

...R

Looking at the RadioHead driver (Porting MySensors to work with the RadioHead library | MySensors Forum) I stumbled upon the RFM73 module from HopeRF (http://www.hoperf.com/rf/2.4g_module/RFM73.htm).

It seems to be a Chinese clone of the nRF24L01+ from Nordic Semiconductors, but the datasheet & the RadioHead implementation suggest they should be compatible.

That quote is from the author of the version of RadioHead i've used.

I have adapted my RF73/RFM73 library for the NRF24L01. These chips are almost identical, except that the RFM73 has a second bank of registers that must be initialized with some magical values.

And that quote is from the author of the RFM73 library at voti.nl

Am i misunderstanding what they are saying - aren't they saying that the RFM73 and NRF24L01 are compatible and can therefore communicate with each other?

Martin.

I know nothing about the RFM73. I had never heard of it until you mentioned it.

It is possible the author just means that interfacing to it from an Arduino is nearly the same as interfacing to an nRF24. That could be possible without wireless communication between them being possible.

Maybe there are other websites that know more about the RFM73?

...R

Robin2:
It is possible the author just means that interfacing to it from an Arduino is nearly the same as interfacing to an nRF24. That could be possible without wireless communication between them being possible.

Yes that may well be the case, let's hope someone else can contribute some more definite information.

Robin2:
Maybe there are other websites that know more about the RFM73?

Documentation and libraries for the RFM73 are relatively scarce.
That's why i was hoping that the NRF24L01 would be a compatible replacement - it has loads more documentation and libraries.

Martin.

The Hoperf RFM75 module seems to be the successor of the 73, which is mentioned in the naming conventions, but not elsewhere.
The RFM75 module is very similiar to the NRF24L01 and has the dual register bank feature. Datasheet rf/RFM75 Datasheet v1.0.pdf

Edit: I found the datasheet RFM73-Datasheet-V2.0.pdf

Whandall:
The RFM75 module is very similiar to the NRF24L01

But do you know if they can communicate with each other? :slight_smile:

@warwound, thinking more about this - considering how cheap the nRF24s are it hardly seems worth spending more than 5 minutes wondering about the RFM75.

...R

Technically it should be possible to communicate with the builtin RFM73.

Maybe some information from Sniffing and decoding NRF24L01+ and Bluetooth LE packets could be useful in finding out more about the tablet communication.

Or more Aduino based Yveaux NRF24_Sniffer.

Whandall:
Technically it should be possible to communicate with the builtin RFM73.

This is Off Topic so I hope the OP will excuse me.

Is that possible because the RFM73 has been derived from the nRF24, or is it techincally possible for an nRF24 to communicate with any 2.4GHz device that uses the same channel frequency?

I have some Cypress 2.4GHz transcievers and it would be interesting if they could communicate with an nRF24 - my study of the documentation led me to think it is not possible. (My Cypress devices are on expensive boards)

...R

Just found this info in the Radiohead library documentation for the RH_NRF24 class:

Send and receive addressed, reliable, acknowledged datagrams by nRF24L01 and compatible transceivers.

Supported transceivers include:

Additionally:

Naturally, for any 2 radios to communicate that must be configured to use the same frequency and data rate, and with identical network addresses.

Finally i have found in the RFM73 datasheet that the RFM73 default pipe 0 address is 0xE7E7E7E7E7 and the default pipe 1 address is 0xC2C2C2C2C2.

I shall now modify the Radiohead sketch i quoted in my original post, trying each of these 2 default RFM73 pipe addresses and hope that my android RFM73 starts to receive transmissions...
I'll post my results later.

Robin2:
Is that possible because the RFM73 has been derived from the nRF24, or is it techincally possible for an nRF24 to communicate with any 2.4GHz device that uses the same channel frequency?

If it is possible for an NRF24L01 to transmit to an RFM73 then i believe it is possible because the RFM73 is a clone of, or derived from, the NRF24L01 and they both share a similar architecture.

No luck with setting the pipe addresses in the arduino sketch, the android RFM73 still fails to receive anything.

This is my modified sketch:

#include <SPI.h>
#include <RH_NRF24.h>

#define RECEIVE_TIMEOUT 500
#define LOOP_DELAY 500

// Singleton instance of the radio driver
RH_NRF24 nrf24(8, 9); // using pins 8 CE and 9 CS

uint8_t message[] = "Hello from Uno";
uint8_t receiveBuffer[RH_NRF24_MAX_MESSAGE_LEN];
uint8_t receiveBufferLength = sizeof(receiveBuffer);

void setup(){
  Serial.begin(9600);

  if (!nrf24.init())
    Serial.println(F("init failed"));
    
  // setting NRF24 to: 2.402GHz (channel 2), 250kbps, 0dBm
  if (!nrf24.setChannel(2))
    Serial.println(F("setChannel failed"));
  if (!nrf24.setRF(RH_NRF24::DataRate250kbps, RH_NRF24::TransmitPower0dBm))
    Serial.println(F("setRF failed"));

  uint8_t pipe1Address[] = {0xE7, 0xE7, 0xE7, 0xE7, 0xE7}; //  default pipe 1 address
  // uint8_t pipe2Address[] = {0xC2, 0xC2, 0xC2, 0xC2, 0xC2}; //  default pipe 2 address
  if (!nrf24.setNetworkAddress(pipe1Address, sizeof(pipe1Address))) {
    Serial.println(F("setNetworkAddress failed"));
  }
}


void loop(){
  Serial.println(F("sending message"));
  nrf24.send(message, sizeof(message));
  nrf24.waitPacketSent();
  
  // wait for a reply
  if (nrf24.waitAvailableTimeout(RECEIVE_TIMEOUT)){
    // Should be a reply message for us now
    if (nrf24.recv(receiveBuffer, &receiveBufferLength)){
      Serial.print(F("reply received: "));
      Serial.println((char*) receiveBuffer);
    } else {
      Serial.println(F("receive failed"));
    }
  } else {
    Serial.println(F("no reply received"));
  }
  delay(LOOP_DELAY);
}

I've managed to verify that if no pipe address is set in the RH_NRF24 class then the default pipe 0 address is used - that's 0xE7E7E7E7E7.
And i can set any arbitary address on both of my arduinos and they can both send and receive to each other.

But still the android remains silent - it'll beep each time it's RFM73 receives a transmission.

Now should i spend any more time on this or should i revert to using an RFM73 on my arduino to transmit to the RFM73 on my android tablet?
I'll wait and see if anyone else on the forum can contribute any info before making my mind up.

Sorry this post isn't going to be super helpful.

I was reading a few days ago that the rfm73/75 can talk to each other with the nrf24 libraries, but they include two additional bytes in the radio communications. As such a pair of rfm73's will work fine.
However an nrf24l01+ will not be able to talk to them.

This is all from memory, so I apologise if I have some of the detail wrong. I also can't find where I was reading about it.

@warwound, you have already invested far more time on this quest than the value of an nRF24 module :slight_smile:

...R

Robin2:
@warwound, you have already invested far more time on this quest than the value of an nRF24 module :slight_smile:

I think you're right.
I'll revert to using an RFMN73 on the arduino side.

Have you seen this:

and the links from description?
I am also interested in making a nrf51822 talking with a RFM73/75.
I will check the github code from description.

1 Like

dan_arcana:
Have you seen this:

No.

...R