nRF24L01 PB de communication en bidirectionnel

Bonsoir à tous,

Je me suis lancé dans la programmation de mes 2 arduinos UNO avec nRF24L01 ce week-end.
J'ai parcouru le forum et les différents tutos sur le web avant donc:
connexions soudées entre nRF et arduino
Petit condo soudé aux bornes de l'alimentation des nRF.
RF24 library => TMRh20 version

Test programme "Hello world" => OK
Test prog de Robin2 Simple one way transmission Simple nRF24L01+ 2.4GHz transceiver demo - Exhibition / Gallery - Arduino Forum => transmission OK sur mes arduino.

Je me lance dans la programmation de mon projet:

Un arduino (station) envoie une requête de données à un 1er arduino (R1)
R1 reçoit la requête et envoie ses données à la station
Une fois les données reçues, la station envoie une requête de données à un 2ème arduino (R2)
R2 reçoit la requête et envoie ses données à la station

La compilation est ok par contre la station n'arrive pas à établir de connexion avec R1...

bool ok = radio.write(& d, sizeof(d) );

ok ne passe jamais à 1 et R1 reste toujours en attente.

Si vous pouviez jeter un coup d'œil sur la structure de mes 2 programmes car je sèche depuis 2 jours et je dois passer à côté de quelque chose.....

Merci pour votre aide

Code Station

#include <SPI.h>
#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp;
const byte R1 = "00001";
const byte R2 = "00002";
const byte Station = "00099";
RF24 radio(9, 10);
const char d[] = "request";
int R_1[3];
int R_2[3];
int Station_t[9];

void setup()
{
Serial.begin(9600);
Serial.println("Programme station");

radio.begin();
Serial.print("Radio connected : ");
Serial.println(radio.isChipConnected() ? "YES" : "NO");
radio.setChannel(115);
radio.setDataRate( RF24_250KBPS ) ;
radio.setPALevel(RF24_PA_LOW);
radio.setRetries(15,15);
radio.openWritingPipe(R1);
radio.openReadingPipe(1,Station);
//bmp.begin(0x76);
TryAgain:
bool ok = radio.write(& d, sizeof(d) );
Serial.println(ok);
    if (ok)
   { 
    Serial.println("radio.write ok...");
   }
else
   {
    Serial.println("radio.write failed !");
    delay(3000);
    goto TryAgain;
   }
   
Serial.println("Requète envoyée à R1");
radio.startListening(); // Station as Receiver
}
void loop()
{
if( radio.available() )
{
radio.read( &R_1, sizeof( R_1));
for(int i=0; i<3; i++)
{
Station_t[i] = R_1[i];
Serial.println(R_1[i]);
delay(1000);
}
radio.stopListening(); // Station as Transmitter
radio.openWritingPipe(R2);
radio.write(& d, sizeof(d) );
Serial.println("Requète envoyée à R2");
radio.startListening();
while(1)
{
if( radio.available() )
{
radio.read( &R_2, sizeof( R_2));
for(int i=0; i<3; i++)
{
Station_t[i+3] = R_2[i];
Serial.println(R_2 [i]);
delay(1000);
}
Serial.println("toutes les mesures:");
Station_t[6] = bmp.readTemperature();
Station_t[7] = bmp.readPressure();
Station_t[8] = bmp.readAltitude(1013.25);
for(int i=0; i<9; i++)
{
Serial.println(Station_t[i]);
delay(1000);
}
}
}
}
}

Code R1

#include <SPI.h>
#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <DHT.h>
#include "DHT.h"
#include "HX711.h"
#define DHTPIN 4
#define DHTTYPE DHT22
#define calibration_factor 7050.0
#define DOUT  3 // HX711
#define CLK  2 // HX711

HX711 scale;
DHT dht(DHTPIN, DHTTYPE);

const byte R1 = "00001";
const byte Station = "00099";

RF24 radio(9, 10);
const char demande[] = "request";
int mesures[3];

