Buonasera, utilizzo due moduli nRF24L01 PA LNA dal 2021 per inviare dati tra due arduino mega2560 di una stazione meteo (invio uno struct da 31byte). Qualche mese fa ho sostituito i moduli rf24, probabilmente non genuini, con due rf24 E01 della ebyte.
Comunicazione bidirezionale con ackPayload di 1byte, sketch di partenza preso dal Simple tutorial di Robin
Moduli alimentati con LM2596, condensatore da 10uF tra VCC e GND.
Distanza fra i moduli di circa 500 metri con un muro nel mezzo.
Ho sempre ricevuto i dati dal master (posto all'esterno), inviati ogni 10 secondi e riscontrato un ack nella maggioranza delle trasmissioni.
Da quando ho installato i moduli E01 ebyte, i dati continuano ad essere inviati dal master allo slave egregiamente ma non c'è traccia di ack nel master.
Mi sono letto un po' di volte la documentazione della libreria RF24 di TMRh20 v 1.4.8 (che uso) e il suo blog, ipotizzando un problema di configurazione delle pipe.
Mi sembra di capire che sia importante che la reading pipe 0 del master abbia lo stesso indirizzo della writing pipe del master.
E' normale, invece, che nello slave ci sia la reading pipe 0 closed?
Ho recentemente fatto il test con i codici del tutorial di Robin: master invia i dati che vengono ricevuti corretamente ma nessun ack riscontrato.
Un chiarimento di teoria:
il master scrive con l'indirizzo specifico, lo slave riceve sulla pipe 1, lo slave scrive con il suo indirizzo l'ack, il master riceve l'ack sulla pipe0. Corretto?
Grazie in anticipo.
Codice master (solo la parte inerente alla radio):
#include <RF24.h>
#include <nRF24L01.h>
RF24 radio(A12,A13); //CE E CSN
const byte slaveAddress[5] = {'R','x','A','A','A'};
//setup
void initRadio() {
if (!radio.begin()) //verifica corretta inizializzazione
Serial.println(F("radio error"));
else
Serial.println(F("radio ok"));
radio.setPALevel(RF24_PA_MAX);
radio.setDataRate(RF24_250KBPS );
//radio.enableDynamicPayloads();
radio.setAutoAck(true);
radio.enableAckPayload();
radio.setRetries(15,15); // delay, count // 5 gives a 1500 µsec delay which is needed for a 32 byte ackPayload
radio.openWritingPipe(slaveAddress);
printf_begin();
radio.printPrettyDetails();
}
//loop
if (millis() - previousSend >= intervalSend && writeFirst){
previousSend = long(millis()/1000)*1000;
//RADIO STUFF
bool okSent = radio.write( &radioTx, sizeof(radioTx) );
if (okSent) { //ACK RECEIVED
digitalWrite(15, HIGH);
if ( radio.available() ) {
radio.read(&resetRx, sizeof(resetRx));
Serial.println(F("Reset status received"));
}
else
Serial.println(F(" Acknowledge but no data "));
}
else //ACK FAIL
digitalWrite(15, LOW);
}
Restituisce questo output di configurazione:
SPI Frequency = 10 Mhz
Channel = 76 (~ 2476 MHz)
Model = nRF24L01+
RF Data Rate = 250 KBPS
RF Power Amplifier = PA_MAX
RF Low Noise Amplifier = Enabled
CRC Length = 16 bits
Address Length = 5 bytes
Static Payload Length = 32 bytes
Auto Retry Delay = 4000 microseconds
Auto Retry Attempts = 15 maximum
Packets lost on
current channel = 0
Retry attempts made for
last transmission = 5
Multicast = Disabled
Custom ACK Payload = Enabled
Dynamic Payloads = Enabled
Auto Acknowledgment = Enabled
Primary Mode = TX
TX address = 0x4141417852
pipe 0 ( open ) bound = 0x4141417852
pipe 1 ( open ) bound = 0x4141417852
pipe 2 (closed) bound = 0xc3
pipe 3 (closed) bound = 0xc4
pipe 4 (closed) bound = 0xc5
pipe 5 (closed) bound = 0xc6
Codice slave:
#include <RF24.h>
#include <nRF24L01.h>
RF24 radio(41,39);
const byte thisSlaveAddress[5] = {'R','x','A','A','A'};
//setup
void initRadio() {
erradioRX = radio.begin();
radio.setPALevel(RF24_PA_MAX);
radio.setDataRate(RF24_250KBPS);
//radio.enableDynamicPayloads();
radio.setAutoAck(true);
radio.enableAckPayload();
//radio.openWritingPipe(thisSlaveAddress);//altrimenti TX address non corretto
radio.openReadingPipe(1, thisSlaveAddress);
radio.startListening();
bool resetTx = false;
//
radio.flush_tx();
radio.writeAckPayload(1, &resetTx, sizeof(resetTx)); // pre-load data
printf_begin();
radio.printPrettyDetails();
}
//loop
bool radioLink=false; //no collegamento radio con master
void radioRX(){
if ( radio.available() ) {
bool writeACK = radio.writeAckPayload(1, &resetTx, sizeof(resetTx)); // pre-load data
radio.read( &radioRx, sizeof(radioRx) );
radioLink = true;
}else{
radioLink = false;
}
}
Output configurazione slave:
SPI Frequency= 10 Mhz
Channel = 76 (~ 2476 MHz)
Model = nRF24L01+
RF Data Rate= 250 KBPS
RF Power Amplifier = PA_MAX
RF Low Noise Amplifier = Enabled
CRC Length= 16 bits
Address Length= 5 bytes
Static Payload Length = 32 bytes
Auto Retry Delay = 1500 microseconds
Auto Retry Attempts = 15 maximum
Packets lost on
current channel = 0
Retry attempts made for
last transmission = 15
Multicast= Disabled
Custom ACK Payload = Enabled
Dynamic Payloads = Enabled
Auto Acknowledgment = Enabled
Primary Mode= RX
TX address= 0x4141417852
pipe 0 (closed) bound = 0x4141417852
pipe 1 ( open ) bound = 0x4141417852
pipe 2 (closed) bound = 0xc3
pipe 3 (closed) bound = 0xc4
pipe 4 (closed) bound = 0xc5
pipe 5 (closed) bound = 0xc6