Moduli NRF24L01 e Payload che non funziona

Ciao,
visto il basso costo di questi moduli, ho voluto provare a farci qualcosa, anche se qualcuno non ne parla molto bene, mi pare però che il suo lo facciano...

Ho fatto due programmi di test con arduino nano, utilizzandoli semplicemente come trasmettitore e ricevitore, solo ACK attivo, e il tutto funziona egregiamente, senza mai un errore, il controllo dei pacchetti lo dovrei fare io via software...

Visto però che già integrato nel protocollo dei moduli c'è un sistema di controllo con reinvio di codici, volevo provare a utilizzarlo, è il Payload, qualcuno lo ha già utilizzato? Ho provato diversi esempi trovati in rete, ma la trasmissione funziona qualche secondo, poi i dati si sballano e cominciano a essere casuali, non mi sembra di aver sbagliato codice, trovato uguale in vari esempi, ma non si sa mai.
Allego i due semplici TX e RX:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(9, 10);          // pin modulo radio CE, CSN

byte inviati[3];           // creo un array per i dati da inviare
byte ricevuti[3];          // creo un array per i dati ricevuti

unsigned long t_ser = 0;    // tempo di trasmissione
unsigned long t_s = 0;      // tempo di scrittura seriale

void setup() {
  Serial.begin(9600);       // inizializza la seriale

  Serial.println();
  Serial.println("Test TR NRF24L01");  // scrivo in seriale
  Serial.println();

  if (!radio.begin()) {
    Serial.println("NRF24L01 non risponde");
  }

  delay(100);                       // attendo per stabilizzare

  radio.setChannel(1);              // setta canale radio
  radio.setPALevel(RF24_PA_MIN);    // setta la potenza del moduro nrf24
  radio.setDataRate(RF24_1MBPS);    // setta velocità tx 250kbps 2MBPS 1MBPS
  radio.setRetries(10, 15);         // setta tempo attesa

  radio.setAutoAck(1);              // abilita la richiesta di ACK
  radio.setCRCLength(RF24_CRC_8);   // setta lunghezza CRC 8 o 16 bit
  radio.enableAckPayload();         // attiva ACK payload
  radio.enableDynamicPayloads();    // attiva payload dinamico

  radio.openWritingPipe(00001);     // indirizzo TX
  radio.openReadingPipe(1, 00002);  // indirizzo RX
  //radio.printDetails(); // scarica configuraz radio per debug

  delay(100);                       // attendo per stabilizzare

  radio.stopListening();          // imposto modulo radio in TX

  t_ser = millis();
  t_s = millis();

  inviati[2] = 255;             // imposto un numero a un byte per test invio
  inviati[1] = 128;
  inviati[0] = 8;                // imposto un numero a un byte
}

void loop()
{

  if ((millis() - t_ser) >= 1000)   // ogni secondi
  {

    radio.write(&inviati, sizeof(inviati));       // invio i byte
    if (radio.isAckPayloadAvailable())
    {
      radio.read(ricevuti, sizeof(ricevuti));

      Serial.print("q.tà dati= ");
      Serial.print(sizeof(ricevuti));
      Serial.print(" contr 1= ");
      Serial.print(ricevuti[0]);
      Serial.print(" contr 2= ");
      Serial.print(ricevuti[1]);
      Serial.print(" contr 3= ");
      Serial.println(ricevuti[2]);
    }

    t_ser = millis();
  }


}  // fine loop

RICEVITORE:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(9, 10);          // pin modulo radio CE, CSN

byte ricevuti[3];          // creo un array per i dati ricevuti
byte inviati[3];           // creo un array per i dati da inviare

unsigned long t_ser = 0;    // tempo se non ricevo dati
unsigned long t_s = 0;      // tempo di scrittura seriale

void setup() {
  Serial.begin(9600);       // inizializza la seriale

  Serial.println();
  Serial.println("Test RX NRF24L01");  // scrivo in seriale
  Serial.println();

  if (!radio.begin()) {
    Serial.println("NRF24L01 non risponde");
  }

  inviati[0] = 234;                 // cifre di controllo
  inviati[1] = 235;
  inviati[2] = 236;

  delay(100);                       // attendo per stabilizzare

  radio.setChannel(1);              // setta canale radio
  radio.setPALevel(RF24_PA_MIN);    // setta la potenza del moduro nrf24
  radio.setDataRate(RF24_1MBPS);    //set datarate to 250kbps 2MBPS 1MBPS
  radio.setRetries(10, 15);         // setta tempo attesa

  radio.setAutoAck(1);              // abilita autoACK
  radio.setCRCLength(RF24_CRC_8);   // setta lunghezza CRC 8 o 16 bit
  radio.enableAckPayload();         // attiva ACK payload
  radio.enableDynamicPayloads();    // attiva payload dinamico

  radio.openWritingPipe(00002);  // indirizzo TX
  radio.openReadingPipe(1, 00001);  // indirizzo RX
  //radio.printDetails();           // scarica configuraz radio per debug

  delay(100);                       // attendo per stabilizzare

  radio.startListening();           //imposto modulo radio in RX

  t_ser = millis();
  t_s = millis();
}

void loop()
{

  if (radio.available())            // se ho dati ricevuti
  {
    radio.read(&ricevuti, sizeof(ricevuti));
    radio.writeAckPayload(1, &inviati, sizeof(inviati));
    Serial.println();               // vado a capo
    Serial.print("dati ricevuti= ");  // scrivo in seriale
    Serial.print(ricevuti[2]);
    Serial.print(", ");
    Serial.print(ricevuti[1]);
    Serial.print(", ");
    Serial.println(ricevuti[0]);
  }


}  // fine loop

Ciao,
vedo che nessuno ha risposto, ho errato qualcosa nella domanda? Oppure sono in pochi ad utilizzare questo sistema del chip? Meglio quindi utilizzare un sistema di controllo formulato nel programma?

Grazie :slight_smile:

... credo buona la seconda ... gli nRF24L01 non sono così tanto usati e quindi ... :roll_eyes:

Guglielmo

Cercando in rete nel forum, a questo link "nrf24l01 trasmissione e ricezione in payload - risolto - #6 by bigc" uno che lo ha usato con successo

Ciao,
si Guglielmo, mi sa che la soluzione migliore è arrangiarsi nel programma, visto che la trasmissione funziona bene senza nessun controllo, l'eventuale aggiunto nel software farebbe già abbastanza come sistema di sicurezza.

nid69ita, è proprio uno degli esempi che ho trovato anche io in rete, infatti il programma che ho fatto io è solo aggiustato, ma identico a quello di quel post, ma non riscontro funzionalità.
Procederò con un protocollo personalizzato...

Grazie