nrf24l01 trasmissione e ricezione in payload - risolto

ho riscontrato un particolare problema solo quando supero in size > 8 byte

per esempio se il payload ha un size di 3 byte non ci sono problemi

struct RF24AckPayload {
byte back1;
byte back2;
byte back3;
};

ora vorrei sostituire i byte con variabile con maggiore precisione ovvero: int long o float

il modulo nrf24l01 supporta fino a 32 byte come dati con 3 variabili di tipo float non dovrei aver problemi

ma se metto le tre variabili in float il payload nella ricezione si blocca mentre continua a tramettere i dati sul ricevente

come posso modificare il codice per usare il payload con variabili superiori a “byte”?

questo e’ il codice per la ricezione:

/// RX RICEVITORE

/* ****** RICEZIONE
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 “Arduino.h”
#include <SPI.h>
#include “RF24.h” //https://github.com/lnxbil/RF24 OR https://github.com/TMRh20/RF24
#include “printf.h”

// The sizeof this struct should not exceed 32 bytes
struct RF24Data {
byte dato1;
byte dato2;
byte dato3;
};

struct RF24AckPayload {
byte back1;
byte back2;
byte back3;
};

RF24Data nrf24Data;
RF24AckPayload nrf24AckPayload;

/************* USER Configuration *****************************/

RF24 radio(7,8); // (CE_PIN, CS_PIN);Set up nRF24L01 radio on SPI bus plus pins 7 & 8

/***************************************************************/

const uint64_t pipes[2] = { 0xABCDABCD71LL, 0x544d52687CLL };

void resetRF24Data()
{
nrf24Data.dato1 = 0;
nrf24Data.dato2 = 0;
nrf24Data.dato3 = 0;
}

void resetRF24AckPayload()
{
nrf24AckPayload.back1 = 50;
nrf24AckPayload.back2 = 30;
nrf24AckPayload.back3 = 2;
}

void setup(void) {

resetRF24Data();
resetRF24AckPayload();

Serial.begin(9600);
delay(1000);
printf_begin();
radio.begin(); // Setup and configure rf radio
radio.setChannel(1); // Set the channel
radio.setPALevel(RF24_PA_LOW); // Set PA LOW for this demonstration. We want the radio to be as lossy as possible for this example.
radio.setDataRate(RF24_250KBPS); // Raise the data rate to reduce transmission distance and increase lossiness
radio.setAutoAck(1); // Ensure autoACK is enabled
radio.enableAckPayload();
radio.enableDynamicPayloads();
radio.setRetries(2,15); // Optionally, increase the delay between retries. Want the number of auto-retries as high as possible (15)
radio.setCRCLength(RF24_CRC_8); // Set CRC length to 16-bit to ensure quality of data
radio.openWritingPipe(pipes[1]); // Both radios listen on the same pipes by default, and switch when writing
radio.openReadingPipe(1,pipes[0]);

radio.printDetails(); // Dump the configuration of the rf unit for debugging

radio.startListening();

}

