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