Go Down

Topic: nRF24L01+ demo using ackPayload (Read 7396 times) previous topic - next topic

Robin2

@Robin2, I was wondering how I could get this to work with several receivers? I want to broadcast the data to anywhere between 2-30 receivers. Would it be as simple as using the same pipe address on all slaves? (i.e. the slaveID from your sketch)?
If you want several slaves to receive the same message then you will have to disable acknowledgement because the slaves would all be replying at the same time. Assuming you do that you could use the same address for every slave.

The alternative is to send the message in turn to every slave separately. It would not take long for the master to communicate with 30 slaves. How often do you need to send the message?

There is a network mode for the nRF24s but I don't know anything about it - I have never used it and I have never read any of the documentation. It may or may not be relevant to your situation.

...R
Two or three hours spent thinking and reading documentation solves most programming problems.

Robin2

#16
Feb 28, 2016, 11:23 pm Last Edit: Aug 15, 2016, 09:09 am by Robin2
I have tidied up (I hope) my use of ackLen and ackMessgLen in the versions in this Reply.
EDIT ... Note to self - I downloaded and tested this code successfully on 14/08/2016


Quote
There is a one packet delay in the signaling of an ack-reception.
I'm afraid I don't believe this happens with my code. The data that is sent in the acknowledgment is what I expect it to send.

Revised versions of the programs

The master program
Code: [Select]
// TrackControl - the master or the transmitter

 // http://tmrh20.github.io/RF24/

 //~ - CONNECTIONS: nRF24L01 Modules See:
 //~ http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo
 //~ 1 - GND
 //~ 2 - VCC 3.3V !!! NOT 5V
 //~ 3 - CE to Arduino pin 9
 //~ 4 - CSN to Arduino pin 10
 //~ 5 - SCK to Arduino pin 13
 //~ 6 - MOSI to Arduino pin 11
 //~ 7 - MISO to Arduino pin 12
 //~ 8 - UNUSED

#include <SPI.h>
//~ #include <TMRh20nRF24L01.h>
//~ #include <TMRh20RF24.h>
#include <nRF24L01.h>
#include <RF24.h>


#define CE_PIN   9
#define CSN_PIN 10

// NOTE: the "LL" at the end of the constant is "LongLong" type
// These are the IDs of each of the slaves
const uint64_t slaveID[2] = {0xE8E8F0F0E1LL, 0xE8E8F0F0E2LL} ;

RF24 radio(CE_PIN, CSN_PIN); // Create a Radio

int dataToSend[2];

unsigned long currentMillis;
unsigned long prevMillis;
unsigned long txIntervalMillis = 1000;
int txVal = 0;
int ackMessg[6];
byte ackMessgLen = 4; // NB this 4 is the number of bytes in the 2 ints that will be recieved


void setup() {

    Serial.begin(9600);
    Serial.println("Track Control Starting");
    radio.begin();
    radio.setDataRate( RF24_250KBPS );
    radio.enableAckPayload();
    radio.setRetries(3,5); // delay, count
}

//====================

void loop() {

    currentMillis = millis();
    if (currentMillis - prevMillis >= txIntervalMillis) {

    radio.openWritingPipe(slaveID[0]); // calls the first slave
                                        // there could be a FOR loop to call several slaves in turn
    dataToSend[0] = txVal; // this gets incremented so you can see that new data is being sent
    txVal += 1;
    dataToSend[1] = txVal;
    txVal += 1;
    bool rslt;
    rslt = radio.write( dataToSend, sizeof(dataToSend) );
    Serial.print("\nRSLT (1 = success) ");
    Serial.println(rslt);
    Serial.print("Data Sent ");
    Serial.print(dataToSend[0]);
    Serial.print("  ");
    Serial.println(dataToSend[1]);
    if ( radio.isAckPayloadAvailable() ) {
        radio.read(ackMessg,ackMessgLen);
        Serial.print("Acknowledge received: ");
        Serial.print(ackMessg[0]);
        Serial.print("  ");
        Serial.println(ackMessg[1]);
    }
    prevMillis = millis();
 }
}


and the slave program
Code: [Select]
// HandController - the slave or the receiver

    // http://tmrh20.github.io/RF24/

    //~ - CONNECTIONS: nRF24L01 Modules See:
    //~ http://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo
    //~ 1 - GND
    //~ 2 - VCC 3.3V !!! NOT 5V
    //~ 3 - CE to Arduino pin 9
    //~ 4 - CSN to Arduino pin 10
    //~ 5 - SCK to Arduino pin 13
    //~ 6 - MOSI to Arduino pin 11
    //~ 7 - MISO to Arduino pin 12
    //~ 8 - UNUSED

#include <SPI.h>
//~ #include <TMRh20nRF24L01.h>
//~ #include <TMRh20RF24.h>
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN   9
#define CSN_PIN 10

// NOTE: the "LL" at the end of the constant is "LongLong" type

const uint64_t   deviceID = 0xE8E8F0F0E1LL; // Define the ID for this slave

int valChange = 1;

RF24 radio(CE_PIN, CSN_PIN);

int dataReceived[2];
int ackData[2] = {12,23};

