Hello All,
I'm at my wits end with this issue, so I'm turning to the Hivemind for help.
I have been using NRF24L01 modules for a while now, and recently wanted to make an RC controller for an RC car. Wanting more than the ~80m of range I get with two NRF24L01 modules, I bought 2 NRF24L01 Wireless Modules with Antenna and PA for 5V external power, and I read online I should be able to get a few hundred meters comfortably. However, despite uing an external 5V supply and 100uF capacitor, my range between two antenna Modules is a few centimeters max.
I bought new Antennas thinking they may just be defective, same issue again. I have quintuple checked my Pins are correct, have tried them without the PA, I have made sure I'm getting stable connection through my SPI, tried shorter and longer wiring, bought brand new modules (same issue) and varied my capacitors. Below is a picture of my current setup (usually used for modules without antenna), and I use the getting started code from the R24.h library. Any Tips would be greatly appreciated
#include <SPI.h>
#include "printf.h"
#include "RF24.h"
#define CE_PIN 9
#define CSN_PIN 10
// instantiate an object for the nRF24L01 transceiver
RF24 radio(CE_PIN, CSN_PIN);
// Let these addresses be used for the pair
uint8_t address[][6] = { "1Node", "2Node" };
// It is very helpful to think of an address as a path instead of as
// an identifying device destination
// to use different addresses on a pair of radios, we need a variable to
// uniquely identify which address this radio will use to transmit
bool radioNumber = 1; // 0 uses address[0] to transmit, 1 uses address[1] to transmit
// Used to control whether this node is sending or receiving
bool role = false; // true = TX role, false = RX role
// For this example, we'll be using a payload containing
// a single float number that will be incremented
// on every successful transmission
float payload = 0.0;
void setup() {
// 1. Initialize Serial first
Serial.begin(115200);
// 2. Wait for Serial port to connect (CRITICAL for modern boards like Nano Every, Leonardo, ESP32)
while (!Serial) {
delay(10);
}
// Force a slower SPI clock speed during initialization
// 3. Print immediate confirmation that the board is alive
Serial.println(F("--- Arduino Booting Up ---"));
radio.begin();
radio.setPALevel(RF24_PA_MIN); // Force lowest power draw (Software band-aid)
if (!radio.isChipConnected()) {
Serial.println(F("CRITICAL ERROR: radio hardware is not responding!!"));
radio.printDetails();
while (1) { delay(1000);
}
}
Serial.println(F("RF24/examples/GettingStarted"));
Serial.println(F("Which radio is this? Enter '0' or '1'. Defaults to '0'"));
while (!Serial.available()) {
// wait for user input
}
char input = Serial.parseInt();
radioNumber = input == 1;
Serial.print(F("radioNumber = "));
Serial.println((int)radioNumber);
Serial.println(F("*** PRESS 'T' to begin transmitting to the other node"));
radio.setPALevel(RF24_PA_LOW);
radio.setPayloadSize(sizeof(payload));
radio.stopListening(address[radioNumber]);
radio.openReadingPipe(1, address[!radioNumber]);
if (!role) {
radio.startListening();
}
}
void loop() {
if (role) {
// This device is a TX node
unsigned long start_timer = micros(); // start the timer
bool report = radio.write(&payload, sizeof(float)); // transmit & save the report
unsigned long end_timer = micros(); // end the timer
if (report) {
Serial.print(F("Transmission successful! ")); // payload was delivered
Serial.print(F("Time to transmit = "));
Serial.print(end_timer - start_timer); // print the timer result
Serial.print(F(" us. Sent: "));
Serial.println(payload); // print payload sent
payload += 0.01; // increment float payload
} else {
Serial.println(F("Transmission failed or timed out")); // payload was not delivered
}
// to make this example readable in the serial monitor
delay(1000); // slow transmissions down by 1 second
} else {
// This device is a RX node
uint8_t pipe;
if (radio.available(&pipe)) { // is there a payload? get the pipe number that received it
uint8_t bytes = radio.getPayloadSize(); // get the size of the payload
radio.read(&payload, bytes); // fetch payload from FIFO
Serial.print(F("Received "));
Serial.print(bytes); // print the size of the payload
Serial.print(F(" bytes on pipe "));
Serial.print(pipe); // print the pipe number
Serial.print(F(": "));
Serial.println(payload); // print the payload's value
}
} // role
if (Serial.available()) {
// change the role via the serial monitor
char c = toupper(Serial.read());
if (c == 'T' && !role) {
// Become the TX node
role = true;
Serial.println(F("*** CHANGING TO TRANSMIT ROLE -- PRESS 'R' TO SWITCH BACK"));
radio.stopListening();
} else if (c == 'R' && role) {
// Become the RX node
role = false;
Serial.println(F("*** CHANGING TO RECEIVE ROLE -- PRESS 'T' TO SWITCH BACK"));
radio.startListening();
}
}
} // loop




