Issue with doing Full duplex transmission using esp32 and nrf24l01 PA lna

@srnet @Paul_KD7HB I have chosen to swap the single ebyte full-duplex transceiver as it is not really full duplex and replaced it with a pair of nrf24l01 Powe amplifier module(one for Tx and the other for Rx) and I have been able to accomplish full duplex transmission of dummy packets. However, I am having an issue; let's say I have 2 esp32s(namely espA and espB) with a pair of NRF's installed on each of them. now, The full duplex transmissions for both of them works well only that the Rx module for espA seems to receive the not only the transmission from the Tx module from espB but also the Tx module on espA which shouldn't be so. Rx module on espA should not see packets sent from Tx module on espA. I have tried to fix this by putting Tx and Rx on each esp on different channels but it is still happening. Can you please see what you can make of this matter? any counsel concerning why this is happening and how to go about fixing it would be much appreciated.

I am currently using nRF24L01.h and RF24.h libraries

Thanks in advance.

I am not an expert on the nrf24L01, but I cannot see how full duplex with two nrf24L01s close to each other is possible.

The local transmitting nrf24L01 will produce a signal, that the nearby RX will see, that is many many times greater than the very weak signal from the other remote TX. The nearby RX will likely just be completely overwhelmed by the very strong signal from the also nearby TX.

It like having someone screaming very loudly directly into one of your ears while your trying to listen to someone talking quietly 100m away.

2 Likes

I’m not an expert either, but it seems like you’re dealing with an antenna design issue since the transmitter may bleed into the receiver.

I'll assume you are using examples from the internet or ChatGPT, so those typically have the addressing backwards. If you want to be able to extend those examples, you need to call something like uint8_t address[][6] = { "1Node", "2Node" }; where the 1 and the 2 are the identifying numbers. So many examples I've seen have this backwards, using addresses like "00001".

@TMRh20 Thanks for the comment. Can you please help me clarify a bit more how I can apply this to resolve the issue I am having?

@gilshultz It seems so too. Based on rf24 library, I was thinking that separating tx channel from rx channel would actually prevent this issue.

Can you plz post some example code? It would help to diagnose if it is a coding issue.

Typically the addresses are applied when calling openReadingPipe(1,address[0]); and/or openWritingPipe(addresss[0]) assuming you have declared uint8_t address[][6] = { "1Node", "2Node" };

You want to make sure all radios in this scenario have unique addresses, but beware pipes 1-5 require the addresses to be exactly the same except for one byte. The 1 or 2 in my example addresses.

Other than that, each receiving/transmitting pair should operate on their own channel, which I think you are doing.

Then, as I understand, you want to place the transmitter/receiver non-pairs (the ones in close proximity that don't communicate directly) at 90-degree angles to each other physically, to help prevent interference.

Also, did you know that nRF24 radios support ACK-payloads, so for example you can establish a pseudo full duplex transmission/reception at 1MBPS each way if you have the radios set to 2MBPS.

With auto-ack enabled (the default) the receiving radio will respond to the transmitter with an ACK-packet. This setting allows you to put data in the ACK-packet and establish two-way communication. Very handy for RC control situations where you are getting data back from the 'receiver'.

1 Like

@TMRh20 thank you very much for the knowledge shared. this is alot to digest. let me research on these topics/areas, implement in my code and revert soonest.

From what I can tell, the signals remain separate until they are transmitted. Once transmitted, the signal is not very narrow coming off the antenna; instead, it spreads quickly in all directions unless a specialized antenna is used. Even then, these antennas are not perfect. The key is to ensure proper separation of the RF signals. Typically, using different frequencies can help achieve this, but care must be taken to ensure that the transmitter does not interfere with the adjacent receiving antenna. This is why I believe it’s an antenna-related issue.

@gilshultz @TMRh20 the issue as now been resolved. I believe antenna adjustment as advised by @gilshultz but I much focused on resolving this at code/software level as advised by @TMRh20 since this option is within the boundaries of my limitations. So here is what I did software/code wise; I assigned Tx on device A and Rx on Device B same address and vice versa for Rx on device A and Tx for device B using a different address and this fixed the issue. Here is what my code looks like:

//For device A
const byte txAddress[5] = {'B','x','A','A','A'};
const byte rxAddress[5] = {'A','x','A','A','A'};


 radio1.begin();
  radio1.setChannel(channel);
  radio1.setPayloadSize(32);
  radio1.setPALevel(RF24_PA_MAX);
  radio1.setDataRate(RF24_2MBPS);
  radio1.setAutoAck(0); 
  radio1.setCRCLength(RF24_CRC_8);
  radio1.setRetries(0,15); 
  radio1.openWritingPipe(txAddress);
  radio1.stopListening();


  radio2.begin();
  radio2.setChannel(channel);
  radio2.setPayloadSize(32);
  radio2.setPALevel(RF24_PA_MAX);
  radio2.setDataRate(RF24_2MBPS);
  radio2.setAutoAck(0); 
  radio2.setCRCLength(RF24_CRC_8);
  radio2.setRetries(0,15); 
  radio2.openReadingPipe(1, rxAddress);
  radio2.startListening();

//For device B - Note that I made a slight change by swapping the first index of
// the address numbers
const byte txNumber[5] = {'A','x','A','A','A'};
const byte rxNumber[5] = {'B','x','A','A','A'};


 radio1.begin();
  radio1.setChannel(channel);
  radio1.setPayloadSize(32);
  radio1.setPALevel(RF24_PA_MAX);
  radio1.setDataRate(RF24_2MBPS);
  radio1.setAutoAck(0); 
  radio1.setCRCLength(RF24_CRC_8);
  radio1.setRetries(0,15); 
  radio1.openWritingPipe(txAddress);
  radio1.stopListening();


  radio2.begin();
  radio2.setChannel(channel);
  radio2.setPayloadSize(32);
  radio2.setPALevel(RF24_PA_MAX);
  radio2.setDataRate(RF24_2MBPS);
  radio2.setAutoAck(0); 
  radio2.setCRCLength(RF24_CRC_8);
  radio2.setRetries(0,15); 
  radio2.openReadingPipe(1, rxAddress);
  radio2.startListening();

I also disable writing pipe for Rx transceiver and disabled reading pipe for Tx transceiver; And I did this for both device A and device B.

Thank you very much @gilshultz and @TMRh20 for your counsels, it is much appreciated and it much helped.

1 Like