void setup()
{
dht.begin();
Serial.begin(9600);
radio.begin();
Serial.print("Radio connected : ");
Serial.println(radio.isChipConnected() ? "YES" : "NO");
radio.setChannel(115);
radio.setDataRate( RF24_250KBPS ) ;
radio.setPALevel(RF24_PA_LOW);
radio.setRetries(15,15);
//scale.set_scale(calibration_factor);
//scale.tare();
radio.openWritingPipe(Station); // 00099 ST
radio.openReadingPipe(1, R1); // 00001 R1
delay (1000);
Serial.println("en attente requète station...");
delay (1000);
}
void loop()
{
if( radio.available() )
{
Serial.println("une demande est recue");
mesures[0] = dht.readTemperature();
mesures[1] = dht.readHumidity();
mesures[2] = scale.get_units();
Serial.println(dht.readTemperature());
delay(100);
radio.read( &demande, sizeof(demande) );
radio.stopListening(); //R1 as Transmitter
delay(4000);
radio.write(& mesures, sizeof(mesures) );
Serial.println("les mesures sont envoyées à la station");
radio.startListening(); // R1 as Receiver
}
}

ça semble ne pas tenir dans un byte...

const byte R1 = "00001";
const byte R2 = "00002";
const byte Station = "00099";

je ne suis pas allé plus loin et je ne pense pas que ce soit ce qui est fait dans les programmes que vous avez exploré... les types c'est important...

si vous faites tourner ce programme:

const byte R1 = "00001";
const byte R2 = "00002";
const byte Station = "00099";

void setup() {
  Serial.begin(115200);
  Serial.println(R1);
  Serial.println(R2);
  Serial.println(Station);
}

void loop() {}

vous allez voir dans la console série un truc du genre

[color=purple]21
27
33
[/color]

qui corresponde au dernier octet de l'adresse mémoire où les chaines de caractères sont rangées...

mais plus important, vous allez aussi avoir à la compilation une alerte

 warning: invalid conversion from 'const char*' to 'byte {aka unsigned char}' [-fpermissive]
 const byte R1 = "00001";
                 ^~~~~~~
warning: invalid conversion from 'const char*' to 'byte {aka unsigned char}' [-fpermissive]
 const byte R2 = "00002";
                 ^~~~~~~
warning: invalid conversion from 'const char*' to 'byte {aka unsigned char}' [-fpermissive]
 const byte Station = "00099";
                      ^~~~~~~

vaut mieux en tenir compte...

si vous faites tourner ce code:

const char R1[] = "00001";
const char R2[] = "00002";
const char Station[] = "00099";

void setup() {
  Serial.begin(115200);
  Serial.println(R1);
  Serial.println(R2);
  Serial.println(Station);
}

void loop() {}

alors vous verrez dans la console

[color=purple] 00001
00002
00099[/color]

ça ressemble plus à ce que vous avez en tête sans doute....

Bonjour et merci de votre réponse.

J'ai testé avec votre suggestion.

Un message est généré à la compilation sur cette ligne radio.openWritingPipe(R1); // R1[/code]

...
const char R1[] = "00001";
const char R2[] = "00002";
const char Station[] = "00099";
....
radio.openWritingPipe(R1); // R1

....

exit status 1
no matching function for call to 'openWritingPipe(const char [6])'

J'ai donc repris le programme de test qui fonctionne
Les "pipes" sont déclarés comme suit dans ce programme

const byte slaveAddress[5] = {'R','x','A','A','A'};

J'ai donc adapté pour mon projet mais toujours pas de communication....

Merci pour votre aide

Les 2 codes modifiés ci-dessous:
Station

#include <SPI.h>
#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp;

const byte pipe[][6] = {'1','2','3'}; // R1, R2, ST

RF24 radio(9, 10);
const char d[] = "request";
int R_1[3];
int R_2[3];
int Station_t[9];

