Can't get 6 nRF24L01+ to work

Hi, I am trying to make two arduinos communicate, the final goal is to make a airplane and its controller
But I can't make them work reliably...

CONTEXT :
I have 6 nrf24L01+,
Two of them give me no life sign.
One of them always returns that communication succeded even when the other board is not connected to a power source (and don't seems to really send data)
And the 3 others are.. changing their minds
yesterday, I could make the controller and the plane communicate almost perfectly. (not a very smooth communication, but enough)
today, I plug the boards, and nothing, can't get them to work...
I am desesperate...
I am using the nrf24l01 lite library with the baseRX and baseTX examples

THE REAL QUESTION :
My goal is to make an airplane, there is 3 stages of "making an airplane" :

  • Create it literaly from scratch, like my first goal. As you can see my radio controller is literaly made on a piece of cardboard, can't be more DIY.
  • Enter the fpv game : buy a real radio controller and a receptor board that is premade and will drive the motors by itself.
  • Buy everything premade

The first option was the best :

  • fun (before I get desesperate)
  • cheap
  • Highly customisable (free on the shape of the plane/boat/car or what you want. Free on the program, if it worked I could take it further with auto stabilization, autopilot, or much more)

The second one is

  • not too expensive
  • offers medium customisation (on the shape of the plane, but I think not on the program, I don't know this word very well but a premade card can't be changed. What if I want to create an autopilot, add a gyro or a gps ? I don't want to buy another entire card every time I want a new function.

And I don't want the third one, expensive and not so fun...

So I am wondering, what is wrong with my nRF24L01+ ? Are they ALL dead ? Is it often the case ?! Concretely, even if they work, is it enough for a sensitive object that need strong reliability like an airplane ?
Should I perseverate in the fully arduino way, or go to the second option ? Maybe it's more free than i think, but I don't have much information on it.
Do you have any advice to make the communication works ?

programs :

BasicRX

/*

Demonstrates simple RX and TX operation.
Any of the Basic_TX examples can be used as a transmitter.
Please read through 'NRFLite.h' for a description of all the methods available in the library.

Radio    Arduino
CE    -> 9
CSN   -> 10 (Hardware SPI SS)
MOSI  -> 11 (Hardware SPI MOSI)
MISO  -> 12 (Hardware SPI MISO)
SCK   -> 13 (Hardware SPI SCK)
IRQ   -> No connection
VCC   -> No more than 3.6 volts
GND   -> GND

*/

#include <SPI.h>
#include <NRFLite.h>

const static uint8_t RADIO_ID = 0;       // Our radio's id.  The transmitter will send to this id.
const static uint8_t PIN_RADIO_CE = 9;
const static uint8_t PIN_RADIO_CSN = 10;

struct RadioPacket // Any packet up to 32 bytes can be sent.
{
    uint8_t FromRadioId;
    uint32_t OnTimeMillis;
    uint32_t FailedTxCount;
};

NRFLite _radio;
RadioPacket _radioData;

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

    // By default, 'init' configures the radio to use a 2MBPS bitrate on channel 100 (channels 0-125 are valid).
    // Both the RX and TX radios must have the same bitrate and channel to communicate with each other.
    // You can run the 'ChannelScanner' example to help select the best channel for your environment.
    // You can assign a different bitrate and channel as shown below.
    //   _radio.init(RADIO_ID, PIN_RADIO_CE, PIN_RADIO_CSN, NRFLite::BITRATE2MBPS, 100) // THE DEFAULT
    //   _radio.init(RADIO_ID, PIN_RADIO_CE, PIN_RADIO_CSN, NRFLite::BITRATE1MBPS, 75)
    //   _radio.init(RADIO_ID, PIN_RADIO_CE, PIN_RADIO_CSN, NRFLite::BITRATE250KBPS, 0)
    
    if (!_radio.init(RADIO_ID, PIN_RADIO_CE, PIN_RADIO_CSN))
    {
        Serial.println("Cannot communicate with radio");
        while (1); // Wait here forever.
    }
}

void loop()
{
    while (_radio.hasData())
    {
        _radio.readData(&_radioData); // Note how '&' must be placed in front of the variable name.

        String msg = "Radio ";
        msg += _radioData.FromRadioId;
        msg += ", ";
        msg += _radioData.OnTimeMillis;
        msg += " ms, ";
        msg += _radioData.FailedTxCount;
        msg += " Failed TX";

        Serial.println(msg);
    }
}

BasicTX

/*

Demonstrates simple RX and TX operation.
Any of the Basic_RX examples can be used as a receiver.
Please read through 'NRFLite.h' for a description of all the methods available in the library.

Radio    Arduino
CE    -> 9
CSN   -> 10 (Hardware SPI SS)
MOSI  -> 11 (Hardware SPI MOSI)
MISO  -> 12 (Hardware SPI MISO)
SCK   -> 13 (Hardware SPI SCK)
IRQ   -> No connection
VCC   -> No more than 3.6 volts
GND   -> GND

*/

#include <SPI.h>
#include <NRFLite.h>

const static uint8_t RADIO_ID = 1;             // Our radio's id.
const static uint8_t DESTINATION_RADIO_ID = 0; // Id of the radio we will transmit to.
const static uint8_t PIN_RADIO_CE = 9;
const static uint8_t PIN_RADIO_CSN = 10;

struct RadioPacket // Any packet up to 32 bytes can be sent.
{
    uint8_t FromRadioId;
    uint32_t OnTimeMillis;
    uint32_t FailedTxCount;
};

NRFLite _radio;
RadioPacket _radioData;

void setup()
{
    Serial.begin(115200);
    
    // By default, 'init' configures the radio to use a 2MBPS bitrate on channel 100 (channels 0-125 are valid).
    // Both the RX and TX radios must have the same bitrate and channel to communicate with each other.
    // You can run the 'ChannelScanner' example to help select the best channel for your environment.
    // You can assign a different bitrate and channel as shown below.
    //   _radio.init(RADIO_ID, PIN_RADIO_CE, PIN_RADIO_CSN, NRFLite::BITRATE2MBPS, 100) // THE DEFAULT
    //   _radio.init(RADIO_ID, PIN_RADIO_CE, PIN_RADIO_CSN, NRFLite::BITRATE1MBPS, 75)
    //   _radio.init(RADIO_ID, PIN_RADIO_CE, PIN_RADIO_CSN, NRFLite::BITRATE250KBPS, 0)
    
    if (!_radio.init(RADIO_ID, PIN_RADIO_CE, PIN_RADIO_CSN))
    {
        Serial.println("Cannot communicate with radio");
        while (1); // Wait here forever.
    }
    
    _radioData.FromRadioId = RADIO_ID;
}

void loop()
{
    _radioData.OnTimeMillis = millis();

    Serial.print("Sending ");
    Serial.print(_radioData.OnTimeMillis);
    Serial.print(" ms");

    // By default, 'send' transmits data and waits for an acknowledgement.  If no acknowledgement is received,
    // it will try again up to 16 times.  This retry logic is built into the radio hardware itself, so it is very fast.
    // You can also perform a NO_ACK send that does not request an acknowledgement.  In this situation, the data packet
    // will only be transmitted a single time and there is no verification of delivery.  So NO_ACK sends are suited for
    // situations where performance is more important than reliability.
    //   _radio.send(DESTINATION_RADIO_ID, &_radioData, sizeof(_radioData), NRFLite::REQUIRE_ACK) // THE DEFAULT
    //   _radio.send(DESTINATION_RADIO_ID, &_radioData, sizeof(_radioData), NRFLite::NO_ACK)
    
    if (_radio.send(DESTINATION_RADIO_ID, &_radioData, sizeof(_radioData))) // Note how '&' must be placed in front of the variable name.
    {
        Serial.println("...Success");
    }
    else
    {
        Serial.println("...Failed");
        _radioData.FailedTxCount++;
    }

    delay(1000);
}

First is to tell us how you are powering the nRF24L01. The power is the most common problem. Second problem is the two devices are too close together.
I see some antennas. Do your nRF24L01 have antennas on the circuit board or are they supposed to have external antennas? If external, they will only work with the antennas connected.

Hi, thanks for your reply.
I have two way of powering them
The first is simply with the 3.3v pin of the arduino
the second is with a second board, given with them, that take 5v. It is said to deliver a more stable voltage and helps for long range, but actually their pins are full of false contact, so I don't use them actually.

Yes they all have an antenna.

on te left : board that take 5v
on the center, nrf24l01 board without the antenna (only to show the pin, otherwise I always let the antenna in)
on the center right, the nrf with the antenna
on the right, the total

Maybe the small distance is the cause ! I will try tomorrow with each one at a different corner of the room and let you know if it worked.

The high power NRFs need a separate 3.3V supply.

This is prone to fail, get supplies that work.

What do you mean by separate supply ? can't the arduino supply it and why ?
What specs ?
Supplies like I just showed ?

like this link ?

The normal Arduino can't supply, because it is too weak.

These work.

I had not much fun with the NRFs, when jumper cables were involved in their connections,
soldered connections work much better.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.