void setup() {

    Serial.begin(9600);
    delay(1000);
    Serial.println("Hand Controller Starting");
    radio.begin();
    radio.setDataRate( RF24_250KBPS );
    radio.openReadingPipe(1,deviceID);
    radio.enableAckPayload();
    radio.writeAckPayload(1, ackData, sizeof(ackData));
    radio.startListening();
}

void loop() {

    if ( radio.available() ) {
        radio.read( dataReceived, sizeof(dataReceived) );
        Serial.print("Data received Number0 ");
        Serial.print(dataReceived[0]);
        Serial.print(" Number1 ");
        Serial.println(dataReceived[1]);
        radio.writeAckPayload(1, ackData, sizeof(ackData));
        ackData[0] += valChange; // this just increments so you can see that new data is being sent
    }
}


NOTE that these programs use TMRh20's version of the RF24 library

...R
Two or three hours spent thinking and reading documentation solves most programming problems.

Whandall

The latest version looks as if the master would not get any ack/ack-payload
Code: [Select]
Track Control Starting

RSLT (1 = success) 0
Data Sent 0  1

RSLT (1 = success) 0
Data Sent 2  3

RSLT (1 = success) 0
Data Sent 4  5

RSLT (1 = success) 0
Data Sent 6  7

RSLT (1 = success) 0
Data Sent 8  9

The slave gets the packets
Code: [Select]
Hand Controller Starting
Data received Number0 0 Number1 1
Data received Number0 2 Number1 3
Data received Number0 4 Number1 5
Data received Number0 6 Number1 7
Data received Number0 8 Number1 9
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Stump_Jumper

I would like to understand this line [] {}

int ackData[2] = {12,23};


CrossRoads

[]  indicates an array, ackData[2] is a 2 location array.
{} is the array contents
so ackData[0] = 12
and ackData[1] = 23
Each location holds a 2 byte value as int was used for the datatype.  byte would have been sufficient as the data used is <= a value of 255.
Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.

Robin2

byte would have been sufficient as the data used is <= a value of 255.
As the program is written it increments ackData[0] indefinitely so it gets some value from the int.

If @Stump_Jumper does wish to change the data type there must be a matching change in the other program.

...R
Two or three hours spent thinking and reading documentation solves most programming problems.

Stump_Jumper

This should help thanks
I will be checking for a button press 1 or 0 converting to 111 or 000 to send over the ackPayload.

WL888

Hi all.
I am referring to post 16 by Robin and the comments that follow:
I have uploaded the respective code to 2 UNO and they are both displaying the expected printout as far as the values go, however the ack section ( as was noted by another member) is not displaying

Code: [Select]
    bool rslt;
    rslt = radio.write( dataToSend, sizeof(dataToSend) );
    Serial.print("\nRSLT (1 = success) ");
    Serial.println(rslt);


Code: [Select]
    if ( radio.isAckPayloadAvailable() ) {
        radio.read(ackMessg,ackMessgLen);
        Serial.print("Acknowledge received: ");
        Serial.print(ackMessg[0]);
        Serial.print("  ");
        Serial.println(ackMessg[1]);



my typical printout:-

RSLT (1 = success) 0
Data Sent 4624  4625

to my understanding, the zero should change to 1 and the ack statements should be printed.


I appreciate that asking for the corrected code is not the best way to learn, but i have spent a lot of time trying to figure this out and am still no wiser, so if you would...the corrected code please.  :-)

I am using the latest Library,as listed, and would like to stay with it, as it seems to work ok.

Like most people, it would appear, it has taken me some time to get this far, finding a working library that has simple examples available is not that easy.

Robin2

I wrote a more recent and more comprehensive Simple nRF24L01+ Tutorial. I suggest you try the examples in that. They do work :)

...R
Two or three hours spent thinking and reading documentation solves most programming problems.

ddmdavid01

Hey, is there a way to reset the nrf24l01 com, like switch the communication of and the on again?

Robin2

Hey, is there a way to reset the nrf24l01 com, like switch the communication of and the on again?
AFAIK the only way to reset the device is to disconnect it from the power. I know it does not reset when you press the Arduino reset button.

However communication is not continuous. It only happens for a brief instant when you send a message.

...R
Two or three hours spent thinking and reading documentation solves most programming problems.

wiremonkey

I was able to get the Ack replies working with Robin2's code above. You have to add the following lines of code to the Master sketch. I added them after radio.enableAckPayload();

radio.setAutoAck(true); 
radio.enableDynamicPayloads();
radio.stopListening();


----------------------------
----------------------------

Thanks Robin2 for all of your hard work!

Robin2

Thanks Robin2 for all of your hard work!
Thank you for your kind words.

Have you looked at my newer Simple nRF24L01+ Tutorial

...R
Two or three hours spent thinking and reading documentation solves most programming problems.

Whandall

I was able to get the Ack replies working with Robin2's code above. You have to add the following lines of code to the Master sketch. I added them after radio.enableAckPayload();

radio.setAutoAck(true); 
radio.enableDynamicPayloads();
radio.stopListening();

To which program do you think the statements have to be added?

I doubt that any of those option are not enabled if used by the sketch.
And stopping to listen does not make much sense in Standby-I, it is still/already stopped.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

Go Up