void setup()
{
Serial.begin(9600);
Serial.println("Programme station");

radio.begin();
Serial.print("Radio connected : ");
Serial.println(radio.isChipConnected() ? "YES" : "NO");
radio.setChannel(115);
radio.setDataRate( RF24_250KBPS ) ;
radio.setPALevel(RF24_PA_LOW);
radio.setRetries(15,15);
radio.openWritingPipe(pipe[0]); // 0 = R1
radio.openReadingPipe(1,pipe[2]); // 2 = station

//bmp.begin(0x76);
TryAgain:
bool ok = radio.write(& d, sizeof(d) );
Serial.println(ok);
    if (ok)
   { 
    Serial.println("radio.write ok...");
   }
else
   {
    Serial.println("radio.write failed !");
    delay(3000);
    goto TryAgain;
   }
   
Serial.println("Requète envoyée à R1");
radio.startListening(); // Station as Receiver
}
void loop()
{
if( radio.available() )
{
radio.read( &R_1, sizeof( R_1));
for(int i=0; i<3; i++)
{
Station_t[i] = R_1[i];
Serial.println(R_1[i]);
delay(1000);
}
radio.stopListening(); // Station as Transmitter
radio.openWritingPipe(pipe[1]); //R2
radio.write(& d, sizeof(d) );
Serial.println("Requète envoyée à R2");
radio.startListening();
while(1)
{
if( radio.available() )
{
radio.read( &R_2, sizeof( R_2));
for(int i=0; i<3; i++)
{
Station_t[i+3] = R_2[i];
Serial.println(R_2 [i]);
delay(1000);
}
Serial.println("toutes les mesures:");
Station_t[6] = bmp.readTemperature();
Station_t[7] = bmp.readPressure();
Station_t[8] = bmp.readAltitude(1013.25);
for(int i=0; i<9; i++)
{
Serial.println(Station_t[i]);
delay(1000);
}
}
}
}
}

R1

#include <SPI.h>
#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <DHT.h>
#include "DHT.h"
#include "HX711.h"
#define DHTPIN 4
#define DHTTYPE DHT22
#define calibration_factor 7050.0
#define DOUT  3 // HX711
#define CLK  2 // HX711

HX711 scale;
DHT dht(DHTPIN, DHTTYPE);

const byte pipe[][6] = {'1','2','3'}; // R1, R2, ST

RF24 radio(9, 10);
const char demande[] = "request";
int mesures[3];

void setup()
{
dht.begin();
Serial.begin(9600);
radio.begin();
Serial.print("Radio connected : ");
Serial.println(radio.isChipConnected() ? "YES" : "NO");
radio.setChannel(115);
radio.setDataRate( RF24_250KBPS ) ;
radio.setPALevel(RF24_PA_LOW);
radio.setRetries(15,15);
//scale.set_scale(calibration_factor);
//scale.tare();
radio.openWritingPipe(pipe[2]); // 2 = Station
radio.openReadingPipe(1, pipe[0]); // 0 = R1
radio.stopListening(); //R1 as tranceiver
delay (1000);
Serial.println("en attente...");
delay (1000);
}
void loop()
{
if( radio.available() )
{
Serial.println("une demmande est reçue");
mesures[0] = dht.readTemperature();
mesures[1] = dht.readHumidity();
mesures[2] = scale.get_units();
Serial.println(dht.readTemperature());
delay(100);
radio.read( &demande, sizeof(demande) );
radio.stopListening(); //R1 as Transmitter
delay(4000);
radio.write(& mesures, sizeof(mesures) );
Serial.println("les mesures sont envoyées à la station");
radio.startListening(); // R1 as Receiver
}
}

oui - c'est là où je voulais vous emmener :slight_smile: [les types sont importants]

ça fonctionne comme vous voulez maintenant ?