void loop(void){

while(radio.available())
{
radio.writeAckPayload(1,&nrf24AckPayload,sizeof(nrf24AckPayload));
radio.read(&nrf24Data, sizeof(nrf24Data));

Serial.print("//size of data “);
Serial.print(sizeof(nrf24Data));
Serial.print(”-- ricevuto //dato1 “);
Serial.print(nrf24Data.dato1);
Serial.print(”// dato2 “);
Serial.print(nrf24Data.dato2);
Serial.print(”// dato3 ");
Serial.println(nrf24Data.dato3);
}

}

//-------------------------------------------------------------------------------------------------------------------------------------------------

e questo e’ il codice per la trasmissione:
/* TRASMISSIONE
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 “nRF24L01.h”
#include “RF24.h”
#include “printf.h”

// The sizeof this struct should not exceed 32 bytes
struct RF24Data {
byte dato1;
byte dato2;
byte dato3;
};

struct RF24AckPayload {
byte back1;
byte back2;
byte back3;
};

RF24Data nrf24Data;
RF24AckPayload nrf24AckPayload;

/************* USER Configuration *****************************/

RF24 radio(9,10); // (CE_PIN, CS_PIN);Set up nRF24L01 radio on SPI bus plus pins 7 & 8

/***************************************************************/

const uint64_t pipes[2] = { 0xABCDABCD71LL, 0x544d52687CLL };

void setup(void) {

Serial.begin(9600);
delay(1000);
printf_begin();
radio.begin(); // Setup and configure rf radio
radio.setChannel(1); // Set the channel
radio.setPALevel(RF24_PA_LOW); // Set PA LOW for this demonstration. We want the radio to be as lossy as possible for this example.
radio.setDataRate(RF24_250KBPS); // Raise the data rate to reduce transmission distance and increase lossiness
radio.setAutoAck(1); // Ensure autoACK is enabled
radio.enableAckPayload();
radio.enableDynamicPayloads();
radio.setRetries(2,15); // Optionally, increase the delay between retries. Want the number of auto-retries as high as possible (15)
radio.setCRCLength(RF24_CRC_8); // Set CRC length to 16-bit to ensure quality of data
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);

radio.printDetails(); // Dump the configuration of the rf unit for debugging

radio.stopListening();
}

void loop(void){

nrf24Data.dato1 = 10;
nrf24Data.dato2 = 13;
nrf24Data.dato3 = 20;

if(radio.isAckPayloadAvailable())
{
radio.read(&nrf24AckPayload, sizeof(nrf24AckPayload));
Serial.print("//size of data “);
Serial.print(sizeof(nrf24AckPayload));
Serial.print(”///1’ received ack payload is : “);
Serial.print(nrf24AckPayload.back1);
Serial.print(”///2’ received ack payload is : “);
Serial.print(nrf24AckPayload.back2);
Serial.print(”///3’ received ack payload is : ");
Serial.println(nrf24AckPayload.back3);
}

radio.write(&nrf24Data, sizeof(RF24Data));

}

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni e a leggere il regolamento: Regolamento - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare. Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Magari un salve, ciao o almeno una frase di cortesia non sarebbe male.

Ho usato gli stessi modulini ma con Mirf, che funziona egregiamente, non so darti suggerimenti x il tuo software, comunque il payload massimo è 32 char, trasmettono e ricevono dei caratteri ascii, verifica ben il payload massimo che hai.

nid69ita: Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni e a leggere il regolamento: Regolamento - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare. Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Magari un salve, ciao o almeno una frase di cortesia non sarebbe male.

ok presentazione fatta

per quato riguarda la formalita' per mio carattere sono un po sintetico certo se ci vediamo per strada sono "formale"

comunque ciao! :D

se interessa ho realizzato anche una piccola stazione barometrica dove posso pubblicare il codice?

con display a 2 righe https://www.youtube.com/watch?v=3WZTmt9QgM0

e con display nokia devo trovare il video ...

aspetto un suggerimento per l'array con n. byte superiore a 8 da passare al RF24 ..

grazie

triac60: Ho usato gli stessi modulini ma con Mirf, che funziona egregiamente, non so darti suggerimenti x il tuo software, comunque il payload massimo è 32 char, trasmettono e ricevono dei caratteri ascii, verifica ben il payload massimo che hai.

1 carattere ascii o char e' 1 byte

ripeto 8 byte me li gira in payload senza problemi ma credo che sia un errore sulla definizione dell'array sono un po arrugginito in programmazione quindi ho bisogno di una mano ...

lo size del payload viene letto dal codice che ho messo sopra e passato su seriale

Serial.print("//size of data "); Serial.print(sizeof(nrf24AckPayload));

poi avrei un dubbio se e' meglio prima fare la lettura (o scrittura in RX) e poi la scrittura (lettura in TX) del payload!

ciao

credo di aver risolto

ho messo

radio.setDataRate(RF24_1MBPS);

in pratica a 250kBPS non riceveva i payload > di 8 byte :sunglasses:

questo e’ il codice rivisitato e ottimizzato, se qualche programmatore expert puo’ darmi una ripulita al codice grazie

in particolare ho il dubbio se e’ meglio prima la ricezione e poi la scrittura/lettura del payload

e poi questa cosa strana dei 250kBPS che non va oltre gli 8 byte

classi e librerie usate per rf24
http://tmrh20.github.io/RF24/classRF24.html

/// RX RICEVITORE

/* ****** RICEZIONE
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 “Arduino.h”
#include <SPI.h>
#include “RF24.h” //https://github.com/lnxbil/RF24 OR https://github.com/TMRh20/RF24
#include “printf.h”

// The sizeof this struct should not exceed 32 bytes
struct RF24Data {
byte dato1;
byte dato2;
byte dato3;
};

struct RF24AckPayload {
float back1;
float back2;
float back3;
};

RF24Data nrf24Data;
RF24AckPayload nrf24AckPayload;

/************* USER Configuration *****************************/

RF24 radio(9,10); // (CE_PIN, CS_PIN);Set up nRF24L01 radio on SPI bus plus pins 9 & 10

/***************************************************************/

const uint64_t pipes[2] = { 0xABCDABCD71LL, 0x544d52687CLL };

void resetRF24Data()
{
nrf24Data.dato1 = 0;
nrf24Data.dato2 = 0;
nrf24Data.dato3 = 0;
}

void resetRF24AckPayload()
{
nrf24AckPayload.back1 = 0;
nrf24AckPayload.back2 = 0;
nrf24AckPayload.back3 = 0;
}

void setup(void) {

resetRF24Data();
resetRF24AckPayload();

Serial.begin(9600);
delay(1000);
printf_begin();
radio.begin(); // Setup and configure rf radio
radio.setChannel(1); // Set the channel
radio.setPALevel(RF24_PA_LOW); // Set PA LOW for this demonstration. We want the radio to be as lossy as possible for this example.
radio.setDataRate(RF24_1MBPS); // Raise the data rate to reduce transmission distance and increase lossiness
radio.setAutoAck(1); // Ensure autoACK is enabled
radio.enableAckPayload();
radio.enableDynamicPayloads();
radio.setRetries(2,15); // Optionally, increase the delay between retries. Want the number of auto-retries as high as possible (15)
radio.setCRCLength(RF24_CRC_8); // Set CRC length to 16-bit to ensure quality of data
radio.openWritingPipe(pipes[1]); // Both radios listen on the same pipes by default, and switch when writing
radio.openReadingPipe(1,pipes[0]);

radio.printDetails(); // Dump the configuration of the rf unit for debugging

radio.startListening();

}

void loop(void){

nrf24AckPayload.back1 = 101.35;
nrf24AckPayload.back2 = 13.55;
nrf24AckPayload.back3 = 21.233;

while(radio.available())
{
radio.read(&nrf24Data, sizeof(nrf24Data));
radio.writeAckPayload(1,&nrf24AckPayload,sizeof(nrf24AckPayload));
Serial.print("//size of payload “);
Serial.print(sizeof(nrf24AckPayload));
Serial.print(”-- ricevuto //dato1 “);
Serial.print(nrf24Data.dato1);
Serial.print(”// dato2 “);
Serial.print(nrf24Data.dato2);
Serial.print(”// dato3 ");
Serial.println(nrf24Data.dato3);
}

}



/* TRASMISSIONE
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 “nRF24L01.h”
#include “RF24.h”
#include “printf.h”

// The sizeof this struct should not exceed 32 bytes
struct RF24Data {
byte dato1;
byte dato2;
byte dato3;
};

struct RF24AckPayload {
float back1;
float back2;
float back3;
};

RF24Data nrf24Data;
RF24AckPayload nrf24AckPayload;

/************* USER Configuration *****************************/

RF24 radio(9,10); // (CE_PIN, CS_PIN);Set up nRF24L01 radio on SPI bus plus pins 9 & 10

/***************************************************************/

const uint64_t pipes[2] = { 0xABCDABCD71LL, 0x544d52687CLL };

void setup(void) {

Serial.begin(9600);
delay(1000);
printf_begin();
radio.begin(); // Setup and configure rf radio
radio.setChannel(1); // Set the channel
radio.setPALevel(RF24_PA_LOW); // Set PA LOW for this demonstration. We want the radio to be as lossy as possible for this example.
radio.setDataRate(RF24_1MBPS); // Raise the data rate to reduce transmission distance and increase lossiness
radio.setAutoAck(1); // Ensure autoACK is enabled
radio.enableAckPayload();
radio.enableDynamicPayloads();
radio.setRetries(2,15); // Optionally, increase the delay between retries. Want the number of auto-retries as high as possible (15)
radio.setCRCLength(RF24_CRC_8); // Set CRC length to 16-bit to ensure quality of data
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);

radio.printDetails(); // Dump the configuration of the rf unit for debugging

radio.stopListening();
}

void loop(void){

nrf24Data.dato1 = 10;
nrf24Data.dato2 = 13;
nrf24Data.dato3 = 20;

radio.write(&nrf24Data, sizeof(RF24Data),0);

if(radio.isAckPayloadAvailable())
{
radio.read(&nrf24AckPayload, sizeof(nrf24AckPayload));
Serial.print("//size of data “);
Serial.print(sizeof(nrf24AckPayload));
Serial.print(”///1’ received ack payload is : “);
Serial.print(nrf24AckPayload.back1);
Serial.print(”///2’ received ack payload is : “);
Serial.print(nrf24AckPayload.back2);
Serial.print(”///3’ received ack payload is : ");
Serial.println(nrf24AckPayload.back3);
}

}

ho risolto anche per i 250KBPS

basta aumentare il delay

radio.setRetries(10,15);

"
There is a restriction on the length of ARD when using ACK packets with payload. The ARD time must
never be shorter than the sum of the startup time and the time on-air for the ACK packet:
• For 2Mbps data rate and 5 byte address; 15 byte is maximum ACK packet payload length for
ARD=250µs (reset value).
• For 1Mbps data rate and 5 byte address; 5 byte is maximum ACK packet payload length for
ARD=250µs (reset value).
ARD=500µs is long enough for any ACK payload length in 1 or 2Mbps mode.
• For 250kbps data rate and 5byte address the following values apply:

1500us ARD ALL sizes
1250us ARD <= 24
1000us ARD <= 16
750us ARD <= 8
500us ARD <= EMPTY/No ACK payload
Table 18. Maximum ACK payload length for different retransmit delays at 250kbps"

ancora una nota che devo verificare per la portate effettiva

misurando la portante sembra che a 1mbps il segnale sia piu' forte ..

sto sviluppando un ricevitore 8ch per multiwii e 9/10ch per funzionamento generico per RC

ho gia' sistemato la parte joystick, radiocomando (sistemato ora il problema dei payload)

il multiwii e' gia' configurato e riceve i controlli del joystick

vi tengo aggiornati quando ho finito

le parti ancora da sviluppare sono: - display con telemetria e posizione gps - videocamera di tipo seriale o i2c con basso fps sempre tramite rf24

poi sto finendo il tricopter e anche qui ci vorra' un po di tempo, gia' stampato in 3d largo circa 380mm, 300grammi

bigc:
se interessa ho realizzato anche una piccola stazione barometrica dove posso pubblicare il codice?

Crea un thread in generale con titolo adeguato. Se poi gli altri utenti vorranno potrà essere spostato sotto megatopic (ma deve essere completo di schemi e software)
P.S. il codice DEVI metterlo nei tag code, quel pulsante con <> sopra a pergamena.