Electronic – arduino – Wireless Communication core concepts based on the NRF24 libary for Arduino

arduinowireless

Well as you may know, there is an amazing libary for arduino called NRF24, used to control Nrf24l01 devices, at the momment I already tried all the examples included, and even made some modifications.

I want to go further but there are some basic concepts I miss, tried on google, in the main site, taking closer look to the examples, but nothing, I just dont understand some things. I really want to go deeper but I feel a good tutorial is missing. Here are some of the things I dont get.

Whats a pipe? How it changes if I want 2 or 6 nodes to speak.

const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

code extracted from the basic example.

What the numbers mean?

Maybe after the explanation, I will figure how to solve the next issue, but just in case; How do I need to set the pipes if my network is static 6 nodes, one base. The nodes some times send data to the base and then the base answers with some other data back to the emiting node…

Best Answer

To quote the datasheet:

A data pipe is a logical channel in the physical RF channel.

In the intended usage, each transceiver node would get its own pipe "address". This essentially signal that the receiving logic uses to know when to listen up amongst all the radio noise that might be on the particular physical channel (i.e. frequency) you are using. You can sort of pick any number, however some numbers are harder to pick out in that noise than others.

Now in that example, there are two pipe numbers. pipes[0] is used by the sample code as the destination address, the node messages will be sent to. pipes[1] is used as the receiving address so "ping" messages marked for F0F0F0F0D2 will be ACK'ed by the transceiver and stored (in a small buffer) for your microprocessor to retrieve.

The sample code also does a higher-level "pong" by sending a new message back to the sender, who is presumed to be listening for messages starting with F0F0F0F0E1 (pipes[0]) — presumed and needing configured in the code because the nRF24 packet structure does not include the sender's address, only the receiver.

[Sorry to muddle this, but one you understand the above you should flip things around and pretend the transmitted address pattern is actually the sender identity. This is implied by the fact that a transceiver can listen for up to 6 formerly "recipient" pipe addresses ± simultaneously as far as your microprocessor is concerned.

In normal usage, packets are auto-acknowledged and auto-retried so only one node should send per pipe (i.e. address) — otherwise two nodes will hear ACKs intended for each other and confused retry attempts can abound. If however you turn the auto-ACK stuff off and implement your own higher-level protocol for reliability, you could have all devices on a particular frequency also listen/send on the same particular pipe address pattern. The advantage here is that it avoids the limitation that an nRF24 transceiver can only be automatically handling receipt for five or six pipe addresses simultaneously. If you want to have more "sender" (in the flipped sense) nodes than that, you need to manage sharing them.]