Hélas non.... je m'arrache les cheveux et j'en ai plus beaucoup :slight_smile:
radio.write renvoie toujours 0 au niveau de la station.
Je ne comprends pas comment cela peut fonctionner en unidirectionnel et pas en bidirectionnel!
Dans mon dernier post les 2 dernières versions du code de la station et de R1.
Merci de votre aide

BigOlive:
Je ne comprends pas comment cela peut fonctionner en unidirectionnel et pas en bidirectionnel!

vous avez regardé mon tuto ?

OK je m'y plonge ce soir et vous tiens informé
Merci

Bonsoir,
Je reprends tout depuis le début....

1er test avec

printf_begin();
  radio.printDetails();

Résultat ci-dessous:

Programme station


Radio connected : YES
STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1 = 0x0000333231 0x0000000074
RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
TX_ADDR = 0x0000333231
RX_PW_P0-6 = 0x20 0x20 0x00 0x00 0x00 0x00
EN_AA = 0x3f
EN_RXADDR = 0x02
RF_CH = 0x4c
RF_SETUP = 0x03
CONFIG = 0x0e
DYNPD/FEATURE = 0x00 0x00
Data Rate = 1MBPS
Model = nRF24L01+
CRC Length = 16 bits
PA Power = PA_LOW

R1:


Radio connected : YES
STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1 = 0x0000000074 0x0000333231
RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
TX_ADDR = 0x0000000074
RX_PW_P0-6 = 0x20 0x20 0x00 0x00 0x00 0x00
EN_AA = 0x3f
EN_RXADDR = 0x03
RF_CH = 0x4c
RF_SETUP = 0x03
CONFIG = 0x0e
DYNPD/FEATURE = 0x00 0x00
Data Rate = 1MBPS
Model = nRF24L01+
CRC Length = 16 bits
PA Power = PA_LOW
en attente...

La 1ère chose qui m'intrigue...
Je déclare radio.setDataRate( RF24_250KBPS )
et radio.printDetails() me renvoie Data Rate = 1MBPS ......

Mystère....

Ne vous prenez pas la tete avec ça Pour le moment

Avez vous compris la structure du code dans mon tuto? si oui essayez de vous en inspirer pour votre code, si non - on peut répondre à des questions

N’oubliez pas non plus que dès qu’on joue avec du sans fil on est sensible aux perturbations électromagnétiques et donc si par exemple vous êtes juste à côté de votre box/station wi-fi ça risque de poser des problèmes.

Bonjour,

Les essais d'hier soir ci-dessous:

J'ai ressoudé les nRF sur les arduino Uno, contrôler les tensions.
J'ai testé les 2 programmes suivants (MasterSwapRoles and SlaveSwapRoles)
(MasterSwapRoles and SlaveSwapRoles don't communicate - Programming Questions - Arduino Forum).
car je retrouve pas mes boutons pour tester votre programme :frowning:

1er test: Tout fonctionne parfaitement la communication s'établie à 100%
Je débranche et rebranche les arduinos sur mes USB => Plus de communication !!!
Je débranche et rebranche de nouveau => je perds des packets mais la transmissions s'établie toutes les 4, 5 tentatives...
Je débranche et rebranche de nouveau => plus de problème 100% de packets reçus.
Je bouge les antennes, la communication se coupe puis se rétablie de façon aléatoire.

Donc c'est vraiment très sensible....

Pour optimiser....
J'utilise des NRF24L01P + PA + LNA => Trop prêt ou trop loin c'est pas bon... j'ai enlevé l'antenne pour
les tests car mes 2 cartes sont à 50cm l'une de l'autre => c'est mieux

Je capte 4 réseaux wifi + le mien => ça doit pas aider niveau perturbation

J'utilise le 3.6V de l'arduino pour alimenter les nRF => je vais acheter les adaptateurs 5V->3V pour les nRF.

Reste le problème dans mon projet, je pense à un problème de timing, je vais regarder ça de plus prêt!

OK - il semble que vous avez effectivement un problème d'interférences. une bonne antenne et une bonne alimentation bien stable, ça aide